From 29580956a6f5128398c589983580688575fcb906 Mon Sep 17 00:00:00 2001 From: crosstar Date: Wed, 11 Jun 2025 15:08:31 +0900 Subject: [PATCH 01/19] =?UTF-8?q?Feat:=20LLM=20=EC=B6=94=EB=A1=A0=20?= =?UTF-8?q?=EB=AA=A8=EB=8D=B8(OpenAI)=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Music Team 에 사용될 모델을 초기화하는 get_openai_model 함수 추가 --- agents/music/modules/models.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/agents/music/modules/models.py b/agents/music/modules/models.py index b94ad2d..9eb63d5 100644 --- a/agents/music/modules/models.py +++ b/agents/music/modules/models.py @@ -2,10 +2,8 @@ 기본적으로 사용할 모델 인스턴스를 설정하고 생성하고 반환시킵니다. """ - from langchain_openai import ChatOpenAI - def get_openai_model(temperature=0.7, top_p=0.9): """ LangChain에서 사용할 OpenAI 모델을 초기화하여 반환합니다. @@ -16,4 +14,7 @@ def get_openai_model(temperature=0.7, top_p=0.9): ChatOpenAI: 초기화된 OpenAI 모델 인스턴스 """ # OpenAI 모델 초기화 및 반환 - return ChatOpenAI(model="gpt-4o-mini", temperature=temperature, top_p=top_p) + return ChatOpenAI(model="gpt-4o-mini", + temperature=temperature, + top_p=top_p, + ) From e71c5b8706b55f3dea755104d8e801857968a27f Mon Sep 17 00:00:00 2001 From: crosstar Date: Wed, 11 Jun 2025 15:16:45 +0900 Subject: [PATCH 02/19] =?UTF-8?q?Feat:=20=EA=B0=80=EC=82=AC=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=ED=85=9C=ED=94=8C=EB=A6=BF=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 가사 생성을 위한 "get_lyric_template" 함수 추가 --- agents/music/modules/prompts.py | 46 +++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 agents/music/modules/prompts.py diff --git a/agents/music/modules/prompts.py b/agents/music/modules/prompts.py new file mode 100644 index 0000000..f4757ae --- /dev/null +++ b/agents/music/modules/prompts.py @@ -0,0 +1,46 @@ +"""프롬프트 템플릿을 생성하는 함수 모듈 + +프롬프트 템플릿을 생성하는 함수 모듈을 구성합니다. +기본적으로 PromptTemplate을 사용하여 프롬프트 템플릿을 생성하고 반환합니다. +""" +from langchain_core.prompts import PromptTemplate + +base_template = """ + +당신은 싱어송라이터 인플루언서 **니제**입니다. 반드시 아래 인적 사항을 바탕으로 **오직 니제의 시선**으로 대답하세요. + +# 기본 인적 사항 + +이름: 니제 (NEEDZE) +나이: 22세 +성별: 여자 +직업: 싱어송라이터 +생일: 03월 03일 (0303) +MBTI: ISTP +주요 특징: +- 취향이 확고하고 자기 주장이 뚜렷함 +- 귀여운 매력과 개성이 넘치며, 독창적인 스타일을 지님 +- 예술적 감각과 창의성을 중요시함 +""" + +lyric_template = base_template + """ +# 음악 스타일 +음악 장르: +- 주요 장르: 앰비언트 포크, RnB, 드림팝, 베드룸 팝 +@ +- 특징: 감성을 담은 부드러운 사운드, 자연스러운 리듬, 공감각적 표현 +- 레퍼런스: fazerdaze, cigarette after sex, 뉴진스, 모임별, 검정치마(“201”, “피와 갈증”) + +가사 및 표현 스타일: +- 내용: 일상 속 인간 관계, 연애 등에서 느낀 감정을 세밀하게 포착 +- 표현 방식: 시각적 색채와 촉각적 느낌을 결합해 감각적으로 전달 +- 레퍼런스: 이바다, 김사월, 신해경 + +이제 다음 주제로 가사를 써줘: {query} +""" + +def get_lyric_template() -> PromptTemplate: + """가사 템플릿 반환""" + return PromptTemplate( + template=lyric_template, + input_variables=["query"], + ) From 6bbd5c795aa0ae1e79b62dfe22ee7ce8efa7e998 Mon Sep 17 00:00:00 2001 From: crosstar Date: Wed, 11 Jun 2025 15:20:04 +0900 Subject: [PATCH 03/19] =?UTF-8?q?Feat:=20=EA=B0=80=EC=82=AC=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=85=B8=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - LyricGenerationNode 클래스 추가 --- agents/music/modules/nodes.py | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/agents/music/modules/nodes.py b/agents/music/modules/nodes.py index 5060e09..b4b758c 100644 --- a/agents/music/modules/nodes.py +++ b/agents/music/modules/nodes.py @@ -4,7 +4,37 @@ 해당 클래스 모듈은 각각 노드 클래스가 BaseNode를 상속받아 노드 클래스를 구현하는 모듈입니다. """ -# from agents.base_node import BaseNode +from agents.base_node import BaseNode +from agents.music.modules.prompts import get_lyric_template +from agents.music.modules.state import MusicState +from agents.music.modules.models import get_openai_model + +class LyricGenerationNode(BaseNode): + """ + 가사 생성 노드 + """ + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.model = get_openai_model() + + def execute(self, state: MusicState) -> dict: + """ + 가사 생성 노드 실행 + """ + self.logging("execute", input_state=state) + prompt = get_lyric_template().format(query=state["query"]) + response = self.model.invoke(prompt) + return {"response": response, "query": state["query"]} + + def __call__(self, state: MusicState) -> dict: + """ + 노드를 함수처럼 호출 가능하게 만드는 메서드 + """ + return self.execute(state) + + + # from agents.music.modules.chains import set_music_generation_chain From 3cc86183bab24a200b0f92cea7ca9ae4e9636e70 Mon Sep 17 00:00:00 2001 From: crosstar Date: Wed, 11 Jun 2025 15:23:48 +0900 Subject: [PATCH 04/19] =?UTF-8?q?Feat:=20workflow=EC=97=90=20lyric=5Fgener?= =?UTF-8?q?ation=20=EB=85=B8=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - start-lyric_generation-end 과정으로 기능 추가함 --- agents/music/workflow.py | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/agents/music/workflow.py b/agents/music/workflow.py index 197d9bd..4007c6d 100644 --- a/agents/music/workflow.py +++ b/agents/music/workflow.py @@ -6,10 +6,10 @@ """ from langgraph.graph import StateGraph - +from langgraph.graph.state import CompiledStateGraph from agents.base_workflow import BaseWorkflow from agents.music.modules.state import MusicState - +from agents.music.modules.nodes import LyricGenerationNode class MusicWorkflow(BaseWorkflow): """ @@ -23,7 +23,7 @@ def __init__(self, state): super().__init__() self.state = state - def build(self): + def build(self) -> CompiledStateGraph: """ 음악 Workflow 그래프 구축 메서드 @@ -36,21 +36,23 @@ def build(self): """ builder = StateGraph(self.state) - builder.add_edge("__start__", "__end__") + # builder.add_edge("__start__", "__end__") - # 조건부 에지 추가 예시 - # builder.add_conditional_edges( - # "call_model", - # # call_model 실행이 완료된 후, 다음 노드(들)는 - # # router의 출력을 기반으로 예약됩니다 - # router, - # ) + builder.add_node("lyric_generation", LyricGenerationNode()) + builder.add_edge("__start__", "lyric_generation") + builder.add_edge("lyric_generation", "__end__") workflow = builder.compile() # 그래프 컴파일 workflow.name = self.name # Workflow 이름 설정 return workflow - -# 음악 Workflow 인스턴스 생성 music_workflow = MusicWorkflow(MusicState) + +if __name__ == "__main__": + # 음악 Workflow 인스턴스 생성 + music_workflow = MusicWorkflow(MusicState) + graph = music_workflow.build() + input_query = input() + graph.invoke({f"query": "{input_query}"}) + From 341a3eb17644ed06fb7f0dcdc8b29ebc3f822e5b Mon Sep 17 00:00:00 2001 From: Kimhansav Date: Sun, 22 Jun 2025 19:55:34 +0900 Subject: [PATCH 05/19] Added diary_generation node, youtube_search node, youtube_analysis node --- .env.example | 2 +- agents/management/modules/state.py | 7 +- agents/music/modules/models.py | 41 + agents/music/modules/nodes.py | 136 ++- agents/music/modules/prompts.py | 64 + agents/music/modules/state.py | 5 +- agents/music/workflow.py | 17 +- uv.lock | 1793 ++++++++++++++++++++++++++++ 8 files changed, 2054 insertions(+), 11 deletions(-) create mode 100644 uv.lock diff --git a/.env.example b/.env.example index 9890512..820029d 100644 --- a/.env.example +++ b/.env.example @@ -5,7 +5,7 @@ # Langsmith Project Tracking # LangSmith is a tool for monitoring and debugging LANGSMITH_PROJECT=pseudo-entertainment-company # Project name to be used by LangSmith. -LANGSMITH_API_KEY=lsv2.... # LangSmith API key (must be replaced with real key) +LANGSMITH_API_KEY=... # LangSmith API key (must be replaced with real key) # Depending on the configuration you choose, you will need the following environment variables. diff --git a/agents/management/modules/state.py b/agents/management/modules/state.py index 8799502..9ae62c1 100644 --- a/agents/management/modules/state.py +++ b/agents/management/modules/state.py @@ -22,9 +22,10 @@ class ManagementState(TypedDict): project_id: str # 프로젝트 ID (예: "PRJ-2023-001", "EP-MARVEL-S01") request_type: str # 요청 유형 (예: "resource_allocation", "team_management", "creator_development") query: str # 사용자 쿼리 또는 요청사항 + response: Annotated[ + list, add_messages + ] team_members: Optional[List[str]] = None # 팀 구성원 목록 resources_available: Optional[Dict[str, any]] = None # 사용 가능한 리소스 정보 resource_plan: Optional[str] = None # 리소스 계획 콘텐츠 - response: Annotated[ - list, add_messages - ] # 응답 메시지 목록 (add_messages로 주석되어 메시지 추가 기능 제공) + # 응답 메시지 목록 (add_messages로 주석되어 메시지 추가 기능 제공) diff --git a/agents/music/modules/models.py b/agents/music/modules/models.py index 9eb63d5..f9a8b4e 100644 --- a/agents/music/modules/models.py +++ b/agents/music/modules/models.py @@ -4,6 +4,17 @@ """ from langchain_openai import ChatOpenAI +from google import genai +from googleapiclient.discovery import build + +import os + +GEMINI_API_KEY = os.getenv("GEMINI_API_KEY") +YOUTUBE_API_KEY = os.getenv("YOUTUBE_API_KEY") +YOUTUBE_API_SERVICE_NAME = os.getenv("YOUTUBE_API_SERVICE_NAME") +YOUTUBE_API_VERSION = os.getenv("YOUTUBE_API_VERSION") + + def get_openai_model(temperature=0.7, top_p=0.9): """ LangChain에서 사용할 OpenAI 모델을 초기화하여 반환합니다. @@ -18,3 +29,33 @@ def get_openai_model(temperature=0.7, top_p=0.9): temperature=temperature, top_p=top_p, ) + +def get_youtube_client(): + """ + Youtube 영상 검색 API에 사용하기 위한 client, 즉 서비스 객체를 제작합니다. + + 환경변수에서 YOUTUBE_API_KEY, YOUTUBE_API_SERVICE_NAME, + YOUTUBE_API_VERSION을 가져와 사용하기 때문에, .env 파일에 유효한 + API 키가 설정되어 있어야 합니다. + + Returns: + build: 초기화된 youtube client 인스턴스 + """ + return build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, + developerKey = YOUTUBE_API_KEY) + +def get_gemini_client(): + """ + LangChain에서 사용할 Gemini client을 초기화하여 반환합니다. + + 환경변수에서 GEMINI_API_KEY를 가져와 사용하기 때문에, + .env 파일에 유효한 API 키가 설정되어 있어야 합니다. + + 노드에서 Gemini 모델을 사용할 때 모델명을 따로 정의해줘야 합니다. + + Returns: + genai.Client: 초기화된 Gemini client 인스턴스 + """ + #Gemini 모델 초기화 및 반환 + return genai.Client(api_key = GEMINI_API_KEY) + diff --git a/agents/music/modules/nodes.py b/agents/music/modules/nodes.py index b4b758c..2b7f60d 100644 --- a/agents/music/modules/nodes.py +++ b/agents/music/modules/nodes.py @@ -5,9 +5,63 @@ """ from agents.base_node import BaseNode -from agents.music.modules.prompts import get_lyric_template +from agents.music.modules.prompts import get_lyric_template, get_diary_template, get_query_extraction_template, get_youtube_query_template, get_youtube_analysis_template from agents.music.modules.state import MusicState -from agents.music.modules.models import get_openai_model +from agents.music.modules.models import get_openai_model, get_gemini_client, get_youtube_client + +from googleapiclient.discovery import build +from google import genai + +class DiaryGenerationNode(BaseNode): + """ + 일기 생성 노드 + """ + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.model = get_openai_model() + + def execute(self, state) -> dict: + """ + 일기 생성 노드 실행 + """ + self.logging("execute", input_state=state) + first_prompt = get_diary_template().format(query=state["query"]) + diary_topic_response = self.model.invoke(first_prompt) + diary_topic_response = diary_topic_response.text() + + second_prompt = get_query_extraction_template().format(query=state["query"]) + messages = [ + { + "role" : "user", + "content" : first_prompt, + }, + { + "role" : "assistant", + "content" : diary_topic_response, + }, + { + "role" : "user", + "content" : second_prompt, + } + ] + query_response = self.model.invoke(messages) + query_response = query_response.text() + + # if "varying_data" not in state: + # state["varying_data"] = {} + + # state["varying_data"]["youtube_query"] = query_response + + # return {"response" : query_response, "query": state["query"], "varying" : state["varying_data"]} + return {"youtube_query" : query_response} + + def __call__(self, state): + """ + 노드를 함수처럼 호출 가능하게 만드는 메서드 + """ + return self.execute(state) + class LyricGenerationNode(BaseNode): """ @@ -33,7 +87,85 @@ def __call__(self, state: MusicState) -> dict: """ return self.execute(state) + +class YoutubeSearchNode(BaseNode): + """ + 유튜브 영상을 찾는 노드 + """ + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.model = get_youtube_client() + + def execute(self, state : MusicState) -> dict: + """ + 유튜브 영상 검색 노드 실행 + """ + self.logging("execute", input_state = state) + prompt = state["youtube_query"] + max_results = 1 + + search_response = self.model.search().list( + q = prompt, + part = "id", #영상 식별만 하면 돼서 id로 검색 + type = "video", # 영상만 검색 + order = "relevance", # 관련성 기준으로 정렬 + maxResults = max_results + ).execute() + + videos = [] + # 검색 결과 파싱 + for item in search_response.get('items', []): + video_id = str(item['id']['videoId']) + videos.append("https://www.youtube.com/watch?v=" + video_id) + # state["varying_data"]["video_url"] = videos[0] + + # return {"response": videos[0], "query": state["query"], "varying" : state["varying_data"]} #검색 결과 영상들 중 첫 번째만 반환 + return {"video_url" : videos[0]} + + def __call__(self, state): + """ + 노드를 함수처럼 호출 가능하게 만드는 메서드 + """ + return self.execute(state) + + +class YoutubeAnalysisNode(BaseNode): + """ + 유튜브 영상을 분석하는 노드 + """ + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.model = get_gemini_client() + + def execute(self, state : MusicState) -> dict: + """ + 유튜브 영상 분석 노드 실행 + """ + self.logging("execute", input_state = state) + prompt = get_youtube_analysis_template().format(query=state["query"]) + video_link = state["video_url"] + response = self.model.models.generate_content( + model='models/gemini-2.0-flash', + contents = genai.types.Content( + parts = [ + genai.types.Part( + file_data = genai.types.FileData(file_uri = video_link) + ), + genai.types.Part(text = prompt) + ] + ) + ) + # response = response["candidates"]["content"]["parts"][0]["text"] + # return {"response" : response, "query" : state["query"], "varying" : state["varying_data"]} + return {"video_analysis" : response.text} + + def __call__(self, state): + """ + 노드를 함수처럼 호출 가능하게 만드는 메서드 + """ + return self.execute(state) # from agents.music.modules.chains import set_music_generation_chain diff --git a/agents/music/modules/prompts.py b/agents/music/modules/prompts.py index f4757ae..ab4fef2 100644 --- a/agents/music/modules/prompts.py +++ b/agents/music/modules/prompts.py @@ -38,9 +38,73 @@ 이제 다음 주제로 가사를 써줘: {query} """ + + +diary_template = base_template + """" +대화 시 반영: +- 위의 모든 정보를 토대로, 니제의 정체성과 감성을 반영하여 대답해. +- 음악, 패션, 예술, 감성 표현 및 창의적 사고를 자연스럽게 드러내. +위의 지시사항을 토대로 너가 실제로 겪었을 만한 하루에 대해 일기를 작성해. +이때 일기는 사건만을 나열하기보다 사건과 이에 대해 너가 느낀 감정도 자세히 묘사하도록 해. +생성된 전체 일기 내용에 기반해서, 네 음악 스타일과 어울리는 노래 주제를 생성해. +""" # 추후 수정 가능 + + +query_extraction_template = """ +위에서 생성한 노래 주제를 기반으로, 유튜브에서 관련된 감성적이거나 분위기 있는 +영상을 검색할 수 있도록 적절한 검색 쿼리 1개를 생성해줘. 쿼리는 사람들이 실제로 +자주 검색할 만한 형태로, 구체적인 키워드 조합으로 구성하고, 음악, 브이로그, +분위기 영상, 에세이 등 다양한 유형의 콘텐츠가 포함되도록 해줘. +다른 설명은 붙이지 말고, 반드시 "쿼리"만 얘기해. +""" + + +youtube_query_template = """ +위에서 생성한 노래 주제를 기반으로, 유튜브에서 관련된 감성적이거나 +분위기 있는 영상을 검색할 수 있도록 적절한 검색 쿼리 1개를 생성해줘. +쿼리는 사람들이 실제로 자주 검색할 만한 형태로, 구체적인 키워드 조합으로 +구성하고, 음악, 브이로그, 분위기 영상, 에세이 등 다양한 유형의 콘텐츠가 +포함되도록 해줘. 다른 설명은 붙이지 말고, 반드시 "쿼리"만 얘기해. +""" + + + + +youtube_analysis_template = """ +This is youtube link url. Please analyze the video in great detail +visually and acoustically in Korean. +""" + + + + def get_lyric_template() -> PromptTemplate: """가사 템플릿 반환""" return PromptTemplate( template=lyric_template, input_variables=["query"], ) + +def get_diary_template() -> PromptTemplate: + """일기 템플릿 반환""" + return PromptTemplate( + template = diary_template, + ) + +def get_query_extraction_template() -> PromptTemplate: + """유튜브 검색어 추출 템플리 반환""" + return PromptTemplate( + template = query_extraction_template, + ) + +def get_youtube_query_template() -> PromptTemplate: + """유튜브 영상 검색어 반환""" + return PromptTemplate( + template = youtube_query_template, + ) + +def get_youtube_analysis_template() -> PromptTemplate: + """유튜브 동영상 분석 내용 반환""" + return PromptTemplate( + template = youtube_analysis_template, + ) \ No newline at end of file diff --git a/agents/music/modules/state.py b/agents/music/modules/state.py index 5cf46f0..fdbb508 100644 --- a/agents/music/modules/state.py +++ b/agents/music/modules/state.py @@ -8,7 +8,7 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Annotated, TypedDict +from typing import Annotated, TypedDict, Dict from langgraph.graph.message import add_messages @@ -26,3 +26,6 @@ class MusicState(TypedDict): response: Annotated[ list, add_messages ] # 응답 메시지 목록 (add_messages로 주석되어 메시지 추가 기능 제공) + youtube_query: str + video_url: str + video_analysis: str diff --git a/agents/music/workflow.py b/agents/music/workflow.py index 4007c6d..ad006f1 100644 --- a/agents/music/workflow.py +++ b/agents/music/workflow.py @@ -9,7 +9,7 @@ from langgraph.graph.state import CompiledStateGraph from agents.base_workflow import BaseWorkflow from agents.music.modules.state import MusicState -from agents.music.modules.nodes import LyricGenerationNode +from agents.music.modules.nodes import LyricGenerationNode, DiaryGenerationNode, YoutubeSearchNode, YoutubeAnalysisNode class MusicWorkflow(BaseWorkflow): """ @@ -38,9 +38,18 @@ def build(self) -> CompiledStateGraph: # builder.add_edge("__start__", "__end__") - builder.add_node("lyric_generation", LyricGenerationNode()) - builder.add_edge("__start__", "lyric_generation") - builder.add_edge("lyric_generation", "__end__") + # builder.add_node("lyric_generation", LyricGenerationNode()) + # builder.add_edge("__start__", "lyric_generation") + # builder.add_edge("lyric_generation", "__end__") + + builder.add_node("diary_generation", DiaryGenerationNode()) + builder.add_node("youtube_search", YoutubeSearchNode()) + builder.add_node("youtube_analysis", YoutubeAnalysisNode()) + + builder.add_edge("__start__", "diary_generation") + builder.add_edge("diary_generation", "youtube_search") + builder.add_edge("youtube_search", "youtube_analysis") + builder.add_edge("youtube_analysis", "__end__") workflow = builder.compile() # 그래프 컴파일 workflow.name = self.name # Workflow 이름 설정 diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..e1662db --- /dev/null +++ b/uv.lock @@ -0,0 +1,1793 @@ +version = 1 +revision = 2 +requires-python = ">=3.13" + +[manifest] +members = [ + "image", + "management", + "music", + "pseudo-entertainment", + "text", +] + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, +] + +[[package]] +name = "aiohttp" +version = "3.11.16" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f1/d9/1c4721d143e14af753f2bf5e3b681883e1f24b592c0482df6fa6e33597fa/aiohttp-3.11.16.tar.gz", hash = "sha256:16f8a2c9538c14a557b4d309ed4d0a7c60f0253e8ed7b6c9a2859a7582f8b1b8", size = 7676826, upload-time = "2025-04-02T02:17:44.74Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/52/7c712b2d9fb4d5e5fd6d12f9ab76e52baddfee71e3c8203ca7a7559d7f51/aiohttp-3.11.16-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a3814760a1a700f3cfd2f977249f1032301d0a12c92aba74605cfa6ce9f78489", size = 698005, upload-time = "2025-04-02T02:16:37.923Z" }, + { url = "https://files.pythonhosted.org/packages/51/3e/61057814f7247666d43ac538abcd6335b022869ade2602dab9bf33f607d2/aiohttp-3.11.16-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9b751a6306f330801665ae69270a8a3993654a85569b3469662efaad6cf5cc50", size = 461106, upload-time = "2025-04-02T02:16:39.961Z" }, + { url = "https://files.pythonhosted.org/packages/4f/85/6b79fb0ea6e913d596d5b949edc2402b20803f51b1a59e1bbc5bb7ba7569/aiohttp-3.11.16-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ad497f38a0d6c329cb621774788583ee12321863cd4bd9feee1effd60f2ad133", size = 453394, upload-time = "2025-04-02T02:16:41.562Z" }, + { url = "https://files.pythonhosted.org/packages/4b/04/e1bb3fcfbd2c26753932c759593a32299aff8625eaa0bf8ff7d9c0c34a36/aiohttp-3.11.16-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca37057625693d097543bd88076ceebeb248291df9d6ca8481349efc0b05dcd0", size = 1666643, upload-time = "2025-04-02T02:16:43.62Z" }, + { url = "https://files.pythonhosted.org/packages/0e/27/97bc0fdd1f439b8f060beb3ba8fb47b908dc170280090801158381ad7942/aiohttp-3.11.16-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5abcbba9f4b463a45c8ca8b7720891200658f6f46894f79517e6cd11f3405ca", size = 1721948, upload-time = "2025-04-02T02:16:45.617Z" }, + { url = "https://files.pythonhosted.org/packages/2c/4f/bc4c5119e75c05ef15c5670ef1563bbe25d4ed4893b76c57b0184d815e8b/aiohttp-3.11.16-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f420bfe862fb357a6d76f2065447ef6f484bc489292ac91e29bc65d2d7a2c84d", size = 1774454, upload-time = "2025-04-02T02:16:48.562Z" }, + { url = "https://files.pythonhosted.org/packages/73/5b/54b42b2150bb26fdf795464aa55ceb1a49c85f84e98e6896d211eabc6670/aiohttp-3.11.16-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58ede86453a6cf2d6ce40ef0ca15481677a66950e73b0a788917916f7e35a0bb", size = 1677785, upload-time = "2025-04-02T02:16:50.367Z" }, + { url = "https://files.pythonhosted.org/packages/10/ee/a0fe68916d3f82eae199b8535624cf07a9c0a0958c7a76e56dd21140487a/aiohttp-3.11.16-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fdec0213244c39973674ca2a7f5435bf74369e7d4e104d6c7473c81c9bcc8c4", size = 1608456, upload-time = "2025-04-02T02:16:52.158Z" }, + { url = "https://files.pythonhosted.org/packages/8b/48/83afd779242b7cf7e1ceed2ff624a86d3221e17798061cf9a79e0b246077/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:72b1b03fb4655c1960403c131740755ec19c5898c82abd3961c364c2afd59fe7", size = 1622424, upload-time = "2025-04-02T02:16:54.386Z" }, + { url = "https://files.pythonhosted.org/packages/6f/27/452f1d5fca1f516f9f731539b7f5faa9e9d3bf8a3a6c3cd7c4b031f20cbd/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:780df0d837276276226a1ff803f8d0fa5f8996c479aeef52eb040179f3156cbd", size = 1660943, upload-time = "2025-04-02T02:16:56.887Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e1/5c7d63143b8d00c83b958b9e78e7048c4a69903c760c1e329bf02bac57a1/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ecdb8173e6c7aa09eee342ac62e193e6904923bd232e76b4157ac0bfa670609f", size = 1622797, upload-time = "2025-04-02T02:16:58.676Z" }, + { url = "https://files.pythonhosted.org/packages/46/9e/2ac29cca2746ee8e449e73cd2fcb3d454467393ec03a269d50e49af743f1/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a6db7458ab89c7d80bc1f4e930cc9df6edee2200127cfa6f6e080cf619eddfbd", size = 1687162, upload-time = "2025-04-02T02:17:01.076Z" }, + { url = "https://files.pythonhosted.org/packages/ad/6b/eaa6768e02edebaf37d77f4ffb74dd55f5cbcbb6a0dbf798ccec7b0ac23b/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2540ddc83cc724b13d1838026f6a5ad178510953302a49e6d647f6e1de82bc34", size = 1718518, upload-time = "2025-04-02T02:17:03.388Z" }, + { url = "https://files.pythonhosted.org/packages/e5/18/dda87cbad29472a51fa058d6d8257dfce168289adaeb358b86bd93af3b20/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3b4e6db8dc4879015b9955778cfb9881897339c8fab7b3676f8433f849425913", size = 1675254, upload-time = "2025-04-02T02:17:05.579Z" }, + { url = "https://files.pythonhosted.org/packages/32/d9/d2fb08c614df401d92c12fcbc60e6e879608d5e8909ef75c5ad8d4ad8aa7/aiohttp-3.11.16-cp313-cp313-win32.whl", hash = "sha256:493910ceb2764f792db4dc6e8e4b375dae1b08f72e18e8f10f18b34ca17d0979", size = 410698, upload-time = "2025-04-02T02:17:07.499Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ed/853e36d5a33c24544cfa46585895547de152dfef0b5c79fa675f6e4b7b87/aiohttp-3.11.16-cp313-cp313-win_amd64.whl", hash = "sha256:42864e70a248f5f6a49fdaf417d9bc62d6e4d8ee9695b24c5916cb4bb666c802", size = 436395, upload-time = "2025-04-02T02:17:09.566Z" }, +] + +[[package]] +name = "aiosignal" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/b5/6d55e80f6d8a08ce22b982eafa278d823b541c925f11ee774b0b9c43473d/aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54", size = 19424, upload-time = "2024-12-13T17:10:40.86Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597, upload-time = "2024-12-13T17:10:38.469Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "anyio" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "sniffio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949, upload-time = "2025-03-17T00:02:54.77Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload-time = "2025-03-17T00:02:52.713Z" }, +] + +[[package]] +name = "appnope" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload-time = "2024-02-06T09:43:11.258Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" }, +] + +[[package]] +name = "asttokens" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978, upload-time = "2024-11-30T04:30:14.439Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918, upload-time = "2024-11-30T04:30:10.946Z" }, +] + +[[package]] +name = "attrs" +version = "25.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload-time = "2025-03-13T11:10:22.779Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" }, +] + +[[package]] +name = "blockbuster" +version = "1.5.24" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "forbiddenfruit", marker = "implementation_name == 'cpython'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/35/c8/1e456a043179f2aef10bcaafea79f6d06c0ac45cc994767a54f680509f3b/blockbuster-1.5.24.tar.gz", hash = "sha256:97645775761a5d425666ec0bc99629b65c7eccdc2f770d2439850682567af4ec", size = 51245, upload-time = "2025-03-18T10:12:06.398Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/c8/57a4c80e5abec29fa9406307a5277527f21210bfc6c2c61c3d8ded36c09b/blockbuster-1.5.24-py3-none-any.whl", hash = "sha256:e703497b55bc72af09d60d1cd746c2f3ba7ce0c446fa256be6ccda5e7d403520", size = 13214, upload-time = "2025-03-18T10:12:04.802Z" }, +] + +[[package]] +name = "certifi" +version = "2025.1.31" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577, upload-time = "2025-01-31T02:16:47.166Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393, upload-time = "2025-01-31T02:16:45.015Z" }, +] + +[[package]] +name = "cffi" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621, upload-time = "2024-09-04T20:45:21.852Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989, upload-time = "2024-09-04T20:44:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802, upload-time = "2024-09-04T20:44:30.289Z" }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792, upload-time = "2024-09-04T20:44:32.01Z" }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893, upload-time = "2024-09-04T20:44:33.606Z" }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810, upload-time = "2024-09-04T20:44:35.191Z" }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200, upload-time = "2024-09-04T20:44:36.743Z" }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447, upload-time = "2024-09-04T20:44:38.492Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358, upload-time = "2024-09-04T20:44:40.046Z" }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469, upload-time = "2024-09-04T20:44:41.616Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475, upload-time = "2024-09-04T20:44:43.733Z" }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload-time = "2024-09-04T20:44:45.309Z" }, +] + +[[package]] +name = "cfgv" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188, upload-time = "2024-12-24T18:12:35.43Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698, upload-time = "2024-12-24T18:11:05.834Z" }, + { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162, upload-time = "2024-12-24T18:11:07.064Z" }, + { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263, upload-time = "2024-12-24T18:11:08.374Z" }, + { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966, upload-time = "2024-12-24T18:11:09.831Z" }, + { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992, upload-time = "2024-12-24T18:11:12.03Z" }, + { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162, upload-time = "2024-12-24T18:11:13.372Z" }, + { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972, upload-time = "2024-12-24T18:11:14.628Z" }, + { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095, upload-time = "2024-12-24T18:11:17.672Z" }, + { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668, upload-time = "2024-12-24T18:11:18.989Z" }, + { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073, upload-time = "2024-12-24T18:11:21.507Z" }, + { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732, upload-time = "2024-12-24T18:11:22.774Z" }, + { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391, upload-time = "2024-12-24T18:11:24.139Z" }, + { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702, upload-time = "2024-12-24T18:11:26.535Z" }, + { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767, upload-time = "2024-12-24T18:12:32.852Z" }, +] + +[[package]] +name = "click" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload-time = "2024-12-21T18:38:44.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload-time = "2024-12-21T18:38:41.666Z" }, +] + +[[package]] +name = "cloudpickle" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/52/39/069100b84d7418bc358d81669d5748efb14b9cceacd2f9c75f550424132f/cloudpickle-3.1.1.tar.gz", hash = "sha256:b216fa8ae4019d5482a8ac3c95d8f6346115d8835911fd4aefd1a445e4242c64", size = 22113, upload-time = "2025-01-14T17:02:05.085Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/e8/64c37fadfc2816a7701fa8a6ed8d87327c7d54eacfbfb6edab14a2f2be75/cloudpickle-3.1.1-py3-none-any.whl", hash = "sha256:c8c5a44295039331ee9dad40ba100a9c7297b6f988e50e87ccdf3765a668350e", size = 20992, upload-time = "2025-01-14T17:02:02.417Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "comm" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/a8/fb783cb0abe2b5fded9f55e5703015cdf1c9c85b3669087c538dd15a6a86/comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", size = 6210, upload-time = "2024-03-12T16:53:41.133Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180, upload-time = "2024-03-12T16:53:39.226Z" }, +] + +[[package]] +name = "cryptography" +version = "44.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/25/4ce80c78963834b8a9fd1cc1266be5ed8d1840785c0f2e1b73b8d128d505/cryptography-44.0.2.tar.gz", hash = "sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0", size = 710807, upload-time = "2025-03-02T00:01:37.692Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/ef/83e632cfa801b221570c5f58c0369db6fa6cef7d9ff859feab1aae1a8a0f/cryptography-44.0.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7", size = 6676361, upload-time = "2025-03-02T00:00:06.528Z" }, + { url = "https://files.pythonhosted.org/packages/30/ec/7ea7c1e4c8fc8329506b46c6c4a52e2f20318425d48e0fe597977c71dbce/cryptography-44.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1", size = 3952350, upload-time = "2025-03-02T00:00:09.537Z" }, + { url = "https://files.pythonhosted.org/packages/27/61/72e3afdb3c5ac510330feba4fc1faa0fe62e070592d6ad00c40bb69165e5/cryptography-44.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb", size = 4166572, upload-time = "2025-03-02T00:00:12.03Z" }, + { url = "https://files.pythonhosted.org/packages/26/e4/ba680f0b35ed4a07d87f9e98f3ebccb05091f3bf6b5a478b943253b3bbd5/cryptography-44.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843", size = 3958124, upload-time = "2025-03-02T00:00:14.518Z" }, + { url = "https://files.pythonhosted.org/packages/9c/e8/44ae3e68c8b6d1cbc59040288056df2ad7f7f03bbcaca6b503c737ab8e73/cryptography-44.0.2-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5", size = 3678122, upload-time = "2025-03-02T00:00:17.212Z" }, + { url = "https://files.pythonhosted.org/packages/27/7b/664ea5e0d1eab511a10e480baf1c5d3e681c7d91718f60e149cec09edf01/cryptography-44.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c", size = 4191831, upload-time = "2025-03-02T00:00:19.696Z" }, + { url = "https://files.pythonhosted.org/packages/2a/07/79554a9c40eb11345e1861f46f845fa71c9e25bf66d132e123d9feb8e7f9/cryptography-44.0.2-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a", size = 3960583, upload-time = "2025-03-02T00:00:22.488Z" }, + { url = "https://files.pythonhosted.org/packages/bb/6d/858e356a49a4f0b591bd6789d821427de18432212e137290b6d8a817e9bf/cryptography-44.0.2-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308", size = 4191753, upload-time = "2025-03-02T00:00:25.038Z" }, + { url = "https://files.pythonhosted.org/packages/b2/80/62df41ba4916067fa6b125aa8c14d7e9181773f0d5d0bd4dcef580d8b7c6/cryptography-44.0.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688", size = 4079550, upload-time = "2025-03-02T00:00:26.929Z" }, + { url = "https://files.pythonhosted.org/packages/f3/cd/2558cc08f7b1bb40683f99ff4327f8dcfc7de3affc669e9065e14824511b/cryptography-44.0.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7", size = 4298367, upload-time = "2025-03-02T00:00:28.735Z" }, + { url = "https://files.pythonhosted.org/packages/71/59/94ccc74788945bc3bd4cf355d19867e8057ff5fdbcac781b1ff95b700fb1/cryptography-44.0.2-cp37-abi3-win32.whl", hash = "sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79", size = 2772843, upload-time = "2025-03-02T00:00:30.592Z" }, + { url = "https://files.pythonhosted.org/packages/ca/2c/0d0bbaf61ba05acb32f0841853cfa33ebb7a9ab3d9ed8bb004bd39f2da6a/cryptography-44.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa", size = 3209057, upload-time = "2025-03-02T00:00:33.393Z" }, + { url = "https://files.pythonhosted.org/packages/9e/be/7a26142e6d0f7683d8a382dd963745e65db895a79a280a30525ec92be890/cryptography-44.0.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3", size = 6677789, upload-time = "2025-03-02T00:00:36.009Z" }, + { url = "https://files.pythonhosted.org/packages/06/88/638865be7198a84a7713950b1db7343391c6066a20e614f8fa286eb178ed/cryptography-44.0.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639", size = 3951919, upload-time = "2025-03-02T00:00:38.581Z" }, + { url = "https://files.pythonhosted.org/packages/d7/fc/99fe639bcdf58561dfad1faa8a7369d1dc13f20acd78371bb97a01613585/cryptography-44.0.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd", size = 4167812, upload-time = "2025-03-02T00:00:42.934Z" }, + { url = "https://files.pythonhosted.org/packages/53/7b/aafe60210ec93d5d7f552592a28192e51d3c6b6be449e7fd0a91399b5d07/cryptography-44.0.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181", size = 3958571, upload-time = "2025-03-02T00:00:46.026Z" }, + { url = "https://files.pythonhosted.org/packages/16/32/051f7ce79ad5a6ef5e26a92b37f172ee2d6e1cce09931646eef8de1e9827/cryptography-44.0.2-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea", size = 3679832, upload-time = "2025-03-02T00:00:48.647Z" }, + { url = "https://files.pythonhosted.org/packages/78/2b/999b2a1e1ba2206f2d3bca267d68f350beb2b048a41ea827e08ce7260098/cryptography-44.0.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699", size = 4193719, upload-time = "2025-03-02T00:00:51.397Z" }, + { url = "https://files.pythonhosted.org/packages/72/97/430e56e39a1356e8e8f10f723211a0e256e11895ef1a135f30d7d40f2540/cryptography-44.0.2-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9", size = 3960852, upload-time = "2025-03-02T00:00:53.317Z" }, + { url = "https://files.pythonhosted.org/packages/89/33/c1cf182c152e1d262cac56850939530c05ca6c8d149aa0dcee490b417e99/cryptography-44.0.2-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23", size = 4193906, upload-time = "2025-03-02T00:00:56.49Z" }, + { url = "https://files.pythonhosted.org/packages/e1/99/87cf26d4f125380dc674233971069bc28d19b07f7755b29861570e513650/cryptography-44.0.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922", size = 4081572, upload-time = "2025-03-02T00:00:59.995Z" }, + { url = "https://files.pythonhosted.org/packages/b3/9f/6a3e0391957cc0c5f84aef9fbdd763035f2b52e998a53f99345e3ac69312/cryptography-44.0.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4", size = 4298631, upload-time = "2025-03-02T00:01:01.623Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a5/5bc097adb4b6d22a24dea53c51f37e480aaec3465285c253098642696423/cryptography-44.0.2-cp39-abi3-win32.whl", hash = "sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5", size = 2773792, upload-time = "2025-03-02T00:01:04.133Z" }, + { url = "https://files.pythonhosted.org/packages/33/cf/1f7649b8b9a3543e042d3f348e398a061923ac05b507f3f4d95f11938aa9/cryptography-44.0.2-cp39-abi3-win_amd64.whl", hash = "sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6", size = 3210957, upload-time = "2025-03-02T00:01:06.987Z" }, +] + +[[package]] +name = "dataclasses-json" +version = "0.6.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "marshmallow" }, + { name = "typing-inspect" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/64/a4/f71d9cf3a5ac257c993b5ca3f93df5f7fb395c725e7f1e6479d2514173c3/dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0", size = 32227, upload-time = "2024-06-09T16:20:19.103Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", size = 28686, upload-time = "2024-06-09T16:20:16.715Z" }, +] + +[[package]] +name = "debugpy" +version = "1.8.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/75/087fe07d40f490a78782ff3b0a30e3968936854105487decdb33446d4b0e/debugpy-1.8.14.tar.gz", hash = "sha256:7cd287184318416850aa8b60ac90105837bb1e59531898c07569d197d2ed5322", size = 1641444, upload-time = "2025-04-10T19:46:10.981Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/e4/395c792b243f2367d84202dc33689aa3d910fb9826a7491ba20fc9e261f5/debugpy-1.8.14-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:329a15d0660ee09fec6786acdb6e0443d595f64f5d096fc3e3ccf09a4259033f", size = 2485676, upload-time = "2025-04-10T19:46:32.96Z" }, + { url = "https://files.pythonhosted.org/packages/ba/f1/6f2ee3f991327ad9e4c2f8b82611a467052a0fb0e247390192580e89f7ff/debugpy-1.8.14-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f920c7f9af409d90f5fd26e313e119d908b0dd2952c2393cd3247a462331f15", size = 4217514, upload-time = "2025-04-10T19:46:34.336Z" }, + { url = "https://files.pythonhosted.org/packages/79/28/b9d146f8f2dc535c236ee09ad3e5ac899adb39d7a19b49f03ac95d216beb/debugpy-1.8.14-cp313-cp313-win32.whl", hash = "sha256:3784ec6e8600c66cbdd4ca2726c72d8ca781e94bce2f396cc606d458146f8f4e", size = 5254756, upload-time = "2025-04-10T19:46:36.199Z" }, + { url = "https://files.pythonhosted.org/packages/e0/62/a7b4a57013eac4ccaef6977966e6bec5c63906dd25a86e35f155952e29a1/debugpy-1.8.14-cp313-cp313-win_amd64.whl", hash = "sha256:684eaf43c95a3ec39a96f1f5195a7ff3d4144e4a18d69bb66beeb1a6de605d6e", size = 5297119, upload-time = "2025-04-10T19:46:38.141Z" }, + { url = "https://files.pythonhosted.org/packages/97/1a/481f33c37ee3ac8040d3d51fc4c4e4e7e61cb08b8bc8971d6032acc2279f/debugpy-1.8.14-py2.py3-none-any.whl", hash = "sha256:5cd9a579d553b6cb9759a7908a41988ee6280b961f24f63336835d9418216a20", size = 5256230, upload-time = "2025-04-10T19:46:54.077Z" }, +] + +[[package]] +name = "decorator" +version = "5.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, +] + +[[package]] +name = "distlib" +version = "0.3.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/dd/1bec4c5ddb504ca60fc29472f3d27e8d4da1257a854e1d96742f15c1d02d/distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403", size = 613923, upload-time = "2024-10-09T18:35:47.551Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973, upload-time = "2024-10-09T18:35:44.272Z" }, +] + +[[package]] +name = "distro" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, +] + +[[package]] +name = "executing" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693, upload-time = "2025-01-22T15:41:29.403Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702, upload-time = "2025-01-22T15:41:25.929Z" }, +] + +[[package]] +name = "filelock" +version = "3.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075, upload-time = "2025-03-14T07:11:40.47Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload-time = "2025-03-14T07:11:39.145Z" }, +] + +[[package]] +name = "forbiddenfruit" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e6/79/d4f20e91327c98096d605646bdc6a5ffedae820f38d378d3515c42ec5e60/forbiddenfruit-0.1.4.tar.gz", hash = "sha256:e3f7e66561a29ae129aac139a85d610dbf3dd896128187ed5454b6421f624253", size = 43756, upload-time = "2021-01-16T21:03:35.401Z" } + +[[package]] +name = "frozenlist" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8f/ed/0f4cec13a93c02c47ec32d81d11c0c1efbadf4a471e3f3ce7cad366cbbd3/frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817", size = 39930, upload-time = "2024-10-23T09:48:29.903Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/3b/915f0bca8a7ea04483622e84a9bd90033bab54bdf485479556c74fd5eaf5/frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953", size = 91538, upload-time = "2024-10-23T09:47:21.176Z" }, + { url = "https://files.pythonhosted.org/packages/c7/d1/a7c98aad7e44afe5306a2b068434a5830f1470675f0e715abb86eb15f15b/frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0", size = 52849, upload-time = "2024-10-23T09:47:22.439Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/76f23bf9ab15d5f760eb48701909645f686f9c64fbb8982674c241fbef14/frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2", size = 50583, upload-time = "2024-10-23T09:47:23.44Z" }, + { url = "https://files.pythonhosted.org/packages/1f/22/462a3dd093d11df623179d7754a3b3269de3b42de2808cddef50ee0f4f48/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f", size = 265636, upload-time = "2024-10-23T09:47:24.82Z" }, + { url = "https://files.pythonhosted.org/packages/80/cf/e075e407fc2ae7328155a1cd7e22f932773c8073c1fc78016607d19cc3e5/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608", size = 270214, upload-time = "2024-10-23T09:47:26.156Z" }, + { url = "https://files.pythonhosted.org/packages/a1/58/0642d061d5de779f39c50cbb00df49682832923f3d2ebfb0fedf02d05f7f/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b", size = 273905, upload-time = "2024-10-23T09:47:27.741Z" }, + { url = "https://files.pythonhosted.org/packages/ab/66/3fe0f5f8f2add5b4ab7aa4e199f767fd3b55da26e3ca4ce2cc36698e50c4/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840", size = 250542, upload-time = "2024-10-23T09:47:28.938Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b8/260791bde9198c87a465224e0e2bb62c4e716f5d198fc3a1dacc4895dbd1/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439", size = 267026, upload-time = "2024-10-23T09:47:30.283Z" }, + { url = "https://files.pythonhosted.org/packages/2e/a4/3d24f88c527f08f8d44ade24eaee83b2627793fa62fa07cbb7ff7a2f7d42/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de", size = 257690, upload-time = "2024-10-23T09:47:32.388Z" }, + { url = "https://files.pythonhosted.org/packages/de/9a/d311d660420b2beeff3459b6626f2ab4fb236d07afbdac034a4371fe696e/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641", size = 253893, upload-time = "2024-10-23T09:47:34.274Z" }, + { url = "https://files.pythonhosted.org/packages/c6/23/e491aadc25b56eabd0f18c53bb19f3cdc6de30b2129ee0bc39cd387cd560/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e", size = 267006, upload-time = "2024-10-23T09:47:35.499Z" }, + { url = "https://files.pythonhosted.org/packages/08/c4/ab918ce636a35fb974d13d666dcbe03969592aeca6c3ab3835acff01f79c/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9", size = 276157, upload-time = "2024-10-23T09:47:37.522Z" }, + { url = "https://files.pythonhosted.org/packages/c0/29/3b7a0bbbbe5a34833ba26f686aabfe982924adbdcafdc294a7a129c31688/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03", size = 264642, upload-time = "2024-10-23T09:47:38.75Z" }, + { url = "https://files.pythonhosted.org/packages/ab/42/0595b3dbffc2e82d7fe658c12d5a5bafcd7516c6bf2d1d1feb5387caa9c1/frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c", size = 44914, upload-time = "2024-10-23T09:47:40.145Z" }, + { url = "https://files.pythonhosted.org/packages/17/c4/b7db1206a3fea44bf3b838ca61deb6f74424a8a5db1dd53ecb21da669be6/frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28", size = 51167, upload-time = "2024-10-23T09:47:41.812Z" }, + { url = "https://files.pythonhosted.org/packages/c6/c8/a5be5b7550c10858fcf9b0ea054baccab474da77d37f1e828ce043a3a5d4/frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", size = 11901, upload-time = "2024-10-23T09:48:28.851Z" }, +] + +[[package]] +name = "greenlet" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/9c/666d8c71b18d0189cf801c0e0b31c4bfc609ac823883286045b1f3ae8994/greenlet-3.2.0.tar.gz", hash = "sha256:1d2d43bd711a43db8d9b9187500e6432ddb4fafe112d082ffabca8660a9e01a7", size = 183685, upload-time = "2025-04-15T16:21:26.141Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/43/c0b655d4d7eae19282b028bcec449e5c80626ad0d8d0ca3703f9b1c29258/greenlet-3.2.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:b86a3ccc865ae601f446af042707b749eebc297928ea7bd0c5f60c56525850be", size = 269131, upload-time = "2025-04-15T16:19:19.469Z" }, + { url = "https://files.pythonhosted.org/packages/7c/7d/c8f51c373c7f7ac0f73d04a6fd77ab34f6f643cb41a0d186d05ba96708e7/greenlet-3.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:144283ad88ed77f3ebd74710dd419b55dd15d18704b0ae05935766a93f5671c5", size = 637323, upload-time = "2025-04-15T16:49:02.677Z" }, + { url = "https://files.pythonhosted.org/packages/89/65/c3ee41b2e56586737d6e124b250583695628ffa6b324855b3a1267a8d1d9/greenlet-3.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5be69cd50994b8465c3ad1467f9e63001f76e53a89440ad4440d1b6d52591280", size = 651430, upload-time = "2025-04-15T16:50:43.445Z" }, + { url = "https://files.pythonhosted.org/packages/f0/07/33bd7a3dcde1db7259371d026ce76be1eb653d2d892334fc79a500b3c5ee/greenlet-3.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:47aeadd1e8fbdef8fdceb8fb4edc0cbb398a57568d56fd68f2bc00d0d809e6b6", size = 645798, upload-time = "2025-04-15T16:55:03.795Z" }, + { url = "https://files.pythonhosted.org/packages/35/5b/33c221a6a867030b0b770513a1b78f6c30e04294131dafdc8da78906bbe6/greenlet-3.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18adc14ab154ca6e53eecc9dc50ff17aeb7ba70b7e14779b26e16d71efa90038", size = 648271, upload-time = "2025-04-15T16:22:42.458Z" }, + { url = "https://files.pythonhosted.org/packages/4d/dd/d6452248fa6093504e3b7525dc2bdc4e55a4296ec6ee74ba241a51d852e2/greenlet-3.2.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8622b33d8694ec373ad55050c3d4e49818132b44852158442e1931bb02af336", size = 606779, upload-time = "2025-04-15T16:22:41.417Z" }, + { url = "https://files.pythonhosted.org/packages/9d/24/160f04d2589bcb15b8661dcd1763437b22e01643626899a4139bf98f02af/greenlet-3.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:e8ac9a2c20fbff3d0b853e9ef705cdedb70d9276af977d1ec1cde86a87a4c821", size = 1117968, upload-time = "2025-04-15T16:52:53.627Z" }, + { url = "https://files.pythonhosted.org/packages/6c/ff/c6e3f3a5168fef5209cfd9498b2b5dd77a0bf29dfc686a03dcc614cf4432/greenlet-3.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:cd37273dc7ca1d5da149b58c8b3ce0711181672ba1b09969663905a765affe21", size = 1145510, upload-time = "2025-04-15T16:23:01.873Z" }, + { url = "https://files.pythonhosted.org/packages/dc/62/5215e374819052e542b5bde06bd7d4a171454b6938c96a2384f21cb94279/greenlet-3.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8a8940a8d301828acd8b9f3f85db23069a692ff2933358861b19936e29946b95", size = 296004, upload-time = "2025-04-15T16:55:46.007Z" }, + { url = "https://files.pythonhosted.org/packages/62/6d/dc9c909cba5cbf4b0833fce69912927a8ca74791c23c47b9fd4f28092108/greenlet-3.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee59db626760f1ca8da697a086454210d36a19f7abecc9922a2374c04b47735b", size = 629900, upload-time = "2025-04-15T16:49:04.099Z" }, + { url = "https://files.pythonhosted.org/packages/5e/a9/f3f304fbbbd604858ff3df303d7fa1d8f7f9e45a6ef74481aaf03aaac021/greenlet-3.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7154b13ef87a8b62fc05419f12d75532d7783586ad016c57b5de8a1c6feeb517", size = 635270, upload-time = "2025-04-15T16:50:44.769Z" }, + { url = "https://files.pythonhosted.org/packages/34/92/4b7b4e2e23ecc723cceef9fe3898e78c8e14e106cc7ba2f276a66161da3e/greenlet-3.2.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:199453d64b02d0c9d139e36d29681efd0e407ed8e2c0bf89d88878d6a787c28f", size = 632534, upload-time = "2025-04-15T16:55:05.203Z" }, + { url = "https://files.pythonhosted.org/packages/da/7f/91f0ecbe72c9d789fb7f400b39da9d1e87fcc2cf8746a9636479ba79ab01/greenlet-3.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0010e928e1901d36625f21d008618273f9dda26b516dbdecf873937d39c9dff0", size = 628826, upload-time = "2025-04-15T16:22:44.545Z" }, + { url = "https://files.pythonhosted.org/packages/9f/59/e449a44ce52b13751f55376d85adc155dd311608f6d2aa5b6bd2c8d15486/greenlet-3.2.0-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6005f7a86de836a1dc4b8d824a2339cdd5a1ca7cb1af55ea92575401f9952f4c", size = 593697, upload-time = "2025-04-15T16:22:43.796Z" }, + { url = "https://files.pythonhosted.org/packages/bb/09/cca3392927c5c990b7a8ede64ccd0712808438d6490d63ce6b8704d6df5f/greenlet-3.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:17fd241c0d50bacb7ce8ff77a30f94a2d0ca69434ba2e0187cf95a5414aeb7e1", size = 1105762, upload-time = "2025-04-15T16:52:55.245Z" }, + { url = "https://files.pythonhosted.org/packages/4d/b9/3d201f819afc3b7a8cd7ebe645f1a17799603e2d62c968154518f79f4881/greenlet-3.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:7b17a26abc6a1890bf77d5d6b71c0999705386b00060d15c10b8182679ff2790", size = 1125173, upload-time = "2025-04-15T16:23:03.009Z" }, + { url = "https://files.pythonhosted.org/packages/80/7b/773a30602234597fc2882091f8e1d1a38ea0b4419d99ca7ed82c827e2c3a/greenlet-3.2.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:397b6bbda06f8fe895893d96218cd6f6d855a6701dc45012ebe12262423cec8b", size = 269908, upload-time = "2025-04-15T16:20:33.58Z" }, +] + +[[package]] +name = "h11" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418, upload-time = "2022-09-25T15:40:01.519Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259, upload-time = "2022-09-25T15:39:59.68Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/45/ad3e1b4d448f22c0cff4f5692f5ed0666658578e358b8d58a19846048059/httpcore-1.0.8.tar.gz", hash = "sha256:86e94505ed24ea06514883fd44d2bc02d90e77e7979c8eb71b90f41d364a1bad", size = 85385, upload-time = "2025-04-11T14:42:46.661Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/8d/f052b1e336bb2c1fc7ed1aaed898aa570c0b61a09707b108979d9fc6e308/httpcore-1.0.8-py3-none-any.whl", hash = "sha256:5254cf149bcb5f75e9d1b2b9f729ea4a4b883d1ad7379fc632b727cec23674be", size = 78732, upload-time = "2025-04-11T14:42:44.896Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "httpx-sse" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/60/8f4281fa9bbf3c8034fd54c0e7412e66edbab6bc74c4996bd616f8d0406e/httpx-sse-0.4.0.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721", size = 12624, upload-time = "2023-12-22T08:01:21.083Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f", size = 7819, upload-time = "2023-12-22T08:01:19.89Z" }, +] + +[[package]] +name = "identify" +version = "2.6.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9b/98/a71ab060daec766acc30fb47dfca219d03de34a70d616a79a38c6066c5bf/identify-2.6.9.tar.gz", hash = "sha256:d40dfe3142a1421d8518e3d3985ef5ac42890683e32306ad614a29490abeb6bf", size = 99249, upload-time = "2025-03-08T15:54:13.632Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/ce/0845144ed1f0e25db5e7a79c2354c1da4b5ce392b8966449d5db8dca18f1/identify-2.6.9-py2.py3-none-any.whl", hash = "sha256:c98b4322da415a8e5a70ff6e51fbc2d2932c015532d77e9f8537b4ba7813b150", size = 99101, upload-time = "2025-03-08T15:54:12.026Z" }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } +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 = "image" +version = "0.1.0" +source = { virtual = "agents/image" } + +[[package]] +name = "iniconfig" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, +] + +[[package]] +name = "ipykernel" +version = "6.29.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appnope", marker = "sys_platform == 'darwin'" }, + { name = "comm" }, + { name = "debugpy" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "matplotlib-inline" }, + { name = "nest-asyncio" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/67594cb0c7055dc50814b21731c22a601101ea3b1b50a9a1b090e11f5d0f/ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215", size = 163367, upload-time = "2024-07-01T14:07:22.543Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173, upload-time = "2024-07-01T14:07:19.603Z" }, +] + +[[package]] +name = "ipython" +version = "9.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "ipython-pygments-lexers" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/70/9a/6b8984bedc990f3a4aa40ba8436dea27e23d26a64527de7c2e5e12e76841/ipython-9.1.0.tar.gz", hash = "sha256:a47e13a5e05e02f3b8e1e7a0f9db372199fe8c3763532fe7a1e0379e4e135f16", size = 4373688, upload-time = "2025-04-07T10:18:28.704Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/9d/4ff2adf55d1b6e3777b0303fdbe5b723f76e46cba4a53a32fe82260d2077/ipython-9.1.0-py3-none-any.whl", hash = "sha256:2df07257ec2f84a6b346b8d83100bcf8fa501c6e01ab75cd3799b0bb253b3d2a", size = 604053, upload-time = "2025-04-07T10:18:24.869Z" }, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, +] + +[[package]] +name = "jedi" +version = "0.19.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, +] + +[[package]] +name = "jiter" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1e/c2/e4562507f52f0af7036da125bb699602ead37a2332af0788f8e0a3417f36/jiter-0.9.0.tar.gz", hash = "sha256:aadba0964deb424daa24492abc3d229c60c4a31bfee205aedbf1acc7639d7893", size = 162604, upload-time = "2025-03-10T21:37:03.278Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/1b/4cd165c362e8f2f520fdb43245e2b414f42a255921248b4f8b9c8d871ff1/jiter-0.9.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2764891d3f3e8b18dce2cff24949153ee30c9239da7c00f032511091ba688ff7", size = 308197, upload-time = "2025-03-10T21:36:03.828Z" }, + { url = "https://files.pythonhosted.org/packages/13/aa/7a890dfe29c84c9a82064a9fe36079c7c0309c91b70c380dc138f9bea44a/jiter-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:387b22fbfd7a62418d5212b4638026d01723761c75c1c8232a8b8c37c2f1003b", size = 318160, upload-time = "2025-03-10T21:36:05.281Z" }, + { url = "https://files.pythonhosted.org/packages/6a/38/5888b43fc01102f733f085673c4f0be5a298f69808ec63de55051754e390/jiter-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d8da8629ccae3606c61d9184970423655fb4e33d03330bcdfe52d234d32f69", size = 341259, upload-time = "2025-03-10T21:36:06.716Z" }, + { url = "https://files.pythonhosted.org/packages/3d/5e/bbdbb63305bcc01006de683b6228cd061458b9b7bb9b8d9bc348a58e5dc2/jiter-0.9.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1be73d8982bdc278b7b9377426a4b44ceb5c7952073dd7488e4ae96b88e1103", size = 363730, upload-time = "2025-03-10T21:36:08.138Z" }, + { url = "https://files.pythonhosted.org/packages/75/85/53a3edc616992fe4af6814c25f91ee3b1e22f7678e979b6ea82d3bc0667e/jiter-0.9.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2228eaaaa111ec54b9e89f7481bffb3972e9059301a878d085b2b449fbbde635", size = 405126, upload-time = "2025-03-10T21:36:10.934Z" }, + { url = "https://files.pythonhosted.org/packages/ae/b3/1ee26b12b2693bd3f0b71d3188e4e5d817b12e3c630a09e099e0a89e28fa/jiter-0.9.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:11509bfecbc319459647d4ac3fd391d26fdf530dad00c13c4dadabf5b81f01a4", size = 393668, upload-time = "2025-03-10T21:36:12.468Z" }, + { url = "https://files.pythonhosted.org/packages/11/87/e084ce261950c1861773ab534d49127d1517b629478304d328493f980791/jiter-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f22238da568be8bbd8e0650e12feeb2cfea15eda4f9fc271d3b362a4fa0604d", size = 352350, upload-time = "2025-03-10T21:36:14.148Z" }, + { url = "https://files.pythonhosted.org/packages/f0/06/7dca84b04987e9df563610aa0bc154ea176e50358af532ab40ffb87434df/jiter-0.9.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17f5d55eb856597607562257c8e36c42bc87f16bef52ef7129b7da11afc779f3", size = 384204, upload-time = "2025-03-10T21:36:15.545Z" }, + { url = "https://files.pythonhosted.org/packages/16/2f/82e1c6020db72f397dd070eec0c85ebc4df7c88967bc86d3ce9864148f28/jiter-0.9.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6a99bed9fbb02f5bed416d137944419a69aa4c423e44189bc49718859ea83bc5", size = 520322, upload-time = "2025-03-10T21:36:17.016Z" }, + { url = "https://files.pythonhosted.org/packages/36/fd/4f0cd3abe83ce208991ca61e7e5df915aa35b67f1c0633eb7cf2f2e88ec7/jiter-0.9.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e057adb0cd1bd39606100be0eafe742de2de88c79df632955b9ab53a086b3c8d", size = 512184, upload-time = "2025-03-10T21:36:18.47Z" }, + { url = "https://files.pythonhosted.org/packages/a0/3c/8a56f6d547731a0b4410a2d9d16bf39c861046f91f57c98f7cab3d2aa9ce/jiter-0.9.0-cp313-cp313-win32.whl", hash = "sha256:f7e6850991f3940f62d387ccfa54d1a92bd4bb9f89690b53aea36b4364bcab53", size = 206504, upload-time = "2025-03-10T21:36:19.809Z" }, + { url = "https://files.pythonhosted.org/packages/f4/1c/0c996fd90639acda75ed7fa698ee5fd7d80243057185dc2f63d4c1c9f6b9/jiter-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:c8ae3bf27cd1ac5e6e8b7a27487bf3ab5f82318211ec2e1346a5b058756361f7", size = 204943, upload-time = "2025-03-10T21:36:21.536Z" }, + { url = "https://files.pythonhosted.org/packages/78/0f/77a63ca7aa5fed9a1b9135af57e190d905bcd3702b36aca46a01090d39ad/jiter-0.9.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0b2827fb88dda2cbecbbc3e596ef08d69bda06c6f57930aec8e79505dc17001", size = 317281, upload-time = "2025-03-10T21:36:22.959Z" }, + { url = "https://files.pythonhosted.org/packages/f9/39/a3a1571712c2bf6ec4c657f0d66da114a63a2e32b7e4eb8e0b83295ee034/jiter-0.9.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062b756ceb1d40b0b28f326cba26cfd575a4918415b036464a52f08632731e5a", size = 350273, upload-time = "2025-03-10T21:36:24.414Z" }, + { url = "https://files.pythonhosted.org/packages/ee/47/3729f00f35a696e68da15d64eb9283c330e776f3b5789bac7f2c0c4df209/jiter-0.9.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6f7838bc467ab7e8ef9f387bd6de195c43bad82a569c1699cb822f6609dd4cdf", size = 206867, upload-time = "2025-03-10T21:36:25.843Z" }, +] + +[[package]] +name = "jsonpatch" +version = "1.33" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonpointer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/78/18813351fe5d63acad16aec57f94ec2b70a09e53ca98145589e185423873/jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c", size = 21699, upload-time = "2023-06-26T12:07:29.144Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/07/02e16ed01e04a374e644b575638ec7987ae846d25ad97bcc9945a3ee4b0e/jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade", size = 12898, upload-time = "2023-06-16T21:01:28.466Z" }, +] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114, upload-time = "2024-06-10T19:24:42.462Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595, upload-time = "2024-06-10T19:24:40.698Z" }, +] + +[[package]] +name = "jsonschema-rs" +version = "0.29.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/b4/33a9b25cad41d1e533c1ab7ff30eaec50628dd1bcb92171b99a2e944d61f/jsonschema_rs-0.29.1.tar.gz", hash = "sha256:a9f896a9e4517630374f175364705836c22f09d5bd5bbb06ec0611332b6702fd", size = 1406679, upload-time = "2025-02-08T21:25:12.639Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/9b/d642024e8b39753b789598363fd5998eb3053b52755a5df6a021d53741d5/jsonschema_rs-0.29.1-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0afee5f31a940dec350a33549ec03f2d1eda2da3049a15cd951a266a57ef97ee", size = 3824864, upload-time = "2025-02-08T21:24:32.252Z" }, + { url = "https://files.pythonhosted.org/packages/aa/3d/48a7baa2373b941e89a12e720dae123fd0a663c28c4e82213a29c89a4715/jsonschema_rs-0.29.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:c38453a5718bcf2ad1b0163d128814c12829c45f958f9407c69009d8b94a1232", size = 1966084, upload-time = "2025-02-08T21:24:33.8Z" }, + { url = "https://files.pythonhosted.org/packages/1e/e4/f260917a17bb28bb1dec6fa5e869223341fac2c92053aa9bd23c1caaefa0/jsonschema_rs-0.29.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5dc8bdb1067bf4f6d2f80001a636202dc2cea027b8579f1658ce8e736b06557f", size = 2062430, upload-time = "2025-02-08T21:24:35.174Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e7/61353403b76768601d802afa5b7b5902d52c33d1dd0f3159aafa47463634/jsonschema_rs-0.29.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bcfe23992623a540169d0845ea8678209aa2fe7179941dc7c512efc0c2b6b46", size = 2065443, upload-time = "2025-02-08T21:24:36.778Z" }, + { url = "https://files.pythonhosted.org/packages/40/ed/40b971a09f46a22aa956071ea159413046e9d5fcd280a5910da058acdeb2/jsonschema_rs-0.29.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f2a526c0deacd588864d3400a0997421dffef6fe1df5cfda4513a453c01ad42", size = 2082606, upload-time = "2025-02-08T21:24:38.388Z" }, + { url = "https://files.pythonhosted.org/packages/bc/59/1c142e1bfb87d57c18fb189149f7aa8edf751725d238d787015278b07600/jsonschema_rs-0.29.1-cp313-cp313-win32.whl", hash = "sha256:68acaefb54f921243552d15cfee3734d222125584243ca438de4444c5654a8a3", size = 1700666, upload-time = "2025-02-08T21:24:40.573Z" }, + { url = "https://files.pythonhosted.org/packages/13/e8/f0ad941286cd350b879dd2b3c848deecd27f0b3fbc0ff44f2809ad59718d/jsonschema_rs-0.29.1-cp313-cp313-win_amd64.whl", hash = "sha256:1c4e5a61ac760a2fc3856a129cc84aa6f8fba7b9bc07b19fe4101050a8ecc33c", size = 1871619, upload-time = "2025-02-08T21:24:42.286Z" }, +] + +[[package]] +name = "jupyter-client" +version = "8.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019, upload-time = "2024-09-17T10:44:17.613Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105, upload-time = "2024-09-17T10:44:15.218Z" }, +] + +[[package]] +name = "jupyter-core" +version = "5.7.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/11/b56381fa6c3f4cc5d2cf54a7dbf98ad9aa0b339ef7a601d6053538b079a7/jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9", size = 87629, upload-time = "2024-03-12T12:37:35.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", size = 28965, upload-time = "2024-03-12T12:37:32.36Z" }, +] + +[[package]] +name = "langchain" +version = "0.3.23" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, + { name = "langchain-text-splitters" }, + { name = "langsmith" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "sqlalchemy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/47/ea/b0de568ca17614d5c00275c4ca506af4139cc7c51d0418802b2447055c00/langchain-0.3.23.tar.gz", hash = "sha256:d95004afe8abebb52d51d6026270248da3f4b53d93e9bf699f76005e0c83ad34", size = 10225576, upload-time = "2025-04-04T14:12:09.713Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/49/6e933837da1931c9db745967282ff8bfff51bc3faec0eade846b12203b75/langchain-0.3.23-py3-none-any.whl", hash = "sha256:084f05ee7e80b7c3f378ebadd7309f2a37868ce2906fa0ae64365a67843ade3d", size = 1011778, upload-time = "2025-04-04T14:12:07.704Z" }, +] + +[[package]] +name = "langchain-community" +version = "0.3.21" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "dataclasses-json" }, + { name = "httpx-sse" }, + { name = "langchain" }, + { name = "langchain-core" }, + { name = "langsmith" }, + { name = "numpy" }, + { name = "pydantic-settings" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "sqlalchemy" }, + { name = "tenacity" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d8/be/5288a737069570741d46390028b4e8518354329345294ca89fcb2d44a9c1/langchain_community-0.3.21.tar.gz", hash = "sha256:b87b9992cbeea7553ed93e3d39faf9893a8690318485f7dc861751c7878729f7", size = 33226597, upload-time = "2025-04-04T14:19:42.545Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/72/4046a132a180b569265bc8aa7ecd6f958f6c11085bdf68c7e1bbe52f1907/langchain_community-0.3.21-py3-none-any.whl", hash = "sha256:8cb9bbb7ef15e5eea776193528dd0e0e1299047146d0c78b6c696ae2dc62e81f", size = 2526687, upload-time = "2025-04-04T14:19:39.586Z" }, +] + +[[package]] +name = "langchain-core" +version = "0.3.52" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonpatch" }, + { name = "langsmith" }, + { name = "packaging" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "tenacity" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e0/5e/55fe9d77fce032191012454297ce19c4fdfb3801f7887a4907e923cd8886/langchain_core-0.3.52.tar.gz", hash = "sha256:f1981ec9efa4fceb11ff5ca57f5f9c8e22859cea3a94f8a044e6de8815afbd57", size = 552963, upload-time = "2025-04-15T16:28:30.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/78/782a9e600377ca73339943e96776daf70bed38ddc69313dd769c505dad6f/langchain_core-0.3.52-py3-none-any.whl", hash = "sha256:cd137109c1e3d04f5a582c2cae9539b2cd5e4b795f486b58969dbc3d0387fe7c", size = 433586, upload-time = "2025-04-15T16:28:28.05Z" }, +] + +[[package]] +name = "langchain-openai" +version = "0.3.13" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, + { name = "openai" }, + { name = "tiktoken" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/b6/c8e86fa8fd3c6feab9c976da505e29abb50fc29fd323f869d14645d077a5/langchain_openai-0.3.13.tar.gz", hash = "sha256:75038efbf686f4b5fe2b6bdb75c43790d563ecd61984fd1d51d6d51c53609d64", size = 269759, upload-time = "2025-04-15T18:08:14.408Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/9d/be6d6a15b22a97209060f4f10d7160626bb173c4b986db373972c965b9c8/langchain_openai-0.3.13-py3-none-any.whl", hash = "sha256:2ca3f1865df32d03c3bd85c77f11f0ffd81b157b4e363291741c65c81463606a", size = 61691, upload-time = "2025-04-15T18:08:11.03Z" }, +] + +[[package]] +name = "langchain-text-splitters" +version = "0.3.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/ac/b4a25c5716bb0103b1515f1f52cc69ffb1035a5a225ee5afe3aed28bf57b/langchain_text_splitters-0.3.8.tar.gz", hash = "sha256:116d4b9f2a22dda357d0b79e30acf005c5518177971c66a9f1ab0edfdb0f912e", size = 42128, upload-time = "2025-04-04T14:03:51.521Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/a3/3696ff2444658053c01b6b7443e761f28bb71217d82bb89137a978c5f66f/langchain_text_splitters-0.3.8-py3-none-any.whl", hash = "sha256:e75cc0f4ae58dcf07d9f18776400cf8ade27fadd4ff6d264df6278bb302f6f02", size = 32440, upload-time = "2025-04-04T14:03:50.6Z" }, +] + +[[package]] +name = "langgraph" +version = "0.3.30" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, + { name = "langgraph-checkpoint" }, + { name = "langgraph-prebuilt" }, + { name = "langgraph-sdk" }, + { name = "xxhash" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/b2/a3aecc5bd803e5a79507915433287a8fc3407c4382014a3e0fa091fea25e/langgraph-0.3.30.tar.gz", hash = "sha256:c1bc664072468d90cb27544cbc958117fca0c16bada20ff578817dacf63d941c", size = 120121, upload-time = "2025-04-14T21:15:03.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/66/23428c03a826ae3d842a15f234065248eee0f837502fb96658f59396703e/langgraph-0.3.30-py3-none-any.whl", hash = "sha256:879bd683248911e6a3c15a694256577c3335d68c1dce4ff5c7cc858fa5e9489a", size = 144969, upload-time = "2025-04-14T21:15:02.239Z" }, +] + +[[package]] +name = "langgraph-api" +version = "0.1.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cloudpickle" }, + { name = "cryptography" }, + { name = "httpx" }, + { name = "jsonschema-rs" }, + { name = "langchain-core" }, + { name = "langgraph" }, + { name = "langgraph-checkpoint" }, + { name = "langgraph-sdk" }, + { name = "langsmith" }, + { name = "orjson" }, + { name = "pyjwt" }, + { name = "sse-starlette" }, + { name = "starlette" }, + { name = "structlog" }, + { name = "tenacity" }, + { name = "uvicorn" }, + { name = "watchfiles" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/de/83/806a1e9915d2584004bf78390a40983b366b0f1b4500706a31100e84a9d5/langgraph_api-0.1.7.tar.gz", hash = "sha256:9b1f8ff1cdbea3b49e1f54f35d13c5c373eeb46f2c9c854e39214003bb5ef08e", size = 185999, upload-time = "2025-04-15T23:04:23.989Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/ef/76a5ffcb608535600ecdd33aea05b1d4ae0f3f5e2ab4a98ff488bafe1a69/langgraph_api-0.1.7-py3-none-any.whl", hash = "sha256:712604e54b79c21cbdffa1031dcc5734d21b4b57294769aebabe1f6a5c8718e2", size = 221149, upload-time = "2025-04-15T23:04:22.367Z" }, +] + +[[package]] +name = "langgraph-checkpoint" +version = "2.0.24" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, + { name = "ormsgpack" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0d/df/bacef68562ba4c391ded751eecda8e579ec78a581506064cf625e0ebd93a/langgraph_checkpoint-2.0.24.tar.gz", hash = "sha256:9596dad332344e7e871257be464df8a07c2e9bac66143081b11b9422b0167e5b", size = 37328, upload-time = "2025-04-02T22:47:34.255Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/60/30397e8fd2b7dead3754aa79d708caff9dbb371f30b4cd21802c60f6b921/langgraph_checkpoint-2.0.24-py3-none-any.whl", hash = "sha256:3836e2909ef2387d1fa8d04ee3e2a353f980d519fd6c649af352676dc73d66b8", size = 42028, upload-time = "2025-04-02T22:47:33.017Z" }, +] + +[[package]] +name = "langgraph-cli" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/39/64ca407c49918cc70c5d2afc223f60962f6e0cf03f40c96f36d5c690cb72/langgraph_cli-0.2.3.tar.gz", hash = "sha256:d9ef97dd5be14b19d98862d19da09abaccf3206ab3822cfe79c728d4f43d6821", size = 30539, upload-time = "2025-04-11T14:52:18.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/02/740b4fb513213111a041ca654ab0fc04fb9c16894a26894b39a7916f61c5/langgraph_cli-0.2.3-py3-none-any.whl", hash = "sha256:1c2ea0e83081066e1a1cf9a55ec1fe370fd6ee58e6b40e1845f017fa5f448eee", size = 33405, upload-time = "2025-04-11T14:52:16.613Z" }, +] + +[package.optional-dependencies] +inmem = [ + { name = "langgraph-api", marker = "python_full_version < '4.0'" }, + { name = "langgraph-runtime-inmem", marker = "python_full_version < '4.0'" }, + { name = "python-dotenv" }, +] + +[[package]] +name = "langgraph-prebuilt" +version = "0.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, + { name = "langgraph-checkpoint" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/57/30/f31f0e076c37d097b53e4cff5d479a3686e1991f6c86a1a4727d5d1f5489/langgraph_prebuilt-0.1.8.tar.gz", hash = "sha256:4de7659151829b2b955b6798df6800e580e617782c15c2c5b29b139697491831", size = 24543, upload-time = "2025-04-03T16:04:19.932Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/72/9e092665502f8f52f2708065ed14fbbba3f95d1a1b65d62049b0c5fcdf00/langgraph_prebuilt-0.1.8-py3-none-any.whl", hash = "sha256:ae97b828ae00be2cefec503423aa782e1bff165e9b94592e224da132f2526968", size = 25903, upload-time = "2025-04-03T16:04:18.993Z" }, +] + +[[package]] +name = "langgraph-runtime-inmem" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "blockbuster" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cb/14/6b4de92d8788c0118e5bfc79c8394370de77a0ffcc119a6dacaa4d923dd3/langgraph_runtime_inmem-0.0.4.tar.gz", hash = "sha256:15757ce7412ba503cd169e4c1946d0703e7c71d4951d578b2ae592a8a71ab039", size = 22468, upload-time = "2025-04-11T23:03:33.095Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/7b/40a447b6851e659aea938f75a4fcc4a163da20bc0d8d876be61413dd3456/langgraph_runtime_inmem-0.0.4-py3-none-any.whl", hash = "sha256:6793e4c93039bfe522908b5990b318b1db347ab82c274f38fa8b826f21e9f9cf", size = 26745, upload-time = "2025-04-11T23:03:32.106Z" }, +] + +[[package]] +name = "langgraph-sdk" +version = "0.1.61" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, + { name = "orjson" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f0/c6/a11de2c770e1ac2774e2f19fdbd982b8df079e4206376456e14af395a3f0/langgraph_sdk-0.1.61.tar.gz", hash = "sha256:87dd1f07ab82da8875ac343268ece8bf5414632017ebc9d1cef4b523962fd601", size = 44136, upload-time = "2025-04-03T01:53:09.317Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/2b/85e796d8b4aad892c5d2bccc0def124fcdc2c9852dfa121adadfc41085b2/langgraph_sdk-0.1.61-py3-none-any.whl", hash = "sha256:f2d774b12497c428862993090622d51e0dbc3f53e0cee3d74a13c7495d835cc6", size = 47249, upload-time = "2025-04-03T01:53:08.067Z" }, +] + +[[package]] +name = "langsmith" +version = "0.3.31" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, + { name = "orjson", marker = "platform_python_implementation != 'PyPy'" }, + { name = "packaging" }, + { name = "pydantic" }, + { name = "requests" }, + { name = "requests-toolbelt" }, + { name = "zstandard" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a5/d0/59101fe1ad16a914b1ebde82c2b24524872dae5feff2d5b7405ab3b82f47/langsmith-0.3.31.tar.gz", hash = "sha256:8d20bd08fa6c3bce54cb600ddc521cd218a1c3410f90d9266179bf83a7ff0897", size = 343600, upload-time = "2025-04-15T00:44:05.093Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/c3/5db3d0977bb53e16eab834f2eea6e1c68d327e2f5c25b88f6506ef06e692/langsmith-0.3.31-py3-none-any.whl", hash = "sha256:ee780ae3eac69998c336817c0b9f5ccfecaaaa3e67d94b7ef726b58ab3e72a25", size = 358251, upload-time = "2025-04-15T00:44:02.794Z" }, +] + +[[package]] +name = "management" +version = "0.1.0" +source = { virtual = "agents/management" } + +[[package]] +name = "marshmallow" +version = "3.26.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/5e/5e53d26b42ab75491cda89b871dab9e97c840bf12c63ec58a1919710cd06/marshmallow-3.26.1.tar.gz", hash = "sha256:e6d8affb6cb61d39d26402096dc0aee12d5a26d490a121f118d2e81dc0719dc6", size = 221825, upload-time = "2025-02-03T15:32:25.093Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/75/51952c7b2d3873b44a0028b1bd26a25078c18f92f256608e8d1dc61b39fd/marshmallow-3.26.1-py3-none-any.whl", hash = "sha256:3350409f20a70a7e4e11a27661187b77cdcaeb20abca41c1454fe33636bea09c", size = 50878, upload-time = "2025-02-03T15:32:22.295Z" }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159, upload-time = "2024-04-15T13:44:44.803Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899, upload-time = "2024-04-15T13:44:43.265Z" }, +] + +[[package]] +name = "multidict" +version = "6.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/2c/e367dfb4c6538614a0c9453e510d75d66099edf1c4e69da1b5ce691a1931/multidict-6.4.3.tar.gz", hash = "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec", size = 89372, upload-time = "2025-04-10T22:20:17.956Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/4b/86fd786d03915c6f49998cf10cd5fe6b6ac9e9a071cb40885d2e080fb90d/multidict-6.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474", size = 63831, upload-time = "2025-04-10T22:18:48.748Z" }, + { url = "https://files.pythonhosted.org/packages/45/05/9b51fdf7aef2563340a93be0a663acba2c428c4daeaf3960d92d53a4a930/multidict-6.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd", size = 37888, upload-time = "2025-04-10T22:18:50.021Z" }, + { url = "https://files.pythonhosted.org/packages/0b/43/53fc25394386c911822419b522181227ca450cf57fea76e6188772a1bd91/multidict-6.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b", size = 36852, upload-time = "2025-04-10T22:18:51.246Z" }, + { url = "https://files.pythonhosted.org/packages/8a/68/7b99c751e822467c94a235b810a2fd4047d4ecb91caef6b5c60116991c4b/multidict-6.4.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3", size = 223644, upload-time = "2025-04-10T22:18:52.965Z" }, + { url = "https://files.pythonhosted.org/packages/80/1b/d458d791e4dd0f7e92596667784fbf99e5c8ba040affe1ca04f06b93ae92/multidict-6.4.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac", size = 230446, upload-time = "2025-04-10T22:18:54.509Z" }, + { url = "https://files.pythonhosted.org/packages/e2/46/9793378d988905491a7806d8987862dc5a0bae8a622dd896c4008c7b226b/multidict-6.4.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790", size = 231070, upload-time = "2025-04-10T22:18:56.019Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b8/b127d3e1f8dd2a5bf286b47b24567ae6363017292dc6dec44656e6246498/multidict-6.4.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb", size = 229956, upload-time = "2025-04-10T22:18:59.146Z" }, + { url = "https://files.pythonhosted.org/packages/0c/93/f70a4c35b103fcfe1443059a2bb7f66e5c35f2aea7804105ff214f566009/multidict-6.4.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0", size = 222599, upload-time = "2025-04-10T22:19:00.657Z" }, + { url = "https://files.pythonhosted.org/packages/63/8c/e28e0eb2fe34921d6aa32bfc4ac75b09570b4d6818cc95d25499fe08dc1d/multidict-6.4.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9", size = 216136, upload-time = "2025-04-10T22:19:02.244Z" }, + { url = "https://files.pythonhosted.org/packages/72/f5/fbc81f866585b05f89f99d108be5d6ad170e3b6c4d0723d1a2f6ba5fa918/multidict-6.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8", size = 228139, upload-time = "2025-04-10T22:19:04.151Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ba/7d196bad6b85af2307d81f6979c36ed9665f49626f66d883d6c64d156f78/multidict-6.4.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1", size = 226251, upload-time = "2025-04-10T22:19:06.117Z" }, + { url = "https://files.pythonhosted.org/packages/cc/e2/fae46a370dce79d08b672422a33df721ec8b80105e0ea8d87215ff6b090d/multidict-6.4.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817", size = 221868, upload-time = "2025-04-10T22:19:07.981Z" }, + { url = "https://files.pythonhosted.org/packages/26/20/bbc9a3dec19d5492f54a167f08546656e7aef75d181d3d82541463450e88/multidict-6.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d", size = 233106, upload-time = "2025-04-10T22:19:09.5Z" }, + { url = "https://files.pythonhosted.org/packages/ee/8d/f30ae8f5ff7a2461177f4d8eb0d8f69f27fb6cfe276b54ec4fd5a282d918/multidict-6.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9", size = 230163, upload-time = "2025-04-10T22:19:11Z" }, + { url = "https://files.pythonhosted.org/packages/15/e9/2833f3c218d3c2179f3093f766940ded6b81a49d2e2f9c46ab240d23dfec/multidict-6.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8", size = 225906, upload-time = "2025-04-10T22:19:12.875Z" }, + { url = "https://files.pythonhosted.org/packages/f1/31/6edab296ac369fd286b845fa5dd4c409e63bc4655ed8c9510fcb477e9ae9/multidict-6.4.3-cp313-cp313-win32.whl", hash = "sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3", size = 35238, upload-time = "2025-04-10T22:19:14.41Z" }, + { url = "https://files.pythonhosted.org/packages/23/57/2c0167a1bffa30d9a1383c3dab99d8caae985defc8636934b5668830d2ef/multidict-6.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5", size = 38799, upload-time = "2025-04-10T22:19:15.869Z" }, + { url = "https://files.pythonhosted.org/packages/c9/13/2ead63b9ab0d2b3080819268acb297bd66e238070aa8d42af12b08cbee1c/multidict-6.4.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6", size = 68642, upload-time = "2025-04-10T22:19:17.527Z" }, + { url = "https://files.pythonhosted.org/packages/85/45/f1a751e1eede30c23951e2ae274ce8fad738e8a3d5714be73e0a41b27b16/multidict-6.4.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c", size = 40028, upload-time = "2025-04-10T22:19:19.465Z" }, + { url = "https://files.pythonhosted.org/packages/a7/29/fcc53e886a2cc5595cc4560df333cb9630257bda65003a7eb4e4e0d8f9c1/multidict-6.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756", size = 39424, upload-time = "2025-04-10T22:19:20.762Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f0/056c81119d8b88703971f937b371795cab1407cd3c751482de5bfe1a04a9/multidict-6.4.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375", size = 226178, upload-time = "2025-04-10T22:19:22.17Z" }, + { url = "https://files.pythonhosted.org/packages/a3/79/3b7e5fea0aa80583d3a69c9d98b7913dfd4fbc341fb10bb2fb48d35a9c21/multidict-6.4.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be", size = 222617, upload-time = "2025-04-10T22:19:23.773Z" }, + { url = "https://files.pythonhosted.org/packages/06/db/3ed012b163e376fc461e1d6a67de69b408339bc31dc83d39ae9ec3bf9578/multidict-6.4.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea", size = 227919, upload-time = "2025-04-10T22:19:25.35Z" }, + { url = "https://files.pythonhosted.org/packages/b1/db/0433c104bca380989bc04d3b841fc83e95ce0c89f680e9ea4251118b52b6/multidict-6.4.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8", size = 226097, upload-time = "2025-04-10T22:19:27.183Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/910db2618175724dd254b7ae635b6cd8d2947a8b76b0376de7b96d814dab/multidict-6.4.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02", size = 220706, upload-time = "2025-04-10T22:19:28.882Z" }, + { url = "https://files.pythonhosted.org/packages/d1/af/aa176c6f5f1d901aac957d5258d5e22897fe13948d1e69063ae3d5d0ca01/multidict-6.4.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124", size = 211728, upload-time = "2025-04-10T22:19:30.481Z" }, + { url = "https://files.pythonhosted.org/packages/e7/42/d51cc5fc1527c3717d7f85137d6c79bb7a93cd214c26f1fc57523774dbb5/multidict-6.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44", size = 226276, upload-time = "2025-04-10T22:19:32.454Z" }, + { url = "https://files.pythonhosted.org/packages/28/6b/d836dea45e0b8432343ba4acf9a8ecaa245da4c0960fb7ab45088a5e568a/multidict-6.4.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b", size = 212069, upload-time = "2025-04-10T22:19:34.17Z" }, + { url = "https://files.pythonhosted.org/packages/55/34/0ee1a7adb3560e18ee9289c6e5f7db54edc312b13e5c8263e88ea373d12c/multidict-6.4.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504", size = 217858, upload-time = "2025-04-10T22:19:35.879Z" }, + { url = "https://files.pythonhosted.org/packages/04/08/586d652c2f5acefe0cf4e658eedb4d71d4ba6dfd4f189bd81b400fc1bc6b/multidict-6.4.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf", size = 226988, upload-time = "2025-04-10T22:19:37.434Z" }, + { url = "https://files.pythonhosted.org/packages/82/e3/cc59c7e2bc49d7f906fb4ffb6d9c3a3cf21b9f2dd9c96d05bef89c2b1fd1/multidict-6.4.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4", size = 220435, upload-time = "2025-04-10T22:19:39.005Z" }, + { url = "https://files.pythonhosted.org/packages/e0/32/5c3a556118aca9981d883f38c4b1bfae646f3627157f70f4068e5a648955/multidict-6.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4", size = 221494, upload-time = "2025-04-10T22:19:41.447Z" }, + { url = "https://files.pythonhosted.org/packages/b9/3b/1599631f59024b75c4d6e3069f4502409970a336647502aaf6b62fb7ac98/multidict-6.4.3-cp313-cp313t-win32.whl", hash = "sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5", size = 41775, upload-time = "2025-04-10T22:19:43.707Z" }, + { url = "https://files.pythonhosted.org/packages/e8/4e/09301668d675d02ca8e8e1a3e6be046619e30403f5ada2ed5b080ae28d02/multidict-6.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208", size = 45946, upload-time = "2025-04-10T22:19:45.071Z" }, + { url = "https://files.pythonhosted.org/packages/96/10/7d526c8974f017f1e7ca584c71ee62a638e9334d8d33f27d7cdfc9ae79e4/multidict-6.4.3-py3-none-any.whl", hash = "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9", size = 10400, upload-time = "2025-04-10T22:20:16.445Z" }, +] + +[[package]] +name = "music" +version = "0.1.0" +source = { virtual = "agents/music" } + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433, upload-time = "2023-02-04T12:11:27.157Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695, upload-time = "2023-02-04T12:11:25.002Z" }, +] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, +] + +[[package]] +name = "nodeenv" +version = "1.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/78/31103410a57bc2c2b93a3597340a8119588571f6a4539067546cb9a0bfac/numpy-2.2.4.tar.gz", hash = "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f", size = 20270701, upload-time = "2025-03-16T18:27:00.648Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/d0/bd5ad792e78017f5decfb2ecc947422a3669a34f775679a76317af671ffc/numpy-2.2.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7", size = 20933623, upload-time = "2025-03-16T18:13:43.231Z" }, + { url = "https://files.pythonhosted.org/packages/c3/bc/2b3545766337b95409868f8e62053135bdc7fa2ce630aba983a2aa60b559/numpy-2.2.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0", size = 14148681, upload-time = "2025-03-16T18:14:08.031Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/67b24d68a56551d43a6ec9fe8c5f91b526d4c1a46a6387b956bf2d64744e/numpy-2.2.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392", size = 5148759, upload-time = "2025-03-16T18:14:18.613Z" }, + { url = "https://files.pythonhosted.org/packages/1c/8b/e2fc8a75fcb7be12d90b31477c9356c0cbb44abce7ffb36be39a0017afad/numpy-2.2.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc", size = 6683092, upload-time = "2025-03-16T18:14:31.386Z" }, + { url = "https://files.pythonhosted.org/packages/13/73/41b7b27f169ecf368b52533edb72e56a133f9e86256e809e169362553b49/numpy-2.2.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298", size = 14081422, upload-time = "2025-03-16T18:14:54.83Z" }, + { url = "https://files.pythonhosted.org/packages/4b/04/e208ff3ae3ddfbafc05910f89546382f15a3f10186b1f56bd99f159689c2/numpy-2.2.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7", size = 16132202, upload-time = "2025-03-16T18:15:22.035Z" }, + { url = "https://files.pythonhosted.org/packages/fe/bc/2218160574d862d5e55f803d88ddcad88beff94791f9c5f86d67bd8fbf1c/numpy-2.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6", size = 15573131, upload-time = "2025-03-16T18:15:48.546Z" }, + { url = "https://files.pythonhosted.org/packages/a5/78/97c775bc4f05abc8a8426436b7cb1be806a02a2994b195945600855e3a25/numpy-2.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd", size = 17894270, upload-time = "2025-03-16T18:16:20.274Z" }, + { url = "https://files.pythonhosted.org/packages/b9/eb/38c06217a5f6de27dcb41524ca95a44e395e6a1decdc0c99fec0832ce6ae/numpy-2.2.4-cp313-cp313-win32.whl", hash = "sha256:f486038e44caa08dbd97275a9a35a283a8f1d2f0ee60ac260a1790e76660833c", size = 6308141, upload-time = "2025-03-16T18:20:15.297Z" }, + { url = "https://files.pythonhosted.org/packages/52/17/d0dd10ab6d125c6d11ffb6dfa3423c3571befab8358d4f85cd4471964fcd/numpy-2.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3", size = 12636885, upload-time = "2025-03-16T18:20:36.982Z" }, + { url = "https://files.pythonhosted.org/packages/fa/e2/793288ede17a0fdc921172916efb40f3cbc2aa97e76c5c84aba6dc7e8747/numpy-2.2.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8", size = 20961829, upload-time = "2025-03-16T18:16:56.191Z" }, + { url = "https://files.pythonhosted.org/packages/3a/75/bb4573f6c462afd1ea5cbedcc362fe3e9bdbcc57aefd37c681be1155fbaa/numpy-2.2.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a761ba0fa886a7bb33c6c8f6f20213735cb19642c580a931c625ee377ee8bd39", size = 14161419, upload-time = "2025-03-16T18:17:22.811Z" }, + { url = "https://files.pythonhosted.org/packages/03/68/07b4cd01090ca46c7a336958b413cdbe75002286295f2addea767b7f16c9/numpy-2.2.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:ac0280f1ba4a4bfff363a99a6aceed4f8e123f8a9b234c89140f5e894e452ecd", size = 5196414, upload-time = "2025-03-16T18:17:34.066Z" }, + { url = "https://files.pythonhosted.org/packages/a5/fd/d4a29478d622fedff5c4b4b4cedfc37a00691079623c0575978d2446db9e/numpy-2.2.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0", size = 6709379, upload-time = "2025-03-16T18:17:47.466Z" }, + { url = "https://files.pythonhosted.org/packages/41/78/96dddb75bb9be730b87c72f30ffdd62611aba234e4e460576a068c98eff6/numpy-2.2.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f05d4198c1bacc9124018109c5fba2f3201dbe7ab6e92ff100494f236209c960", size = 14051725, upload-time = "2025-03-16T18:18:11.904Z" }, + { url = "https://files.pythonhosted.org/packages/00/06/5306b8199bffac2a29d9119c11f457f6c7d41115a335b78d3f86fad4dbe8/numpy-2.2.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f085ce2e813a50dfd0e01fbfc0c12bbe5d2063d99f8b29da30e544fb6483b8", size = 16101638, upload-time = "2025-03-16T18:18:40.749Z" }, + { url = "https://files.pythonhosted.org/packages/fa/03/74c5b631ee1ded596945c12027649e6344614144369fd3ec1aaced782882/numpy-2.2.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:92bda934a791c01d6d9d8e038363c50918ef7c40601552a58ac84c9613a665bc", size = 15571717, upload-time = "2025-03-16T18:19:04.512Z" }, + { url = "https://files.pythonhosted.org/packages/cb/dc/4fc7c0283abe0981e3b89f9b332a134e237dd476b0c018e1e21083310c31/numpy-2.2.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ee4d528022f4c5ff67332469e10efe06a267e32f4067dc76bb7e2cddf3cd25ff", size = 17879998, upload-time = "2025-03-16T18:19:32.52Z" }, + { url = "https://files.pythonhosted.org/packages/e5/2b/878576190c5cfa29ed896b518cc516aecc7c98a919e20706c12480465f43/numpy-2.2.4-cp313-cp313t-win32.whl", hash = "sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286", size = 6366896, upload-time = "2025-03-16T18:19:43.55Z" }, + { url = "https://files.pythonhosted.org/packages/3e/05/eb7eec66b95cf697f08c754ef26c3549d03ebd682819f794cb039574a0a6/numpy-2.2.4-cp313-cp313t-win_amd64.whl", hash = "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d", size = 12739119, upload-time = "2025-03-16T18:20:03.94Z" }, +] + +[[package]] +name = "openai" +version = "1.74.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/75/86/c605a6e84da0248f2cebfcd864b5a6076ecf78849245af5e11d2a5ec7977/openai-1.74.0.tar.gz", hash = "sha256:592c25b8747a7cad33a841958f5eb859a785caea9ee22b9e4f4a2ec062236526", size = 427571, upload-time = "2025-04-14T16:45:25.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/91/8c150f16a96367e14bd7d20e86e0bbbec3080e3eb593e63f21a7f013f8e4/openai-1.74.0-py3-none-any.whl", hash = "sha256:aff3e0f9fb209836382ec112778667027f4fd6ae38bdb2334bc9e173598b092a", size = 644790, upload-time = "2025-04-14T16:45:23.041Z" }, +] + +[[package]] +name = "orjson" +version = "3.10.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/c7/03913cc4332174071950acf5b0735463e3f63760c80585ef369270c2b372/orjson-3.10.16.tar.gz", hash = "sha256:d2aaa5c495e11d17b9b93205f5fa196737ee3202f000aaebf028dc9a73750f10", size = 5410415, upload-time = "2025-03-24T17:00:23.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/b9/ff6aa28b8c86af9526160905593a2fe8d004ac7a5e592ee0b0ff71017511/orjson-3.10.16-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:148a97f7de811ba14bc6dbc4a433e0341ffd2cc285065199fb5f6a98013744bd", size = 249289, upload-time = "2025-03-24T16:59:40.117Z" }, + { url = "https://files.pythonhosted.org/packages/6c/81/6d92a586149b52684ab8fd70f3623c91d0e6a692f30fd8c728916ab2263c/orjson-3.10.16-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:1d960c1bf0e734ea36d0adc880076de3846aaec45ffad29b78c7f1b7962516b8", size = 133640, upload-time = "2025-03-24T16:59:41.469Z" }, + { url = "https://files.pythonhosted.org/packages/c2/88/b72443f4793d2e16039ab85d0026677932b15ab968595fb7149750d74134/orjson-3.10.16-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a318cd184d1269f68634464b12871386808dc8b7c27de8565234d25975a7a137", size = 138286, upload-time = "2025-03-24T16:59:42.769Z" }, + { url = "https://files.pythonhosted.org/packages/c3/3c/72a22d4b28c076c4016d5a52bd644a8e4d849d3bb0373d9e377f9e3b2250/orjson-3.10.16-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df23f8df3ef9223d1d6748bea63fca55aae7da30a875700809c500a05975522b", size = 132307, upload-time = "2025-03-24T16:59:44.143Z" }, + { url = "https://files.pythonhosted.org/packages/8a/a2/f1259561bdb6ad7061ff1b95dab082fe32758c4bc143ba8d3d70831f0a06/orjson-3.10.16-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b94dda8dd6d1378f1037d7f3f6b21db769ef911c4567cbaa962bb6dc5021cf90", size = 136739, upload-time = "2025-03-24T16:59:45.995Z" }, + { url = "https://files.pythonhosted.org/packages/3d/af/c7583c4b34f33d8b8b90cfaab010ff18dd64e7074cc1e117a5f1eff20dcf/orjson-3.10.16-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f12970a26666a8775346003fd94347d03ccb98ab8aa063036818381acf5f523e", size = 138076, upload-time = "2025-03-24T16:59:47.776Z" }, + { url = "https://files.pythonhosted.org/packages/d7/59/d7fc7fbdd3d4a64c2eae4fc7341a5aa39cf9549bd5e2d7f6d3c07f8b715b/orjson-3.10.16-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15a1431a245d856bd56e4d29ea0023eb4d2c8f71efe914beb3dee8ab3f0cd7fb", size = 142643, upload-time = "2025-03-24T16:59:49.258Z" }, + { url = "https://files.pythonhosted.org/packages/92/0e/3bd8f2197d27601f16b4464ae948826da2bcf128af31230a9dbbad7ceb57/orjson-3.10.16-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c83655cfc247f399a222567d146524674a7b217af7ef8289c0ff53cfe8db09f0", size = 133168, upload-time = "2025-03-24T16:59:51.027Z" }, + { url = "https://files.pythonhosted.org/packages/af/a8/351fd87b664b02f899f9144d2c3dc848b33ac04a5df05234cbfb9e2a7540/orjson-3.10.16-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fa59ae64cb6ddde8f09bdbf7baf933c4cd05734ad84dcf4e43b887eb24e37652", size = 135271, upload-time = "2025-03-24T16:59:52.449Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b0/a6d42a7d412d867c60c0337d95123517dd5a9370deea705ea1be0f89389e/orjson-3.10.16-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ca5426e5aacc2e9507d341bc169d8af9c3cbe88f4cd4c1cf2f87e8564730eb56", size = 412444, upload-time = "2025-03-24T16:59:53.825Z" }, + { url = "https://files.pythonhosted.org/packages/79/ec/7572cd4e20863f60996f3f10bc0a6da64a6fd9c35954189a914cec0b7377/orjson-3.10.16-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6fd5da4edf98a400946cd3a195680de56f1e7575109b9acb9493331047157430", size = 152737, upload-time = "2025-03-24T16:59:55.599Z" }, + { url = "https://files.pythonhosted.org/packages/a9/19/ceb9e8fed5403b2e76a8ac15f581b9d25780a3be3c9b3aa54b7777a210d5/orjson-3.10.16-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:980ecc7a53e567169282a5e0ff078393bac78320d44238da4e246d71a4e0e8f5", size = 137482, upload-time = "2025-03-24T16:59:57.045Z" }, + { url = "https://files.pythonhosted.org/packages/1b/78/a78bb810f3786579dbbbd94768284cbe8f2fd65167cd7020260679665c17/orjson-3.10.16-cp313-cp313-win32.whl", hash = "sha256:28f79944dd006ac540a6465ebd5f8f45dfdf0948ff998eac7a908275b4c1add6", size = 141714, upload-time = "2025-03-24T16:59:58.666Z" }, + { url = "https://files.pythonhosted.org/packages/81/9c/b66ce9245ff319df2c3278acd351a3f6145ef34b4a2d7f4b0f739368370f/orjson-3.10.16-cp313-cp313-win_amd64.whl", hash = "sha256:fe0a145e96d51971407cb8ba947e63ead2aa915db59d6631a355f5f2150b56b7", size = 133954, upload-time = "2025-03-24T17:00:00.101Z" }, +] + +[[package]] +name = "ormsgpack" +version = "1.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/25/a7/462cf8ff5e29241868b82d3a5ec124d690eb6a6a5c6fa5bb1367b839e027/ormsgpack-1.9.1.tar.gz", hash = "sha256:3da6e63d82565e590b98178545e64f0f8506137b92bd31a2d04fd7c82baf5794", size = 56887, upload-time = "2025-03-28T07:14:38.843Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/54/0390d5d092831e4df29dbafe32402891fc14b3e6ffe5a644b16cbbc9d9bc/ormsgpack-1.9.1-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:ac61c18d9dd085e8519b949f7e655f7fb07909fd09c53b4338dd33309012e289", size = 383226, upload-time = "2025-03-28T07:14:13.868Z" }, + { url = "https://files.pythonhosted.org/packages/47/64/8b15d262d1caefead8fb22ec144f5ff7d9505fc31c22bc34598053d46fbe/ormsgpack-1.9.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134840b8c6615da2c24ce77bd12a46098015c808197a9995c7a2d991e1904eec", size = 214057, upload-time = "2025-03-28T07:14:15.307Z" }, + { url = "https://files.pythonhosted.org/packages/57/00/65823609266bad4d5ed29ea753d24a3bdb01c7edaf923da80967fc31f9c5/ormsgpack-1.9.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:38fd42618f626394b2c7713c5d4bcbc917254e9753d5d4cde460658b51b11a74", size = 217340, upload-time = "2025-03-28T07:14:16.69Z" }, + { url = "https://files.pythonhosted.org/packages/a0/51/e535c50f7f87b49110233647f55300d7975139ef5e51f1adb4c55f58c124/ormsgpack-1.9.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d36397333ad07b9eba4c2e271fa78951bd81afc059c85a6e9f6c0eb2de07cda", size = 223815, upload-time = "2025-03-28T07:14:18.651Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ee/393e4a6de2a62124bf589602648f295a9fb3907a0e2fe80061b88899d072/ormsgpack-1.9.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:603063089597917d04e4c1b1d53988a34f7dc2ff1a03adcfd1cf4ae966d5fba6", size = 394287, upload-time = "2025-03-28T07:14:20.569Z" }, + { url = "https://files.pythonhosted.org/packages/c6/d8/e56d7c3cb73a0e533e3e2a21ae5838b2aa36a9dac1ca9c861af6bae5a369/ormsgpack-1.9.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:94bbf2b185e0cb721ceaba20e64b7158e6caf0cecd140ca29b9f05a8d5e91e2f", size = 480707, upload-time = "2025-03-28T07:14:22.006Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e0/6a3c6a6dc98583a721c54b02f5195bde8f801aebdeda9b601fa2ab30ad39/ormsgpack-1.9.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c38f380b1e8c96a712eb302b9349347385161a8e29046868ae2bfdfcb23e2692", size = 397246, upload-time = "2025-03-28T07:14:23.868Z" }, + { url = "https://files.pythonhosted.org/packages/b0/60/0ee5d790f13507e1f75ac21fc82dc1ef29afe1f520bd0f249d65b2f4839b/ormsgpack-1.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:a4bc63fb30db94075611cedbbc3d261dd17cf2aa8ff75a0fd684cd45ca29cb1b", size = 125371, upload-time = "2025-03-28T07:14:25.176Z" }, +] + +[[package]] +name = "packaging" +version = "24.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950, upload-time = "2024-11-08T09:47:47.202Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451, upload-time = "2024-11-08T09:47:44.722Z" }, +] + +[[package]] +name = "parso" +version = "0.8.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609, upload-time = "2024-04-05T09:43:55.897Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650, upload-time = "2024-04-05T09:43:53.299Z" }, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.3.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b6/2d/7d512a3913d60623e7eb945c6d1b4f0bddf1d0b7ada5225274c87e5b53d1/platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351", size = 21291, upload-time = "2025-03-19T20:36:10.989Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94", size = 18499, upload-time = "2025-03-19T20:36:09.038Z" }, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955, upload-time = "2024-04-20T21:34:42.531Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556, upload-time = "2024-04-20T21:34:40.434Z" }, +] + +[[package]] +name = "pre-commit" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cfgv" }, + { name = "identify" }, + { name = "nodeenv" }, + { name = "pyyaml" }, + { name = "virtualenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/08/39/679ca9b26c7bb2999ff122d50faa301e49af82ca9c066ec061cfbc0c6784/pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146", size = 193424, upload-time = "2025-03-18T21:35:20.987Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/74/a88bf1b1efeae488a0c0b7bdf71429c313722d1fc0f377537fbe554e6180/pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd", size = 220707, upload-time = "2025-03-18T21:35:19.343Z" }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.51" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bb/6e/9d084c929dfe9e3bfe0c6a47e31f78a25c54627d64a66e884a8bf5474f1c/prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed", size = 428940, upload-time = "2025-04-15T09:18:47.731Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07", size = 387810, upload-time = "2025-04-15T09:18:44.753Z" }, +] + +[[package]] +name = "propcache" +version = "0.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/07/c8/fdc6686a986feae3541ea23dcaa661bd93972d3940460646c6bb96e21c40/propcache-0.3.1.tar.gz", hash = "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf", size = 43651, upload-time = "2025-03-26T03:06:12.05Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/60/f645cc8b570f99be3cf46714170c2de4b4c9d6b827b912811eff1eb8a412/propcache-0.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8", size = 77865, upload-time = "2025-03-26T03:04:53.406Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d4/c1adbf3901537582e65cf90fd9c26fde1298fde5a2c593f987112c0d0798/propcache-0.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f", size = 45452, upload-time = "2025-03-26T03:04:54.624Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b5/fe752b2e63f49f727c6c1c224175d21b7d1727ce1d4873ef1c24c9216830/propcache-0.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111", size = 44800, upload-time = "2025-03-26T03:04:55.844Z" }, + { url = "https://files.pythonhosted.org/packages/62/37/fc357e345bc1971e21f76597028b059c3d795c5ca7690d7a8d9a03c9708a/propcache-0.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5", size = 225804, upload-time = "2025-03-26T03:04:57.158Z" }, + { url = "https://files.pythonhosted.org/packages/0d/f1/16e12c33e3dbe7f8b737809bad05719cff1dccb8df4dafbcff5575002c0e/propcache-0.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb", size = 230650, upload-time = "2025-03-26T03:04:58.61Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a2/018b9f2ed876bf5091e60153f727e8f9073d97573f790ff7cdf6bc1d1fb8/propcache-0.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7", size = 234235, upload-time = "2025-03-26T03:05:00.599Z" }, + { url = "https://files.pythonhosted.org/packages/45/5f/3faee66fc930dfb5da509e34c6ac7128870631c0e3582987fad161fcb4b1/propcache-0.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120", size = 228249, upload-time = "2025-03-26T03:05:02.11Z" }, + { url = "https://files.pythonhosted.org/packages/62/1e/a0d5ebda5da7ff34d2f5259a3e171a94be83c41eb1e7cd21a2105a84a02e/propcache-0.3.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654", size = 214964, upload-time = "2025-03-26T03:05:03.599Z" }, + { url = "https://files.pythonhosted.org/packages/db/a0/d72da3f61ceab126e9be1f3bc7844b4e98c6e61c985097474668e7e52152/propcache-0.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e", size = 222501, upload-time = "2025-03-26T03:05:05.107Z" }, + { url = "https://files.pythonhosted.org/packages/18/6d/a008e07ad7b905011253adbbd97e5b5375c33f0b961355ca0a30377504ac/propcache-0.3.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b", size = 217917, upload-time = "2025-03-26T03:05:06.59Z" }, + { url = "https://files.pythonhosted.org/packages/98/37/02c9343ffe59e590e0e56dc5c97d0da2b8b19fa747ebacf158310f97a79a/propcache-0.3.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53", size = 217089, upload-time = "2025-03-26T03:05:08.1Z" }, + { url = "https://files.pythonhosted.org/packages/53/1b/d3406629a2c8a5666d4674c50f757a77be119b113eedd47b0375afdf1b42/propcache-0.3.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5", size = 228102, upload-time = "2025-03-26T03:05:09.982Z" }, + { url = "https://files.pythonhosted.org/packages/cd/a7/3664756cf50ce739e5f3abd48febc0be1a713b1f389a502ca819791a6b69/propcache-0.3.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7", size = 230122, upload-time = "2025-03-26T03:05:11.408Z" }, + { url = "https://files.pythonhosted.org/packages/35/36/0bbabaacdcc26dac4f8139625e930f4311864251276033a52fd52ff2a274/propcache-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef", size = 226818, upload-time = "2025-03-26T03:05:12.909Z" }, + { url = "https://files.pythonhosted.org/packages/cc/27/4e0ef21084b53bd35d4dae1634b6d0bad35e9c58ed4f032511acca9d4d26/propcache-0.3.1-cp313-cp313-win32.whl", hash = "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24", size = 40112, upload-time = "2025-03-26T03:05:14.289Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2c/a54614d61895ba6dd7ac8f107e2b2a0347259ab29cbf2ecc7b94fa38c4dc/propcache-0.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037", size = 44034, upload-time = "2025-03-26T03:05:15.616Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a8/0a4fd2f664fc6acc66438370905124ce62e84e2e860f2557015ee4a61c7e/propcache-0.3.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f", size = 82613, upload-time = "2025-03-26T03:05:16.913Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e5/5ef30eb2cd81576256d7b6caaa0ce33cd1d2c2c92c8903cccb1af1a4ff2f/propcache-0.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c", size = 47763, upload-time = "2025-03-26T03:05:18.607Z" }, + { url = "https://files.pythonhosted.org/packages/87/9a/87091ceb048efeba4d28e903c0b15bcc84b7c0bf27dc0261e62335d9b7b8/propcache-0.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc", size = 47175, upload-time = "2025-03-26T03:05:19.85Z" }, + { url = "https://files.pythonhosted.org/packages/3e/2f/854e653c96ad1161f96194c6678a41bbb38c7947d17768e8811a77635a08/propcache-0.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de", size = 292265, upload-time = "2025-03-26T03:05:21.654Z" }, + { url = "https://files.pythonhosted.org/packages/40/8d/090955e13ed06bc3496ba4a9fb26c62e209ac41973cb0d6222de20c6868f/propcache-0.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6", size = 294412, upload-time = "2025-03-26T03:05:23.147Z" }, + { url = "https://files.pythonhosted.org/packages/39/e6/d51601342e53cc7582449e6a3c14a0479fab2f0750c1f4d22302e34219c6/propcache-0.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7", size = 294290, upload-time = "2025-03-26T03:05:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/3b/4d/be5f1a90abc1881884aa5878989a1acdafd379a91d9c7e5e12cef37ec0d7/propcache-0.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458", size = 282926, upload-time = "2025-03-26T03:05:26.459Z" }, + { url = "https://files.pythonhosted.org/packages/57/2b/8f61b998c7ea93a2b7eca79e53f3e903db1787fca9373af9e2cf8dc22f9d/propcache-0.3.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11", size = 267808, upload-time = "2025-03-26T03:05:28.188Z" }, + { url = "https://files.pythonhosted.org/packages/11/1c/311326c3dfce59c58a6098388ba984b0e5fb0381ef2279ec458ef99bd547/propcache-0.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c", size = 290916, upload-time = "2025-03-26T03:05:29.757Z" }, + { url = "https://files.pythonhosted.org/packages/4b/74/91939924b0385e54dc48eb2e4edd1e4903ffd053cf1916ebc5347ac227f7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf", size = 262661, upload-time = "2025-03-26T03:05:31.472Z" }, + { url = "https://files.pythonhosted.org/packages/c2/d7/e6079af45136ad325c5337f5dd9ef97ab5dc349e0ff362fe5c5db95e2454/propcache-0.3.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27", size = 264384, upload-time = "2025-03-26T03:05:32.984Z" }, + { url = "https://files.pythonhosted.org/packages/b7/d5/ba91702207ac61ae6f1c2da81c5d0d6bf6ce89e08a2b4d44e411c0bbe867/propcache-0.3.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757", size = 291420, upload-time = "2025-03-26T03:05:34.496Z" }, + { url = "https://files.pythonhosted.org/packages/58/70/2117780ed7edcd7ba6b8134cb7802aada90b894a9810ec56b7bb6018bee7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18", size = 290880, upload-time = "2025-03-26T03:05:36.256Z" }, + { url = "https://files.pythonhosted.org/packages/4a/1f/ecd9ce27710021ae623631c0146719280a929d895a095f6d85efb6a0be2e/propcache-0.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a", size = 287407, upload-time = "2025-03-26T03:05:37.799Z" }, + { url = "https://files.pythonhosted.org/packages/3e/66/2e90547d6b60180fb29e23dc87bd8c116517d4255240ec6d3f7dc23d1926/propcache-0.3.1-cp313-cp313t-win32.whl", hash = "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d", size = 42573, upload-time = "2025-03-26T03:05:39.193Z" }, + { url = "https://files.pythonhosted.org/packages/cb/8f/50ad8599399d1861b4d2b6b45271f0ef6af1b09b0a2386a46dbaf19c9535/propcache-0.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e", size = 46757, upload-time = "2025-03-26T03:05:40.811Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d3/c3cb8f1d6ae3b37f83e1de806713a9b3642c5895f0215a62e1a4bd6e5e34/propcache-0.3.1-py3-none-any.whl", hash = "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", size = 12376, upload-time = "2025-03-26T03:06:10.5Z" }, +] + +[[package]] +name = "pseudo-entertainment" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "langchain" }, + { name = "langchain-community" }, + { name = "langgraph" }, + { name = "python-dotenv" }, +] + +[package.dev-dependencies] +dev = [ + { name = "ipykernel" }, + { name = "langgraph-cli", extra = ["inmem"] }, + { name = "pre-commit" }, + { name = "pytest" }, +] + +[package.metadata] +requires-dist = [ + { name = "langchain", specifier = ">=0.3.23" }, + { name = "langchain-community", specifier = ">=0.2.17" }, + { name = "langgraph", specifier = ">=0.3.27" }, + { name = "python-dotenv", specifier = ">=1.0.1" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "ipykernel", specifier = ">=6.29.5" }, + { name = "langgraph-cli", extras = ["inmem"], specifier = ">=0.2.3" }, + { name = "pre-commit", specifier = ">=4.2.0" }, + { name = "pytest", specifier = ">=8.3.5" }, +] + +[[package]] +name = "psutil" +version = "7.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003, upload-time = "2025-02-13T21:54:07.946Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051, upload-time = "2025-02-13T21:54:12.36Z" }, + { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535, upload-time = "2025-02-13T21:54:16.07Z" }, + { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004, upload-time = "2025-02-13T21:54:18.662Z" }, + { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986, upload-time = "2025-02-13T21:54:21.811Z" }, + { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544, upload-time = "2025-02-13T21:54:24.68Z" }, + { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053, upload-time = "2025-02-13T21:54:34.31Z" }, + { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885, upload-time = "2025-02-13T21:54:37.486Z" }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, +] + +[[package]] +name = "pycparser" +version = "2.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736, upload-time = "2024-03-30T13:22:22.564Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552, upload-time = "2024-03-30T13:22:20.476Z" }, +] + +[[package]] +name = "pydantic" +version = "2.11.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/10/2e/ca897f093ee6c5f3b0bee123ee4465c50e75431c3d5b6a3b44a47134e891/pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", size = 785513, upload-time = "2025-04-08T13:27:06.399Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/1d/407b29780a289868ed696d1616f4aad49d6388e5a77f567dcd2629dcd7b8/pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f", size = 443591, upload-time = "2025-04-08T13:27:03.789Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.33.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/17/19/ed6a078a5287aea7922de6841ef4c06157931622c89c2a47940837b5eecd/pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", size = 434395, upload-time = "2025-04-02T09:49:41.8Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/24/eed3466a4308d79155f1cdd5c7432c80ddcc4530ba8623b79d5ced021641/pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", size = 2033551, upload-time = "2025-04-02T09:47:51.648Z" }, + { url = "https://files.pythonhosted.org/packages/ab/14/df54b1a0bc9b6ded9b758b73139d2c11b4e8eb43e8ab9c5847c0a2913ada/pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", size = 1852785, upload-time = "2025-04-02T09:47:53.149Z" }, + { url = "https://files.pythonhosted.org/packages/fa/96/e275f15ff3d34bb04b0125d9bc8848bf69f25d784d92a63676112451bfb9/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", size = 1897758, upload-time = "2025-04-02T09:47:55.006Z" }, + { url = "https://files.pythonhosted.org/packages/b7/d8/96bc536e975b69e3a924b507d2a19aedbf50b24e08c80fb00e35f9baaed8/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", size = 1986109, upload-time = "2025-04-02T09:47:56.532Z" }, + { url = "https://files.pythonhosted.org/packages/90/72/ab58e43ce7e900b88cb571ed057b2fcd0e95b708a2e0bed475b10130393e/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", size = 2129159, upload-time = "2025-04-02T09:47:58.088Z" }, + { url = "https://files.pythonhosted.org/packages/dc/3f/52d85781406886c6870ac995ec0ba7ccc028b530b0798c9080531b409fdb/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", size = 2680222, upload-time = "2025-04-02T09:47:59.591Z" }, + { url = "https://files.pythonhosted.org/packages/f4/56/6e2ef42f363a0eec0fd92f74a91e0ac48cd2e49b695aac1509ad81eee86a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", size = 2006980, upload-time = "2025-04-02T09:48:01.397Z" }, + { url = "https://files.pythonhosted.org/packages/4c/c0/604536c4379cc78359f9ee0aa319f4aedf6b652ec2854953f5a14fc38c5a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", size = 2120840, upload-time = "2025-04-02T09:48:03.056Z" }, + { url = "https://files.pythonhosted.org/packages/1f/46/9eb764814f508f0edfb291a0f75d10854d78113fa13900ce13729aaec3ae/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", size = 2072518, upload-time = "2025-04-02T09:48:04.662Z" }, + { url = "https://files.pythonhosted.org/packages/42/e3/fb6b2a732b82d1666fa6bf53e3627867ea3131c5f39f98ce92141e3e3dc1/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", size = 2248025, upload-time = "2025-04-02T09:48:06.226Z" }, + { url = "https://files.pythonhosted.org/packages/5c/9d/fbe8fe9d1aa4dac88723f10a921bc7418bd3378a567cb5e21193a3c48b43/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", size = 2254991, upload-time = "2025-04-02T09:48:08.114Z" }, + { url = "https://files.pythonhosted.org/packages/aa/99/07e2237b8a66438d9b26482332cda99a9acccb58d284af7bc7c946a42fd3/pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", size = 1915262, upload-time = "2025-04-02T09:48:09.708Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f4/e457a7849beeed1e5defbcf5051c6f7b3c91a0624dd31543a64fc9adcf52/pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", size = 1956626, upload-time = "2025-04-02T09:48:11.288Z" }, + { url = "https://files.pythonhosted.org/packages/20/d0/e8d567a7cff7b04e017ae164d98011f1e1894269fe8e90ea187a3cbfb562/pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", size = 1909590, upload-time = "2025-04-02T09:48:12.861Z" }, + { url = "https://files.pythonhosted.org/packages/ef/fd/24ea4302d7a527d672c5be06e17df16aabfb4e9fdc6e0b345c21580f3d2a/pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", size = 1812963, upload-time = "2025-04-02T09:48:14.553Z" }, + { url = "https://files.pythonhosted.org/packages/5f/95/4fbc2ecdeb5c1c53f1175a32d870250194eb2fdf6291b795ab08c8646d5d/pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", size = 1986896, upload-time = "2025-04-02T09:48:16.222Z" }, + { url = "https://files.pythonhosted.org/packages/71/ae/fe31e7f4a62431222d8f65a3bd02e3fa7e6026d154a00818e6d30520ea77/pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", size = 1931810, upload-time = "2025-04-02T09:48:17.97Z" }, +] + +[[package]] +name = "pydantic-settings" +version = "2.8.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/88/82/c79424d7d8c29b994fb01d277da57b0a9b09cc03c3ff875f9bd8a86b2145/pydantic_settings-2.8.1.tar.gz", hash = "sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585", size = 83550, upload-time = "2025-02-27T10:10:32.338Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/53/a64f03044927dc47aafe029c42a5b7aabc38dfb813475e0e1bf71c4a59d0/pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c", size = 30839, upload-time = "2025-02-27T10:10:30.711Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581, upload-time = "2025-01-06T17:26:30.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293, upload-time = "2025-01-06T17:26:25.553Z" }, +] + +[[package]] +name = "pyjwt" +version = "2.10.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" }, +] + +[[package]] +name = "pytest" +version = "8.3.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload-time = "2025-03-02T12:54:54.503Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload-time = "2025-03-02T12:54:52.069Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "python-dotenv" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920, upload-time = "2025-03-25T10:14:56.835Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256, upload-time = "2025-03-25T10:14:55.034Z" }, +] + +[[package]] +name = "pywin32" +version = "310" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384, upload-time = "2025-03-17T00:56:04.383Z" }, + { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039, upload-time = "2025-03-17T00:56:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152, upload-time = "2025-03-17T00:56:07.819Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" }, +] + +[[package]] +name = "pyzmq" +version = "26.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/11/b9213d25230ac18a71b39b3723494e57adebe36e066397b961657b3b41c1/pyzmq-26.4.0.tar.gz", hash = "sha256:4bd13f85f80962f91a651a7356fe0472791a5f7a92f227822b5acf44795c626d", size = 278293, upload-time = "2025-04-04T12:05:44.049Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/20/fb2c92542488db70f833b92893769a569458311a76474bda89dc4264bd18/pyzmq-26.4.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:c43fac689880f5174d6fc864857d1247fe5cfa22b09ed058a344ca92bf5301e3", size = 1339484, upload-time = "2025-04-04T12:04:00.671Z" }, + { url = "https://files.pythonhosted.org/packages/58/29/2f06b9cabda3a6ea2c10f43e67ded3e47fc25c54822e2506dfb8325155d4/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:902aca7eba477657c5fb81c808318460328758e8367ecdd1964b6330c73cae43", size = 666106, upload-time = "2025-04-04T12:04:02.366Z" }, + { url = "https://files.pythonhosted.org/packages/77/e4/dcf62bd29e5e190bd21bfccaa4f3386e01bf40d948c239239c2f1e726729/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5e48a830bfd152fe17fbdeaf99ac5271aa4122521bf0d275b6b24e52ef35eb6", size = 902056, upload-time = "2025-04-04T12:04:03.919Z" }, + { url = "https://files.pythonhosted.org/packages/1a/cf/b36b3d7aea236087d20189bec1a87eeb2b66009731d7055e5c65f845cdba/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31be2b6de98c824c06f5574331f805707c667dc8f60cb18580b7de078479891e", size = 860148, upload-time = "2025-04-04T12:04:05.581Z" }, + { url = "https://files.pythonhosted.org/packages/18/a6/f048826bc87528c208e90604c3bf573801e54bd91e390cbd2dfa860e82dc/pyzmq-26.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6332452034be001bbf3206ac59c0d2a7713de5f25bb38b06519fc6967b7cf771", size = 855983, upload-time = "2025-04-04T12:04:07.096Z" }, + { url = "https://files.pythonhosted.org/packages/0a/27/454d34ab6a1d9772a36add22f17f6b85baf7c16e14325fa29e7202ca8ee8/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:da8c0f5dd352136853e6a09b1b986ee5278dfddfebd30515e16eae425c872b30", size = 1197274, upload-time = "2025-04-04T12:04:08.523Z" }, + { url = "https://files.pythonhosted.org/packages/f4/3d/7abfeab6b83ad38aa34cbd57c6fc29752c391e3954fd12848bd8d2ec0df6/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f4ccc1a0a2c9806dda2a2dd118a3b7b681e448f3bb354056cad44a65169f6d86", size = 1507120, upload-time = "2025-04-04T12:04:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/13/ff/bc8d21dbb9bc8705126e875438a1969c4f77e03fc8565d6901c7933a3d01/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1c0b5fceadbab461578daf8d1dcc918ebe7ddd2952f748cf30c7cf2de5d51101", size = 1406738, upload-time = "2025-04-04T12:04:12.509Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5d/d4cd85b24de71d84d81229e3bbb13392b2698432cf8fdcea5afda253d587/pyzmq-26.4.0-cp313-cp313-win32.whl", hash = "sha256:28e2b0ff5ba4b3dd11062d905682bad33385cfa3cc03e81abd7f0822263e6637", size = 577826, upload-time = "2025-04-04T12:04:14.289Z" }, + { url = "https://files.pythonhosted.org/packages/c6/6c/f289c1789d7bb6e5a3b3bef7b2a55089b8561d17132be7d960d3ff33b14e/pyzmq-26.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:23ecc9d241004c10e8b4f49d12ac064cd7000e1643343944a10df98e57bc544b", size = 640406, upload-time = "2025-04-04T12:04:15.757Z" }, + { url = "https://files.pythonhosted.org/packages/b3/99/676b8851cb955eb5236a0c1e9ec679ea5ede092bf8bf2c8a68d7e965cac3/pyzmq-26.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:1edb0385c7f025045d6e0f759d4d3afe43c17a3d898914ec6582e6f464203c08", size = 556216, upload-time = "2025-04-04T12:04:17.212Z" }, + { url = "https://files.pythonhosted.org/packages/65/c2/1fac340de9d7df71efc59d9c50fc7a635a77b103392d1842898dd023afcb/pyzmq-26.4.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:93a29e882b2ba1db86ba5dd5e88e18e0ac6b627026c5cfbec9983422011b82d4", size = 1333769, upload-time = "2025-04-04T12:04:18.665Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c7/6c03637e8d742c3b00bec4f5e4cd9d1c01b2f3694c6f140742e93ca637ed/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb45684f276f57110bb89e4300c00f1233ca631f08f5f42528a5c408a79efc4a", size = 658826, upload-time = "2025-04-04T12:04:20.405Z" }, + { url = "https://files.pythonhosted.org/packages/a5/97/a8dca65913c0f78e0545af2bb5078aebfc142ca7d91cdaffa1fbc73e5dbd/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f72073e75260cb301aad4258ad6150fa7f57c719b3f498cb91e31df16784d89b", size = 891650, upload-time = "2025-04-04T12:04:22.413Z" }, + { url = "https://files.pythonhosted.org/packages/7d/7e/f63af1031eb060bf02d033732b910fe48548dcfdbe9c785e9f74a6cc6ae4/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be37e24b13026cfedd233bcbbccd8c0bcd2fdd186216094d095f60076201538d", size = 849776, upload-time = "2025-04-04T12:04:23.959Z" }, + { url = "https://files.pythonhosted.org/packages/f6/fa/1a009ce582802a895c0d5fe9413f029c940a0a8ee828657a3bb0acffd88b/pyzmq-26.4.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:237b283044934d26f1eeff4075f751b05d2f3ed42a257fc44386d00df6a270cf", size = 842516, upload-time = "2025-04-04T12:04:25.449Z" }, + { url = "https://files.pythonhosted.org/packages/6e/bc/f88b0bad0f7a7f500547d71e99f10336f2314e525d4ebf576a1ea4a1d903/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:b30f862f6768b17040929a68432c8a8be77780317f45a353cb17e423127d250c", size = 1189183, upload-time = "2025-04-04T12:04:27.035Z" }, + { url = "https://files.pythonhosted.org/packages/d9/8c/db446a3dd9cf894406dec2e61eeffaa3c07c3abb783deaebb9812c4af6a5/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:c80fcd3504232f13617c6ab501124d373e4895424e65de8b72042333316f64a8", size = 1495501, upload-time = "2025-04-04T12:04:28.833Z" }, + { url = "https://files.pythonhosted.org/packages/05/4c/bf3cad0d64c3214ac881299c4562b815f05d503bccc513e3fd4fdc6f67e4/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:26a2a7451606b87f67cdeca2c2789d86f605da08b4bd616b1a9981605ca3a364", size = 1395540, upload-time = "2025-04-04T12:04:30.562Z" }, +] + +[[package]] +name = "regex" +version = "2024.11.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494, upload-time = "2024-11-06T20:12:31.635Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84", size = 483525, upload-time = "2024-11-06T20:10:45.19Z" }, + { url = "https://files.pythonhosted.org/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4", size = 288324, upload-time = "2024-11-06T20:10:47.177Z" }, + { url = "https://files.pythonhosted.org/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0", size = 284617, upload-time = "2024-11-06T20:10:49.312Z" }, + { url = "https://files.pythonhosted.org/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0", size = 795023, upload-time = "2024-11-06T20:10:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7", size = 833072, upload-time = "2024-11-06T20:10:52.926Z" }, + { url = "https://files.pythonhosted.org/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7", size = 823130, upload-time = "2024-11-06T20:10:54.828Z" }, + { url = "https://files.pythonhosted.org/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c", size = 796857, upload-time = "2024-11-06T20:10:56.634Z" }, + { url = "https://files.pythonhosted.org/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3", size = 784006, upload-time = "2024-11-06T20:10:59.369Z" }, + { url = "https://files.pythonhosted.org/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07", size = 781650, upload-time = "2024-11-06T20:11:02.042Z" }, + { url = "https://files.pythonhosted.org/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e", size = 789545, upload-time = "2024-11-06T20:11:03.933Z" }, + { url = "https://files.pythonhosted.org/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6", size = 853045, upload-time = "2024-11-06T20:11:06.497Z" }, + { url = "https://files.pythonhosted.org/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4", size = 860182, upload-time = "2024-11-06T20:11:09.06Z" }, + { url = "https://files.pythonhosted.org/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d", size = 787733, upload-time = "2024-11-06T20:11:11.256Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f1/e40c8373e3480e4f29f2692bd21b3e05f296d3afebc7e5dcf21b9756ca1c/regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff", size = 262122, upload-time = "2024-11-06T20:11:13.161Z" }, + { url = "https://files.pythonhosted.org/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a", size = 273545, upload-time = "2024-11-06T20:11:15Z" }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218, upload-time = "2024-05-29T15:37:49.536Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload-time = "2024-05-29T15:37:47.027Z" }, +] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888, upload-time = "2023-05-01T04:11:33.229Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481, upload-time = "2023-05-01T04:11:28.427Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.40" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "greenlet", marker = "(python_full_version < '3.14' and platform_machine == 'AMD64') or (python_full_version < '3.14' and platform_machine == 'WIN32') or (python_full_version < '3.14' and platform_machine == 'aarch64') or (python_full_version < '3.14' and platform_machine == 'amd64') or (python_full_version < '3.14' and platform_machine == 'ppc64le') or (python_full_version < '3.14' and platform_machine == 'win32') or (python_full_version < '3.14' and platform_machine == 'x86_64')" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/68/c3/3f2bfa5e4dcd9938405fe2fab5b6ab94a9248a4f9536ea2fd497da20525f/sqlalchemy-2.0.40.tar.gz", hash = "sha256:d827099289c64589418ebbcaead0145cd19f4e3e8a93919a0100247af245fa00", size = 9664299, upload-time = "2025-03-27T17:52:31.876Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/18/4e3a86cc0232377bc48c373a9ba6a1b3fb79ba32dbb4eda0b357f5a2c59d/sqlalchemy-2.0.40-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:915866fd50dd868fdcc18d61d8258db1bf9ed7fbd6dfec960ba43365952f3b01", size = 2107887, upload-time = "2025-03-27T18:40:05.461Z" }, + { url = "https://files.pythonhosted.org/packages/cb/60/9fa692b1d2ffc4cbd5f47753731fd332afed30137115d862d6e9a1e962c7/sqlalchemy-2.0.40-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a4c5a2905a9ccdc67a8963e24abd2f7afcd4348829412483695c59e0af9a705", size = 2098367, upload-time = "2025-03-27T18:40:07.182Z" }, + { url = "https://files.pythonhosted.org/packages/4c/9f/84b78357ca641714a439eb3fbbddb17297dacfa05d951dbf24f28d7b5c08/sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55028d7a3ebdf7ace492fab9895cbc5270153f75442a0472d8516e03159ab364", size = 3184806, upload-time = "2025-03-27T18:51:29.356Z" }, + { url = "https://files.pythonhosted.org/packages/4b/7d/e06164161b6bfce04c01bfa01518a20cccbd4100d5c951e5a7422189191a/sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cfedff6878b0e0d1d0a50666a817ecd85051d12d56b43d9d425455e608b5ba0", size = 3198131, upload-time = "2025-03-27T18:50:31.616Z" }, + { url = "https://files.pythonhosted.org/packages/6d/51/354af20da42d7ec7b5c9de99edafbb7663a1d75686d1999ceb2c15811302/sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bb19e30fdae77d357ce92192a3504579abe48a66877f476880238a962e5b96db", size = 3131364, upload-time = "2025-03-27T18:51:31.336Z" }, + { url = "https://files.pythonhosted.org/packages/7a/2f/48a41ff4e6e10549d83fcc551ab85c268bde7c03cf77afb36303c6594d11/sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:16d325ea898f74b26ffcd1cf8c593b0beed8714f0317df2bed0d8d1de05a8f26", size = 3159482, upload-time = "2025-03-27T18:50:33.201Z" }, + { url = "https://files.pythonhosted.org/packages/33/ac/e5e0a807163652a35be878c0ad5cfd8b1d29605edcadfb5df3c512cdf9f3/sqlalchemy-2.0.40-cp313-cp313-win32.whl", hash = "sha256:a669cbe5be3c63f75bcbee0b266779706f1a54bcb1000f302685b87d1b8c1500", size = 2080704, upload-time = "2025-03-27T18:46:00.193Z" }, + { url = "https://files.pythonhosted.org/packages/1c/cb/f38c61f7f2fd4d10494c1c135ff6a6ddb63508d0b47bccccd93670637309/sqlalchemy-2.0.40-cp313-cp313-win_amd64.whl", hash = "sha256:641ee2e0834812d657862f3a7de95e0048bdcb6c55496f39c6fa3d435f6ac6ad", size = 2104564, upload-time = "2025-03-27T18:46:01.442Z" }, + { url = "https://files.pythonhosted.org/packages/d1/7c/5fc8e802e7506fe8b55a03a2e1dab156eae205c91bee46305755e086d2e2/sqlalchemy-2.0.40-py3-none-any.whl", hash = "sha256:32587e2e1e359276957e6fe5dad089758bc042a971a8a09ae8ecf7a8fe23d07a", size = 1903894, upload-time = "2025-03-27T18:40:43.796Z" }, +] + +[[package]] +name = "sse-starlette" +version = "2.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "starlette" }, + { name = "uvicorn" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/fc/56ab9f116b2133521f532fce8d03194cf04dcac25f583cf3d839be4c0496/sse_starlette-2.1.3.tar.gz", hash = "sha256:9cd27eb35319e1414e3d2558ee7414487f9529ce3b3cf9b21434fd110e017169", size = 19678, upload-time = "2024-08-01T08:52:50.248Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/aa/36b271bc4fa1d2796311ee7c7283a3a1c348bad426d37293609ca4300eef/sse_starlette-2.1.3-py3-none-any.whl", hash = "sha256:8ec846438b4665b9e8c560fcdea6bc8081a3abf7942faa95e5a744999d219772", size = 9383, upload-time = "2024-08-01T08:52:48.659Z" }, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, +] + +[[package]] +name = "starlette" +version = "0.46.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/20/08dfcd9c983f6a6f4a1000d934b9e6d626cff8d2eeb77a89a68eef20a2b7/starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5", size = 2580846, upload-time = "2025-04-13T13:56:17.942Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037, upload-time = "2025-04-13T13:56:16.21Z" }, +] + +[[package]] +name = "structlog" +version = "25.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/78/b8/d3670aec25747e32d54cd5258102ae0d69b9c61c79e7aa326be61a570d0d/structlog-25.2.0.tar.gz", hash = "sha256:d9f9776944207d1035b8b26072b9b140c63702fd7aa57c2f85d28ab701bd8e92", size = 1367438, upload-time = "2025-03-11T17:41:11.436Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/eb/244741c1abf7b4092686db0798a4c43491298f40ddec4226f5c4f6b5d3eb/structlog-25.2.0-py3-none-any.whl", hash = "sha256:0fecea2e345d5d491b72f3db2e5fcd6393abfc8cd06a4851f21fcd4d1a99f437", size = 68448, upload-time = "2025-03-11T17:41:09.478Z" }, +] + +[[package]] +name = "tenacity" +version = "9.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036, upload-time = "2025-04-02T08:25:09.966Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload-time = "2025-04-02T08:25:07.678Z" }, +] + +[[package]] +name = "text" +version = "0.1.0" +source = { virtual = "agents/text" } +dependencies = [ + { name = "langchain-openai" }, +] + +[package.metadata] +requires-dist = [{ name = "langchain-openai", specifier = ">=0.3.12" }] + +[[package]] +name = "tiktoken" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "regex" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ea/cf/756fedf6981e82897f2d570dd25fa597eb3f4459068ae0572d7e888cfd6f/tiktoken-0.9.0.tar.gz", hash = "sha256:d02a5ca6a938e0490e1ff957bc48c8b078c88cb83977be1625b1fd8aac792c5d", size = 35991, upload-time = "2025-02-14T06:03:01.003Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/11/09d936d37f49f4f494ffe660af44acd2d99eb2429d60a57c71318af214e0/tiktoken-0.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b0e8e05a26eda1249e824156d537015480af7ae222ccb798e5234ae0285dbdb", size = 1064919, upload-time = "2025-02-14T06:02:37.494Z" }, + { url = "https://files.pythonhosted.org/packages/80/0e/f38ba35713edb8d4197ae602e80837d574244ced7fb1b6070b31c29816e0/tiktoken-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:27d457f096f87685195eea0165a1807fae87b97b2161fe8c9b1df5bd74ca6f63", size = 1007877, upload-time = "2025-02-14T06:02:39.516Z" }, + { url = "https://files.pythonhosted.org/packages/fe/82/9197f77421e2a01373e27a79dd36efdd99e6b4115746ecc553318ecafbf0/tiktoken-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cf8ded49cddf825390e36dd1ad35cd49589e8161fdcb52aa25f0583e90a3e01", size = 1140095, upload-time = "2025-02-14T06:02:41.791Z" }, + { url = "https://files.pythonhosted.org/packages/f2/bb/4513da71cac187383541facd0291c4572b03ec23c561de5811781bbd988f/tiktoken-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc156cb314119a8bb9748257a2eaebd5cc0753b6cb491d26694ed42fc7cb3139", size = 1195649, upload-time = "2025-02-14T06:02:43Z" }, + { url = "https://files.pythonhosted.org/packages/fa/5c/74e4c137530dd8504e97e3a41729b1103a4ac29036cbfd3250b11fd29451/tiktoken-0.9.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cd69372e8c9dd761f0ab873112aba55a0e3e506332dd9f7522ca466e817b1b7a", size = 1258465, upload-time = "2025-02-14T06:02:45.046Z" }, + { url = "https://files.pythonhosted.org/packages/de/a8/8f499c179ec900783ffe133e9aab10044481679bb9aad78436d239eee716/tiktoken-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:5ea0edb6f83dc56d794723286215918c1cde03712cbbafa0348b33448faf5b95", size = 894669, upload-time = "2025-02-14T06:02:47.341Z" }, +] + +[[package]] +name = "tornado" +version = "6.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/59/45/a0daf161f7d6f36c3ea5fc0c2de619746cc3dd4c76402e9db545bd920f63/tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b", size = 501135, upload-time = "2024-11-22T03:06:38.036Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/7e/71f604d8cea1b58f82ba3590290b66da1e72d840aeb37e0d5f7291bd30db/tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1", size = 436299, upload-time = "2024-11-22T03:06:20.162Z" }, + { url = "https://files.pythonhosted.org/packages/96/44/87543a3b99016d0bf54fdaab30d24bf0af2e848f1d13d34a3a5380aabe16/tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803", size = 434253, upload-time = "2024-11-22T03:06:22.39Z" }, + { url = "https://files.pythonhosted.org/packages/cb/fb/fdf679b4ce51bcb7210801ef4f11fdac96e9885daa402861751353beea6e/tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec", size = 437602, upload-time = "2024-11-22T03:06:24.214Z" }, + { url = "https://files.pythonhosted.org/packages/4f/3b/e31aeffffc22b475a64dbeb273026a21b5b566f74dee48742817626c47dc/tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946", size = 436972, upload-time = "2024-11-22T03:06:25.559Z" }, + { url = "https://files.pythonhosted.org/packages/22/55/b78a464de78051a30599ceb6983b01d8f732e6f69bf37b4ed07f642ac0fc/tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf", size = 437173, upload-time = "2024-11-22T03:06:27.584Z" }, + { url = "https://files.pythonhosted.org/packages/79/5e/be4fb0d1684eb822c9a62fb18a3e44a06188f78aa466b2ad991d2ee31104/tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634", size = 437892, upload-time = "2024-11-22T03:06:28.933Z" }, + { url = "https://files.pythonhosted.org/packages/f5/33/4f91fdd94ea36e1d796147003b490fe60a0215ac5737b6f9c65e160d4fe0/tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73", size = 437334, upload-time = "2024-11-22T03:06:30.428Z" }, + { url = "https://files.pythonhosted.org/packages/2b/ae/c1b22d4524b0e10da2f29a176fb2890386f7bd1f63aacf186444873a88a0/tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c", size = 437261, upload-time = "2024-11-22T03:06:32.458Z" }, + { url = "https://files.pythonhosted.org/packages/b5/25/36dbd49ab6d179bcfc4c6c093a51795a4f3bed380543a8242ac3517a1751/tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482", size = 438463, upload-time = "2024-11-22T03:06:34.71Z" }, + { url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907, upload-time = "2024-11-22T03:06:36.71Z" }, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload-time = "2025-04-10T14:19:05.416Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload-time = "2025-04-10T14:19:03.967Z" }, +] + +[[package]] +name = "typing-inspect" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mypy-extensions" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dc/74/1789779d91f1961fa9438e9a8710cdae6bd138c80d7303996933d117264a/typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78", size = 13825, upload-time = "2023-05-24T20:25:47.612Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f", size = 8827, upload-time = "2023-05-24T20:25:45.287Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222, upload-time = "2025-02-25T17:27:59.638Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125, upload-time = "2025-02-25T17:27:57.754Z" }, +] + +[[package]] +name = "urllib3" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672, upload-time = "2025-04-10T15:23:39.232Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680, upload-time = "2025-04-10T15:23:37.377Z" }, +] + +[[package]] +name = "uvicorn" +version = "0.34.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/86/37/dd92f1f9cedb5eaf74d9999044306e06abe65344ff197864175dbbd91871/uvicorn-0.34.1.tar.gz", hash = "sha256:af981725fc4b7ffc5cb3b0e9eda6258a90c4b52cb2a83ce567ae0a7ae1757afc", size = 76755, upload-time = "2025-04-13T13:48:04.305Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/38/a5801450940a858c102a7ad9e6150146a25406a119851c993148d56ab041/uvicorn-0.34.1-py3-none-any.whl", hash = "sha256:984c3a8c7ca18ebaad15995ee7401179212c59521e67bfc390c07fa2b8d2e065", size = 62404, upload-time = "2025-04-13T13:48:02.408Z" }, +] + +[[package]] +name = "virtualenv" +version = "20.30.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/e0/633e369b91bbc664df47dcb5454b6c7cf441e8f5b9d0c250ce9f0546401e/virtualenv-20.30.0.tar.gz", hash = "sha256:800863162bcaa5450a6e4d721049730e7f2dae07720e0902b0e4040bd6f9ada8", size = 4346945, upload-time = "2025-03-31T16:33:29.185Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/ed/3cfeb48175f0671ec430ede81f628f9fb2b1084c9064ca67ebe8c0ed6a05/virtualenv-20.30.0-py3-none-any.whl", hash = "sha256:e34302959180fca3af42d1800df014b35019490b119eba981af27f2fa486e5d6", size = 4329461, upload-time = "2025-03-31T16:33:26.758Z" }, +] + +[[package]] +name = "watchfiles" +version = "1.0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/03/e2/8ed598c42057de7aa5d97c472254af4906ff0a59a66699d426fc9ef795d7/watchfiles-1.0.5.tar.gz", hash = "sha256:b7529b5dcc114679d43827d8c35a07c493ad6f083633d573d81c660abc5979e9", size = 94537, upload-time = "2025-04-08T10:36:26.722Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/62/435766874b704f39b2fecd8395a29042db2b5ec4005bd34523415e9bd2e0/watchfiles-1.0.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0b289572c33a0deae62daa57e44a25b99b783e5f7aed81b314232b3d3c81a11d", size = 401531, upload-time = "2025-04-08T10:35:35.792Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a6/e52a02c05411b9cb02823e6797ef9bbba0bfaf1bb627da1634d44d8af833/watchfiles-1.0.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a056c2f692d65bf1e99c41045e3bdcaea3cb9e6b5a53dcaf60a5f3bd95fc9763", size = 392417, upload-time = "2025-04-08T10:35:37.048Z" }, + { url = "https://files.pythonhosted.org/packages/3f/53/c4af6819770455932144e0109d4854437769672d7ad897e76e8e1673435d/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9dca99744991fc9850d18015c4f0438865414e50069670f5f7eee08340d8b40", size = 453423, upload-time = "2025-04-08T10:35:38.357Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d1/8e88df58bbbf819b8bc5cfbacd3c79e01b40261cad0fc84d1e1ebd778a07/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:894342d61d355446d02cd3988a7326af344143eb33a2fd5d38482a92072d9563", size = 458185, upload-time = "2025-04-08T10:35:39.708Z" }, + { url = "https://files.pythonhosted.org/packages/ff/70/fffaa11962dd5429e47e478a18736d4e42bec42404f5ee3b92ef1b87ad60/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab44e1580924d1ffd7b3938e02716d5ad190441965138b4aa1d1f31ea0877f04", size = 486696, upload-time = "2025-04-08T10:35:41.469Z" }, + { url = "https://files.pythonhosted.org/packages/39/db/723c0328e8b3692d53eb273797d9a08be6ffb1d16f1c0ba2bdbdc2a3852c/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6f9367b132078b2ceb8d066ff6c93a970a18c3029cea37bfd7b2d3dd2e5db8f", size = 522327, upload-time = "2025-04-08T10:35:43.289Z" }, + { url = "https://files.pythonhosted.org/packages/cd/05/9fccc43c50c39a76b68343484b9da7b12d42d0859c37c61aec018c967a32/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2e55a9b162e06e3f862fb61e399fe9f05d908d019d87bf5b496a04ef18a970a", size = 499741, upload-time = "2025-04-08T10:35:44.574Z" }, + { url = "https://files.pythonhosted.org/packages/23/14/499e90c37fa518976782b10a18b18db9f55ea73ca14641615056f8194bb3/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0125f91f70e0732a9f8ee01e49515c35d38ba48db507a50c5bdcad9503af5827", size = 453995, upload-time = "2025-04-08T10:35:46.336Z" }, + { url = "https://files.pythonhosted.org/packages/61/d9/f75d6840059320df5adecd2c687fbc18960a7f97b55c300d20f207d48aef/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:13bb21f8ba3248386337c9fa51c528868e6c34a707f729ab041c846d52a0c69a", size = 629693, upload-time = "2025-04-08T10:35:48.161Z" }, + { url = "https://files.pythonhosted.org/packages/fc/17/180ca383f5061b61406477218c55d66ec118e6c0c51f02d8142895fcf0a9/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:839ebd0df4a18c5b3c1b890145b5a3f5f64063c2a0d02b13c76d78fe5de34936", size = 624677, upload-time = "2025-04-08T10:35:49.65Z" }, + { url = "https://files.pythonhosted.org/packages/bf/15/714d6ef307f803f236d69ee9d421763707899d6298d9f3183e55e366d9af/watchfiles-1.0.5-cp313-cp313-win32.whl", hash = "sha256:4a8ec1e4e16e2d5bafc9ba82f7aaecfeec990ca7cd27e84fb6f191804ed2fcfc", size = 277804, upload-time = "2025-04-08T10:35:51.093Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b4/c57b99518fadf431f3ef47a610839e46e5f8abf9814f969859d1c65c02c7/watchfiles-1.0.5-cp313-cp313-win_amd64.whl", hash = "sha256:f436601594f15bf406518af922a89dcaab416568edb6f65c4e5bbbad1ea45c11", size = 291087, upload-time = "2025-04-08T10:35:52.458Z" }, +] + +[[package]] +name = "wcwidth" +version = "0.2.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301, upload-time = "2024-01-06T02:10:57.829Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166, upload-time = "2024-01-06T02:10:55.763Z" }, +] + +[[package]] +name = "xxhash" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/00/5e/d6e5258d69df8b4ed8c83b6664f2b47d30d2dec551a29ad72a6c69eafd31/xxhash-3.5.0.tar.gz", hash = "sha256:84f2caddf951c9cbf8dc2e22a89d4ccf5d86391ac6418fe81e3c67d0cf60b45f", size = 84241, upload-time = "2024-08-17T09:20:38.972Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/b8/e4b3ad92d249be5c83fa72916c9091b0965cb0faeff05d9a0a3870ae6bff/xxhash-3.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37889a0d13b0b7d739cfc128b1c902f04e32de17b33d74b637ad42f1c55101f6", size = 31795, upload-time = "2024-08-17T09:18:46.813Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d8/b3627a0aebfbfa4c12a41e22af3742cf08c8ea84f5cc3367b5de2d039cce/xxhash-3.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:97a662338797c660178e682f3bc180277b9569a59abfb5925e8620fba00b9fc5", size = 30792, upload-time = "2024-08-17T09:18:47.862Z" }, + { url = "https://files.pythonhosted.org/packages/c3/cc/762312960691da989c7cd0545cb120ba2a4148741c6ba458aa723c00a3f8/xxhash-3.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f85e0108d51092bdda90672476c7d909c04ada6923c14ff9d913c4f7dc8a3bc", size = 220950, upload-time = "2024-08-17T09:18:49.06Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e9/cc266f1042c3c13750e86a535496b58beb12bf8c50a915c336136f6168dc/xxhash-3.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2fd827b0ba763ac919440042302315c564fdb797294d86e8cdd4578e3bc7f3", size = 199980, upload-time = "2024-08-17T09:18:50.445Z" }, + { url = "https://files.pythonhosted.org/packages/bf/85/a836cd0dc5cc20376de26b346858d0ac9656f8f730998ca4324921a010b9/xxhash-3.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82085c2abec437abebf457c1d12fccb30cc8b3774a0814872511f0f0562c768c", size = 428324, upload-time = "2024-08-17T09:18:51.988Z" }, + { url = "https://files.pythonhosted.org/packages/b4/0e/15c243775342ce840b9ba34aceace06a1148fa1630cd8ca269e3223987f5/xxhash-3.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07fda5de378626e502b42b311b049848c2ef38784d0d67b6f30bb5008642f8eb", size = 194370, upload-time = "2024-08-17T09:18:54.164Z" }, + { url = "https://files.pythonhosted.org/packages/87/a1/b028bb02636dfdc190da01951d0703b3d904301ed0ef6094d948983bef0e/xxhash-3.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c279f0d2b34ef15f922b77966640ade58b4ccdfef1c4d94b20f2a364617a493f", size = 207911, upload-time = "2024-08-17T09:18:55.509Z" }, + { url = "https://files.pythonhosted.org/packages/80/d5/73c73b03fc0ac73dacf069fdf6036c9abad82de0a47549e9912c955ab449/xxhash-3.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:89e66ceed67b213dec5a773e2f7a9e8c58f64daeb38c7859d8815d2c89f39ad7", size = 216352, upload-time = "2024-08-17T09:18:57.073Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2a/5043dba5ddbe35b4fe6ea0a111280ad9c3d4ba477dd0f2d1fe1129bda9d0/xxhash-3.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bcd51708a633410737111e998ceb3b45d3dbc98c0931f743d9bb0a209033a326", size = 203410, upload-time = "2024-08-17T09:18:58.54Z" }, + { url = "https://files.pythonhosted.org/packages/a2/b2/9a8ded888b7b190aed75b484eb5c853ddd48aa2896e7b59bbfbce442f0a1/xxhash-3.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ff2c0a34eae7df88c868be53a8dd56fbdf592109e21d4bfa092a27b0bf4a7bf", size = 210322, upload-time = "2024-08-17T09:18:59.943Z" }, + { url = "https://files.pythonhosted.org/packages/98/62/440083fafbc917bf3e4b67c2ade621920dd905517e85631c10aac955c1d2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4e28503dccc7d32e0b9817aa0cbfc1f45f563b2c995b7a66c4c8a0d232e840c7", size = 414725, upload-time = "2024-08-17T09:19:01.332Z" }, + { url = "https://files.pythonhosted.org/packages/75/db/009206f7076ad60a517e016bb0058381d96a007ce3f79fa91d3010f49cc2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a6c50017518329ed65a9e4829154626f008916d36295b6a3ba336e2458824c8c", size = 192070, upload-time = "2024-08-17T09:19:03.007Z" }, + { url = "https://files.pythonhosted.org/packages/1f/6d/c61e0668943a034abc3a569cdc5aeae37d686d9da7e39cf2ed621d533e36/xxhash-3.5.0-cp313-cp313-win32.whl", hash = "sha256:53a068fe70301ec30d868ece566ac90d873e3bb059cf83c32e76012c889b8637", size = 30172, upload-time = "2024-08-17T09:19:04.355Z" }, + { url = "https://files.pythonhosted.org/packages/96/14/8416dce965f35e3d24722cdf79361ae154fa23e2ab730e5323aa98d7919e/xxhash-3.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:80babcc30e7a1a484eab952d76a4f4673ff601f54d5142c26826502740e70b43", size = 30041, upload-time = "2024-08-17T09:19:05.435Z" }, + { url = "https://files.pythonhosted.org/packages/27/ee/518b72faa2073f5aa8e3262408d284892cb79cf2754ba0c3a5870645ef73/xxhash-3.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:4811336f1ce11cac89dcbd18f3a25c527c16311709a89313c3acaf771def2d4b", size = 26801, upload-time = "2024-08-17T09:19:06.547Z" }, +] + +[[package]] +name = "yarl" +version = "1.19.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/4d/8a8f57caccce49573e567744926f88c6ab3ca0b47a257806d1cf88584c5f/yarl-1.19.0.tar.gz", hash = "sha256:01e02bb80ae0dbed44273c304095295106e1d9470460e773268a27d11e594892", size = 184396, upload-time = "2025-04-06T02:36:26.161Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/a7/222144efa2f4a47363a5fee27d8a1d24851283b5a7f628890805fe7f7a66/yarl-1.19.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:59281b9ed27bc410e0793833bcbe7fc149739d56ffa071d1e0fe70536a4f7b61", size = 144789, upload-time = "2025-04-06T02:35:13.176Z" }, + { url = "https://files.pythonhosted.org/packages/72/4f/3ee8de3f94baa33c0716260b0048b1fd5306f104b3efc6e1713693e7063e/yarl-1.19.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d27a6482ad5e05e8bafd47bf42866f8a1c0c3345abcb48d4511b3c29ecc197dc", size = 96685, upload-time = "2025-04-06T02:35:14.852Z" }, + { url = "https://files.pythonhosted.org/packages/3e/7c/fbeebf875c1ededd872d6fefabd8a8526ef8aba6e9e8bcdf230d895d487b/yarl-1.19.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7a8e19fd5a6fdf19a91f2409665c7a089ffe7b9b5394ab33c0eec04cbecdd01f", size = 94307, upload-time = "2025-04-06T02:35:16.722Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ff/b7a9c1d7df37e594b43b7a8030e228ccd4ce361eeff24a92b17fe210e57d/yarl-1.19.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cda34ab19099c3a1685ad48fe45172536610c312b993310b5f1ca3eb83453b36", size = 342811, upload-time = "2025-04-06T02:35:18.648Z" }, + { url = "https://files.pythonhosted.org/packages/79/e2/9e092876b2156c1d386e4864e85eba541ccabf2b9dcc47da64624bad0cc9/yarl-1.19.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7908a25d33f94852b479910f9cae6cdb9e2a509894e8d5f416c8342c0253c397", size = 336928, upload-time = "2025-04-06T02:35:20.59Z" }, + { url = "https://files.pythonhosted.org/packages/71/24/648d99c134f2e14fc01ba790ad36ab56815e00069e60a12a4af893448b83/yarl-1.19.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e66c14d162bac94973e767b24de5d7e6c5153f7305a64ff4fcba701210bcd638", size = 351021, upload-time = "2025-04-06T02:35:22.614Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ee/7278d475784d407d1990a5939722e66a0fef057046fb5f1721f0a6eb156c/yarl-1.19.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c03607bf932aa4cfae371e2dc9ca8b76faf031f106dac6a6ff1458418140c165", size = 354454, upload-time = "2025-04-06T02:35:24.72Z" }, + { url = "https://files.pythonhosted.org/packages/15/ae/242546114e052a7de21a75bd7d4860266439f90bbc21c5e4dd696866d91d/yarl-1.19.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9931343d1c1f4e77421687b6b94bbebd8a15a64ab8279adf6fbb047eff47e536", size = 347594, upload-time = "2025-04-06T02:35:26.665Z" }, + { url = "https://files.pythonhosted.org/packages/46/2c/35f4347f76ea4c986e9c1f774b085f489b3a1bf1503c67a4dfc5d8e68e92/yarl-1.19.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:262087a8a0d73e1d169d45c2baf968126f93c97cf403e1af23a7d5455d52721f", size = 334113, upload-time = "2025-04-06T02:35:28.4Z" }, + { url = "https://files.pythonhosted.org/packages/20/89/3086bc8ec8d7bd505531c51056452d7ae6af906d29c427374f1170ac1938/yarl-1.19.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:70f384921c24e703d249a6ccdabeb57dd6312b568b504c69e428a8dd3e8e68ca", size = 361037, upload-time = "2025-04-06T02:35:30.509Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5b/2c9765524a70d1c51922b41c91caa30c8094a416734349166e1a3d8de055/yarl-1.19.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:756b9ea5292a2c180d1fe782a377bc4159b3cfefaca7e41b5b0a00328ef62fa9", size = 361025, upload-time = "2025-04-06T02:35:32.904Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f8/c4a190bcc3cd98fb428d1dd31519e58004153dc7f2acd1236ecae54e3433/yarl-1.19.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cbeb9c145d534c240a63b6ecc8a8dd451faeb67b3dc61d729ec197bb93e29497", size = 364397, upload-time = "2025-04-06T02:35:34.807Z" }, + { url = "https://files.pythonhosted.org/packages/6b/fb/f65b1347be8e12ac4e3e37a9bb880e6b9b604f252aaafd88e4879b1e9348/yarl-1.19.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:087ae8f8319848c18e0d114d0f56131a9c017f29200ab1413b0137ad7c83e2ae", size = 374065, upload-time = "2025-04-06T02:35:36.669Z" }, + { url = "https://files.pythonhosted.org/packages/1c/c5/102cc3b9baad1a76f9127453ad08e0f5bc9c996c18128b1e28fe03817d6c/yarl-1.19.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362f5480ba527b6c26ff58cff1f229afe8b7fdd54ee5ffac2ab827c1a75fc71c", size = 381341, upload-time = "2025-04-06T02:35:38.912Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ce/f5dc0439320dfe59fadab8cdd24ac324be19cf6ae4736422c7e2a510ddf3/yarl-1.19.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f408d4b4315e814e5c3668094e33d885f13c7809cbe831cbdc5b1bb8c7a448f4", size = 376552, upload-time = "2025-04-06T02:35:40.846Z" }, + { url = "https://files.pythonhosted.org/packages/a9/4a/4833a134c76af987eff3ce8cb71e42932234120e6be061eb2555061e8844/yarl-1.19.0-cp313-cp313-win32.whl", hash = "sha256:24e4c367ad69988a2283dd45ea88172561ca24b2326b9781e164eb46eea68345", size = 85878, upload-time = "2025-04-06T02:35:43.517Z" }, + { url = "https://files.pythonhosted.org/packages/32/e9/59327daab3af8f79221638a8f0d11474d20f6a8fbc41e9da80c5ef69e688/yarl-1.19.0-cp313-cp313-win_amd64.whl", hash = "sha256:0110f91c57ab43d1538dfa92d61c45e33b84df9257bd08fcfcda90cce931cbc9", size = 92448, upload-time = "2025-04-06T02:35:45.694Z" }, + { url = "https://files.pythonhosted.org/packages/a4/06/ae25a353e8f032322df6f30d6bb1fc329773ee48e1a80a2196ccb8d1206b/yarl-1.19.0-py3-none-any.whl", hash = "sha256:a727101eb27f66727576630d02985d8a065d09cd0b5fcbe38a5793f71b2a97ef", size = 45990, upload-time = "2025-04-06T02:36:24.343Z" }, +] + +[[package]] +name = "zstandard" +version = "0.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation == 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ed/f6/2ac0287b442160a89d726b17a9184a4c615bb5237db763791a7fd16d9df1/zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09", size = 681701, upload-time = "2024-07-15T00:18:06.141Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/f1/8386f3f7c10261fe85fbc2c012fdb3d4db793b921c9abcc995d8da1b7a80/zstandard-0.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:576856e8594e6649aee06ddbfc738fec6a834f7c85bf7cadd1c53d4a58186ef9", size = 788975, upload-time = "2024-07-15T00:16:16.005Z" }, + { url = "https://files.pythonhosted.org/packages/16/e8/cbf01077550b3e5dc86089035ff8f6fbbb312bc0983757c2d1117ebba242/zstandard-0.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38302b78a850ff82656beaddeb0bb989a0322a8bbb1bf1ab10c17506681d772a", size = 633448, upload-time = "2024-07-15T00:16:17.897Z" }, + { url = "https://files.pythonhosted.org/packages/06/27/4a1b4c267c29a464a161aeb2589aff212b4db653a1d96bffe3598f3f0d22/zstandard-0.23.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2240ddc86b74966c34554c49d00eaafa8200a18d3a5b6ffbf7da63b11d74ee2", size = 4945269, upload-time = "2024-07-15T00:16:20.136Z" }, + { url = "https://files.pythonhosted.org/packages/7c/64/d99261cc57afd9ae65b707e38045ed8269fbdae73544fd2e4a4d50d0ed83/zstandard-0.23.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ef230a8fd217a2015bc91b74f6b3b7d6522ba48be29ad4ea0ca3a3775bf7dd5", size = 5306228, upload-time = "2024-07-15T00:16:23.398Z" }, + { url = "https://files.pythonhosted.org/packages/7a/cf/27b74c6f22541f0263016a0fd6369b1b7818941de639215c84e4e94b2a1c/zstandard-0.23.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:774d45b1fac1461f48698a9d4b5fa19a69d47ece02fa469825b442263f04021f", size = 5336891, upload-time = "2024-07-15T00:16:26.391Z" }, + { url = "https://files.pythonhosted.org/packages/fa/18/89ac62eac46b69948bf35fcd90d37103f38722968e2981f752d69081ec4d/zstandard-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f77fa49079891a4aab203d0b1744acc85577ed16d767b52fc089d83faf8d8ed", size = 5436310, upload-time = "2024-07-15T00:16:29.018Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a8/5ca5328ee568a873f5118d5b5f70d1f36c6387716efe2e369010289a5738/zstandard-0.23.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac184f87ff521f4840e6ea0b10c0ec90c6b1dcd0bad2f1e4a9a1b4fa177982ea", size = 4859912, upload-time = "2024-07-15T00:16:31.871Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ca/3781059c95fd0868658b1cf0440edd832b942f84ae60685d0cfdb808bca1/zstandard-0.23.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c363b53e257246a954ebc7c488304b5592b9c53fbe74d03bc1c64dda153fb847", size = 4936946, upload-time = "2024-07-15T00:16:34.593Z" }, + { url = "https://files.pythonhosted.org/packages/ce/11/41a58986f809532742c2b832c53b74ba0e0a5dae7e8ab4642bf5876f35de/zstandard-0.23.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e7792606d606c8df5277c32ccb58f29b9b8603bf83b48639b7aedf6df4fe8171", size = 5466994, upload-time = "2024-07-15T00:16:36.887Z" }, + { url = "https://files.pythonhosted.org/packages/83/e3/97d84fe95edd38d7053af05159465d298c8b20cebe9ccb3d26783faa9094/zstandard-0.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a0817825b900fcd43ac5d05b8b3079937073d2b1ff9cf89427590718b70dd840", size = 4848681, upload-time = "2024-07-15T00:16:39.709Z" }, + { url = "https://files.pythonhosted.org/packages/6e/99/cb1e63e931de15c88af26085e3f2d9af9ce53ccafac73b6e48418fd5a6e6/zstandard-0.23.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9da6bc32faac9a293ddfdcb9108d4b20416219461e4ec64dfea8383cac186690", size = 4694239, upload-time = "2024-07-15T00:16:41.83Z" }, + { url = "https://files.pythonhosted.org/packages/ab/50/b1e703016eebbc6501fc92f34db7b1c68e54e567ef39e6e59cf5fb6f2ec0/zstandard-0.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fd7699e8fd9969f455ef2926221e0233f81a2542921471382e77a9e2f2b57f4b", size = 5200149, upload-time = "2024-07-15T00:16:44.287Z" }, + { url = "https://files.pythonhosted.org/packages/aa/e0/932388630aaba70197c78bdb10cce2c91fae01a7e553b76ce85471aec690/zstandard-0.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d477ed829077cd945b01fc3115edd132c47e6540ddcd96ca169facff28173057", size = 5655392, upload-time = "2024-07-15T00:16:46.423Z" }, + { url = "https://files.pythonhosted.org/packages/02/90/2633473864f67a15526324b007a9f96c96f56d5f32ef2a56cc12f9548723/zstandard-0.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ce8b52c5987b3e34d5674b0ab529a4602b632ebab0a93b07bfb4dfc8f8a33", size = 5191299, upload-time = "2024-07-15T00:16:49.053Z" }, + { url = "https://files.pythonhosted.org/packages/b0/4c/315ca5c32da7e2dc3455f3b2caee5c8c2246074a61aac6ec3378a97b7136/zstandard-0.23.0-cp313-cp313-win32.whl", hash = "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd", size = 430862, upload-time = "2024-07-15T00:16:51.003Z" }, + { url = "https://files.pythonhosted.org/packages/a2/bf/c6aaba098e2d04781e8f4f7c0ba3c7aa73d00e4c436bcc0cf059a66691d1/zstandard-0.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b", size = 495578, upload-time = "2024-07-15T00:16:53.135Z" }, +] From 0b50c7fb617c7128ea22c953f2d5cb73e9e49fae Mon Sep 17 00:00:00 2001 From: jingyu Date: Thu, 10 Jul 2025 06:52:39 +0900 Subject: [PATCH 06/19] =?UTF-8?q?Feat!:=20music=20workflow=EC=97=90=20Weat?= =?UTF-8?q?herGenerationNode=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 날씨 기반 가사 생성을 지원하는 WeatherGenerationNode를 추가 - 기존 그래프를 병렬 노드로 구현 --- agents/music/workflow.py | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/agents/music/workflow.py b/agents/music/workflow.py index ad006f1..eafaa18 100644 --- a/agents/music/workflow.py +++ b/agents/music/workflow.py @@ -9,7 +9,7 @@ from langgraph.graph.state import CompiledStateGraph from agents.base_workflow import BaseWorkflow from agents.music.modules.state import MusicState -from agents.music.modules.nodes import LyricGenerationNode, DiaryGenerationNode, YoutubeSearchNode, YoutubeAnalysisNode +from agents.music.modules.nodes import LyricGenerationNode, DiaryGenerationNode, YoutubeSearchNode, YoutubeAnalysisNode, WeatherGenerationNode class MusicWorkflow(BaseWorkflow): """ @@ -35,33 +35,38 @@ def build(self) -> CompiledStateGraph: CompiledStateGraph: 컴파일된 상태 그래프 객체 """ builder = StateGraph(self.state) + - # builder.add_edge("__start__", "__end__") - - # builder.add_node("lyric_generation", LyricGenerationNode()) - # builder.add_edge("__start__", "lyric_generation") - # builder.add_edge("lyric_generation", "__end__") - + # 노드 생성 및 연결결 builder.add_node("diary_generation", DiaryGenerationNode()) + builder.add_node("weather_generation", WeatherGenerationNode()) + builder.add_edge("__start__", "diary_generation") + builder.add_edge("__start__", "weather_generation") + builder.add_node("youtube_search", YoutubeSearchNode()) builder.add_node("youtube_analysis", YoutubeAnalysisNode()) - - builder.add_edge("__start__", "diary_generation") builder.add_edge("diary_generation", "youtube_search") builder.add_edge("youtube_search", "youtube_analysis") - builder.add_edge("youtube_analysis", "__end__") + + builder.add_node("lyric_generation", LyricGenerationNode()) + builder.add_edge(["youtube_analysis", "weather_generation"], "lyric_generation") + builder.add_edge("lyric_generation", "__end__") workflow = builder.compile() # 그래프 컴파일 workflow.name = self.name # Workflow 이름 설정 return workflow -music_workflow = MusicWorkflow(MusicState) if __name__ == "__main__": - # 음악 Workflow 인스턴스 생성 + diary_query = input("일기 생성용 입력: ") + lyric_query = input("가사 생성용 입력: ") + music_workflow = MusicWorkflow(MusicState) graph = music_workflow.build() - input_query = input() - graph.invoke({f"query": "{input_query}"}) + + graph.invoke({ + "diary_query": diary_query, + "lyric_query": lyric_query + }) From 26c7a2407cdc69566f65aed0934cdd1b939bfede Mon Sep 17 00:00:00 2001 From: jingyu Date: Thu, 10 Jul 2025 06:56:50 +0900 Subject: [PATCH 07/19] =?UTF-8?q?refactor:=20models.py=20=ED=99=98?= =?UTF-8?q?=EA=B2=BD=20=EB=B3=80=EC=88=98=20=EB=A1=9C=EB=94=A9=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EC=9E=AC=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 파일 상단에 dotenv 로딩 코드 추가 --- agents/music/modules/models.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/agents/music/modules/models.py b/agents/music/modules/models.py index f9a8b4e..24003b2 100644 --- a/agents/music/modules/models.py +++ b/agents/music/modules/models.py @@ -6,14 +6,15 @@ from google import genai from googleapiclient.discovery import build +from dotenv import load_dotenv +import os -import os +load_dotenv() -GEMINI_API_KEY = os.getenv("GEMINI_API_KEY") -YOUTUBE_API_KEY = os.getenv("YOUTUBE_API_KEY") YOUTUBE_API_SERVICE_NAME = os.getenv("YOUTUBE_API_SERVICE_NAME") YOUTUBE_API_VERSION = os.getenv("YOUTUBE_API_VERSION") - +YOUTUBE_API_KEY = os.getenv("YOUTUBE_API_KEY") +GEMINI_API_KEY = os.getenv("GEMINI_API_KEY") def get_openai_model(temperature=0.7, top_p=0.9): """ From 138a5d610af97cf5b602937c83a5123a6f4f7143 Mon Sep 17 00:00:00 2001 From: jingyu Date: Thu, 10 Jul 2025 07:02:09 +0900 Subject: [PATCH 08/19] =?UTF-8?q?feat:=20DiaryGenerationNode=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=84=B0=EB=A7=81=20=EB=B0=8F=20Lyric/WeatherGenerati?= =?UTF-8?q?onNode=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - DiaryGenerationNode에서 프롬프트 키를 ‘diary_query’로 통합하여 입력 방식 일관화 및 가독성 향상 - 날씨·영상 분석 컨텍스트 기반 가사 생성 기능을 제공하는 LyricGenerationNode 도입 - 외부 API로 실시간 날씨 정보를 조회하는 WeatherGenerationNode 도입 - 코드 클린업을 위해 불필요하게 주석 처리된 코드를 제거 --- agents/music/modules/nodes.py | 101 ++++++++++++++++++++-------------- 1 file changed, 61 insertions(+), 40 deletions(-) diff --git a/agents/music/modules/nodes.py b/agents/music/modules/nodes.py index 2b7f60d..1807fcd 100644 --- a/agents/music/modules/nodes.py +++ b/agents/music/modules/nodes.py @@ -8,10 +8,11 @@ from agents.music.modules.prompts import get_lyric_template, get_diary_template, get_query_extraction_template, get_youtube_query_template, get_youtube_analysis_template from agents.music.modules.state import MusicState from agents.music.modules.models import get_openai_model, get_gemini_client, get_youtube_client - +from agents.music.modules.tools.weather import WeatherService from googleapiclient.discovery import build from google import genai + class DiaryGenerationNode(BaseNode): """ 일기 생성 노드 @@ -26,11 +27,11 @@ def execute(self, state) -> dict: 일기 생성 노드 실행 """ self.logging("execute", input_state=state) - first_prompt = get_diary_template().format(query=state["query"]) + first_prompt = get_diary_template().format(query=state["diary_query"]) diary_topic_response = self.model.invoke(first_prompt) diary_topic_response = diary_topic_response.text() - second_prompt = get_query_extraction_template().format(query=state["query"]) + second_prompt = get_query_extraction_template().format(query=state["diary_query"]) messages = [ { "role" : "user", @@ -48,12 +49,6 @@ def execute(self, state) -> dict: query_response = self.model.invoke(messages) query_response = query_response.text() - # if "varying_data" not in state: - # state["varying_data"] = {} - - # state["varying_data"]["youtube_query"] = query_response - - # return {"response" : query_response, "query": state["query"], "varying" : state["varying_data"]} return {"youtube_query" : query_response} def __call__(self, state): @@ -63,31 +58,6 @@ def __call__(self, state): return self.execute(state) -class LyricGenerationNode(BaseNode): - """ - 가사 생성 노드 - """ - - def __init__(self, **kwargs): - super().__init__(**kwargs) - self.model = get_openai_model() - - def execute(self, state: MusicState) -> dict: - """ - 가사 생성 노드 실행 - """ - self.logging("execute", input_state=state) - prompt = get_lyric_template().format(query=state["query"]) - response = self.model.invoke(prompt) - return {"response": response, "query": state["query"]} - - def __call__(self, state: MusicState) -> dict: - """ - 노드를 함수처럼 호출 가능하게 만드는 메서드 - """ - return self.execute(state) - - class YoutubeSearchNode(BaseNode): """ 유튜브 영상을 찾는 노드 @@ -118,9 +88,6 @@ def execute(self, state : MusicState) -> dict: video_id = str(item['id']['videoId']) videos.append("https://www.youtube.com/watch?v=" + video_id) - # state["varying_data"]["video_url"] = videos[0] - - # return {"response": videos[0], "query": state["query"], "varying" : state["varying_data"]} #검색 결과 영상들 중 첫 번째만 반환 return {"video_url" : videos[0]} def __call__(self, state): @@ -144,7 +111,7 @@ def execute(self, state : MusicState) -> dict: 유튜브 영상 분석 노드 실행 """ self.logging("execute", input_state = state) - prompt = get_youtube_analysis_template().format(query=state["query"]) + prompt = get_youtube_analysis_template().format(query=state["diary_query"]) video_link = state["video_url"] response = self.model.models.generate_content( model='models/gemini-2.0-flash', @@ -157,8 +124,7 @@ def execute(self, state : MusicState) -> dict: ] ) ) - # response = response["candidates"]["content"]["parts"][0]["text"] - # return {"response" : response, "query" : state["query"], "varying" : state["varying_data"]} + return {"video_analysis" : response.text} def __call__(self, state): @@ -166,6 +132,61 @@ def __call__(self, state): 노드를 함수처럼 호출 가능하게 만드는 메서드 """ return self.execute(state) + + +class LyricGenerationNode(BaseNode): + """ + 가사 생성 노드 + """ + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.model = get_openai_model() + + def execute(self, state: MusicState) -> dict: + """ + 가사 생성 노드 실행 + """ + self.logging("execute", input_state=state) + prompt = get_lyric_template().format( + query=state["lyric_query"], + weather_info=state["weather_info"], + video_analysis=state["video_analysis"] + ) + response = self.model.invoke(prompt) + return {"response": response, "query": state["lyric_query"]} + + def __call__(self, state: MusicState) -> dict: + """ + 노드를 함수처럼 호출 가능하게 만드는 메서드 + """ + return self.execute(state) + + +class WeatherGenerationNode(BaseNode): + """ + 날씨 정보 생성 노드 + """ + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.weather_service = WeatherService() + + def execute(self, state: MusicState) -> dict: + """ + 날씨 정보 생성 노드 실행 + """ + self.logging("execute", input_state=state) + + # 날씨 정보 가져오기 + weather_info = self.weather_service.get_current_weather() + return {"weather_info": weather_info} + + def __call__(self, state: MusicState) -> dict: + """ + 노드를 함수처럼 호출 가능하게 만드는 메서드 + """ + return self.execute(state) # from agents.music.modules.chains import set_music_generation_chain From 7c9d28419915f8791cabab05b943f7922e384367 Mon Sep 17 00:00:00 2001 From: jingyu Date: Thu, 10 Jul 2025 07:03:13 +0900 Subject: [PATCH 09/19] =?UTF-8?q?feat:=20lyric=20=ED=85=9C=ED=94=8C?= =?UTF-8?q?=EB=A6=BF=EC=97=90=20=EB=82=A0=EC=94=A8=20=EB=B0=8F=20=EC=9C=A0?= =?UTF-8?q?=ED=88=AC=EB=B8=8C=20=EB=B6=84=EC=84=9D=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - lyric 템플릿에 오늘의 날씨와 유투브 분석 내용을 포함 - 입력 변수 목록에 weather_info와 video_analysis 추가 --- agents/music/modules/prompts.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/agents/music/modules/prompts.py b/agents/music/modules/prompts.py index ab4fef2..48a0bb6 100644 --- a/agents/music/modules/prompts.py +++ b/agents/music/modules/prompts.py @@ -35,6 +35,9 @@ - 표현 방식: 시각적 색채와 촉각적 느낌을 결합해 감각적으로 전달 - 레퍼런스: 이바다, 김사월, 신해경 +오늘의 날씨 : {weather_info} +유투브 분석 내용 : {video_analysis} + 이제 다음 주제로 가사를 써줘: {query} """ @@ -82,7 +85,7 @@ def get_lyric_template() -> PromptTemplate: """가사 템플릿 반환""" return PromptTemplate( template=lyric_template, - input_variables=["query"], + input_variables=["weather_info", "video_analysis", "query"], ) def get_diary_template() -> PromptTemplate: From f469f6f4c0132f82dbbb525575f6ba4f9455c7a7 Mon Sep 17 00:00:00 2001 From: jingyu Date: Thu, 10 Jul 2025 07:05:03 +0900 Subject: [PATCH 10/19] =?UTF-8?q?feat:=20MusicState=EC=97=90=20diary=5Fque?= =?UTF-8?q?ry=20=EB=B0=8F=20lyric=5Fquery=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MusicState 클래스에 diary_query와 lyric_query 필드를 추가 및 state 값 통합 --- agents/music/modules/state.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/agents/music/modules/state.py b/agents/music/modules/state.py index fdbb508..047a647 100644 --- a/agents/music/modules/state.py +++ b/agents/music/modules/state.py @@ -8,8 +8,7 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Annotated, TypedDict, Dict - +from typing import Annotated, TypedDict, Any, Dict from langgraph.graph.message import add_messages @@ -22,10 +21,13 @@ class MusicState(TypedDict): LangGraph의 상태 관리를 위한 클래스로, Workflow 내에서 처리되는 데이터의 형태와 구조를 지정합니다. """ - query: str # 사용자 쿼리 또는 요청사항 + diary_query: str + lyric_query: str response: Annotated[ list, add_messages ] # 응답 메시지 목록 (add_messages로 주석되어 메시지 추가 기능 제공) + weather_info: str # 날씨 정보 제공 youtube_query: str video_url: str video_analysis: str + aggregate: Annotated[list, add_messages] \ No newline at end of file From 3587f67d6693e2c0f322fa06fca98ddd79787dd1 Mon Sep 17 00:00:00 2001 From: jingyu Date: Thu, 10 Jul 2025 07:09:31 +0900 Subject: [PATCH 11/19] =?UTF-8?q?feat:=20=EA=B8=B0=EC=83=81=EC=B2=AD=20API?= =?UTF-8?q?=EB=A5=BC=20=ED=99=9C=EC=9A=A9=ED=95=9C=20=EB=82=A0=EC=94=A8=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EB=AA=A8=EB=93=88=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 날씨 정보를 가져오고 음악 생성에 활용할 수 있도록 변환하는 WeatherService 클래스 구현 - 날씨 데이터 파싱 및 포맷팅 기능 포함 - 기본 X, Y 좌표를 서울 용산구로 설정 --- agents/music/modules/tools/weather.py | 242 ++++++++++++++++++++++++++ 1 file changed, 242 insertions(+) create mode 100644 agents/music/modules/tools/weather.py diff --git a/agents/music/modules/tools/weather.py b/agents/music/modules/tools/weather.py new file mode 100644 index 0000000..5946f56 --- /dev/null +++ b/agents/music/modules/tools/weather.py @@ -0,0 +1,242 @@ +""" +날씨 정보를 가져오는 모듈 + +기상청 API를 사용하여 현재 날씨 정보를 가져오고, +음악 생성에 활용할 수 있는 형태로 변환합니다. +""" + +from datetime import datetime, timedelta +import json +import requests +from typing import Dict, Any, Optional +from dotenv import load_dotenv +import os + +load_dotenv() + + +class WeatherService: + """ + 기상청 API를 사용하여 날씨 정보를 가져오는 서비스 클래스 + """ + + def __init__(self): + self.service_key = os.getenv("WEATHER_API_KEY") + self.base_url = "http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtFcst" + self.numOfRows = '1000' + self.pageNO = '1' + self.dataType = 'JSON' + + # 방위 코드 정의 + self.deg_code = { + 0: 'N', 360: 'N', 180: 'S', 270: 'W', 90: 'E', 22.5: 'NNE', + 45: 'NE', 67.5: 'ENE', 112.5: 'ESE', 135: 'SE', 157.5: 'SSE', + 202.5: 'SSW', 225: 'SW', 247.5: 'WSW', 292.5: 'WNW', 315: 'NW', + 337.5: 'NNW' + } + + # 날씨 코드 정의 + self.pty_code = { + 0: '강수 없음', 1: '비', 2: '비/눈', 3: '눈', + 5: '빗방울눈날림', 6: '진눈깨비', 7: '눈날림' + } + self.sky_code = {1: '맑음', 3: '구름많음', 4: '흐림'} + + def deg_to_dir(self, deg: float) -> str: + """ + 각도를 방위로 변환 + + Args: + deg: 각도 (0-360) + + Returns: + 방위 문자열 (N, S, E, W, NE, SE, SW, NW 등) + """ + close_dir = '' + min_abs = 360 + if deg not in self.deg_code.keys(): + for key in self.deg_code.keys(): + if abs(key - deg) < min_abs: + min_abs = abs(key - deg) + close_dir = self.deg_code[key] + else: + close_dir = self.deg_code[deg] + return close_dir + + def get_weather_data(self, nx: str = '60', ny: str = '126') -> Dict[str, Any]: + """ + 기상청 API에서 날씨 데이터를 가져옵니다. + + Args: + nx: X 좌표 (기본값: 서울 용산구) + ny: Y 좌표 (기본값: 서울 용산구) + + Returns: + 날씨 데이터 딕셔너리 + """ + # 현재 날짜와 시간 사용 + now = datetime.now() + one_hour_ago = now - timedelta(hours=1) + + base_date = now.strftime('%Y%m%d') + base_time = one_hour_ago.strftime('%H%M') + + # URL 생성 + url = f"{self.base_url}?serviceKey={self.service_key}&numOfRows={self.numOfRows}&pageNo={self.pageNO}&dataType={self.dataType}&base_date={base_date}&base_time={base_time}&nx={nx}&ny={ny}" + + try: + response = requests.get(url) + return json.loads(response.text) + except requests.RequestException as e: + print(f"날씨 API 요청 실패: {e}") + return {} + except json.JSONDecodeError as e: + print(f"JSON 파싱 실패: {e}") + return {} + + def parse_weather_data(self, weather_data: Dict[str, Any]) -> Dict[str, Dict[str, Any]]: + """ + 날씨 데이터를 시간대별로 파싱합니다. + + Args: + weather_data: API 응답 데이터 + + Returns: + 시간대별 날씨 정보 딕셔너리 + """ + informations = {} + + if 'response' not in weather_data or 'body' not in weather_data['response']: + return informations + + items = weather_data['response']['body']['items']['item'] + + for item in items: + cate = item['category'] + fcst_time = item['fcstTime'] + fcst_value = item['fcstValue'] + + if fcst_time not in informations: + informations[fcst_time] = {} + + informations[fcst_time][cate] = fcst_value + + return informations + + def format_weather_info(self, weather_info: Dict[str, Any], base_date: str, + fcst_time: str, nx: str, ny: str) -> str: + """ + 날씨 정보를 읽기 쉬운 형태로 포맷팅합니다. + + Args: + weather_info: 특정 시간의 날씨 정보 + base_date: 기준 날짜 + fcst_time: 예보 시간 + nx: X 좌표 + ny: Y 좌표 + + Returns: + 포맷팅된 날씨 정보 문자열 + """ + template = f"{base_date[:4]}년 {base_date[4:6]}월 {base_date[-2:]}일 {fcst_time[:2]}시 {fcst_time[2:]}분 ({int(nx)}, {int(ny)}) 지역의 날씨는 " + + # 하늘 상태 + if 'SKY' in weather_info: + sky_temp = self.sky_code[int(weather_info['SKY'])] + template += sky_temp + " | " + + # 강수 형태 + if 'PTY' in weather_info: + pty_temp = self.pty_code[int(weather_info['PTY'])] + template += pty_temp + " | " + + # 1시간 강수량 + if 'RN1' in weather_info: + rn1_temp = weather_info['RN1'] + template += f"시간당 {rn1_temp} | " + + # 기온 + if 'T1H' in weather_info: + t1h_temp = float(weather_info['T1H']) + template += f"기온 {t1h_temp}°C | " + + # 습도 + if 'REH' in weather_info: + reh_temp = float(weather_info['REH']) + template += f"습도 {reh_temp}% | " + + # 동서 바람 성분 + if 'UUU' in weather_info: + uuu_temp = float(weather_info['UUU']) + template += f"동서 바람 성분 {uuu_temp}m/s | " + + # 남북 바람 성분 + if 'VVV' in weather_info: + vvv_temp = float(weather_info['VVV']) + template += f"남북 바람 성분 {vvv_temp}m/s | " + + # 풍향 + if 'VEC' in weather_info: + vec_temp = self.deg_to_dir(float(weather_info['VEC'])) + template += f"풍향 {vec_temp} | " + + # 풍속 + if 'WSD' in weather_info: + wsd_temp = weather_info['WSD'] + template += f"풍속 {wsd_temp}m/s | " + + # 낙뢰 + if 'LGT' in weather_info: + lgt_temp = weather_info['LGT'] + template += f"낙뢰 {lgt_temp}kA" + + return template + + def get_current_weather(self, nx: str = '60', ny: str = '126') -> Dict[str, Any]: + """ + 현재 시간과 가장 가까운 날씨 정보를 가져옵니다. + + Args: + nx: X 좌표 + ny: Y 좌표 + + Returns: + 현재 날씨 정보 딕셔너리 + """ + # 날씨 데이터 가져오기 + weather_data = self.get_weather_data(nx, ny) + if not weather_data: + return {} + + # 시간대별로 파싱 + informations = self.parse_weather_data(weather_data) + if not informations: + return {} + + # 현재 시간과 가장 가까운 예보 시간 찾기 + now = datetime.now() + current_time = now.strftime('%H%M') + base_date = now.strftime('%Y%m%d') + + closest_time = min(informations.keys(), + key=lambda x: abs(int(x) - int(current_time))) + + # 해당 시간의 날씨 정보 + current_weather = informations[closest_time] + + # 포맷팅된 문자열 생성 + formatted_weather = self.format_weather_info( + current_weather, base_date, closest_time, nx, ny + ) + + return { + 'raw_data': current_weather, + 'formatted_text': formatted_weather, + 'temperature': float(current_weather.get('T1H', 0)), + 'humidity': float(current_weather.get('REH', 0)), + 'sky_condition': self.sky_code.get(int(current_weather.get('SKY', 1)), '맑음'), + 'precipitation': self.pty_code.get(int(current_weather.get('PTY', 0)), '강수 없음'), + 'wind_speed': current_weather.get('WSD', '0'), + 'wind_direction': self.deg_to_dir(float(current_weather.get('VEC', 0))), + 'location': f"({nx}, {ny})" + } \ No newline at end of file From 0517b4eb9771ac9f40ea02e770f7fb6cfc5f066e Mon Sep 17 00:00:00 2001 From: jingyu Date: Thu, 10 Jul 2025 07:25:18 +0900 Subject: [PATCH 12/19] =?UTF-8?q?feat:=20MusicWorkflow=20=EC=9D=B8?= =?UTF-8?q?=EC=8A=A4=ED=84=B4=EC=8A=A4=20=EC=83=9D=EC=84=B1=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 실수로 누락된 코드 다시 추가가 --- agents/music/workflow.py | 1 + 1 file changed, 1 insertion(+) diff --git a/agents/music/workflow.py b/agents/music/workflow.py index eafaa18..87258e1 100644 --- a/agents/music/workflow.py +++ b/agents/music/workflow.py @@ -57,6 +57,7 @@ def build(self) -> CompiledStateGraph: return workflow +music_workflow = MusicWorkflow(MusicState) if __name__ == "__main__": diary_query = input("일기 생성용 입력: ") From ae101896d011c63a62809aad5b7848ae88424cdb Mon Sep 17 00:00:00 2001 From: Kimhansav Date: Sun, 13 Jul 2025 21:36:19 +0900 Subject: [PATCH 13/19] =?UTF-8?q?management/modules/state.py=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=B3=B5=EA=B5=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agents/management/modules/state.py | 7 +++---- agents/music/modules/nodes.py | 6 ++++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/agents/management/modules/state.py b/agents/management/modules/state.py index 9ae62c1..8799502 100644 --- a/agents/management/modules/state.py +++ b/agents/management/modules/state.py @@ -22,10 +22,9 @@ class ManagementState(TypedDict): project_id: str # 프로젝트 ID (예: "PRJ-2023-001", "EP-MARVEL-S01") request_type: str # 요청 유형 (예: "resource_allocation", "team_management", "creator_development") query: str # 사용자 쿼리 또는 요청사항 - response: Annotated[ - list, add_messages - ] team_members: Optional[List[str]] = None # 팀 구성원 목록 resources_available: Optional[Dict[str, any]] = None # 사용 가능한 리소스 정보 resource_plan: Optional[str] = None # 리소스 계획 콘텐츠 - # 응답 메시지 목록 (add_messages로 주석되어 메시지 추가 기능 제공) + response: Annotated[ + list, add_messages + ] # 응답 메시지 목록 (add_messages로 주석되어 메시지 추가 기능 제공) diff --git a/agents/music/modules/nodes.py b/agents/music/modules/nodes.py index 1807fcd..141fc4d 100644 --- a/agents/music/modules/nodes.py +++ b/agents/music/modules/nodes.py @@ -48,7 +48,10 @@ def execute(self, state) -> dict: ] query_response = self.model.invoke(messages) query_response = query_response.text() +<<<<<<< Updated upstream +======= +>>>>>>> Stashed changes return {"youtube_query" : query_response} def __call__(self, state): @@ -124,7 +127,10 @@ def execute(self, state : MusicState) -> dict: ] ) ) +<<<<<<< Updated upstream +======= +>>>>>>> Stashed changes return {"video_analysis" : response.text} def __call__(self, state): From 3a21840331a6c552c6b5a33c69f4bdb3dbd36f29 Mon Sep 17 00:00:00 2001 From: Kimhansav Date: Sun, 13 Jul 2025 21:52:21 +0900 Subject: [PATCH 14/19] =?UTF-8?q?=EB=B3=91=ED=95=A9=20=EC=B6=A9=EB=8F=8C?= =?UTF-8?q?=20=ED=95=B4=EA=B2=B0=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agents/music/modules/nodes.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/agents/music/modules/nodes.py b/agents/music/modules/nodes.py index 141fc4d..0e84a75 100644 --- a/agents/music/modules/nodes.py +++ b/agents/music/modules/nodes.py @@ -48,10 +48,7 @@ def execute(self, state) -> dict: ] query_response = self.model.invoke(messages) query_response = query_response.text() -<<<<<<< Updated upstream -======= ->>>>>>> Stashed changes return {"youtube_query" : query_response} def __call__(self, state): @@ -127,10 +124,6 @@ def execute(self, state : MusicState) -> dict: ] ) ) -<<<<<<< Updated upstream - -======= ->>>>>>> Stashed changes return {"video_analysis" : response.text} def __call__(self, state): From b40f2f0dfa359cc5ccd729d7490cf372e275bff1 Mon Sep 17 00:00:00 2001 From: Kimhansav Date: Sun, 13 Jul 2025 23:25:56 +0900 Subject: [PATCH 15/19] =?UTF-8?q?LyricGenerationNode=20=EC=98=A4=EB=A5=98?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agents/music/modules/nodes.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/agents/music/modules/nodes.py b/agents/music/modules/nodes.py index 0e84a75..cc6368b 100644 --- a/agents/music/modules/nodes.py +++ b/agents/music/modules/nodes.py @@ -48,7 +48,7 @@ def execute(self, state) -> dict: ] query_response = self.model.invoke(messages) query_response = query_response.text() - + return {"youtube_query" : query_response} def __call__(self, state): @@ -148,12 +148,14 @@ def execute(self, state: MusicState) -> dict: """ self.logging("execute", input_state=state) prompt = get_lyric_template().format( - query=state["lyric_query"], + # query=state["lyric_query"], + query=state["youtube_query"], weather_info=state["weather_info"], video_analysis=state["video_analysis"] ) response = self.model.invoke(prompt) - return {"response": response, "query": state["lyric_query"]} + # return {"response": response, "query": state["lyric_query"]} + return {"response": response} def __call__(self, state: MusicState) -> dict: """ From 71096200af52ec4bf1a27e8b5f9b5b8b51dd79d6 Mon Sep 17 00:00:00 2001 From: Kimhansav Date: Sun, 22 Jun 2025 19:55:34 +0900 Subject: [PATCH 16/19] Added diary_generation node, youtube_search node, youtube_analysis node --- agents.svg | 382 +++++++++++++++++++++++++++++ agents/management/modules/state.py | 7 +- agents_dependency.png | Bin 0 -> 151423 bytes tests/music/test_workflow.py | 120 +++++++++ 4 files changed, 506 insertions(+), 3 deletions(-) create mode 100644 agents.svg create mode 100644 agents_dependency.png create mode 100644 tests/music/test_workflow.py diff --git a/agents.svg b/agents.svg new file mode 100644 index 0000000..9be1932 --- /dev/null +++ b/agents.svg @@ -0,0 +1,382 @@ + + + + + + +G + + + +agents + +agents + + + +agents_base_node + +agents. +base_node + + + +agents_music_modules_nodes + +agents. +music. +modules. +nodes + + + +agents_base_node->agents_music_modules_nodes + + + + + + +agents_text_modules_nodes + +agents. +text. +modules. +nodes + + + +agents_base_node->agents_text_modules_nodes + + + + + + +agents_base_workflow + +agents. +base_workflow + + + +agents_image_workflow + +agents. +image. +workflow + + + +agents_base_workflow->agents_image_workflow + + + + + + +agents_music_workflow + +agents. +music. +workflow + + + +agents_base_workflow->agents_music_workflow + + + + + +agents_text_workflow + +agents. +text. +workflow + + + +agents_base_workflow->agents_text_workflow + + + + + +agents_workflow + +agents. +workflow + + + +agents_base_workflow->agents_workflow + + + + + +agents_image + +agents.image + + + +agents_image_modules + +agents. +image. +modules + + + +agents_image_modules->agents_image_workflow + + + + + +agents_image_modules_state + +agents. +image. +modules. +state + + + +agents_image_modules_state->agents_image_workflow + + + + + +agents_image_workflow->agents_image + + + + + +agents_main_state + +agents. +main_state + + + +agents_main_state->agents_workflow + + + + + +agents_music + +agents.music + + + +agents_music_modules + +agents. +music. +modules + + + +agents_music_modules->agents_music_workflow + + + + + +agents_music_modules_models + +agents. +music. +modules. +models + + + +agents_music_modules_models->agents_music_modules_nodes + + + + + +agents_music_modules_nodes->agents_music_workflow + + + + + +agents_music_modules_prompts + +agents. +music. +modules. +prompts + + + +agents_music_modules_prompts->agents_music_modules_nodes + + + + + +agents_music_modules_state + +agents. +music. +modules. +state + + + +agents_music_modules_state->agents_music_modules_nodes + + + + + +agents_music_modules_state->agents_music_workflow + + + + + +agents_music_workflow->agents_music + + + + + +agents_text + +agents.text + + + +agents_text_modules + +agents. +text. +modules + + + +agents_text_modules->agents_text_workflow + + + + + +agents_text_modules_chains + +agents. +text. +modules. +chains + + + +agents_text_modules_chains->agents_text_modules_nodes + + + + + +agents_text_modules_models + +agents. +text. +modules. +models + + + +agents_text_modules_models->agents_text_modules_chains + + + + + +agents_text_modules_nodes->agents_text_workflow + + + + + + +agents_text_modules_persona + +agents. +text. +modules. +persona + + + +agents_text_modules_persona->agents_text_modules_chains + + + + + +agents_text_modules_persona->agents_text_modules_nodes + + + + +agents_text_modules_prompts + +agents. +text. +modules. +prompts + + + +agents_text_modules_prompts->agents_text_modules_chains + + + + + +agents_text_modules_state + +agents. +text. +modules. +state + + + +agents_text_modules_state->agents_text_modules_nodes + + + + + +agents_text_modules_state->agents_text_workflow + + + + +agents_text_workflow->agents_text + + + + + +agents_workflow->agents + + + + + diff --git a/agents/management/modules/state.py b/agents/management/modules/state.py index 8799502..9ae62c1 100644 --- a/agents/management/modules/state.py +++ b/agents/management/modules/state.py @@ -22,9 +22,10 @@ class ManagementState(TypedDict): project_id: str # 프로젝트 ID (예: "PRJ-2023-001", "EP-MARVEL-S01") request_type: str # 요청 유형 (예: "resource_allocation", "team_management", "creator_development") query: str # 사용자 쿼리 또는 요청사항 + response: Annotated[ + list, add_messages + ] team_members: Optional[List[str]] = None # 팀 구성원 목록 resources_available: Optional[Dict[str, any]] = None # 사용 가능한 리소스 정보 resource_plan: Optional[str] = None # 리소스 계획 콘텐츠 - response: Annotated[ - list, add_messages - ] # 응답 메시지 목록 (add_messages로 주석되어 메시지 추가 기능 제공) + # 응답 메시지 목록 (add_messages로 주석되어 메시지 추가 기능 제공) diff --git a/agents_dependency.png b/agents_dependency.png new file mode 100644 index 0000000000000000000000000000000000000000..59108d8fca681e74d99a70d94850f1a11b8bc6da GIT binary patch literal 151423 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�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 z r2{%dWTD_!u=k4wXB*YDlCfu(AUPx`J0zk%i&v8}G7O@o@I&fk}pSBFRdfPZ{Z zK>_`ZxRtD)`1z2fWtBPTh3h6J+1LWay59|K{81xq8o#Zk3_0zw13f6V8ESV>1f#1a~QD$Vt@UhA4K)2Q=KpU%Uob)-$R z+eV(ZVF?PdVV<4E^OvQpvdTfj04|Ugcz*rUb1q^19aYN~jN3gCV~|qoHR42gRg-rW z%0>W(y3y8dTE$i1VM`R-JE%)|CV*RyGxeWFAhKgja&d7JK4oW{`ODNGW^dIXtn%{O z#0fSM5nk4a@^oPAmE$g1Ux?GrEbz20dkd}Eq->)s68Nl{?xZn&c&;3B z>Wo#A_e!?K8yA-YlcFRG7DZ>K8#h9x<{g;a+(K5rMQ^vFSL=g`ZnISDw@TdlVX@>eF)rfnPMZVGC3@wEhwl~^99#Fkfi<}d89(&OJIN!J z2Bp5s84t4ld7lZ!3^)ufs?=uV*2-+|JIAJ0{83^fPS(@>S{6n z3DrM620|gbegQyi?LIRQm%=$wa}Vk1{Fmj4nx6q=TNu(AC{6C#pDV)Gc;JUC@mh+h zGxc#DHk!{dJ9ZwI7P@nCC7r0*4llTmu>B}>>RZd7A<8Cxx^6r8NzCHWifCpGx5YRy{^a|$K{5yOWrCKG!yXKH0%yA zzkUPGRe=P+@h@&J#OjyCL0n$XqXrQlzB2|I~xYGvA1BT&y@*V#R5bSIVNv0ht#~i?&hyLX;W>9 z<5x2U?8jy5bFtajvz?TYdbEuW9MaNJ{BI3}YPD%c-lq1j%=ag%MhOhckol~jxN*F7_RE7f5fUNq*sF3R?>O?1f5LydO2Q3CV9fU z1XTeV1EW`evn-xE&nHiefFx5W)7uw5HpA`BY*2gO#?4nXo5$qU_*rbJX#}tL)nfe; zK=DVqa|{&G5EQqo&K>LzM1j>DO#VGKxr2sXtdMDYx2;vHy3>ez{Dr7@05B`{6{gY{ znzOtf&4u3D?``5CD4ZKemh}`d_g>^13ur`-#&PKkz1HcrJ$->y?y^Uif1gBVpvv3%w;5wQt=cKMgT zg9$N{-yc>G&!4jBoMIRIz+!*RHCx;&1igAe`b&KZHZQ$(bKZ75c&KiG+bMw+)-OjL=yqD#R zH!)DIbxUQ0Fjn)G+HLW8GY(ZX;d)o}92cxZS_6l&@BXl#n8ZFj`z+&IJ=FjB0PS)9 zdkgBLdlpr>RJw)8;K}l2sJ5eW^QPKoeT%iWzM}MK5d}2fmz7N@LxzKrGL=y}Ab|Mf z?ZdwSa+Oh6z8ZRJ!YduU%G17%oqRC6U|6B+P?1Vp)<}qvbQWlsYK=OGxRMSfP|h+l z+qG(u+mZwofBq?e^q|>e^Dgneaf2{yek+e{y!QRSDNlVOMMjfHN*5loNk8yX2-xqd z_jzp@j2_6dQ1&?09xkMS%Pki&yUs;adW)LB6Ku)@18a(`cEHJ@_zo9?dBp@5ZQ{+r z3CJ`lz{Tz2Hp9ruxt%-6HRo0=h_9d(C0@8uO4m=hFCD^Q~maV5Df9F#sAMoG7Ny; X`r_M9AIbMgP7_i^^Jb~igD3w7bDd9@ literal 0 HcmV?d00001 diff --git a/tests/music/test_workflow.py b/tests/music/test_workflow.py new file mode 100644 index 0000000..076bdfb --- /dev/null +++ b/tests/music/test_workflow.py @@ -0,0 +1,120 @@ +# test code + +""" +음악 Workflow 테스트 모듈 + +이 모듈은 MusicWorkflow 클래스의 기능을 테스트합니다. +""" + +import pytest +from unittest.mock import Mock, patch + +from agents.music.workflow import MusicWorkflow +from agents.music.modules.state import MusicState +from modules.models import ChatGPT + + +@pytest.fixture +def mock_chatgpt(): + """ChatGPT 모의 객체 생성""" + mock = Mock(spec=ChatGPT) + mock.generate.return_value = "테스트 음악 가사" + return mock + + +@pytest.fixture +def music_workflow(mock_chatgpt): + """MusicWorkflow 인스턴스 생성""" + return MusicWorkflow(MusicState, mock_chatgpt) + + +def test_music_workflow_initialization(music_workflow, mock_chatgpt): + """MusicWorkflow 초기화 테스트""" + assert music_workflow.name == "MusicWorkflow" + assert music_workflow.state == MusicState + assert music_workflow.model == mock_chatgpt + + +def test_music_workflow_build(music_workflow): + """Workflow 그래프 구축 테스트""" + graph = music_workflow.build() + + # 그래프가 성공적으로 생성되었는지 확인 + assert graph is not None + assert graph.name == "MusicWorkflow" + + # 노드가 올바르게 추가되었는지 확인 + assert "generate_music" in graph.nodes + + +def test_music_workflow_execution(music_workflow, mock_chatgpt): + """Workflow 실행 테스트""" + # 테스트용 입력 상태 + initial_state = { + "query": "여름 바다를 주제로 한 가사", + "response": [] + } + + # Workflow 실행 + graph = music_workflow.build() + result = graph.invoke(initial_state) + + # 결과 검증 + assert result is not None + assert "response" in result + assert "query" in result + assert result["query"] == initial_state["query"] + + # ChatGPT가 호출되었는지 확인 + mock_chatgpt.generate.assert_called_once() + + +def test_music_workflow_error_handling(music_workflow, mock_chatgpt): + """에러 처리 테스트""" + # ChatGPT 에러 시뮬레이션 + mock_chatgpt.generate.side_effect = Exception("API Error") + + initial_state = { + "query": "에러 테스트", + "response": [] + } + + # Workflow 실행 및 에러 처리 검증 + graph = music_workflow.build() + with pytest.raises(Exception) as exc_info: + graph.invoke(initial_state) + + assert "API Error" in str(exc_info.value) + + +def test_music_workflow_empty_query(music_workflow): + """빈 쿼리 처리 테스트""" + initial_state = { + "query": "", + "response": [] + } + + graph = music_workflow.build() + result = graph.invoke(initial_state) + + assert result is not None + assert result["query"] == "" + + +@pytest.mark.parametrize("test_input,expected", [ + ("여름 바다", "여름 바다"), + ("겨울 눈", "겨울 눈"), + ("가을 단풍", "가을 단풍"), +]) +def test_music_workflow_different_queries(music_workflow, mock_chatgpt, test_input, expected): + """다양한 쿼리에 대한 테스트""" + initial_state = { + "query": test_input, + "response": [] + } + + graph = music_workflow.build() + result = graph.invoke(initial_state) + + assert result["query"] == expected + mock_chatgpt.generate.assert_called() \ No newline at end of file From a5cafea85db51af213c694cf59c7d74abf76e6b5 Mon Sep 17 00:00:00 2001 From: crosstar Date: Sat, 2 Aug 2025 13:20:37 +0900 Subject: [PATCH 17/19] =?UTF-8?q?doc:=20link=EC=97=90=20=EA=B1=B8=EB=A6=AC?= =?UTF-8?q?=EB=8A=94=20=EB=AF=B8=EC=82=AC=EC=9A=A9=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agents/music/modules/nodes.py | 3 +-- agents/music/modules/state.py | 2 +- agents/music/modules/tools/weather.py | 2 +- tests/music/test_workflow.py | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/agents/music/modules/nodes.py b/agents/music/modules/nodes.py index cc6368b..cd88235 100644 --- a/agents/music/modules/nodes.py +++ b/agents/music/modules/nodes.py @@ -5,11 +5,10 @@ """ from agents.base_node import BaseNode -from agents.music.modules.prompts import get_lyric_template, get_diary_template, get_query_extraction_template, get_youtube_query_template, get_youtube_analysis_template +from agents.music.modules.prompts import get_lyric_template, get_diary_template, get_query_extraction_template, get_youtube_analysis_template from agents.music.modules.state import MusicState from agents.music.modules.models import get_openai_model, get_gemini_client, get_youtube_client from agents.music.modules.tools.weather import WeatherService -from googleapiclient.discovery import build from google import genai diff --git a/agents/music/modules/state.py b/agents/music/modules/state.py index 047a647..79fec91 100644 --- a/agents/music/modules/state.py +++ b/agents/music/modules/state.py @@ -8,7 +8,7 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Annotated, TypedDict, Any, Dict +from typing import Annotated, TypedDict from langgraph.graph.message import add_messages diff --git a/agents/music/modules/tools/weather.py b/agents/music/modules/tools/weather.py index 5946f56..bd61432 100644 --- a/agents/music/modules/tools/weather.py +++ b/agents/music/modules/tools/weather.py @@ -8,7 +8,7 @@ from datetime import datetime, timedelta import json import requests -from typing import Dict, Any, Optional +from typing import Dict, Any from dotenv import load_dotenv import os diff --git a/tests/music/test_workflow.py b/tests/music/test_workflow.py index 076bdfb..bd6980b 100644 --- a/tests/music/test_workflow.py +++ b/tests/music/test_workflow.py @@ -7,7 +7,7 @@ """ import pytest -from unittest.mock import Mock, patch +from unittest.mock import Mock from agents.music.workflow import MusicWorkflow from agents.music.modules.state import MusicState From e54a4d06375c5d24b996ebb9e3b55831c978fa3e Mon Sep 17 00:00:00 2001 From: crosstar Date: Thu, 7 Aug 2025 23:07:00 +0900 Subject: [PATCH 18/19] =?UTF-8?q?doc:=20=EA=B7=B8=EB=A6=BC=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20media=20=EB=A1=9C=20=EC=98=AE=EA=B9=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agents.svg => media/agents.svg | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename agents.svg => media/agents.svg (100%) diff --git a/agents.svg b/media/agents.svg similarity index 100% rename from agents.svg rename to media/agents.svg From f5c3eae81fc23763aef6ab649b2d5ec26fd7537e Mon Sep 17 00:00:00 2001 From: crosstar Date: Thu, 7 Aug 2025 23:07:26 +0900 Subject: [PATCH 19/19] =?UTF-8?q?doc:=20=EA=B8=B0=EB=B3=B8=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20main=EA=B3=BC=20=EB=8F=99=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.env.example b/.env.example index b74128d..e8f5d00 100644 --- a/.env.example +++ b/.env.example @@ -4,11 +4,9 @@ # Langsmith Project Tracking # LangSmith is a tool for monitoring and debugging - LANGSMITH_PROJECT=act-entertainment # Project name to be used by LangSmith. LANGSMITH_API_KEY=lsv2.... # LangSmith API key (must be replaced with real key) - # Depending on the configuration you choose, you will need the following environment variables. ## LLM API Keys: @@ -16,9 +14,4 @@ LANGSMITH_API_KEY=lsv2.... # LangSmith API key (must be replaced with real key) # You can get it from the OpenAI website (https://platform.openai.com/). OPENAI_API_KEY=sk... -## Groq -# Groq API Key - used to access Groq LLMs such as Mixtral or LLaMA models. -# Sign up and get your key from https://console.groq.com/keys -GROQ_API_KEY=grq... - # Others... \ No newline at end of file