muhammadmaazuddin commited on
Commit
758273a
·
1 Parent(s): 345fd89
Files changed (5) hide show
  1. pyproject.toml +3 -0
  2. src/_agents.py +137 -10
  3. src/main.py +82 -36
  4. src/utils/image-generation.py +174 -47
  5. uv.lock +460 -0
pyproject.toml CHANGED
@@ -8,6 +8,9 @@ dependencies = [
8
  "google>=3.0.0",
9
  "google-genai>=1.31.0",
10
  "huggingface-hub>=0.34.4",
 
 
 
11
  "langfuse>=3.3.4",
12
  "nest-asyncio>=1.6.0",
13
  "openai-agents>=0.2.8",
 
8
  "google>=3.0.0",
9
  "google-genai>=1.31.0",
10
  "huggingface-hub>=0.34.4",
11
+ "ipython>=9.5.0",
12
+ "langchain>=0.3.27",
13
+ "langchain-core>=0.3.75",
14
  "langfuse>=3.3.4",
15
  "nest-asyncio>=1.6.0",
16
  "openai-agents>=0.2.8",
src/_agents.py CHANGED
@@ -1,20 +1,40 @@
1
  from agents import Agent, RunContextWrapper
2
  from model import get_model
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
 
4
 
5
  #----------------------- content agent ----------------------------------
6
 
7
  def content_prompt(context: RunContextWrapper, agent: Agent):
8
- """You are a LinkedIn Content Writer AI.
9
- Your task is to take a user's description of an idea, event, or announcement and turn it into engaging LinkedIn post text.
10
-
11
- Guidelines:
12
- - Start with a strong hook or headline (1 line).
13
- - Write a clear and engaging body (2-5 short sentences).
14
- - Use a professional but approachable tone suited for LinkedIn.
15
- - Add 3-6 relevant hashtags.
16
- - End with a call-to-action (CTA), e.g., “Let's connect”, “Check out the details”, “Join the discussion”.
17
- - Keep sentences concise and scannable for social media.
 
 
 
 
 
18
  """
19
 
20
 
@@ -35,8 +55,115 @@ content_agent = Agent(
35
 
36
 
37
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
 
39
 
40
 
41
 
 
 
42
 
 
 
1
  from agents import Agent, RunContextWrapper
2
  from model import get_model
3
+ import os
4
+ from dotenv import load_dotenv
5
+ from agents import Agent, AsyncOpenAI, Runner,function_tool, AgentHooks, TContext
6
+ from model import get_model
7
+ from contextlib import AsyncExitStack
8
+ from agents.mcp.server import MCPServerStdio, MCPServerStdioParams
9
+ from agents.mcp import ToolFilterContext, create_static_tool_filter
10
+ import asyncio
11
+ import uuid
12
+ import base64
13
+ from typing import Any
14
+
15
+
16
+
17
+
18
 
19
 
20
  #----------------------- content agent ----------------------------------
21
 
22
  def content_prompt(context: RunContextWrapper, agent: Agent):
23
+ """You are a social media Content Writer Agent.
24
+ You will be provided a raw text on which you need to create a content of social media post.
25
+ Your task is to transform a user's idea, event, or announcement into a highly engaging post tailored for the specified platform.
26
+
27
+ Instructions:
28
+ - The user query will indicate the platform (LinkedIn, Twitter/X, Instagram, Facebook, etc.). Adjust tone, style, and length accordingly.
29
+ - LinkedIn: professional, insightful, concise.
30
+ - Twitter/X: short, punchy, with impactful hashtags.
31
+ - Instagram: friendly, visual, creative, with hashtags.
32
+ - Facebook: approachable, slightly longer, storytelling style.
33
+ - Begin with a compelling hook or headline.
34
+ - Write a concise, engaging body (2-5 sentences) that conveys the key message.
35
+ - Include 3-6 relevant, trending hashtags appropriate for the platform.
36
+ - End with a clear, platform-suitable call-to-action (CTA), e.g., “Join the discussion”, “Check it out”, “Comment below”.
37
+ - Ensure readability: short sentences, scannable text, and consistent tone.
38
  """
39
 
40
 
 
55
 
56
 
57
 
58
+ #----------------------- Web Browser agent ---------------------------Start----------------
59
+
60
+
61
+
62
+
63
+ @function_tool
64
+ def save_temp_screenshot(image_data: str, is_base64: bool = True) -> str:
65
+ """
66
+ Save a screenshot to the tmpshot folder.
67
+
68
+ Args:
69
+ image_data: Either base64 string (default) or raw bytes.
70
+ is_base64: Set True if input is base64, False if raw bytes.
71
+
72
+ Returns:
73
+ str: Path to the saved screenshot.
74
+ """
75
+ print(image_data, is_base64)
76
+ # Ensure folder exists
77
+ folder = "tmpshot"
78
+ os.makedirs(folder, exist_ok=True)
79
+
80
+ # Generate unique filename
81
+ filename = f"screenshot_{uuid.uuid4().hex}.png"
82
+ path = os.path.join(folder, filename)
83
+
84
+ # Decode and save
85
+ if is_base64:
86
+ with open(path, "wb") as f:
87
+ f.write(base64.b64decode(image_data))
88
+ else:
89
+ with open(path, "wb") as f:
90
+ f.write(image_data)
91
+
92
+ return path
93
+
94
+
95
+ def site_analyzer_prompt():
96
+
97
+ return """
98
+ You are Site Analyzer, which extract the details for a website.
99
+
100
+ - Your role is to analyze a webpage and always return three things:
101
+ 1. Raw visible text from the page.
102
+ 2. Extract only the 4-5 most frequent distinct colors from the page's CSS as theme colors, and indicate whether the overall theme is dark or light.
103
+ 3. A screenshot of the page saved via the `save_temp_screenshot` function for design/theme analysis.
104
+
105
+ - Must follow these *STEPS* in order to complete the task:
106
+ 1 Open the webpage in a browser.
107
+ 2. Navigate to the given URL with browser_navigate.
108
+ 3. Wait for the body to load using browser_wait_for 2 seconds.
109
+ 4. Extract raw text using browser_evaluate with `document.body.innerText`.
110
+ 5. Extract color themes using browser_evaluate with `getComputedStyle`.
111
+ 6. Capture a screenshot with browser_take_screenshot with fullPage=False.
112
+
113
+ - Final Output Format (MUST be JSON only):
114
+ ```json
115
+ {
116
+ "raw_text": "...raw text...",
117
+ "theme":{
118
+ "type": "dark"|"light"
119
+ "colors": ["#RRGGBB", "rgb(...)", ...],
120
+ },
121
+ "screenshot_file_name": "<screenshot file name returned by browser_take_screenshot>"
122
+ }
123
+ """
124
+
125
+
126
+
127
+
128
+ async def custom_filter(context: ToolFilterContext, tool) -> bool:
129
+ # Only allow tools that start with "mood"
130
+ return context.agent.name == "site_analyzer_agent" and (tool.name == 'browser_navigate' or tool.name == 'browser_wait_for' or tool.name == 'browser_evaluate' or tool.name == 'browser_take_screenshot')
131
+
132
+
133
+
134
+
135
+
136
+ async def get_site_analyzer_agent():
137
+ async with MCPServerStdio(
138
+ # params=MCPServerStdioParams(
139
+ # command="npx",
140
+ # args=["@playwright/mcp@latest", "--output-dir", "./tmpshot", "--headless"],
141
+ # ), name="Playwrite",
142
+ # client_session_timeout_seconds=30,
143
+ params={
144
+ "command": "npx",
145
+ "args": ["@playwright/mcp@latest", "--output-dir", "./tmpshot", "--headless"],
146
+ },
147
+ tool_filter=create_static_tool_filter(
148
+ allowed_tool_names=["browser_navigate", "browser_wait_for", "browser_evaluate", "browser_take_screenshot", "write_file"]
149
+ )
150
+ ) as playwrite_client:
151
+
152
+
153
+ site_analyzer_agent = Agent(
154
+ name="site_analyzer_agent",
155
+ instructions=site_analyzer_prompt(),
156
+ model=get_model('gemini-2.0-flash'),
157
+ mcp_servers=[playwrite_client],
158
+ )
159
+
160
+ return site_analyzer_agent, playwrite_client
161
+
162
 
163
 
164
 
165
 
166
+ # if __name__ == "__main__":
167
+ # asyncio.run(create_browser_agent())
168
 
169
+ #----------------------- Web Browser agent ---------------------------END----------------
src/main.py CHANGED
@@ -1,14 +1,18 @@
1
  import os
2
  import asyncio
3
  from dataclasses import dataclass
4
- from agents import set_tracing_disabled, Runner, SQLiteSession
5
- from _agents import content_agent
6
  from pydantic import BaseModel, Field, ConfigDict
 
7
  from typing import Optional
8
  import nest_asyncio
9
  import logfire
10
  from langfuse import get_client
11
-
 
 
 
12
 
13
  # set_tracing_disabled(disabled=True)
14
 
@@ -37,56 +41,98 @@ else:
37
 
38
 
39
 
 
40
  class AgentContext(BaseModel):
41
  user_input: Optional[str] = Field(default=None,description="The input provided by the user to the agent.")
42
  post_content: Optional[str] = Field(default=None,description="The generated content for the post.")
43
-
44
  model_config= ConfigDict(extra='forbid')
45
 
 
 
 
 
 
 
 
 
 
46
  async def main():
47
  print("Hello from smpg!")
48
-
49
  session = SQLiteSession("conversation_123")
50
 
51
  agent_context = AgentContext(
52
  user_input="Write a LinkedIn post about the importance of AI in modern business strategies."
53
  )
54
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
 
 
 
 
56
 
57
- # orchestrator_agent = Agent(
58
- # name="orchestrator_agent",
59
- # instructions=(
60
- # "You are a translation agent. You use the tools given to you to translate."
61
- # "If asked for multiple translations, you call the relevant tools in order."
62
- # "You never translate on your own, you always use the provided tools."
63
- # ),
64
- # tools=[
65
- # spanish_agent.as_tool(
66
- # tool_name="translate_to_spanish",
67
- # tool_description="Translate the user's message to Spanish",
68
- # ),
69
- # french_agent.as_tool(
70
- # tool_name="translate_to_french",
71
- # tool_description="Translate the user's message to French",
72
- # ),
73
- # italian_agent.as_tool(
74
- # tool_name="translate_to_italian",
75
- # tool_description="Translate the user's message to Italian",
76
- # ),
77
- # ],
78
- # model=model
79
- # )
80
-
81
-
82
-
83
- result = await Runner.run(content_agent, context=agent_context, input=agent_context.user_input, session=session ,max_turns=5)
84
-
85
- agent_context.post_content = result.final_output
86
- print("Generated Post Content:")
87
- print(agent_context.post_content)
88
 
89
 
90
 
91
  if __name__ == "__main__":
 
 
 
92
  asyncio.run(main())
 
1
  import os
2
  import asyncio
3
  from dataclasses import dataclass
4
+ from agents import set_tracing_disabled, Runner, SQLiteSession, Agent, AgentHooks, RunContextWrapper, TContext
5
+ from _agents import content_agent, get_site_analyzer_agent
6
  from pydantic import BaseModel, Field, ConfigDict
7
+ from model import get_model
8
  from typing import Optional
9
  import nest_asyncio
10
  import logfire
11
  from langfuse import get_client
12
+ import shutil
13
+ from typing import Any
14
+
15
+
16
 
17
  # set_tracing_disabled(disabled=True)
18
 
 
41
 
42
 
43
 
44
+
45
  class AgentContext(BaseModel):
46
  user_input: Optional[str] = Field(default=None,description="The input provided by the user to the agent.")
47
  post_content: Optional[str] = Field(default=None,description="The generated content for the post.")
48
+ raw_text: Optional[str] = Field(default=None,description="Raw text extracted from web pages.")
49
  model_config= ConfigDict(extra='forbid')
50
 
51
+
52
+
53
+ class MyAgentHooks(AgentHooks):
54
+ async def on_tool_start(self, context, agent, output):
55
+ print(f"Agent {agent.name} finished with output: {output}")
56
+ async def on_start(self, context, agent):
57
+ print(f"Agent {agent.name} started.")
58
+
59
+
60
  async def main():
61
  print("Hello from smpg!")
 
62
  session = SQLiteSession("conversation_123")
63
 
64
  agent_context = AgentContext(
65
  user_input="Write a LinkedIn post about the importance of AI in modern business strategies."
66
  )
67
 
68
+ site_analyzer_agent, playwrite_client = await get_site_analyzer_agent()
69
+
70
+ orchestrator_agent = Agent(
71
+ name="orchestrator_agent",
72
+ instructions="""You are the Orchestrator Agent for social media post creation.
73
+ Your task is to coordinate multiple agents to produce a complete social media post.
74
+
75
+ Steps:
76
+ 1. Receive user input including a brief and a URL.
77
+ 2. Call the Site Analysis Agent to extract key details from the URL.
78
+ 3. Pass the extracted text and user brief to the Content Agent to generate engaging platform-specific post text.
79
+ 4. Provide the generated content and relevant details to the Media Generation Agent to create images or media.
80
+ 5. Combine all outputs into a coherent final post suitable for the requested platform.
81
+
82
+ Rules:
83
+ - Do not generate text or media yourself.
84
+ - Always follow the above order.
85
+ - Validate each agent's output before proceeding to the next step.
86
+ - Ask the user for clarification only if the input is missing or ambiguous.""",
87
+ tools=[
88
+ content_agent.as_tool(
89
+ tool_name="content_agent",
90
+ tool_description="""
91
+ Generates engaging social media post content based on user input and extracted text.
92
+ Input: A brief description and raw text from the Site Analysis Agent.
93
+ """
94
+ ),
95
+ site_analyzer_agent.as_tool(
96
+ tool_name="site_analyzer_agent",
97
+ tool_description="""Analyzes a webpage and extracts key details such as raw text, theme colors, and a screenshot.
98
+ Input: A valid URL to analyze.
99
+ Output: JSON with raw text, theme colors, and screenshot file name.
100
+ """
101
+ ),
102
+ ],
103
+ model=get_model('gemini-2.0-flash'),
104
+ hooks=MyAgentHooks(),
105
+ )
106
+
107
+ result = await Runner.run(orchestrator_agent,
108
+ input="""
109
+ Create a LinkedIn post about the importance of AI in modern business strategies.
110
+ Website URL : https://denovers.com
111
+ """ ,
112
+ )
113
+ print(result)
114
+ playwrite_client.cleanup()
115
 
116
+
117
+
118
+ # result = await Runner.run(content_agent, context=agent_context, input=agent_context.user_input, session=session ,max_turns=5)
119
 
120
+ # agent_context.post_content = result.final_output
121
+ # print("Generated Post Content:")
122
+ # print(agent_context.post_content)
123
+
124
+ # result = await Runner.run(site_analyzer_agent, input="URL : https://www.denovers.com, give raw_text, theme and screenshot_name" ,max_turns=15)
125
+ # print(result)
126
+
127
+ # agent_context.raw_text = result.final_output
128
+ # print(agent_context.raw_text)
129
+
130
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
131
 
132
 
133
 
134
  if __name__ == "__main__":
135
+ if not shutil.which("npx"):
136
+ raise RuntimeError("npx is not installed. Please install it with `npm install -g npx`.")
137
+
138
  asyncio.run(main())
src/utils/image-generation.py CHANGED
@@ -3,6 +3,14 @@ import re
3
  from google import genai
4
  from huggingface_hub import InferenceClient
5
  from dotenv import load_dotenv, find_dotenv
 
 
 
 
 
 
 
 
6
 
7
  _: bool = load_dotenv(find_dotenv())
8
 
@@ -12,14 +20,19 @@ client = genai.Client(
12
  )
13
 
14
 
 
 
 
 
 
 
 
 
 
 
15
  aspect_ratios = {
16
- "1:1": (1328, 1328),
17
- "16:9": (1664, 928),
18
- "9:16": (928, 1664),
19
- "4:3": (1472, 1140),
20
- "3:4": (1140, 1472),
21
- "3:2": (1584, 1056),
22
- "2:3": (1056, 1584),
23
  }
24
 
25
  hf_client = InferenceClient(
@@ -28,17 +41,42 @@ hf_client = InferenceClient(
28
  )
29
 
30
 
31
- def generate_json_from_idea(idea: str, defaultValues:str) -> str:
32
- """Generates a detailed JSON prompt from a simple idea using a Gemini model."""
33
-
34
- # The prompt template includes the desired JSON schema structure.
35
- schema_template = """Convert the attached user idea into a detailed JSON object for generating an image. The output should only be the raw JSON object, without any markdown formatting like ```json ... ```.
36
 
37
- Idea: "{idea}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
 
39
- defaultValues:{defaultValues}
40
 
41
- Schema:
42
  {{
43
  "meta": {{
44
  "styleName": "...", // A unique, descriptive name for this specific image style or preset (e.g., "Ethereal Forest Magic", "Cyberpunk Noir Alley").
@@ -97,15 +135,56 @@ Schema:
97
  }}
98
  }}
99
  """
100
- prompt = schema_template.format(idea=idea,defaultValues=defaultValues)
101
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
102
  response = client.models.generate_content(
103
  model="gemini-2.5-pro",
104
  contents=prompt,
 
105
  )
106
 
107
- print(response.text)
108
- return response.text
 
 
 
109
 
110
 
111
  def generate_images(
@@ -114,6 +193,7 @@ def generate_images(
114
  aspectRatio: str = "1:1", # "1:1", "3:4", "4:3", "9:16", and "16:9".
115
  output_dir: str = "images",
116
  num_images: int = 1,
 
117
  ):
118
  """Generates images using Imagen and saves them to the output directory."""
119
 
@@ -130,32 +210,48 @@ def generate_images(
130
  # ),
131
  # )
132
 
133
- width, height = aspect_ratios[aspectRatio]
134
- response = hf_client.text_to_image(
135
- prompt=prompt,
136
- model="Qwen/Qwen-Image",
137
- width=width,
138
- height=height,
 
 
 
 
 
 
139
 
 
 
 
140
  )
141
- print(response)
142
-
143
- clean_idea = (re.sub(r"[^a-zA-Z0-9\s]", "", idea[:30]).lower().replace(" ", "-"))
144
- image_path = os.path.join(output_dir, f"{clean_idea}-.png")
145
- response.save(image_path)
146
- with open(os.path.join(output_dir, f"{clean_idea}.json"), "w") as f:
147
- f.write(prompt)
148
- print(f"Saved image and prompt to {image_path}")
149
-
150
- # for i, generated_image in enumerate(response):
151
- # clean_idea = (
152
- # re.sub(r"[^a-zA-Z0-9\s]", "", idea[:30]).lower().replace(" ", "-")
153
- # )
154
- # image_path = os.path.join(output_dir, f"{clean_idea}-{i+1}.png")
155
- # generated_image.image.save(image_path)
156
- # with open(os.path.join(output_dir, f"{clean_idea}.json"), "w") as f:
157
- # f.write(prompt)
158
- # print(f"Saved image and prompt to {image_path}")
 
 
 
 
 
 
 
159
 
160
  except Exception as e:
161
  print(f"An error occurred during image generation: {e}")
@@ -171,15 +267,37 @@ def generate(
171
  os.makedirs(output_dir, exist_ok=True)
172
 
173
  ideaJson = generate_json_from_idea(idea,f"aspect_ratio:{aspectRatio}")
174
-
175
  generate_images(
 
176
  idea=idea,
177
  prompt=f"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
178
  {idea}
179
 
180
- <MetaSchemaForImageGeneration>
181
- {ideaJson}
182
- </MetaSchemaForImageGeneration>
 
 
 
 
183
  """,
184
  aspectRatio="1:1",
185
  output_dir=output_dir,
@@ -187,6 +305,9 @@ def generate(
187
  )
188
 
189
 
 
 
 
190
  if __name__ == "__main__":
191
  ideas = [
192
  # "A energy drink with water drops on it, ultra realistic, for a commercial.",
@@ -199,7 +320,13 @@ if __name__ == "__main__":
199
  # "A magical man with sparkling pink hair and large from an anime.",
200
  # "A cartoon robot waving happily, with a simple, bold outline and bright, flat colors. ",
201
  # "A full-body character sheet of a realistic pirate captain, showing front, back, and side views.",
202
- """An AI brain made of digital circuits seamlessly integrated into a modern office skyline, representing artificial intelligence as essential for business growth and innovation"""
 
 
 
 
 
 
203
  ]
204
 
205
  for idea in ideas:
 
3
  from google import genai
4
  from huggingface_hub import InferenceClient
5
  from dotenv import load_dotenv, find_dotenv
6
+ from pydantic import BaseModel, Field, ConfigDict
7
+ from langchain_core.output_parsers import JsonOutputParser
8
+ import json
9
+ import time
10
+
11
+ from PIL import Image
12
+ from io import BytesIO
13
+ from IPython.display import display
14
 
15
  _: bool = load_dotenv(find_dotenv())
16
 
 
20
  )
21
 
22
 
23
+ # aspect_ratios = {
24
+ # "1:1": (1328, 1328),
25
+ # "16:9": (1664, 928),
26
+ # "9:16": (928, 1664),
27
+ # "4:3": (1472, 1140),
28
+ # "3:4": (1140, 1472),
29
+ # "3:2": (1584, 1056),
30
+ # "2:3": (1056, 1584),
31
+ # }
32
+
33
  aspect_ratios = {
34
+ "1:1": (1200, 1200), # Standard LinkedIn square post
35
+ "16:9": (1200, 627), # LinkedIn horizontal post
 
 
 
 
 
36
  }
37
 
38
  hf_client = InferenceClient(
 
41
  )
42
 
43
 
 
 
 
 
 
44
 
45
+ post_schema = """{
46
+ "meta": {
47
+ "platform": "LinkedIn | Instagram | Twitter | TikTok",
48
+ "aspectRatio": "1:1 | 16:9 | 9:16 | 4:5",
49
+ "style": "Modern | Minimal | Bold | Corporate | Playful"
50
+ },
51
+ "brand": {
52
+ "company": "Company Name",
53
+ "logo": "Include | Exclude",
54
+ "colors": ["#HEX1", "#HEX2", "#HEX3"]
55
+ },
56
+ "content": {
57
+ "headline": "Main text (max 8 words)",
58
+ "subtext": "Optional supporting line (max 15 words)",
59
+ "tone": "Professional | Inspirational | Energetic | Friendly"
60
+ },
61
+ "visuals": {
62
+ "primarySubject": "Headline with abstract icons | Infographic shapes | Product mockup",
63
+ "elements": ["Icons", "Illustrations", "Charts", "Abstract shapes"],
64
+ "composition": "Centered | Rule of Thirds | Balanced layout"
65
+ },
66
+ "design": {
67
+ "typography": "Bold, clean, sans-serif | Minimal serif",
68
+ "contrast": "High | Medium",
69
+ "background": "Solid color | Gradient | Abstract"
70
+ },
71
+ "finishing": {
72
+ "quality": "Ultra-sharp, high-resolution",
73
+ "effects": "Subtle shadows | Soft gradients | None"
74
+ }
75
+ }
76
 
77
+ """
78
 
79
+ normal_schema = """
80
  {{
81
  "meta": {{
82
  "styleName": "...", // A unique, descriptive name for this specific image style or preset (e.g., "Ethereal Forest Magic", "Cyberpunk Noir Alley").
 
135
  }}
136
  }}
137
  """
 
138
 
139
+
140
+
141
+
142
+
143
+ def generate_json_from_idea(user_input: str, defaultValues:str) -> dict:
144
+ """Generates a detailed JSON prompt from a simple idea using a Gemini model."""
145
+
146
+ # The prompt template includes the desired JSON schema structure.
147
+ schema_template = """
148
+ You are a professional creative director preparing a design brief for a graphic designer or an AI image generation model.
149
+ The user will give you a topic, idea, or post concept. Your task is to create a structured, detailed, and clear **image brief** that a designer can immediately use to create the visual.
150
+
151
+ Steps to follow:
152
+ 1. Understand the user query and extract the main theme and goal.
153
+ 2. Specify a **headline** (4–10 words, bold, attention-grabbing).
154
+ 3. Write a **subtext** (1–2 sentences, persuasive or explanatory).
155
+ 4. Suggest **visual style / mood** (e.g., modern, bold, minimal, futuristic, playful, professional, corporate).
156
+ 5. Recommend **visual elements** (icons, illustrations, product mockups, abstract shapes, characters).
157
+ 6. Suggest a **color palette** (2–3 colors, HEX or descriptive names).
158
+ 7. Provide **layout guidance** (hierarchy: headline first, subtext second, CTA last, placement of visuals).
159
+ 8. Optionally, include a **call-to-action** (if relevant).
160
+
161
+ User's input: "{user_input}"
162
+
163
+ defaultValues:{defaultValues}
164
+ Schema:
165
+ {post_schema}
166
+
167
+ The output should only be the raw JSON object, without any markdown formatting like ```json ... ```.
168
+ Output format:
169
+ imagefileName: str = name for the image file
170
+ image_brief: str = detailed image brief for designer/AI
171
+ generatedSchema: dict = generated schema
172
+ """
173
+
174
+ prompt = schema_template.format(user_input=user_input,defaultValues=defaultValues,post_schema=post_schema, )
175
+
176
+
177
  response = client.models.generate_content(
178
  model="gemini-2.5-pro",
179
  contents=prompt,
180
+
181
  )
182
 
183
+ print(response)
184
+ data = JsonOutputParser().invoke(response.text)
185
+
186
+ print(data)
187
+ return data
188
 
189
 
190
  def generate_images(
 
193
  aspectRatio: str = "1:1", # "1:1", "3:4", "4:3", "9:16", and "16:9".
194
  output_dir: str = "images",
195
  num_images: int = 1,
196
+ file_name: str = "",
197
  ):
198
  """Generates images using Imagen and saves them to the output directory."""
199
 
 
210
  # ),
211
  # )
212
 
213
+ # width, height = aspect_ratios[aspectRatio]
214
+ # print(width, height)
215
+ # response = hf_client.text_to_image(
216
+ # prompt=prompt,
217
+ # negative_prompt="social media logos, LinkedIn icon, Instagram logo, Twitter logo, browser bars, fake UI, buttons, links, gibberish text, distorted fonts",
218
+ # model="Qwen/Qwen-Image",
219
+ # width=width,
220
+ # height=height,
221
+ # guidance_scale=10.0,
222
+
223
+ # )
224
+ # print(response)
225
 
226
+ response = client.models.generate_content(
227
+ model="gemini-2.5-flash-image-preview",
228
+ contents=prompt,
229
  )
230
+
231
+ image_parts = [
232
+ part.inline_data.data
233
+ for part in response.candidates[0].content.parts
234
+ if part.inline_data
235
+ ]
236
+
237
+ if image_parts:
238
+ image = Image.open(BytesIO(image_parts[0]))
239
+ timestamp = str(int(time.time()))
240
+ image_path = os.path.join(output_dir, f"{file_name}-{timestamp}.png")
241
+ image.save(image_path)
242
+ with open(os.path.join(output_dir, f"{file_name}.json"), "w") as f:
243
+ f.write(prompt)
244
+ print(f"Saved image and prompt to {image_path}")
245
+ display(image)
246
+
247
+ # clean_idea = (re.sub(r"[^a-zA-Z0-9\s]", "", idea[:30]).lower().replace(" ", "-"))
248
+ # timestamp = str(int(time.time()))
249
+ # image_path = os.path.join(output_dir, f"{file_name}-{timestamp}.png")
250
+ # response.save(image_path)
251
+ # with open(os.path.join(output_dir, f"{file_name}.json"), "w") as f:
252
+ # f.write(prompt)
253
+ # print(f"Saved image and prompt to {image_path}")
254
+
255
 
256
  except Exception as e:
257
  print(f"An error occurred during image generation: {e}")
 
267
  os.makedirs(output_dir, exist_ok=True)
268
 
269
  ideaJson = generate_json_from_idea(idea,f"aspect_ratio:{aspectRatio}")
270
+
271
  generate_images(
272
+ file_name=ideaJson.get("imagefileName", "image"),
273
  idea=idea,
274
  prompt=f"""
275
+ You are a professional social media graphic designer AI specialized in creating high-quality, visually striking images for social media posts.
276
+ Your goal is to generate attention-grabbing, brand-aligned images that clearly communicate the given message.
277
+
278
+ Guidelines:
279
+ - Style: Modern, clean, bold typography, high contrast, professional and visually engaging.
280
+ - Composition: Balanced layout with focal points, readable text placement, and strong visual hierarchy.
281
+ - Colors: Use brand-relevant palettes, with consistent tones suitable for LinkedIn/Twitter/Instagram audiences.
282
+ - Typography: Ensure clear, legible fonts with strong emphasis for headlines.
283
+ - Elements: Use relevant icons, illustrations, or abstract visuals to reinforce the message. Avoid clutter.
284
+ - Aspect Ratios: Default to 1:1 (Instagram/LinkedIn) unless otherwise specified. Optionally support 16:9 (Twitter, YouTube) and 9:16 (Stories/Reels).
285
+ - Text handling: Highlight key message with 4-10 words max, never overcrowd.
286
+ - Do NOT include watermarks, stock photo watermarks, or irrelevant artifacts.
287
+ - Quality: Ultra-sharp, high-resolution, and aesthetically polished for professional social media usage.
288
+
289
+
290
+
291
+ User's input:
292
  {idea}
293
 
294
+ Image brief: Follow these steps to create the image
295
+ {ideaJson.get("image_brief", "")}
296
+
297
+ Schema (use this structured format when interpreting inputs/brief):
298
+ {ideaJson.get("generatedSchema", {})}
299
+
300
+
301
  """,
302
  aspectRatio="1:1",
303
  output_dir=output_dir,
 
305
  )
306
 
307
 
308
+
309
+
310
+
311
  if __name__ == "__main__":
312
  ideas = [
313
  # "A energy drink with water drops on it, ultra realistic, for a commercial.",
 
320
  # "A magical man with sparkling pink hair and large from an anime.",
321
  # "A cartoon robot waving happily, with a simple, bold outline and bright, flat colors. ",
322
  # "A full-body character sheet of a realistic pirate captain, showing front, back, and side views.",
323
+ """
324
+ Create a media for posting on linkedin plateform, make it modren and professional.
325
+
326
+ companydetails:
327
+ Design Atom is a subscription-based design service tailored for AI and tech startups, offering comprehensive product design, branding, and web development solutions. With a fixed monthly rate, dedicated designers, and fast 4-hour average turnaround times, they have completed over 200 projects, helped clients raise $45M+, and reached 100M+ users with their designs. Trusted by 45+ global companies, including Y Combinator-backed startups, Design Atom delivers startup-proven results, streamlining UX, boosting retention, and enhancing conversions. Their free design trial eliminates bottlenecks, supporting startups in building investor-ready, user-friendly products.
328
+
329
+ """
330
  ]
331
 
332
  for idea in ideas:
uv.lock CHANGED
@@ -153,6 +153,15 @@ wheels = [
153
  { url = "https://files.pythonhosted.org/packages/31/da/e42d7a9d8dd33fa775f467e4028a47936da2f01e4b0e561f9ba0d74cb0ca/argcomplete-3.6.2-py3-none-any.whl", hash = "sha256:65b3133a29ad53fb42c48cf5114752c7ab66c1c38544fdf6460f450c09b42591", size = 43708 },
154
  ]
155
 
 
 
 
 
 
 
 
 
 
156
  [[package]]
157
  name = "attrs"
158
  version = "25.3.0"
@@ -324,6 +333,15 @@ wheels = [
324
  { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
325
  ]
326
 
 
 
 
 
 
 
 
 
 
327
  [[package]]
328
  name = "distro"
329
  version = "1.9.0"
@@ -547,6 +565,48 @@ wheels = [
547
  { url = "https://files.pythonhosted.org/packages/86/f1/62a193f0227cf15a920390abe675f386dec35f7ae3ffe6da582d3ade42c7/googleapis_common_protos-1.70.0-py3-none-any.whl", hash = "sha256:b8bfcca8c25a2bb253e0e0b0adaf8c00773e5e6af6fd92397576680b807e0fd8", size = 294530 },
548
  ]
549
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
550
  [[package]]
551
  name = "griffe"
552
  version = "1.12.1"
@@ -691,6 +751,52 @@ wheels = [
691
  { url = "https://files.pythonhosted.org/packages/0a/66/7f8c48009c72d73bc6bbe6eb87ac838d6a526146f7dab14af671121eb379/invoke-2.2.0-py3-none-any.whl", hash = "sha256:6ea924cc53d4f78e3d98bc436b08069a03077e6f85ad1ddaa8a116d7dad15820", size = 160274 },
692
  ]
693
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
694
  [[package]]
695
  name = "jiter"
696
  version = "0.10.0"
@@ -760,6 +866,27 @@ wheels = [
760
  { url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", size = 20256 },
761
  ]
762
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
763
  [[package]]
764
  name = "jsonschema"
765
  version = "4.25.1"
@@ -787,6 +914,54 @@ wheels = [
787
  { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437 },
788
  ]
789
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
790
  [[package]]
791
  name = "langfuse"
792
  version = "3.3.4"
@@ -807,6 +982,24 @@ wheels = [
807
  { url = "https://files.pythonhosted.org/packages/dc/46/edd370d47ca72ed4ca36b3c3b8f3a4ce71a310629d0bcb6ed760b04b08b1/langfuse-3.3.4-py3-none-any.whl", hash = "sha256:15b9d20878cf39a48ca9cfa7e52acdfeb043603d3a9cef8cf451687a4d838c6b", size = 318389 },
808
  ]
809
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
810
  [[package]]
811
  name = "logfire"
812
  version = "4.4.0"
@@ -851,6 +1044,18 @@ wheels = [
851
  { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321 },
852
  ]
853
 
 
 
 
 
 
 
 
 
 
 
 
 
854
  [[package]]
855
  name = "mcp"
856
  version = "1.13.0"
@@ -1161,6 +1366,70 @@ wheels = [
1161
  { url = "https://files.pythonhosted.org/packages/0b/a6/b98d508d189b9c208f5978d0906141747d7e6df7c7cafec03657ed1ed559/opentelemetry_util_http-0.57b0-py3-none-any.whl", hash = "sha256:e54c0df5543951e471c3d694f85474977cd5765a3b7654398c83bab3d2ffb8e9", size = 7643 },
1162
  ]
1163
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1164
  [[package]]
1165
  name = "packaging"
1166
  version = "25.0"
@@ -1170,6 +1439,27 @@ wheels = [
1170
  { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469 },
1171
  ]
1172
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1173
  [[package]]
1174
  name = "pillow"
1175
  version = "11.3.0"
@@ -1353,6 +1643,24 @@ wheels = [
1353
  { url = "https://files.pythonhosted.org/packages/7e/cc/7e77861000a0691aeea8f4566e5d3aa716f2b1dece4a24439437e41d3d25/protobuf-5.29.5-py3-none-any.whl", hash = "sha256:6cf42630262c59b2d8de33954443d94b746c952b01434fc58a417fdbd2e84bd5", size = 172823 },
1354
  ]
1355
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1356
  [[package]]
1357
  name = "pyasn1"
1358
  version = "0.6.1"
@@ -1713,6 +2021,18 @@ wheels = [
1713
  { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738 },
1714
  ]
1715
 
 
 
 
 
 
 
 
 
 
 
 
 
1716
  [[package]]
1717
  name = "rich"
1718
  version = "14.1.0"
@@ -1875,6 +2195,9 @@ dependencies = [
1875
  { name = "google" },
1876
  { name = "google-genai" },
1877
  { name = "huggingface-hub" },
 
 
 
1878
  { name = "langfuse" },
1879
  { name = "nest-asyncio" },
1880
  { name = "openai-agents" },
@@ -1888,6 +2211,9 @@ requires-dist = [
1888
  { name = "google", specifier = ">=3.0.0" },
1889
  { name = "google-genai", specifier = ">=1.31.0" },
1890
  { name = "huggingface-hub", specifier = ">=0.34.4" },
 
 
 
1891
  { name = "langfuse", specifier = ">=3.3.4" },
1892
  { name = "nest-asyncio", specifier = ">=1.6.0" },
1893
  { name = "openai-agents", specifier = ">=0.2.8" },
@@ -1914,6 +2240,43 @@ wheels = [
1914
  { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677 },
1915
  ]
1916
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1917
  [[package]]
1918
  name = "sse-starlette"
1919
  version = "3.0.2"
@@ -1926,6 +2289,20 @@ wheels = [
1926
  { url = "https://files.pythonhosted.org/packages/ef/10/c78f463b4ef22eef8491f218f692be838282cd65480f6e423d7730dfd1fb/sse_starlette-3.0.2-py3-none-any.whl", hash = "sha256:16b7cbfddbcd4eaca11f7b586f3b8a080f1afe952c15813455b162edea619e5a", size = 11297 },
1927
  ]
1928
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1929
  [[package]]
1930
  name = "starlette"
1931
  version = "0.47.2"
@@ -2004,6 +2381,15 @@ wheels = [
2004
  { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 },
2005
  ]
2006
 
 
 
 
 
 
 
 
 
 
2007
  [[package]]
2008
  name = "types-protobuf"
2009
  version = "6.30.2.20250822"
@@ -2268,3 +2654,77 @@ sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50e
2268
  wheels = [
2269
  { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276 },
2270
  ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
153
  { url = "https://files.pythonhosted.org/packages/31/da/e42d7a9d8dd33fa775f467e4028a47936da2f01e4b0e561f9ba0d74cb0ca/argcomplete-3.6.2-py3-none-any.whl", hash = "sha256:65b3133a29ad53fb42c48cf5114752c7ab66c1c38544fdf6460f450c09b42591", size = 43708 },
154
  ]
155
 
156
+ [[package]]
157
+ name = "asttokens"
158
+ version = "3.0.0"
159
+ source = { registry = "https://pypi.org/simple" }
160
+ sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978 }
161
+ wheels = [
162
+ { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918 },
163
+ ]
164
+
165
  [[package]]
166
  name = "attrs"
167
  version = "25.3.0"
 
333
  { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
334
  ]
335
 
336
+ [[package]]
337
+ name = "decorator"
338
+ version = "5.2.1"
339
+ source = { registry = "https://pypi.org/simple" }
340
+ sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711 }
341
+ wheels = [
342
+ { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190 },
343
+ ]
344
+
345
  [[package]]
346
  name = "distro"
347
  version = "1.9.0"
 
565
  { url = "https://files.pythonhosted.org/packages/86/f1/62a193f0227cf15a920390abe675f386dec35f7ae3ffe6da582d3ade42c7/googleapis_common_protos-1.70.0-py3-none-any.whl", hash = "sha256:b8bfcca8c25a2bb253e0e0b0adaf8c00773e5e6af6fd92397576680b807e0fd8", size = 294530 },
566
  ]
567
 
568
+ [[package]]
569
+ name = "greenlet"
570
+ version = "3.2.4"
571
+ source = { registry = "https://pypi.org/simple" }
572
+ sdist = { url = "https://files.pythonhosted.org/packages/03/b8/704d753a5a45507a7aab61f18db9509302ed3d0a27ac7e0359ec2905b1a6/greenlet-3.2.4.tar.gz", hash = "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d", size = 188260 }
573
+ wheels = [
574
+ { url = "https://files.pythonhosted.org/packages/a4/de/f28ced0a67749cac23fecb02b694f6473f47686dff6afaa211d186e2ef9c/greenlet-3.2.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2", size = 272305 },
575
+ { url = "https://files.pythonhosted.org/packages/09/16/2c3792cba130000bf2a31c5272999113f4764fd9d874fb257ff588ac779a/greenlet-3.2.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246", size = 632472 },
576
+ { url = "https://files.pythonhosted.org/packages/ae/8f/95d48d7e3d433e6dae5b1682e4292242a53f22df82e6d3dda81b1701a960/greenlet-3.2.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94abf90142c2a18151632371140b3dba4dee031633fe614cb592dbb6c9e17bc3", size = 644646 },
577
+ { url = "https://files.pythonhosted.org/packages/d5/5e/405965351aef8c76b8ef7ad370e5da58d57ef6068df197548b015464001a/greenlet-3.2.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:4d1378601b85e2e5171b99be8d2dc85f594c79967599328f95c1dc1a40f1c633", size = 640519 },
578
+ { url = "https://files.pythonhosted.org/packages/25/5d/382753b52006ce0218297ec1b628e048c4e64b155379331f25a7316eb749/greenlet-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0db5594dce18db94f7d1650d7489909b57afde4c580806b8d9203b6e79cdc079", size = 639707 },
579
+ { url = "https://files.pythonhosted.org/packages/1f/8e/abdd3f14d735b2929290a018ecf133c901be4874b858dd1c604b9319f064/greenlet-3.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8", size = 587684 },
580
+ { url = "https://files.pythonhosted.org/packages/5d/65/deb2a69c3e5996439b0176f6651e0052542bb6c8f8ec2e3fba97c9768805/greenlet-3.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52", size = 1116647 },
581
+ { url = "https://files.pythonhosted.org/packages/3f/cc/b07000438a29ac5cfb2194bfc128151d52f333cee74dd7dfe3fb733fc16c/greenlet-3.2.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:55e9c5affaa6775e2c6b67659f3a71684de4c549b3dd9afca3bc773533d284fa", size = 1142073 },
582
+ { url = "https://files.pythonhosted.org/packages/d8/0f/30aef242fcab550b0b3520b8e3561156857c94288f0332a79928c31a52cf/greenlet-3.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:9c40adce87eaa9ddb593ccb0fa6a07caf34015a29bf8d344811665b573138db9", size = 299100 },
583
+ { url = "https://files.pythonhosted.org/packages/44/69/9b804adb5fd0671f367781560eb5eb586c4d495277c93bde4307b9e28068/greenlet-3.2.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd", size = 274079 },
584
+ { url = "https://files.pythonhosted.org/packages/46/e9/d2a80c99f19a153eff70bc451ab78615583b8dac0754cfb942223d2c1a0d/greenlet-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb", size = 640997 },
585
+ { url = "https://files.pythonhosted.org/packages/3b/16/035dcfcc48715ccd345f3a93183267167cdd162ad123cd93067d86f27ce4/greenlet-3.2.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f28588772bb5fb869a8eb331374ec06f24a83a9c25bfa1f38b6993afe9c1e968", size = 655185 },
586
+ { url = "https://files.pythonhosted.org/packages/31/da/0386695eef69ffae1ad726881571dfe28b41970173947e7c558d9998de0f/greenlet-3.2.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5c9320971821a7cb77cfab8d956fa8e39cd07ca44b6070db358ceb7f8797c8c9", size = 649926 },
587
+ { url = "https://files.pythonhosted.org/packages/68/88/69bf19fd4dc19981928ceacbc5fd4bb6bc2215d53199e367832e98d1d8fe/greenlet-3.2.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c60a6d84229b271d44b70fb6e5fa23781abb5d742af7b808ae3f6efd7c9c60f6", size = 651839 },
588
+ { url = "https://files.pythonhosted.org/packages/19/0d/6660d55f7373b2ff8152401a83e02084956da23ae58cddbfb0b330978fe9/greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0", size = 607586 },
589
+ { url = "https://files.pythonhosted.org/packages/8e/1a/c953fdedd22d81ee4629afbb38d2f9d71e37d23caace44775a3a969147d4/greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0", size = 1123281 },
590
+ { url = "https://files.pythonhosted.org/packages/3f/c7/12381b18e21aef2c6bd3a636da1088b888b97b7a0362fac2e4de92405f97/greenlet-3.2.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f", size = 1151142 },
591
+ { url = "https://files.pythonhosted.org/packages/e9/08/b0814846b79399e585f974bbeebf5580fbe59e258ea7be64d9dfb253c84f/greenlet-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02", size = 299899 },
592
+ { url = "https://files.pythonhosted.org/packages/49/e8/58c7f85958bda41dafea50497cbd59738c5c43dbbea5ee83d651234398f4/greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31", size = 272814 },
593
+ { url = "https://files.pythonhosted.org/packages/62/dd/b9f59862e9e257a16e4e610480cfffd29e3fae018a68c2332090b53aac3d/greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945", size = 641073 },
594
+ { url = "https://files.pythonhosted.org/packages/f7/0b/bc13f787394920b23073ca3b6c4a7a21396301ed75a655bcb47196b50e6e/greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc", size = 655191 },
595
+ { url = "https://files.pythonhosted.org/packages/f2/d6/6adde57d1345a8d0f14d31e4ab9c23cfe8e2cd39c3baf7674b4b0338d266/greenlet-3.2.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a", size = 649516 },
596
+ { url = "https://files.pythonhosted.org/packages/7f/3b/3a3328a788d4a473889a2d403199932be55b1b0060f4ddd96ee7cdfcad10/greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504", size = 652169 },
597
+ { url = "https://files.pythonhosted.org/packages/ee/43/3cecdc0349359e1a527cbf2e3e28e5f8f06d3343aaf82ca13437a9aa290f/greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671", size = 610497 },
598
+ { url = "https://files.pythonhosted.org/packages/b8/19/06b6cf5d604e2c382a6f31cafafd6f33d5dea706f4db7bdab184bad2b21d/greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b", size = 1121662 },
599
+ { url = "https://files.pythonhosted.org/packages/a2/15/0d5e4e1a66fab130d98168fe984c509249c833c1a3c16806b90f253ce7b9/greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae", size = 1149210 },
600
+ { url = "https://files.pythonhosted.org/packages/0b/55/2321e43595e6801e105fcfdee02b34c0f996eb71e6ddffca6b10b7e1d771/greenlet-3.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b", size = 299685 },
601
+ { url = "https://files.pythonhosted.org/packages/22/5c/85273fd7cc388285632b0498dbbab97596e04b154933dfe0f3e68156c68c/greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0", size = 273586 },
602
+ { url = "https://files.pythonhosted.org/packages/d1/75/10aeeaa3da9332c2e761e4c50d4c3556c21113ee3f0afa2cf5769946f7a3/greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f", size = 686346 },
603
+ { url = "https://files.pythonhosted.org/packages/c0/aa/687d6b12ffb505a4447567d1f3abea23bd20e73a5bed63871178e0831b7a/greenlet-3.2.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5", size = 699218 },
604
+ { url = "https://files.pythonhosted.org/packages/dc/8b/29aae55436521f1d6f8ff4e12fb676f3400de7fcf27fccd1d4d17fd8fecd/greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1", size = 694659 },
605
+ { url = "https://files.pythonhosted.org/packages/92/2e/ea25914b1ebfde93b6fc4ff46d6864564fba59024e928bdc7de475affc25/greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735", size = 695355 },
606
+ { url = "https://files.pythonhosted.org/packages/72/60/fc56c62046ec17f6b0d3060564562c64c862948c9d4bc8aa807cf5bd74f4/greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337", size = 657512 },
607
+ { url = "https://files.pythonhosted.org/packages/e3/a5/6ddab2b4c112be95601c13428db1d8b6608a8b6039816f2ba09c346c08fc/greenlet-3.2.4-cp314-cp314-win_amd64.whl", hash = "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01", size = 303425 },
608
+ ]
609
+
610
  [[package]]
611
  name = "griffe"
612
  version = "1.12.1"
 
751
  { url = "https://files.pythonhosted.org/packages/0a/66/7f8c48009c72d73bc6bbe6eb87ac838d6a526146f7dab14af671121eb379/invoke-2.2.0-py3-none-any.whl", hash = "sha256:6ea924cc53d4f78e3d98bc436b08069a03077e6f85ad1ddaa8a116d7dad15820", size = 160274 },
752
  ]
753
 
754
+ [[package]]
755
+ name = "ipython"
756
+ version = "9.5.0"
757
+ source = { registry = "https://pypi.org/simple" }
758
+ dependencies = [
759
+ { name = "colorama", marker = "sys_platform == 'win32'" },
760
+ { name = "decorator" },
761
+ { name = "ipython-pygments-lexers" },
762
+ { name = "jedi" },
763
+ { name = "matplotlib-inline" },
764
+ { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
765
+ { name = "prompt-toolkit" },
766
+ { name = "pygments" },
767
+ { name = "stack-data" },
768
+ { name = "traitlets" },
769
+ { name = "typing-extensions", marker = "python_full_version < '3.12'" },
770
+ ]
771
+ sdist = { url = "https://files.pythonhosted.org/packages/6e/71/a86262bf5a68bf211bcc71fe302af7e05f18a2852fdc610a854d20d085e6/ipython-9.5.0.tar.gz", hash = "sha256:129c44b941fe6d9b82d36fc7a7c18127ddb1d6f02f78f867f402e2e3adde3113", size = 4389137 }
772
+ wheels = [
773
+ { url = "https://files.pythonhosted.org/packages/08/2a/5628a99d04acb2d2f2e749cdf4ea571d2575e898df0528a090948018b726/ipython-9.5.0-py3-none-any.whl", hash = "sha256:88369ffa1d5817d609120daa523a6da06d02518e582347c29f8451732a9c5e72", size = 612426 },
774
+ ]
775
+
776
+ [[package]]
777
+ name = "ipython-pygments-lexers"
778
+ version = "1.1.1"
779
+ source = { registry = "https://pypi.org/simple" }
780
+ dependencies = [
781
+ { name = "pygments" },
782
+ ]
783
+ sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393 }
784
+ wheels = [
785
+ { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074 },
786
+ ]
787
+
788
+ [[package]]
789
+ name = "jedi"
790
+ version = "0.19.2"
791
+ source = { registry = "https://pypi.org/simple" }
792
+ dependencies = [
793
+ { name = "parso" },
794
+ ]
795
+ sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287 }
796
+ wheels = [
797
+ { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278 },
798
+ ]
799
+
800
  [[package]]
801
  name = "jiter"
802
  version = "0.10.0"
 
866
  { url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", size = 20256 },
867
  ]
868
 
869
+ [[package]]
870
+ name = "jsonpatch"
871
+ version = "1.33"
872
+ source = { registry = "https://pypi.org/simple" }
873
+ dependencies = [
874
+ { name = "jsonpointer" },
875
+ ]
876
+ sdist = { url = "https://files.pythonhosted.org/packages/42/78/18813351fe5d63acad16aec57f94ec2b70a09e53ca98145589e185423873/jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c", size = 21699 }
877
+ wheels = [
878
+ { url = "https://files.pythonhosted.org/packages/73/07/02e16ed01e04a374e644b575638ec7987ae846d25ad97bcc9945a3ee4b0e/jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade", size = 12898 },
879
+ ]
880
+
881
+ [[package]]
882
+ name = "jsonpointer"
883
+ version = "3.0.0"
884
+ source = { registry = "https://pypi.org/simple" }
885
+ sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114 }
886
+ wheels = [
887
+ { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595 },
888
+ ]
889
+
890
  [[package]]
891
  name = "jsonschema"
892
  version = "4.25.1"
 
914
  { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437 },
915
  ]
916
 
917
+ [[package]]
918
+ name = "langchain"
919
+ version = "0.3.27"
920
+ source = { registry = "https://pypi.org/simple" }
921
+ dependencies = [
922
+ { name = "langchain-core" },
923
+ { name = "langchain-text-splitters" },
924
+ { name = "langsmith" },
925
+ { name = "pydantic" },
926
+ { name = "pyyaml" },
927
+ { name = "requests" },
928
+ { name = "sqlalchemy" },
929
+ ]
930
+ sdist = { url = "https://files.pythonhosted.org/packages/83/f6/f4f7f3a56626fe07e2bb330feb61254dbdf06c506e6b59a536a337da51cf/langchain-0.3.27.tar.gz", hash = "sha256:aa6f1e6274ff055d0fd36254176770f356ed0a8994297d1df47df341953cec62", size = 10233809 }
931
+ wheels = [
932
+ { url = "https://files.pythonhosted.org/packages/f6/d5/4861816a95b2f6993f1360cfb605aacb015506ee2090433a71de9cca8477/langchain-0.3.27-py3-none-any.whl", hash = "sha256:7b20c4f338826acb148d885b20a73a16e410ede9ee4f19bb02011852d5f98798", size = 1018194 },
933
+ ]
934
+
935
+ [[package]]
936
+ name = "langchain-core"
937
+ version = "0.3.75"
938
+ source = { registry = "https://pypi.org/simple" }
939
+ dependencies = [
940
+ { name = "jsonpatch" },
941
+ { name = "langsmith" },
942
+ { name = "packaging" },
943
+ { name = "pydantic" },
944
+ { name = "pyyaml" },
945
+ { name = "tenacity" },
946
+ { name = "typing-extensions" },
947
+ ]
948
+ sdist = { url = "https://files.pythonhosted.org/packages/06/63/270b71a23e849984505ddc7c5c9fd3f4bd9cb14b1a484ee44c4e51c33cc2/langchain_core-0.3.75.tar.gz", hash = "sha256:ab0eb95a06ed6043f76162e6086b45037690cb70b7f090bd83b5ebb8a05b70ed", size = 570876 }
949
+ wheels = [
950
+ { url = "https://files.pythonhosted.org/packages/fb/42/0d0221cce6f168f644d7d96cb6c87c4e42fc55d2941da7a36e970e3ab8ab/langchain_core-0.3.75-py3-none-any.whl", hash = "sha256:03ca1fadf955ee3c7d5806a841f4b3a37b816acea5e61a7e6ba1298c05eea7f5", size = 443986 },
951
+ ]
952
+
953
+ [[package]]
954
+ name = "langchain-text-splitters"
955
+ version = "0.3.11"
956
+ source = { registry = "https://pypi.org/simple" }
957
+ dependencies = [
958
+ { name = "langchain-core" },
959
+ ]
960
+ sdist = { url = "https://files.pythonhosted.org/packages/11/43/dcda8fd25f0b19cb2835f2f6bb67f26ad58634f04ac2d8eae00526b0fa55/langchain_text_splitters-0.3.11.tar.gz", hash = "sha256:7a50a04ada9a133bbabb80731df7f6ddac51bc9f1b9cab7fa09304d71d38a6cc", size = 46458 }
961
+ wheels = [
962
+ { url = "https://files.pythonhosted.org/packages/58/0d/41a51b40d24ff0384ec4f7ab8dd3dcea8353c05c973836b5e289f1465d4f/langchain_text_splitters-0.3.11-py3-none-any.whl", hash = "sha256:cf079131166a487f1372c8ab5d0bfaa6c0a4291733d9c43a34a16ac9bcd6a393", size = 33845 },
963
+ ]
964
+
965
  [[package]]
966
  name = "langfuse"
967
  version = "3.3.4"
 
982
  { url = "https://files.pythonhosted.org/packages/dc/46/edd370d47ca72ed4ca36b3c3b8f3a4ce71a310629d0bcb6ed760b04b08b1/langfuse-3.3.4-py3-none-any.whl", hash = "sha256:15b9d20878cf39a48ca9cfa7e52acdfeb043603d3a9cef8cf451687a4d838c6b", size = 318389 },
983
  ]
984
 
985
+ [[package]]
986
+ name = "langsmith"
987
+ version = "0.4.25"
988
+ source = { registry = "https://pypi.org/simple" }
989
+ dependencies = [
990
+ { name = "httpx" },
991
+ { name = "orjson", marker = "platform_python_implementation != 'PyPy'" },
992
+ { name = "packaging" },
993
+ { name = "pydantic" },
994
+ { name = "requests" },
995
+ { name = "requests-toolbelt" },
996
+ { name = "zstandard" },
997
+ ]
998
+ sdist = { url = "https://files.pythonhosted.org/packages/0c/84/2f01d51a557d14a9a5590c32de5dde3b466b00a55521450c2c9e77ffa438/langsmith-0.4.25.tar.gz", hash = "sha256:56f0c45810384fba37582ca17fdbcf6ead51934d26d72672e5a810452c0d4ae3", size = 940274 }
999
+ wheels = [
1000
+ { url = "https://files.pythonhosted.org/packages/a5/85/8a5ca8f6044bd74acd0d364878b459d84ec460cf40aec17ed9cd5716e908/langsmith-0.4.25-py3-none-any.whl", hash = "sha256:adb61784ff58e65f0290ba45770626219fb06a776e69fbcf98aec580478b4686", size = 379416 },
1001
+ ]
1002
+
1003
  [[package]]
1004
  name = "logfire"
1005
  version = "4.4.0"
 
1044
  { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321 },
1045
  ]
1046
 
1047
+ [[package]]
1048
+ name = "matplotlib-inline"
1049
+ version = "0.1.7"
1050
+ source = { registry = "https://pypi.org/simple" }
1051
+ dependencies = [
1052
+ { name = "traitlets" },
1053
+ ]
1054
+ sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159 }
1055
+ wheels = [
1056
+ { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 },
1057
+ ]
1058
+
1059
  [[package]]
1060
  name = "mcp"
1061
  version = "1.13.0"
 
1366
  { url = "https://files.pythonhosted.org/packages/0b/a6/b98d508d189b9c208f5978d0906141747d7e6df7c7cafec03657ed1ed559/opentelemetry_util_http-0.57b0-py3-none-any.whl", hash = "sha256:e54c0df5543951e471c3d694f85474977cd5765a3b7654398c83bab3d2ffb8e9", size = 7643 },
1367
  ]
1368
 
1369
+ [[package]]
1370
+ name = "orjson"
1371
+ version = "3.11.3"
1372
+ source = { registry = "https://pypi.org/simple" }
1373
+ sdist = { url = "https://files.pythonhosted.org/packages/be/4d/8df5f83256a809c22c4d6792ce8d43bb503be0fb7a8e4da9025754b09658/orjson-3.11.3.tar.gz", hash = "sha256:1c0603b1d2ffcd43a411d64797a19556ef76958aef1c182f22dc30860152a98a", size = 5482394 }
1374
+ wheels = [
1375
+ { url = "https://files.pythonhosted.org/packages/cd/8b/360674cd817faef32e49276187922a946468579fcaf37afdfb6c07046e92/orjson-3.11.3-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9d2ae0cc6aeb669633e0124531f342a17d8e97ea999e42f12a5ad4adaa304c5f", size = 238238 },
1376
+ { url = "https://files.pythonhosted.org/packages/05/3d/5fa9ea4b34c1a13be7d9046ba98d06e6feb1d8853718992954ab59d16625/orjson-3.11.3-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:ba21dbb2493e9c653eaffdc38819b004b7b1b246fb77bfc93dc016fe664eac91", size = 127713 },
1377
+ { url = "https://files.pythonhosted.org/packages/e5/5f/e18367823925e00b1feec867ff5f040055892fc474bf5f7875649ecfa586/orjson-3.11.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00f1a271e56d511d1569937c0447d7dce5a99a33ea0dec76673706360a051904", size = 123241 },
1378
+ { url = "https://files.pythonhosted.org/packages/0f/bd/3c66b91c4564759cf9f473251ac1650e446c7ba92a7c0f9f56ed54f9f0e6/orjson-3.11.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b67e71e47caa6680d1b6f075a396d04fa6ca8ca09aafb428731da9b3ea32a5a6", size = 127895 },
1379
+ { url = "https://files.pythonhosted.org/packages/82/b5/dc8dcd609db4766e2967a85f63296c59d4722b39503e5b0bf7fd340d387f/orjson-3.11.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d7d012ebddffcce8c85734a6d9e5f08180cd3857c5f5a3ac70185b43775d043d", size = 130303 },
1380
+ { url = "https://files.pythonhosted.org/packages/48/c2/d58ec5fd1270b2aa44c862171891adc2e1241bd7dab26c8f46eb97c6c6f1/orjson-3.11.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd759f75d6b8d1b62012b7f5ef9461d03c804f94d539a5515b454ba3a6588038", size = 132366 },
1381
+ { url = "https://files.pythonhosted.org/packages/73/87/0ef7e22eb8dd1ef940bfe3b9e441db519e692d62ed1aae365406a16d23d0/orjson-3.11.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6890ace0809627b0dff19cfad92d69d0fa3f089d3e359a2a532507bb6ba34efb", size = 135180 },
1382
+ { url = "https://files.pythonhosted.org/packages/bb/6a/e5bf7b70883f374710ad74faf99bacfc4b5b5a7797c1d5e130350e0e28a3/orjson-3.11.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9d4a5e041ae435b815e568537755773d05dac031fee6a57b4ba70897a44d9d2", size = 132741 },
1383
+ { url = "https://files.pythonhosted.org/packages/bd/0c/4577fd860b6386ffaa56440e792af01c7882b56d2766f55384b5b0e9d39b/orjson-3.11.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d68bf97a771836687107abfca089743885fb664b90138d8761cce61d5625d55", size = 131104 },
1384
+ { url = "https://files.pythonhosted.org/packages/66/4b/83e92b2d67e86d1c33f2ea9411742a714a26de63641b082bdbf3d8e481af/orjson-3.11.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:bfc27516ec46f4520b18ef645864cee168d2a027dbf32c5537cb1f3e3c22dac1", size = 403887 },
1385
+ { url = "https://files.pythonhosted.org/packages/6d/e5/9eea6a14e9b5ceb4a271a1fd2e1dec5f2f686755c0fab6673dc6ff3433f4/orjson-3.11.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f66b001332a017d7945e177e282a40b6997056394e3ed7ddb41fb1813b83e824", size = 145855 },
1386
+ { url = "https://files.pythonhosted.org/packages/45/78/8d4f5ad0c80ba9bf8ac4d0fc71f93a7d0dc0844989e645e2074af376c307/orjson-3.11.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:212e67806525d2561efbfe9e799633b17eb668b8964abed6b5319b2f1cfbae1f", size = 135361 },
1387
+ { url = "https://files.pythonhosted.org/packages/0b/5f/16386970370178d7a9b438517ea3d704efcf163d286422bae3b37b88dbb5/orjson-3.11.3-cp311-cp311-win32.whl", hash = "sha256:6e8e0c3b85575a32f2ffa59de455f85ce002b8bdc0662d6b9c2ed6d80ab5d204", size = 136190 },
1388
+ { url = "https://files.pythonhosted.org/packages/09/60/db16c6f7a41dd8ac9fb651f66701ff2aeb499ad9ebc15853a26c7c152448/orjson-3.11.3-cp311-cp311-win_amd64.whl", hash = "sha256:6be2f1b5d3dc99a5ce5ce162fc741c22ba9f3443d3dd586e6a1211b7bc87bc7b", size = 131389 },
1389
+ { url = "https://files.pythonhosted.org/packages/3e/2a/bb811ad336667041dea9b8565c7c9faf2f59b47eb5ab680315eea612ef2e/orjson-3.11.3-cp311-cp311-win_arm64.whl", hash = "sha256:fafb1a99d740523d964b15c8db4eabbfc86ff29f84898262bf6e3e4c9e97e43e", size = 126120 },
1390
+ { url = "https://files.pythonhosted.org/packages/3d/b0/a7edab2a00cdcb2688e1c943401cb3236323e7bfd2839815c6131a3742f4/orjson-3.11.3-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:8c752089db84333e36d754c4baf19c0e1437012242048439c7e80eb0e6426e3b", size = 238259 },
1391
+ { url = "https://files.pythonhosted.org/packages/e1/c6/ff4865a9cc398a07a83342713b5932e4dc3cb4bf4bc04e8f83dedfc0d736/orjson-3.11.3-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:9b8761b6cf04a856eb544acdd82fc594b978f12ac3602d6374a7edb9d86fd2c2", size = 127633 },
1392
+ { url = "https://files.pythonhosted.org/packages/6e/e6/e00bea2d9472f44fe8794f523e548ce0ad51eb9693cf538a753a27b8bda4/orjson-3.11.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b13974dc8ac6ba22feaa867fc19135a3e01a134b4f7c9c28162fed4d615008a", size = 123061 },
1393
+ { url = "https://files.pythonhosted.org/packages/54/31/9fbb78b8e1eb3ac605467cb846e1c08d0588506028b37f4ee21f978a51d4/orjson-3.11.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f83abab5bacb76d9c821fd5c07728ff224ed0e52d7a71b7b3de822f3df04e15c", size = 127956 },
1394
+ { url = "https://files.pythonhosted.org/packages/36/88/b0604c22af1eed9f98d709a96302006915cfd724a7ebd27d6dd11c22d80b/orjson-3.11.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6fbaf48a744b94091a56c62897b27c31ee2da93d826aa5b207131a1e13d4064", size = 130790 },
1395
+ { url = "https://files.pythonhosted.org/packages/0e/9d/1c1238ae9fffbfed51ba1e507731b3faaf6b846126a47e9649222b0fd06f/orjson-3.11.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc779b4f4bba2847d0d2940081a7b6f7b5877e05408ffbb74fa1faf4a136c424", size = 132385 },
1396
+ { url = "https://files.pythonhosted.org/packages/a3/b5/c06f1b090a1c875f337e21dd71943bc9d84087f7cdf8c6e9086902c34e42/orjson-3.11.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd4b909ce4c50faa2192da6bb684d9848d4510b736b0611b6ab4020ea6fd2d23", size = 135305 },
1397
+ { url = "https://files.pythonhosted.org/packages/a0/26/5f028c7d81ad2ebbf84414ba6d6c9cac03f22f5cd0d01eb40fb2d6a06b07/orjson-3.11.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:524b765ad888dc5518bbce12c77c2e83dee1ed6b0992c1790cc5fb49bb4b6667", size = 132875 },
1398
+ { url = "https://files.pythonhosted.org/packages/fe/d4/b8df70d9cfb56e385bf39b4e915298f9ae6c61454c8154a0f5fd7efcd42e/orjson-3.11.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:84fd82870b97ae3cdcea9d8746e592b6d40e1e4d4527835fc520c588d2ded04f", size = 130940 },
1399
+ { url = "https://files.pythonhosted.org/packages/da/5e/afe6a052ebc1a4741c792dd96e9f65bf3939d2094e8b356503b68d48f9f5/orjson-3.11.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:fbecb9709111be913ae6879b07bafd4b0785b44c1eb5cac8ac76da048b3885a1", size = 403852 },
1400
+ { url = "https://files.pythonhosted.org/packages/f8/90/7bbabafeb2ce65915e9247f14a56b29c9334003536009ef5b122783fe67e/orjson-3.11.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9dba358d55aee552bd868de348f4736ca5a4086d9a62e2bfbbeeb5629fe8b0cc", size = 146293 },
1401
+ { url = "https://files.pythonhosted.org/packages/27/b3/2d703946447da8b093350570644a663df69448c9d9330e5f1d9cce997f20/orjson-3.11.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eabcf2e84f1d7105f84580e03012270c7e97ecb1fb1618bda395061b2a84a049", size = 135470 },
1402
+ { url = "https://files.pythonhosted.org/packages/38/70/b14dcfae7aff0e379b0119c8a812f8396678919c431efccc8e8a0263e4d9/orjson-3.11.3-cp312-cp312-win32.whl", hash = "sha256:3782d2c60b8116772aea8d9b7905221437fdf53e7277282e8d8b07c220f96cca", size = 136248 },
1403
+ { url = "https://files.pythonhosted.org/packages/35/b8/9e3127d65de7fff243f7f3e53f59a531bf6bb295ebe5db024c2503cc0726/orjson-3.11.3-cp312-cp312-win_amd64.whl", hash = "sha256:79b44319268af2eaa3e315b92298de9a0067ade6e6003ddaef72f8e0bedb94f1", size = 131437 },
1404
+ { url = "https://files.pythonhosted.org/packages/51/92/a946e737d4d8a7fd84a606aba96220043dcc7d6988b9e7551f7f6d5ba5ad/orjson-3.11.3-cp312-cp312-win_arm64.whl", hash = "sha256:0e92a4e83341ef79d835ca21b8bd13e27c859e4e9e4d7b63defc6e58462a3710", size = 125978 },
1405
+ { url = "https://files.pythonhosted.org/packages/fc/79/8932b27293ad35919571f77cb3693b5906cf14f206ef17546052a241fdf6/orjson-3.11.3-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:af40c6612fd2a4b00de648aa26d18186cd1322330bd3a3cc52f87c699e995810", size = 238127 },
1406
+ { url = "https://files.pythonhosted.org/packages/1c/82/cb93cd8cf132cd7643b30b6c5a56a26c4e780c7a145db6f83de977b540ce/orjson-3.11.3-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:9f1587f26c235894c09e8b5b7636a38091a9e6e7fe4531937534749c04face43", size = 127494 },
1407
+ { url = "https://files.pythonhosted.org/packages/a4/b8/2d9eb181a9b6bb71463a78882bcac1027fd29cf62c38a40cc02fc11d3495/orjson-3.11.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61dcdad16da5bb486d7227a37a2e789c429397793a6955227cedbd7252eb5a27", size = 123017 },
1408
+ { url = "https://files.pythonhosted.org/packages/b4/14/a0e971e72d03b509190232356d54c0f34507a05050bd026b8db2bf2c192c/orjson-3.11.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:11c6d71478e2cbea0a709e8a06365fa63da81da6498a53e4c4f065881d21ae8f", size = 127898 },
1409
+ { url = "https://files.pythonhosted.org/packages/8e/af/dc74536722b03d65e17042cc30ae586161093e5b1f29bccda24765a6ae47/orjson-3.11.3-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff94112e0098470b665cb0ed06efb187154b63649403b8d5e9aedeb482b4548c", size = 130742 },
1410
+ { url = "https://files.pythonhosted.org/packages/62/e6/7a3b63b6677bce089fe939353cda24a7679825c43a24e49f757805fc0d8a/orjson-3.11.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae8b756575aaa2a855a75192f356bbda11a89169830e1439cfb1a3e1a6dde7be", size = 132377 },
1411
+ { url = "https://files.pythonhosted.org/packages/fc/cd/ce2ab93e2e7eaf518f0fd15e3068b8c43216c8a44ed82ac2b79ce5cef72d/orjson-3.11.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9416cc19a349c167ef76135b2fe40d03cea93680428efee8771f3e9fb66079d", size = 135313 },
1412
+ { url = "https://files.pythonhosted.org/packages/d0/b4/f98355eff0bd1a38454209bbc73372ce351ba29933cb3e2eba16c04b9448/orjson-3.11.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b822caf5b9752bc6f246eb08124c3d12bf2175b66ab74bac2ef3bbf9221ce1b2", size = 132908 },
1413
+ { url = "https://files.pythonhosted.org/packages/eb/92/8f5182d7bc2a1bed46ed960b61a39af8389f0ad476120cd99e67182bfb6d/orjson-3.11.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:414f71e3bdd5573893bf5ecdf35c32b213ed20aa15536fe2f588f946c318824f", size = 130905 },
1414
+ { url = "https://files.pythonhosted.org/packages/1a/60/c41ca753ce9ffe3d0f67b9b4c093bdd6e5fdb1bc53064f992f66bb99954d/orjson-3.11.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:828e3149ad8815dc14468f36ab2a4b819237c155ee1370341b91ea4c8672d2ee", size = 403812 },
1415
+ { url = "https://files.pythonhosted.org/packages/dd/13/e4a4f16d71ce1868860db59092e78782c67082a8f1dc06a3788aef2b41bc/orjson-3.11.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ac9e05f25627ffc714c21f8dfe3a579445a5c392a9c8ae7ba1d0e9fb5333f56e", size = 146277 },
1416
+ { url = "https://files.pythonhosted.org/packages/8d/8b/bafb7f0afef9344754a3a0597a12442f1b85a048b82108ef2c956f53babd/orjson-3.11.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e44fbe4000bd321d9f3b648ae46e0196d21577cf66ae684a96ff90b1f7c93633", size = 135418 },
1417
+ { url = "https://files.pythonhosted.org/packages/60/d4/bae8e4f26afb2c23bea69d2f6d566132584d1c3a5fe89ee8c17b718cab67/orjson-3.11.3-cp313-cp313-win32.whl", hash = "sha256:2039b7847ba3eec1f5886e75e6763a16e18c68a63efc4b029ddf994821e2e66b", size = 136216 },
1418
+ { url = "https://files.pythonhosted.org/packages/88/76/224985d9f127e121c8cad882cea55f0ebe39f97925de040b75ccd4b33999/orjson-3.11.3-cp313-cp313-win_amd64.whl", hash = "sha256:29be5ac4164aa8bdcba5fa0700a3c9c316b411d8ed9d39ef8a882541bd452fae", size = 131362 },
1419
+ { url = "https://files.pythonhosted.org/packages/e2/cf/0dce7a0be94bd36d1346be5067ed65ded6adb795fdbe3abd234c8d576d01/orjson-3.11.3-cp313-cp313-win_arm64.whl", hash = "sha256:18bd1435cb1f2857ceb59cfb7de6f92593ef7b831ccd1b9bfb28ca530e539dce", size = 125989 },
1420
+ { url = "https://files.pythonhosted.org/packages/ef/77/d3b1fef1fc6aaeed4cbf3be2b480114035f4df8fa1a99d2dac1d40d6e924/orjson-3.11.3-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cf4b81227ec86935568c7edd78352a92e97af8da7bd70bdfdaa0d2e0011a1ab4", size = 238115 },
1421
+ { url = "https://files.pythonhosted.org/packages/e4/6d/468d21d49bb12f900052edcfbf52c292022d0a323d7828dc6376e6319703/orjson-3.11.3-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:bc8bc85b81b6ac9fc4dae393a8c159b817f4c2c9dee5d12b773bddb3b95fc07e", size = 127493 },
1422
+ { url = "https://files.pythonhosted.org/packages/67/46/1e2588700d354aacdf9e12cc2d98131fb8ac6f31ca65997bef3863edb8ff/orjson-3.11.3-cp314-cp314-manylinux_2_34_aarch64.whl", hash = "sha256:88dcfc514cfd1b0de038443c7b3e6a9797ffb1b3674ef1fd14f701a13397f82d", size = 122998 },
1423
+ { url = "https://files.pythonhosted.org/packages/3b/94/11137c9b6adb3779f1b34fd98be51608a14b430dbc02c6d41134fbba484c/orjson-3.11.3-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:d61cd543d69715d5fc0a690c7c6f8dcc307bc23abef9738957981885f5f38229", size = 132915 },
1424
+ { url = "https://files.pythonhosted.org/packages/10/61/dccedcf9e9bcaac09fdabe9eaee0311ca92115699500efbd31950d878833/orjson-3.11.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2b7b153ed90ababadbef5c3eb39549f9476890d339cf47af563aea7e07db2451", size = 130907 },
1425
+ { url = "https://files.pythonhosted.org/packages/0e/fd/0e935539aa7b08b3ca0f817d73034f7eb506792aae5ecc3b7c6e679cdf5f/orjson-3.11.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:7909ae2460f5f494fecbcd10613beafe40381fd0316e35d6acb5f3a05bfda167", size = 403852 },
1426
+ { url = "https://files.pythonhosted.org/packages/4a/2b/50ae1a5505cd1043379132fdb2adb8a05f37b3e1ebffe94a5073321966fd/orjson-3.11.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:2030c01cbf77bc67bee7eef1e7e31ecf28649353987775e3583062c752da0077", size = 146309 },
1427
+ { url = "https://files.pythonhosted.org/packages/cd/1d/a473c158e380ef6f32753b5f39a69028b25ec5be331c2049a2201bde2e19/orjson-3.11.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a0169ebd1cbd94b26c7a7ad282cf5c2744fce054133f959e02eb5265deae1872", size = 135424 },
1428
+ { url = "https://files.pythonhosted.org/packages/da/09/17d9d2b60592890ff7382e591aa1d9afb202a266b180c3d4049b1ec70e4a/orjson-3.11.3-cp314-cp314-win32.whl", hash = "sha256:0c6d7328c200c349e3a4c6d8c83e0a5ad029bdc2d417f234152bf34842d0fc8d", size = 136266 },
1429
+ { url = "https://files.pythonhosted.org/packages/15/58/358f6846410a6b4958b74734727e582ed971e13d335d6c7ce3e47730493e/orjson-3.11.3-cp314-cp314-win_amd64.whl", hash = "sha256:317bbe2c069bbc757b1a2e4105b64aacd3bc78279b66a6b9e51e846e4809f804", size = 131351 },
1430
+ { url = "https://files.pythonhosted.org/packages/28/01/d6b274a0635be0468d4dbd9cafe80c47105937a0d42434e805e67cd2ed8b/orjson-3.11.3-cp314-cp314-win_arm64.whl", hash = "sha256:e8f6a7a27d7b7bec81bd5924163e9af03d49bbb63013f107b48eb5d16db711bc", size = 125985 },
1431
+ ]
1432
+
1433
  [[package]]
1434
  name = "packaging"
1435
  version = "25.0"
 
1439
  { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469 },
1440
  ]
1441
 
1442
+ [[package]]
1443
+ name = "parso"
1444
+ version = "0.8.5"
1445
+ source = { registry = "https://pypi.org/simple" }
1446
+ sdist = { url = "https://files.pythonhosted.org/packages/d4/de/53e0bcf53d13e005bd8c92e7855142494f41171b34c2536b86187474184d/parso-0.8.5.tar.gz", hash = "sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a", size = 401205 }
1447
+ wheels = [
1448
+ { url = "https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl", hash = "sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887", size = 106668 },
1449
+ ]
1450
+
1451
+ [[package]]
1452
+ name = "pexpect"
1453
+ version = "4.9.0"
1454
+ source = { registry = "https://pypi.org/simple" }
1455
+ dependencies = [
1456
+ { name = "ptyprocess" },
1457
+ ]
1458
+ sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 }
1459
+ wheels = [
1460
+ { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 },
1461
+ ]
1462
+
1463
  [[package]]
1464
  name = "pillow"
1465
  version = "11.3.0"
 
1643
  { url = "https://files.pythonhosted.org/packages/7e/cc/7e77861000a0691aeea8f4566e5d3aa716f2b1dece4a24439437e41d3d25/protobuf-5.29.5-py3-none-any.whl", hash = "sha256:6cf42630262c59b2d8de33954443d94b746c952b01434fc58a417fdbd2e84bd5", size = 172823 },
1644
  ]
1645
 
1646
+ [[package]]
1647
+ name = "ptyprocess"
1648
+ version = "0.7.0"
1649
+ source = { registry = "https://pypi.org/simple" }
1650
+ sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 }
1651
+ wheels = [
1652
+ { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 },
1653
+ ]
1654
+
1655
+ [[package]]
1656
+ name = "pure-eval"
1657
+ version = "0.2.3"
1658
+ source = { registry = "https://pypi.org/simple" }
1659
+ sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752 }
1660
+ wheels = [
1661
+ { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 },
1662
+ ]
1663
+
1664
  [[package]]
1665
  name = "pyasn1"
1666
  version = "0.6.1"
 
2021
  { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738 },
2022
  ]
2023
 
2024
+ [[package]]
2025
+ name = "requests-toolbelt"
2026
+ version = "1.0.0"
2027
+ source = { registry = "https://pypi.org/simple" }
2028
+ dependencies = [
2029
+ { name = "requests" },
2030
+ ]
2031
+ sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888 }
2032
+ wheels = [
2033
+ { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481 },
2034
+ ]
2035
+
2036
  [[package]]
2037
  name = "rich"
2038
  version = "14.1.0"
 
2195
  { name = "google" },
2196
  { name = "google-genai" },
2197
  { name = "huggingface-hub" },
2198
+ { name = "ipython" },
2199
+ { name = "langchain" },
2200
+ { name = "langchain-core" },
2201
  { name = "langfuse" },
2202
  { name = "nest-asyncio" },
2203
  { name = "openai-agents" },
 
2211
  { name = "google", specifier = ">=3.0.0" },
2212
  { name = "google-genai", specifier = ">=1.31.0" },
2213
  { name = "huggingface-hub", specifier = ">=0.34.4" },
2214
+ { name = "ipython", specifier = ">=9.5.0" },
2215
+ { name = "langchain", specifier = ">=0.3.27" },
2216
+ { name = "langchain-core", specifier = ">=0.3.75" },
2217
  { name = "langfuse", specifier = ">=3.3.4" },
2218
  { name = "nest-asyncio", specifier = ">=1.6.0" },
2219
  { name = "openai-agents", specifier = ">=0.2.8" },
 
2240
  { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677 },
2241
  ]
2242
 
2243
+ [[package]]
2244
+ name = "sqlalchemy"
2245
+ version = "2.0.43"
2246
+ source = { registry = "https://pypi.org/simple" }
2247
+ dependencies = [
2248
+ { 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')" },
2249
+ { name = "typing-extensions" },
2250
+ ]
2251
+ sdist = { url = "https://files.pythonhosted.org/packages/d7/bc/d59b5d97d27229b0e009bd9098cd81af71c2fa5549c580a0a67b9bed0496/sqlalchemy-2.0.43.tar.gz", hash = "sha256:788bfcef6787a7764169cfe9859fe425bf44559619e1d9f56f5bddf2ebf6f417", size = 9762949 }
2252
+ wheels = [
2253
+ { url = "https://files.pythonhosted.org/packages/9d/77/fa7189fe44114658002566c6fe443d3ed0ec1fa782feb72af6ef7fbe98e7/sqlalchemy-2.0.43-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:52d9b73b8fb3e9da34c2b31e6d99d60f5f99fd8c1225c9dad24aeb74a91e1d29", size = 2136472 },
2254
+ { url = "https://files.pythonhosted.org/packages/99/ea/92ac27f2fbc2e6c1766bb807084ca455265707e041ba027c09c17d697867/sqlalchemy-2.0.43-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f42f23e152e4545157fa367b2435a1ace7571cab016ca26038867eb7df2c3631", size = 2126535 },
2255
+ { url = "https://files.pythonhosted.org/packages/94/12/536ede80163e295dc57fff69724caf68f91bb40578b6ac6583a293534849/sqlalchemy-2.0.43-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fb1a8c5438e0c5ea51afe9c6564f951525795cf432bed0c028c1cb081276685", size = 3297521 },
2256
+ { url = "https://files.pythonhosted.org/packages/03/b5/cacf432e6f1fc9d156eca0560ac61d4355d2181e751ba8c0cd9cb232c8c1/sqlalchemy-2.0.43-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db691fa174e8f7036afefe3061bc40ac2b770718be2862bfb03aabae09051aca", size = 3297343 },
2257
+ { url = "https://files.pythonhosted.org/packages/ca/ba/d4c9b526f18457667de4c024ffbc3a0920c34237b9e9dd298e44c7c00ee5/sqlalchemy-2.0.43-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe2b3b4927d0bc03d02ad883f402d5de201dbc8894ac87d2e981e7d87430e60d", size = 3232113 },
2258
+ { url = "https://files.pythonhosted.org/packages/aa/79/c0121b12b1b114e2c8a10ea297a8a6d5367bc59081b2be896815154b1163/sqlalchemy-2.0.43-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4d3d9b904ad4a6b175a2de0738248822f5ac410f52c2fd389ada0b5262d6a1e3", size = 3258240 },
2259
+ { url = "https://files.pythonhosted.org/packages/79/99/a2f9be96fb382f3ba027ad42f00dbe30fdb6ba28cda5f11412eee346bec5/sqlalchemy-2.0.43-cp311-cp311-win32.whl", hash = "sha256:5cda6b51faff2639296e276591808c1726c4a77929cfaa0f514f30a5f6156921", size = 2101248 },
2260
+ { url = "https://files.pythonhosted.org/packages/ee/13/744a32ebe3b4a7a9c7ea4e57babae7aa22070d47acf330d8e5a1359607f1/sqlalchemy-2.0.43-cp311-cp311-win_amd64.whl", hash = "sha256:c5d1730b25d9a07727d20ad74bc1039bbbb0a6ca24e6769861c1aa5bf2c4c4a8", size = 2126109 },
2261
+ { url = "https://files.pythonhosted.org/packages/61/db/20c78f1081446095450bdc6ee6cc10045fce67a8e003a5876b6eaafc5cc4/sqlalchemy-2.0.43-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:20d81fc2736509d7a2bd33292e489b056cbae543661bb7de7ce9f1c0cd6e7f24", size = 2134891 },
2262
+ { url = "https://files.pythonhosted.org/packages/45/0a/3d89034ae62b200b4396f0f95319f7d86e9945ee64d2343dcad857150fa2/sqlalchemy-2.0.43-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b9fc27650ff5a2c9d490c13c14906b918b0de1f8fcbb4c992712d8caf40e83", size = 2123061 },
2263
+ { url = "https://files.pythonhosted.org/packages/cb/10/2711f7ff1805919221ad5bee205971254845c069ee2e7036847103ca1e4c/sqlalchemy-2.0.43-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6772e3ca8a43a65a37c88e2f3e2adfd511b0b1da37ef11ed78dea16aeae85bd9", size = 3320384 },
2264
+ { url = "https://files.pythonhosted.org/packages/6e/0e/3d155e264d2ed2778484006ef04647bc63f55b3e2d12e6a4f787747b5900/sqlalchemy-2.0.43-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a113da919c25f7f641ffbd07fbc9077abd4b3b75097c888ab818f962707eb48", size = 3329648 },
2265
+ { url = "https://files.pythonhosted.org/packages/5b/81/635100fb19725c931622c673900da5efb1595c96ff5b441e07e3dd61f2be/sqlalchemy-2.0.43-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4286a1139f14b7d70141c67a8ae1582fc2b69105f1b09d9573494eb4bb4b2687", size = 3258030 },
2266
+ { url = "https://files.pythonhosted.org/packages/0c/ed/a99302716d62b4965fded12520c1cbb189f99b17a6d8cf77611d21442e47/sqlalchemy-2.0.43-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:529064085be2f4d8a6e5fab12d36ad44f1909a18848fcfbdb59cc6d4bbe48efe", size = 3294469 },
2267
+ { url = "https://files.pythonhosted.org/packages/5d/a2/3a11b06715149bf3310b55a98b5c1e84a42cfb949a7b800bc75cb4e33abc/sqlalchemy-2.0.43-cp312-cp312-win32.whl", hash = "sha256:b535d35dea8bbb8195e7e2b40059e2253acb2b7579b73c1b432a35363694641d", size = 2098906 },
2268
+ { url = "https://files.pythonhosted.org/packages/bc/09/405c915a974814b90aa591280623adc6ad6b322f61fd5cff80aeaef216c9/sqlalchemy-2.0.43-cp312-cp312-win_amd64.whl", hash = "sha256:1c6d85327ca688dbae7e2b06d7d84cfe4f3fffa5b5f9e21bb6ce9d0e1a0e0e0a", size = 2126260 },
2269
+ { url = "https://files.pythonhosted.org/packages/41/1c/a7260bd47a6fae7e03768bf66451437b36451143f36b285522b865987ced/sqlalchemy-2.0.43-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e7c08f57f75a2bb62d7ee80a89686a5e5669f199235c6d1dac75cd59374091c3", size = 2130598 },
2270
+ { url = "https://files.pythonhosted.org/packages/8e/84/8a337454e82388283830b3586ad7847aa9c76fdd4f1df09cdd1f94591873/sqlalchemy-2.0.43-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:14111d22c29efad445cd5021a70a8b42f7d9152d8ba7f73304c4d82460946aaa", size = 2118415 },
2271
+ { url = "https://files.pythonhosted.org/packages/cf/ff/22ab2328148492c4d71899d62a0e65370ea66c877aea017a244a35733685/sqlalchemy-2.0.43-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21b27b56eb2f82653168cefe6cb8e970cdaf4f3a6cb2c5e3c3c1cf3158968ff9", size = 3248707 },
2272
+ { url = "https://files.pythonhosted.org/packages/dc/29/11ae2c2b981de60187f7cbc84277d9d21f101093d1b2e945c63774477aba/sqlalchemy-2.0.43-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c5a9da957c56e43d72126a3f5845603da00e0293720b03bde0aacffcf2dc04f", size = 3253602 },
2273
+ { url = "https://files.pythonhosted.org/packages/b8/61/987b6c23b12c56d2be451bc70900f67dd7d989d52b1ee64f239cf19aec69/sqlalchemy-2.0.43-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d79f9fdc9584ec83d1b3c75e9f4595c49017f5594fee1a2217117647225d738", size = 3183248 },
2274
+ { url = "https://files.pythonhosted.org/packages/86/85/29d216002d4593c2ce1c0ec2cec46dda77bfbcd221e24caa6e85eff53d89/sqlalchemy-2.0.43-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9df7126fd9db49e3a5a3999442cc67e9ee8971f3cb9644250107d7296cb2a164", size = 3219363 },
2275
+ { url = "https://files.pythonhosted.org/packages/b6/e4/bd78b01919c524f190b4905d47e7630bf4130b9f48fd971ae1c6225b6f6a/sqlalchemy-2.0.43-cp313-cp313-win32.whl", hash = "sha256:7f1ac7828857fcedb0361b48b9ac4821469f7694089d15550bbcf9ab22564a1d", size = 2096718 },
2276
+ { url = "https://files.pythonhosted.org/packages/ac/a5/ca2f07a2a201f9497de1928f787926613db6307992fe5cda97624eb07c2f/sqlalchemy-2.0.43-cp313-cp313-win_amd64.whl", hash = "sha256:971ba928fcde01869361f504fcff3b7143b47d30de188b11c6357c0505824197", size = 2123200 },
2277
+ { url = "https://files.pythonhosted.org/packages/b8/d9/13bdde6521f322861fab67473cec4b1cc8999f3871953531cf61945fad92/sqlalchemy-2.0.43-py3-none-any.whl", hash = "sha256:1681c21dd2ccee222c2fe0bef671d1aef7c504087c9c4e800371cfcc8ac966fc", size = 1924759 },
2278
+ ]
2279
+
2280
  [[package]]
2281
  name = "sse-starlette"
2282
  version = "3.0.2"
 
2289
  { url = "https://files.pythonhosted.org/packages/ef/10/c78f463b4ef22eef8491f218f692be838282cd65480f6e423d7730dfd1fb/sse_starlette-3.0.2-py3-none-any.whl", hash = "sha256:16b7cbfddbcd4eaca11f7b586f3b8a080f1afe952c15813455b162edea619e5a", size = 11297 },
2290
  ]
2291
 
2292
+ [[package]]
2293
+ name = "stack-data"
2294
+ version = "0.6.3"
2295
+ source = { registry = "https://pypi.org/simple" }
2296
+ dependencies = [
2297
+ { name = "asttokens" },
2298
+ { name = "executing" },
2299
+ { name = "pure-eval" },
2300
+ ]
2301
+ sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707 }
2302
+ wheels = [
2303
+ { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 },
2304
+ ]
2305
+
2306
  [[package]]
2307
  name = "starlette"
2308
  version = "0.47.2"
 
2381
  { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 },
2382
  ]
2383
 
2384
+ [[package]]
2385
+ name = "traitlets"
2386
+ version = "5.14.3"
2387
+ source = { registry = "https://pypi.org/simple" }
2388
+ sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621 }
2389
+ wheels = [
2390
+ { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 },
2391
+ ]
2392
+
2393
  [[package]]
2394
  name = "types-protobuf"
2395
  version = "6.30.2.20250822"
 
2654
  wheels = [
2655
  { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276 },
2656
  ]
2657
+
2658
+ [[package]]
2659
+ name = "zstandard"
2660
+ version = "0.24.0"
2661
+ source = { registry = "https://pypi.org/simple" }
2662
+ sdist = { url = "https://files.pythonhosted.org/packages/09/1b/c20b2ef1d987627765dcd5bf1dadb8ef6564f00a87972635099bb76b7a05/zstandard-0.24.0.tar.gz", hash = "sha256:fe3198b81c00032326342d973e526803f183f97aa9e9a98e3f897ebafe21178f", size = 905681 }
2663
+ wheels = [
2664
+ { url = "https://files.pythonhosted.org/packages/01/1f/5c72806f76043c0ef9191a2b65281dacdf3b65b0828eb13bb2c987c4fb90/zstandard-0.24.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:addfc23e3bd5f4b6787b9ca95b2d09a1a67ad5a3c318daaa783ff90b2d3a366e", size = 795228 },
2665
+ { url = "https://files.pythonhosted.org/packages/0b/ba/3059bd5cd834666a789251d14417621b5c61233bd46e7d9023ea8bc1043a/zstandard-0.24.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6b005bcee4be9c3984b355336283afe77b2defa76ed6b89332eced7b6fa68b68", size = 640520 },
2666
+ { url = "https://files.pythonhosted.org/packages/57/07/f0e632bf783f915c1fdd0bf68614c4764cae9dd46ba32cbae4dd659592c3/zstandard-0.24.0-cp311-cp311-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:3f96a9130171e01dbb6c3d4d9925d604e2131a97f540e223b88ba45daf56d6fb", size = 5347682 },
2667
+ { url = "https://files.pythonhosted.org/packages/a6/4c/63523169fe84773a7462cd090b0989cb7c7a7f2a8b0a5fbf00009ba7d74d/zstandard-0.24.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd0d3d16e63873253bad22b413ec679cf6586e51b5772eb10733899832efec42", size = 5057650 },
2668
+ { url = "https://files.pythonhosted.org/packages/c6/16/49013f7ef80293f5cebf4c4229535a9f4c9416bbfd238560edc579815dbe/zstandard-0.24.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:b7a8c30d9bf4bd5e4dcfe26900bef0fcd9749acde45cdf0b3c89e2052fda9a13", size = 5404893 },
2669
+ { url = "https://files.pythonhosted.org/packages/4d/38/78e8bcb5fc32a63b055f2b99e0be49b506f2351d0180173674f516cf8a7a/zstandard-0.24.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:52cd7d9fa0a115c9446abb79b06a47171b7d916c35c10e0c3aa6f01d57561382", size = 5452389 },
2670
+ { url = "https://files.pythonhosted.org/packages/55/8a/81671f05619edbacd49bd84ce6899a09fc8299be20c09ae92f6618ccb92d/zstandard-0.24.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0f6fc2ea6e07e20df48752e7700e02e1892c61f9a6bfbacaf2c5b24d5ad504b", size = 5558888 },
2671
+ { url = "https://files.pythonhosted.org/packages/49/cc/e83feb2d7d22d1f88434defbaeb6e5e91f42a4f607b5d4d2d58912b69d67/zstandard-0.24.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e46eb6702691b24ddb3e31e88b4a499e31506991db3d3724a85bd1c5fc3cfe4e", size = 5048038 },
2672
+ { url = "https://files.pythonhosted.org/packages/08/c3/7a5c57ff49ef8943877f85c23368c104c2aea510abb339a2dc31ad0a27c3/zstandard-0.24.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5e3b9310fd7f0d12edc75532cd9a56da6293840c84da90070d692e0bb15f186", size = 5573833 },
2673
+ { url = "https://files.pythonhosted.org/packages/f9/00/64519983cd92535ba4bdd4ac26ac52db00040a52d6c4efb8d1764abcc343/zstandard-0.24.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76cdfe7f920738ea871f035568f82bad3328cbc8d98f1f6988264096b5264efd", size = 4961072 },
2674
+ { url = "https://files.pythonhosted.org/packages/72/ab/3a08a43067387d22994fc87c3113636aa34ccd2914a4d2d188ce365c5d85/zstandard-0.24.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3f2fe35ec84908dddf0fbf66b35d7c2878dbe349552dd52e005c755d3493d61c", size = 5268462 },
2675
+ { url = "https://files.pythonhosted.org/packages/49/cf/2abb3a1ad85aebe18c53e7eca73223f1546ddfa3bf4d2fb83fc5a064c5ca/zstandard-0.24.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:aa705beb74ab116563f4ce784fa94771f230c05d09ab5de9c397793e725bb1db", size = 5443319 },
2676
+ { url = "https://files.pythonhosted.org/packages/40/42/0dd59fc2f68f1664cda11c3b26abdf987f4e57cb6b6b0f329520cd074552/zstandard-0.24.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:aadf32c389bb7f02b8ec5c243c38302b92c006da565e120dfcb7bf0378f4f848", size = 5822355 },
2677
+ { url = "https://files.pythonhosted.org/packages/99/c0/ea4e640fd4f7d58d6f87a1e7aca11fb886ac24db277fbbb879336c912f63/zstandard-0.24.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e40cd0fc734aa1d4bd0e7ad102fd2a1aefa50ce9ef570005ffc2273c5442ddc3", size = 5365257 },
2678
+ { url = "https://files.pythonhosted.org/packages/27/a9/92da42a5c4e7e4003271f2e1f0efd1f37cfd565d763ad3604e9597980a1c/zstandard-0.24.0-cp311-cp311-win32.whl", hash = "sha256:cda61c46343809ecda43dc620d1333dd7433a25d0a252f2dcc7667f6331c7b61", size = 435559 },
2679
+ { url = "https://files.pythonhosted.org/packages/e2/8e/2c8e5c681ae4937c007938f954a060fa7c74f36273b289cabdb5ef0e9a7e/zstandard-0.24.0-cp311-cp311-win_amd64.whl", hash = "sha256:3b95fc06489aa9388400d1aab01a83652bc040c9c087bd732eb214909d7fb0dd", size = 505070 },
2680
+ { url = "https://files.pythonhosted.org/packages/52/10/a2f27a66bec75e236b575c9f7b0d7d37004a03aa2dcde8e2decbe9ed7b4d/zstandard-0.24.0-cp311-cp311-win_arm64.whl", hash = "sha256:ad9fd176ff6800a0cf52bcf59c71e5de4fa25bf3ba62b58800e0f84885344d34", size = 461507 },
2681
+ { url = "https://files.pythonhosted.org/packages/26/e9/0bd281d9154bba7fc421a291e263911e1d69d6951aa80955b992a48289f6/zstandard-0.24.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a2bda8f2790add22773ee7a4e43c90ea05598bffc94c21c40ae0a9000b0133c3", size = 795710 },
2682
+ { url = "https://files.pythonhosted.org/packages/36/26/b250a2eef515caf492e2d86732e75240cdac9d92b04383722b9753590c36/zstandard-0.24.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cc76de75300f65b8eb574d855c12518dc25a075dadb41dd18f6322bda3fe15d5", size = 640336 },
2683
+ { url = "https://files.pythonhosted.org/packages/79/bf/3ba6b522306d9bf097aac8547556b98a4f753dc807a170becaf30dcd6f01/zstandard-0.24.0-cp312-cp312-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:d2b3b4bda1a025b10fe0269369475f420177f2cb06e0f9d32c95b4873c9f80b8", size = 5342533 },
2684
+ { url = "https://files.pythonhosted.org/packages/ea/ec/22bc75bf054e25accdf8e928bc68ab36b4466809729c554ff3a1c1c8bce6/zstandard-0.24.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b84c6c210684286e504022d11ec294d2b7922d66c823e87575d8b23eba7c81f", size = 5062837 },
2685
+ { url = "https://files.pythonhosted.org/packages/48/cc/33edfc9d286e517fb5b51d9c3210e5bcfce578d02a675f994308ca587ae1/zstandard-0.24.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c59740682a686bf835a1a4d8d0ed1eefe31ac07f1c5a7ed5f2e72cf577692b00", size = 5393855 },
2686
+ { url = "https://files.pythonhosted.org/packages/73/36/59254e9b29da6215fb3a717812bf87192d89f190f23817d88cb8868c47ac/zstandard-0.24.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6324fde5cf5120fbf6541d5ff3c86011ec056e8d0f915d8e7822926a5377193a", size = 5451058 },
2687
+ { url = "https://files.pythonhosted.org/packages/9a/c7/31674cb2168b741bbbe71ce37dd397c9c671e73349d88ad3bca9e9fae25b/zstandard-0.24.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51a86bd963de3f36688553926a84e550d45d7f9745bd1947d79472eca27fcc75", size = 5546619 },
2688
+ { url = "https://files.pythonhosted.org/packages/e6/01/1a9f22239f08c00c156f2266db857545ece66a6fc0303d45c298564bc20b/zstandard-0.24.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d82ac87017b734f2fb70ff93818c66f0ad2c3810f61040f077ed38d924e19980", size = 5046676 },
2689
+ { url = "https://files.pythonhosted.org/packages/a7/91/6c0cf8fa143a4988a0361380ac2ef0d7cb98a374704b389fbc38b5891712/zstandard-0.24.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:92ea7855d5bcfb386c34557516c73753435fb2d4a014e2c9343b5f5ba148b5d8", size = 5576381 },
2690
+ { url = "https://files.pythonhosted.org/packages/e2/77/1526080e22e78871e786ccf3c84bf5cec9ed25110a9585507d3c551da3d6/zstandard-0.24.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3adb4b5414febf074800d264ddf69ecade8c658837a83a19e8ab820e924c9933", size = 4953403 },
2691
+ { url = "https://files.pythonhosted.org/packages/6e/d0/a3a833930bff01eab697eb8abeafb0ab068438771fa066558d96d7dafbf9/zstandard-0.24.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6374feaf347e6b83ec13cc5dcfa70076f06d8f7ecd46cc71d58fac798ff08b76", size = 5267396 },
2692
+ { url = "https://files.pythonhosted.org/packages/f3/5e/90a0db9a61cd4769c06374297ecfcbbf66654f74cec89392519deba64d76/zstandard-0.24.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:13fc548e214df08d896ee5f29e1f91ee35db14f733fef8eabea8dca6e451d1e2", size = 5433269 },
2693
+ { url = "https://files.pythonhosted.org/packages/ce/58/fc6a71060dd67c26a9c5566e0d7c99248cbe5abfda6b3b65b8f1a28d59f7/zstandard-0.24.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0a416814608610abf5488889c74e43ffa0343ca6cf43957c6b6ec526212422da", size = 5814203 },
2694
+ { url = "https://files.pythonhosted.org/packages/5c/6a/89573d4393e3ecbfa425d9a4e391027f58d7810dec5cdb13a26e4cdeef5c/zstandard-0.24.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0d66da2649bb0af4471699aeb7a83d6f59ae30236fb9f6b5d20fb618ef6c6777", size = 5359622 },
2695
+ { url = "https://files.pythonhosted.org/packages/60/ff/2cbab815d6f02a53a9d8d8703bc727d8408a2e508143ca9af6c3cca2054b/zstandard-0.24.0-cp312-cp312-win32.whl", hash = "sha256:ff19efaa33e7f136fe95f9bbcc90ab7fb60648453b03f95d1de3ab6997de0f32", size = 435968 },
2696
+ { url = "https://files.pythonhosted.org/packages/ce/a3/8f96b8ddb7ad12344218fbd0fd2805702dafd126ae9f8a1fb91eef7b33da/zstandard-0.24.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc05f8a875eb651d1cc62e12a4a0e6afa5cd0cc231381adb830d2e9c196ea895", size = 505195 },
2697
+ { url = "https://files.pythonhosted.org/packages/a3/4a/bfca20679da63bfc236634ef2e4b1b4254203098b0170e3511fee781351f/zstandard-0.24.0-cp312-cp312-win_arm64.whl", hash = "sha256:b04c94718f7a8ed7cdd01b162b6caa1954b3c9d486f00ecbbd300f149d2b2606", size = 461605 },
2698
+ { url = "https://files.pythonhosted.org/packages/ec/ef/db949de3bf81ed122b8ee4db6a8d147a136fe070e1015f5a60d8a3966748/zstandard-0.24.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e4ebb000c0fe24a6d0f3534b6256844d9dbf042fdf003efe5cf40690cf4e0f3e", size = 795700 },
2699
+ { url = "https://files.pythonhosted.org/packages/99/56/fc04395d6f5eabd2fe6d86c0800d198969f3038385cb918bfbe94f2b0c62/zstandard-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:498f88f5109666c19531f0243a90d2fdd2252839cd6c8cc6e9213a3446670fa8", size = 640343 },
2700
+ { url = "https://files.pythonhosted.org/packages/9b/0f/0b0e0d55f2f051d5117a0d62f4f9a8741b3647440c0ee1806b7bd47ed5ae/zstandard-0.24.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:0a9e95ceb180ccd12a8b3437bac7e8a8a089c9094e39522900a8917745542184", size = 5342571 },
2701
+ { url = "https://files.pythonhosted.org/packages/5d/43/d74e49f04fbd62d4b5d89aeb7a29d693fc637c60238f820cd5afe6ca8180/zstandard-0.24.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bcf69e0bcddbf2adcfafc1a7e864edcc204dd8171756d3a8f3340f6f6cc87b7b", size = 5062723 },
2702
+ { url = "https://files.pythonhosted.org/packages/8e/97/df14384d4d6a004388e6ed07ded02933b5c7e0833a9150c57d0abc9545b7/zstandard-0.24.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:10e284748a7e7fbe2815ca62a9d6e84497d34cfdd0143fa9e8e208efa808d7c4", size = 5393282 },
2703
+ { url = "https://files.pythonhosted.org/packages/7e/09/8f5c520e59a4d41591b30b7568595eda6fd71c08701bb316d15b7ed0613a/zstandard-0.24.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:1bda8a85e5b9d5e73af2e61b23609a8cc1598c1b3b2473969912979205a1ff25", size = 5450895 },
2704
+ { url = "https://files.pythonhosted.org/packages/d9/3d/02aba892327a67ead8cba160ee835cfa1fc292a9dcb763639e30c07da58b/zstandard-0.24.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1b14bc92af065d0534856bf1b30fc48753163ea673da98857ea4932be62079b1", size = 5546353 },
2705
+ { url = "https://files.pythonhosted.org/packages/6a/6e/96c52afcde44da6a5313a1f6c356349792079808f12d8b69a7d1d98ef353/zstandard-0.24.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:b4f20417a4f511c656762b001ec827500cbee54d1810253c6ca2df2c0a307a5f", size = 5046404 },
2706
+ { url = "https://files.pythonhosted.org/packages/da/b6/eefee6b92d341a7db7cd1b3885d42d30476a093720fb5c181e35b236d695/zstandard-0.24.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:337572a7340e1d92fd7fb5248c8300d0e91071002d92e0b8cabe8d9ae7b58159", size = 5576095 },
2707
+ { url = "https://files.pythonhosted.org/packages/a3/29/743de3131f6239ba6611e17199581e6b5e0f03f268924d42468e29468ca0/zstandard-0.24.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:df4be1cf6e8f0f2bbe2a3eabfff163ef592c84a40e1a20a8d7db7f27cfe08fc2", size = 4953448 },
2708
+ { url = "https://files.pythonhosted.org/packages/c9/11/bd36ef49fba82e307d69d93b5abbdcdc47d6a0bcbc7ffbbfe0ef74c2fec5/zstandard-0.24.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6885ae4b33aee8835dbdb4249d3dfec09af55e705d74d9b660bfb9da51baaa8b", size = 5267388 },
2709
+ { url = "https://files.pythonhosted.org/packages/c0/23/a4cfe1b871d3f1ce1f88f5c68d7e922e94be0043f3ae5ed58c11578d1e21/zstandard-0.24.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:663848a8bac4fdbba27feea2926049fdf7b55ec545d5b9aea096ef21e7f0b079", size = 5433383 },
2710
+ { url = "https://files.pythonhosted.org/packages/77/26/f3fb85f00e732cca617d4b9cd1ffa6484f613ea07fad872a8bdc3a0ce753/zstandard-0.24.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:05d27c953f2e0a3ecc8edbe91d6827736acc4c04d0479672e0400ccdb23d818c", size = 5813988 },
2711
+ { url = "https://files.pythonhosted.org/packages/3d/8c/d7e3b424b73f3ce66e754595cbcb6d94ff49790c9ac37d50e40e8145cd44/zstandard-0.24.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77b8b7b98893eaf47da03d262816f01f251c2aa059c063ed8a45c50eada123a5", size = 5359756 },
2712
+ { url = "https://files.pythonhosted.org/packages/90/6c/f1f0e11f1b295138f9da7e7ae22dcd9a1bb96a9544fa3b31507e431288f5/zstandard-0.24.0-cp313-cp313-win32.whl", hash = "sha256:cf7fbb4e54136e9a03c7ed7691843c4df6d2ecc854a2541f840665f4f2bb2edd", size = 435957 },
2713
+ { url = "https://files.pythonhosted.org/packages/9f/03/ab8b82ae5eb49eca4d3662705399c44442666cc1ce45f44f2d263bb1ae31/zstandard-0.24.0-cp313-cp313-win_amd64.whl", hash = "sha256:d64899cc0f33a8f446f1e60bffc21fa88b99f0e8208750d9144ea717610a80ce", size = 505171 },
2714
+ { url = "https://files.pythonhosted.org/packages/db/12/89a2ecdea4bc73a934a30b66a7cfac5af352beac94d46cf289e103b65c34/zstandard-0.24.0-cp313-cp313-win_arm64.whl", hash = "sha256:57be3abb4313e0dd625596376bbb607f40059d801d51c1a1da94d7477e63b255", size = 461596 },
2715
+ { url = "https://files.pythonhosted.org/packages/c9/56/f3d2c4d64aacee4aab89e788783636884786b6f8334c819f09bff1aa207b/zstandard-0.24.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b7fa260dd2731afd0dfa47881c30239f422d00faee4b8b341d3e597cface1483", size = 795747 },
2716
+ { url = "https://files.pythonhosted.org/packages/32/2d/9d3e5f6627e4cb5e511803788be1feee2f0c3b94594591e92b81db324253/zstandard-0.24.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e05d66239d14a04b4717998b736a25494372b1b2409339b04bf42aa4663bf251", size = 640475 },
2717
+ { url = "https://files.pythonhosted.org/packages/be/5d/48e66abf8c146d95330e5385633a8cfdd556fa8bd14856fe721590cbab2b/zstandard-0.24.0-cp314-cp314-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:622e1e04bd8a085994e02313ba06fbcf4f9ed9a488c6a77a8dbc0692abab6a38", size = 5343866 },
2718
+ { url = "https://files.pythonhosted.org/packages/95/6c/65fe7ba71220a551e082e4a52790487f1d6bb8dfc2156883e088f975ad6d/zstandard-0.24.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:55872e818598319f065e8192ebefecd6ac05f62a43f055ed71884b0a26218f41", size = 5062719 },
2719
+ { url = "https://files.pythonhosted.org/packages/cb/68/15ed0a813ff91be80cc2a610ac42e0fc8d29daa737de247bbf4bab9429a1/zstandard-0.24.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bb2446a55b3a0fd8aa02aa7194bd64740015464a2daaf160d2025204e1d7c282", size = 5393090 },
2720
+ { url = "https://files.pythonhosted.org/packages/d4/89/e560427b74fa2da6a12b8f3af8ee29104fe2bb069a25e7d314c35eec7732/zstandard-0.24.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2825a3951f945fb2613ded0f517d402b1e5a68e87e0ee65f5bd224a8333a9a46", size = 5450383 },
2721
+ { url = "https://files.pythonhosted.org/packages/a3/95/0498328cbb1693885509f2fc145402b108b750a87a3af65b7250b10bd896/zstandard-0.24.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:09887301001e7a81a3618156bc1759e48588de24bddfdd5b7a4364da9a8fbc20", size = 5546142 },
2722
+ { url = "https://files.pythonhosted.org/packages/8a/8a/64aa15a726594df3bf5d8decfec14fe20cd788c60890f44fcfc74d98c2cc/zstandard-0.24.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:98ca91dc9602cf351497d5600aa66e6d011a38c085a8237b370433fcb53e3409", size = 4953456 },
2723
+ { url = "https://files.pythonhosted.org/packages/b0/b6/e94879c5cd6017af57bcba08519ed1228b1ebb15681efd949f4a00199449/zstandard-0.24.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:e69f8e534b4e254f523e2f9d4732cf9c169c327ca1ce0922682aac9a5ee01155", size = 5268287 },
2724
+ { url = "https://files.pythonhosted.org/packages/fd/e5/1a3b3a93f953dbe9e77e2a19be146e9cd2af31b67b1419d6cc8e8898d409/zstandard-0.24.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:444633b487a711e34f4bccc46a0c5dfbe1aee82c1a511e58cdc16f6bd66f187c", size = 5433197 },
2725
+ { url = "https://files.pythonhosted.org/packages/39/83/b6eb1e1181de994b29804e1e0d2dc677bece4177f588c71653093cb4f6d5/zstandard-0.24.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f7d3fe9e1483171e9183ffdb1fab07c5fef80a9c3840374a38ec2ab869ebae20", size = 5813161 },
2726
+ { url = "https://files.pythonhosted.org/packages/f6/d3/2fb4166561591e9d75e8e35c79182aa9456644e2f4536f29e51216d1c513/zstandard-0.24.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:27b6fa72b57824a3f7901fc9cc4ce1c1c834b28f3a43d1d4254c64c8f11149d4", size = 5359831 },
2727
+ { url = "https://files.pythonhosted.org/packages/11/94/6a9227315b774f64a67445f62152c69b4e5e49a52a3c7c4dad8520a55e20/zstandard-0.24.0-cp314-cp314-win32.whl", hash = "sha256:fdc7a52a4cdaf7293e10813fd6a3abc0c7753660db12a3b864ab1fb5a0c60c16", size = 444448 },
2728
+ { url = "https://files.pythonhosted.org/packages/fc/de/67acaba311013e0798cb96d1a2685cb6edcdfc1cae378b297ea7b02c319f/zstandard-0.24.0-cp314-cp314-win_amd64.whl", hash = "sha256:656ed895b28c7e42dd5b40dfcea3217cfc166b6b7eef88c3da2f5fc62484035b", size = 516075 },
2729
+ { url = "https://files.pythonhosted.org/packages/10/ae/45fd8921263cea0228b20aa31bce47cc66016b2aba1afae1c6adcc3dbb1f/zstandard-0.24.0-cp314-cp314-win_arm64.whl", hash = "sha256:0101f835da7de08375f380192ff75135527e46e3f79bef224e3c49cb640fef6a", size = 476847 },
2730
+ ]