diff --git a/kosmos/agents/flight.py b/kosmos/agents/flight.py index e69de29..ff5052c 100644 --- a/kosmos/agents/flight.py +++ b/kosmos/agents/flight.py @@ -0,0 +1,160 @@ +import ast +import re +import time + +import kosmos.utils as U +from langchain_openai import ChatOpenAI +from langchain.prompts import SystemMessagePromptTemplate +from langchain.prompts import AIMessage, HumanMessage, SystemMessage + +from kosmos.prompts import load_prompt +from kosmos.control_primitives_context import load_control_primitives_context + +class FlightAgent: + def __init__( + self, + model_name="gpt-4o", + temperature=0, + request_timeout=120, + checkpoint_dir="checkpoint", + chat_log=True, + execution_error=True, + ): + self.checkpoint_dir = checkpoint_dir + self.chat_log = chat_log + self.execution_error = execution_error + U.f_mkdir(f"{checkpoint_dir}/action") + self.llm = ChatOpenAI( + model_name=model_name, + temperature=temperature, + request_timeout=request_timeout, + ) + + def construct_system_message(self, skills=[]): + system_template = load_prompt("action_template") + base_skills = [ + # load control primitives + ] + programs = "\n\n".join(load_control_primitives_context(base_skills) + skills) + response_format = load_prompt("action_response_format") + system_message_prompt = SystemMessagePromptTemplate.from_template( + system_template + ) + system_message = system_message_prompt.format( + programs=programs, response_format=response_format + ) + assert isinstance(system_message, SystemMessage) + return system_message + + def construct_human_message(self, *, events, code="", task="", context="", audit=""): + chat_messages = [] + error_messages = [] + assert events[-1][0] == "observe", "Last event must be observe" + for i, (event_type, event) in enumerate(events): + # Process events here - placeholder for now + pass + + observation = "" + + if code: + observation += f"Code from the last round:\n{code}\n\n" + else: + observation += f"Code from the last round: No code in the first round\n\n" + + if self.execution_error: + if error_messages: + error = "\n".join(error_messages) + observation += f"Execution error:\n{error}\n\n" + else: + observation += f"Execution error: No error\n\n" + + if self.chat_log: + if chat_messages: + chat_log = "\n".join(chat_messages) + observation += f"Chat log: {chat_log}\n\n" + else: + observation += f"Chat log: None\n\n" + + # FIXME: add all the game telemetry to the observation + + observation += f"Task: {task}\n\n" + + if context: + observation += f"Context: {context}\n\n" + else: + observation += f"Context: None\n\n" + + if audit: + observation += f"Audit: {audit}\n\n" + else: + observation += f"Critique: None\n\n" + + return HumanMessage(content=observation) + + def process_ai_message(self, message): + assert isinstance(message, AIMessage) + + retry = 3 + error = None + while retry > 0: + try: + code_pattern = re.compile(r"```(?:python|py)(.*?)```", re.DOTALL) + code = "\n".join(code_pattern.findall(message.content)) + parsed = ast.parse(code) + functions = [] + assert len(parsed.body) > 0, "No functions found" + + for node in parsed.body: + if not isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)): + continue + + node_type = "AsyncFunctionDef" if isinstance(node, ast.AsyncFunctionDef) else "FunctionDef" + + # Extract function parameters + params = [] + for arg in node.args.args: + params.append(arg.arg) + + # Get function source code (simplified - in practice you might want to use ast.unparse) + functions.append({ + "name": node.id.name, + "type": node_type, + "body": ast.unparse(node), + "params": params, + }) + + # Find the last async function + main_function = None + for function in reversed(functions): + if function["type"] == "AsyncFunctionDef": + main_function = function + break + + assert ( + main_function is not None + ), "No async function found. Your main function must be async." + assert ( + len(main_function["params"]) == 1 + and main_function["params"][0] == "bot" + ), f"Main function {main_function['name']} must take a single argument named 'bot'" + + program_code = "\n\n".join(function["body"] for function in functions) + exec_code = f"await {main_function['name']}(bot)" + + return { + "program_code": program_code, + "program_name": main_function["name"], + "exec_code": exec_code, + } + except Exception as e: + retry -= 1 + error = e + time.sleep(1) + return f"Error parsing action response (before program execution): {error}" + + def summarize_chatlog(self, events): + chatlog = set() + for event_type, event in events: + if event_type == "onChat": + chatlog.add(event["onChat"]) + return "I also need " + ", ".join(chatlog) + "." if chatlog else "" \ No newline at end of file diff --git a/kosmos/prompts/__init__.py b/kosmos/prompts/__init__.py new file mode 100644 index 0000000..fc98192 --- /dev/null +++ b/kosmos/prompts/__init__.py @@ -0,0 +1,7 @@ +import importlib.util +import os +import kosmos.utils as U + +def load_prompt(prompt_name): + package_path = importlib.util.find_spec("kosmos").submodule_search_locations[0] + return U.load_text(f"{package_path}/prompts/{prompt_name}.txt") \ No newline at end of file diff --git a/kosmos/prompts/flight_response_format.txt b/kosmos/prompts/flight_response_format.txt new file mode 100644 index 0000000..0d8d36f --- /dev/null +++ b/kosmos/prompts/flight_response_format.txt @@ -0,0 +1,13 @@ +Explain: ... +Plan: ... +1) ... +2) ... +3) ... +... +Code: +```python +# helper functions (only if needed, try to avoid them) +... +# main function after the helper functions +def your_main_function_name(conn, vessel): + # ... \ No newline at end of file diff --git a/kosmos/prompts/flight_template.txt b/kosmos/prompts/flight_template.txt new file mode 100644 index 0000000..f13f136 --- /dev/null +++ b/kosmos/prompts/flight_template.txt @@ -0,0 +1,53 @@ +You are a helpful assistant that writes kRPC and MechJeb python code to complete any Kerbel Space Program task specified by me. + +Here are some useful programs written with the kRPC and MechJeb APIs. + +{programs} + + +At each round of conversation, I will give you +Code from the last round: ... +Execution error: ... +Chat log: ... +Telemetry log: ... +Current body: ... +Mission time: ... +Vessel status: ... +Nearby vessels (nearest to farthest): ... +Fuel remaining: ... +Battery charge: ... +Position: ... +Velocity: ... +Altitude: ... +Orbit parameters: ... +Part status: ... +Resources: ... +Task: ... +Context: ... +Critique: ... + +You should then respond to me with +Explain (if applicable): Are there any steps missing in your plan? Why does the code not complete the task? What does the chat log and execution error imply? +Plan: How to complete the task step by step. You should pay attention to to Resources and Part status since they tell what you have available. The task completeness check is also based on your final orbital state and mission objective. +Code: + 1) Write a function taking the connection and vessel as arguments. + 2) Reuse the above useful programs as much as possible. + - Use `launch_to_orbit(conn, vessel, target_altitude, target_inclination)` for launches. Do not use raw staging and throttle control. + - Use `execute_maneuver_node(conn, vessl, mode)` for burns. Do not use manual throttle control during burns. + - Use `automated_landing(conn, vessel, target_lat, target_lon)` for landings. Do not use manual landing procedures. + - Use `transfer_to_body(conn, vessel, target_body)` for interplanetary transfers. Do not calculate transfer windows manually. + - Use `rendezvous_with_target(conn, vessel, target)` for docking operations. Do not use manual approach procedures. + 3) Your function will be reused for building more complex missions. Therefore, you should make it generic and reusable. You should not make strong assumptions about the vessel configuration (as it may be changed between missions), and therefore you should always check whether you have the required parts and resources before using them. If not, you should return appropriate error messages. + 4) Functions in the "Code from the last round" section will not be saved or executed. Do not reuse functions listed there. + 5) Anything defined outside a function will be ignored, define all your variables inside your functions. + 6) Use `print()` statements to show intermediate progress and telemetry data. + 7) Use `wait_for_soi_change(conn, vessel, target_body)` when waiting for sphere of influence changes during transfers. You should monitor vessel status during long burns or coast phases. + 8) Always check `conn.space_center.active_vessel` to ensure you're controlling the correct vessel. Vessel references can change during scene transitions. + 9) Do not write infinite loops without proper exit conditions based on mission objectives or failure states. + 10) Do not use `conn.add_stream()` without properly removing streams when done. Always clean up resources. + 11) Handle MechJeb availability with mj.available()` checks before using autopilots. Wait for MechJeb to initialize if needed. + 12) Name your function in a meaningful way that describes the mission phase or objective. + +You should only respond in the format as described below: +RESPONSE FORMAT: +{response_format} \ No newline at end of file diff --git a/krpc_readme_llm.md b/krpc_readme_llm.md new file mode 100644 index 0000000..560a8c4 --- /dev/null +++ b/krpc_readme_llm.md @@ -0,0 +1,783 @@ +# kRPC and kRPC.MechJeb ReadMe.LLM + +The following is the full ReadMe.LLM for the kRPC library and its MechJeb extension: + +## ReadMe.LLM + +### context_description +The context will be for the kRPC library and kRPC.MechJeb extension. kRPC allows you to control Kerbal Space Program from scripts running outside of the game using Remote Procedure Calls. It provides client libraries for many popular languages including C#, C++, C, Java, Lua, Python, and Ruby. kRPC.MechJeb extends this functionality by providing remote procedures to interact with MechJeb 2 autopilots. The context is organized into numbered sections using XML tags, with each section containing a description, code snippets, and use case examples. + +## context_1 + +### context_1_description +The kRPC SpaceCenter service provides the core functionality for controlling Kerbal Space Program from external scripts. It includes vessel control, flight data access, resource management, maneuver node planning, and camera control. This service exposes most of KSP's API for interacting with rockets, celestial bodies, and game state management. + +### context_1_code_snippet + +```python +import krpc + +# Connect to the kRPC server +conn = krpc.connect(name='Flight Controller') + +# Get the SpaceCenter service +space_center = conn.space_center + +# Get the active vessel +vessel = space_center.active_vessel + +# Control systems +control = vessel.control +autopilot = vessel.auto_pilot +flight = vessel.flight() +orbit = vessel.orbit + +# Basic vessel properties +print(f"Vessel name: {vessel.name}") +print(f"Mass: {vessel.mass} kg") +print(f"Dry mass: {vessel.dry_mass} kg") + +# Flight telemetry +print(f"Altitude: {flight.mean_altitude:.2f} m") +print(f"Speed: {flight.speed:.2f} m/s") +print(f"Vertical speed: {flight.vertical_speed:.2f} m/s") + +# Orbital information +print(f"Apoapsis: {orbit.apoapsis_altitude:.2f} m") +print(f"Periapsis: {orbit.periapsis_altitude:.2f} m") +print(f"Inclination: {orbit.inclination:.2f} degrees") + +# Vessel control +control.throttle = 1.0 # Full throttle +control.activate_next_stage() # Stage separation +control.sas = True # Enable SAS +control.rcs = True # Enable RCS + +# Autopilot control +autopilot.engage() +autopilot.target_pitch_and_heading(45, 90) # 45 degrees pitch, 90 degrees heading +autopilot.wait() + +# Resource management +for resource in vessel.resources.all: + print(f"{resource.name}: {resource.amount:.2f}/{resource.max:.2f}") + +# Maneuver nodes +ut = space_center.ut + 3600 # 1 hour from now +node = control.add_node(ut, prograde=1000) # Add 1000 m/s prograde burn + +# Camera control +camera = space_center.camera +camera.mode = space_center.CameraMode.free +camera.pitch = 0 +camera.heading = 90 +camera.distance = 150 + +# Parts and staging +for stage in vessel.control.current_stage: + print(f"Stage {stage}") + +for part in vessel.parts.all: + if part.engine: + print(f"Engine: {part.title}, Thrust: {part.engine.thrust}") +``` + +### context_1_examples + +```python +""" +Simple orbital insertion script using kRPC +Launches a rocket and performs a basic gravity turn to orbit +""" +import krpc +import time +import math + +# Connect to kRPC +conn = krpc.connect(name='Launch Controller') +vessel = conn.space_center.active_vessel + +# Set up data streams for efficient monitoring +ut = conn.add_stream(getattr, conn.space_center, 'ut') +altitude = conn.add_stream(getattr, vessel.flight(), 'mean_altitude') +apoapsis = conn.add_stream(getattr, vessel.orbit, 'apoapsis_altitude') +stage_2_resources = vessel.resources_in_decouple_stage(stage=2, cumulative=False) +srb_fuel = conn.add_stream(stage_2_resources.amount, 'SolidFuel') + +# Launch parameters +target_altitude = 100000 # 100km orbit +turn_start_altitude = 250 +turn_end_altitude = 45000 +target_heading = 90 # East + +print('Launch!') +vessel.control.activate_next_stage() +vessel.auto_pilot.engage() +vessel.auto_pilot.target_pitch_and_heading(90, target_heading) + +# Main ascent loop +srbs_separated = False +turn_angle = 0 + +while apoapsis() < target_altitude: + # Gravity turn + if altitude() > turn_start_altitude and altitude() < turn_end_altitude: + frac = ((altitude() - turn_start_altitude) / + (turn_end_altitude - turn_start_altitude)) + new_turn_angle = frac * 90 + if abs(new_turn_angle - turn_angle) > 0.5: + turn_angle = new_turn_angle + vessel.auto_pilot.target_pitch_and_heading(90-turn_angle, target_heading) + + # Separate SRBs when empty + if not srbs_separated: + if srb_fuel() < 0.1: + vessel.control.activate_next_stage() + srbs_separated = True + print('SRBs separated') + + time.sleep(0.1) + +print('Apoapsis reached') +vessel.control.throttle = 0.0 + +# Wait until approaching apoapsis +print('Coasting to apoapsis') +while vessel.orbit.time_to_apoapsis > 75: + time.sleep(1) + +# Execute circularization burn +print('Circularization burn') +vessel.control.throttle = 1.0 +while vessel.orbit.periapsis_altitude < target_altitude * 0.9: + time.sleep(0.1) + +vessel.control.throttle = 0.0 +vessel.auto_pilot.disengage() +print('Launch complete!') +``` + +## context_2 + +### context_2_description +The kRPC.MechJeb service provides programmatic access to MechJeb 2 autopilots and systems. This extension allows external scripts to configure and control MechJeb's various autopilots including ascent guidance, landing autopilot, docking autopilot, and maneuver execution. It exposes MechJeb's sophisticated flight control algorithms through a simple API. + +### context_2_code_snippet + +```python +import krpc + +# Connect to kRPC with MechJeb extension +conn = krpc.connect(name='MechJeb Controller') +vessel = conn.space_center.active_vessel +mj = conn.mech_jeb + +# Check if MechJeb is available +print(f"MechJeb available: {mj.available}") + +# Ascent Autopilot +ascent = mj.ascent_autopilot +ascent.enabled = True +ascent.desired_orbit_altitude = 100000 # 100km +ascent.desired_inclination = 0 # Equatorial orbit +ascent.force_roll = True +ascent.vertical_roll = 0 +ascent.turn_roll = 0 + +# Ascent guidance settings +classic = ascent.ascent_path_classic +classic.turn_start_altitude = 500 +classic.turn_start_velocity = 100 +classic.turn_end_altitude = 60000 +classic.turn_end_angle = 0 +classic.turn_shape_percentage = 40 + +# Landing Autopilot +landing = mj.landing_autopilot +landing.enabled = True +landing.touchdown_speed = 0.5 # m/s +landing.deploy_parachutes = True +landing.deploy_landing_gear = True + +# Set landing target +target = conn.space_center.target_body.surface_position( + latitude=-0.0972, longitude=-74.5577 # KSC coordinates +) +landing.land_at_position_target(target) + +# Docking Autopilot +docking = mj.docking_autopilot +docking.enabled = True +docking.speed_limit = 1.0 # m/s approach speed + +# Maneuver Planner +maneuver_planner = mj.maneuver_planner +# Plan Hohmann transfer +hohmann = maneuver_planner.operation_hohmann +hohmann.make_nodes(target_body=conn.space_center.bodies['Mun']) + +# Node Executor +node_executor = mj.node_executor +node_executor.enabled = True +node_executor.tolerance = 0.1 # m/s delta-v tolerance + +# Smart A.S.S. (Attitude Control) +smart_ass = mj.smart_ass +smart_ass.autopilot_mode = mj.SmartASSAutopilotMode.prograde +smart_ass.update() + +# Thrust Controller +thrust = mj.thrust_controller +thrust.twr_controller = True +thrust.target_twr = 1.5 # Target thrust-to-weight ratio + +# Staging Controller +staging = mj.staging_controller +staging.enabled = True +staging.auto_stage_pre_delay = 0.5 +staging.auto_stage_post_delay = 1.0 + +# Warp Controller +warp = mj.warp_controller +warp.warp_to_next_sol() # Warp to next sphere of influence +``` + +### context_2_examples + +```python +""" +Automated mission to Mun using kRPC.MechJeb +Performs launch, transfer, landing, and return +""" +import krpc +import time + +def wait_for_autopilot(autopilot, timeout=300): + """Wait for autopilot to complete with timeout""" + start_time = time.time() + while autopilot.enabled and (time.time() - start_time) < timeout: + time.sleep(1) + return not autopilot.enabled + +# Connect to game +conn = krpc.connect(name='Mun Mission Controller') +vessel = conn.space_center.active_vessel +sc = conn.space_center +mj = conn.mech_jeb + +print("=== MUN MISSION CONTROLLER ===") +print(f"Controlling vessel: {vessel.name}") + +# === LAUNCH PHASE === +print("\n1. LAUNCH TO PARKING ORBIT") +ascent = mj.ascent_autopilot +ascent.desired_orbit_altitude = 100000 +ascent.desired_inclination = 0 +ascent.ascent_path_index = mj.AscentPathType.classic + +# Configure classic ascent path +classic = ascent.ascent_path_classic +classic.turn_start_altitude = 250 +classic.turn_start_velocity = 100 +classic.turn_end_altitude = 45000 +classic.turn_shape_percentage = 40 + +# Enable staging and launch +staging = mj.staging_controller +staging.enabled = True +ascent.enabled = True + +print("Launching...") +wait_for_autopilot(ascent, timeout=600) +print("Parking orbit achieved") + +# === TRANSFER PHASE === +print("\n2. TRANSFER TO MUN") +maneuver = mj.maneuver_planner + +# Plan Hohmann transfer to Mun +hohmann = maneuver.operation_hohmann +mun = sc.bodies['Mun'] +hohmann.make_nodes(mun) + +# Execute the maneuver +node_exec = mj.node_executor +node_exec.tolerance = 1.0 +node_exec.enabled = True + +print("Executing transfer burn...") +wait_for_autopilot(node_exec, timeout=300) +print("Transfer burn complete") + +# Warp to Mun SOI +warp = mj.warp_controller +print("Warping to Mun sphere of influence...") +warp.warp_to_soi_change() + +# === MUN ORBIT INSERTION === +print("\n3. MUN ORBIT INSERTION") +# Plan circularization at Mun periapsis +circularize = maneuver.operation_circularize +circularize.make_nodes() + +node_exec.enabled = True +print("Executing orbit insertion...") +wait_for_autopilot(node_exec, timeout=300) +print("Mun orbit achieved") + +# === LANDING PHASE === +print("\n4. LANDING ON MUN") +landing = mj.landing_autopilot +landing.enabled = True +landing.touchdown_speed = 2.0 +landing.deploy_landing_gear = True + +# Choose landing site (East Crater) +landing.land_somewhere = True +print("Beginning descent...") +wait_for_autopilot(landing, timeout=600) +print("Landed on Mun!") + +# === SAMPLE COLLECTION SIMULATION === +print("\n5. SURFACE OPERATIONS") +print("Collecting samples... (simulated)") +time.sleep(10) + +# === RETURN PHASE === +print("\n6. RETURN TO KERBIN") +# Launch from Mun surface +ascent.desired_orbit_altitude = 15000 # Low Mun orbit +ascent.enabled = True +wait_for_autopilot(ascent, timeout=300) +print("Launched from Mun surface") + +# Plan return to Kerbin +kerbin = sc.bodies['Kerbin'] +hohmann.make_nodes(kerbin) +node_exec.enabled = True +wait_for_autopilot(node_exec, timeout=300) +print("Return trajectory set") + +# Warp to Kerbin SOI +warp.warp_to_soi_change() + +# === ATMOSPHERIC ENTRY === +print("\n7. ATMOSPHERIC ENTRY") +# Configure for atmospheric entry +smart_ass = mj.smart_ass +smart_ass.autopilot_mode = mj.SmartASSAutopilotMode.retrograde +smart_ass.update() + +# Deploy parachutes when safe +print("Deploying parachutes...") +vessel.control.activate_next_stage() + +print("\n=== MISSION COMPLETE ===") +print("Welcome back to Kerbin!") +``` + +```python +""" +Rendezvous and docking script using kRPC.MechJeb +Automatically rendezvous with and dock to a target vessel +""" +import krpc +import time + +conn = krpc.connect(name='Docking Controller') +vessel = conn.space_center.active_vessel +sc = conn.space_center +mj = conn.mech_jeb + +# Verify we have a target +if not sc.target_vessel: + print("ERROR: No target vessel selected!") + exit(1) + +target = sc.target_vessel +print(f"Docking {vessel.name} with {target.name}") + +# === PHASE 1: RENDEZVOUS === +print("\n1. PLANNING RENDEZVOUS") +maneuver = mj.maneuver_planner + +# Plan Hohmann transfer to target +rendezvous = maneuver.operation_hohmann_transfer +rendezvous.make_nodes() + +# Execute approach burn +node_exec = mj.node_executor +node_exec.tolerance = 0.5 +node_exec.enabled = True + +print("Executing approach burn...") +while node_exec.enabled: + time.sleep(1) + +# === PHASE 2: CLOSE APPROACH === +print("\n2. FINE APPROACH") +# Get within 100m using Smart A.S.S. +smart_ass = mj.smart_ass +smart_ass.autopilot_mode = mj.SmartASSAutopilotMode.target +smart_ass.update() + +# Thrust towards target until close +thrust = mj.thrust_controller +vessel.control.rcs = True + +while vessel.orbital_reference_frame.position(target).magnitude > 100: + distance = vessel.orbital_reference_frame.position(target).magnitude + + if distance > 1000: + vessel.control.throttle = 0.1 + elif distance > 100: + vessel.control.throttle = 0.05 + else: + vessel.control.throttle = 0.0 + + time.sleep(0.5) + +vessel.control.throttle = 0.0 +print("Close approach achieved") + +# === PHASE 3: DOCKING === +print("\n3. AUTOMATED DOCKING") +docking = mj.docking_autopilot +docking.speed_limit = 0.2 # Very slow approach +docking.roll_reference = mj.DockingAutopilotRollReference.off +docking.enabled = True + +print("Docking in progress...") +while docking.enabled: + status = docking.status + print(f"Docking status: {status}") + time.sleep(2) + +if vessel.control.rcs: + vessel.control.rcs = False + +print("\n=== DOCKING COMPLETE ===") +print(f"{vessel.name} successfully docked with {target.name}") +``` + +## context_3 + +### context_3_description +Advanced kRPC utilities provide helper functions and classes for common spaceflight operations. These utilities handle coordinate transformations, orbital mechanics calculations, vessel state monitoring, and automated mission sequencing. They serve as building blocks for complex automated missions and can be combined with both basic kRPC and MechJeb functionality. + +### context_3_code_snippet + +```python +import krpc +import time +import math +from collections import namedtuple + +class VesselMonitor: + """Monitor vessel telemetry with data streams for efficiency""" + + def __init__(self, connection, vessel): + self.conn = connection + self.vessel = vessel + self._setup_streams() + + def _setup_streams(self): + """Set up data streams for efficient monitoring""" + self.ut = self.conn.add_stream(getattr, self.conn.space_center, 'ut') + self.altitude = self.conn.add_stream(getattr, self.vessel.flight(), 'mean_altitude') + self.speed = self.conn.add_stream(getattr, self.vessel.flight(), 'speed') + self.vertical_speed = self.conn.add_stream(getattr, self.vessel.flight(), 'vertical_speed') + self.apoapsis = self.conn.add_stream(getattr, self.vessel.orbit, 'apoapsis_altitude') + self.periapsis = self.conn.add_stream(getattr, self.vessel.orbit, 'periapsis_altitude') + self.inclination = self.conn.add_stream(getattr, self.vessel.orbit, 'inclination') + + def get_telemetry(self): + """Get current telemetry snapshot""" + Telemetry = namedtuple('Telemetry', [ + 'time', 'altitude', 'speed', 'vertical_speed', + 'apoapsis', 'periapsis', 'inclination' + ]) + return Telemetry( + self.ut(), self.altitude(), self.speed(), self.vertical_speed(), + self.apoapsis(), self.periapsis(), math.degrees(self.inclination()) + ) + +class OrbitalMechanics: + """Utility functions for orbital mechanics calculations""" + + @staticmethod + def hohmann_delta_v(r1, r2, mu): + """Calculate delta-v required for Hohmann transfer""" + v1 = math.sqrt(mu / r1) # Circular velocity at r1 + v2 = math.sqrt(mu / r2) # Circular velocity at r2 + + # Transfer ellipse parameters + a_transfer = (r1 + r2) / 2 + v_transfer_1 = math.sqrt(mu * (2/r1 - 1/a_transfer)) + v_transfer_2 = math.sqrt(mu * (2/r2 - 1/a_transfer)) + + dv1 = abs(v_transfer_1 - v1) # Departure burn + dv2 = abs(v2 - v_transfer_2) # Arrival burn + + return dv1, dv2, dv1 + dv2 + + @staticmethod + def time_to_phase_angle(current_angle, target_angle, angular_velocity): + """Calculate time until target phase angle is reached""" + angle_diff = (target_angle - current_angle) % 360 + if angle_diff > 180: + angle_diff -= 360 + return abs(angle_diff / math.degrees(angular_velocity)) + +class MissionController: + """High-level mission sequencing and control""" + + def __init__(self, connection): + self.conn = connection + self.vessel = connection.space_center.active_vessel + self.monitor = VesselMonitor(connection, self.vessel) + + # Try to initialize MechJeb if available + try: + self.mj = connection.mech_jeb + self.has_mechjeb = True + print("MechJeb integration enabled") + except: + self.has_mechjeb = False + print("Operating without MechJeb") + + def launch_to_orbit(self, target_altitude=100000, target_inclination=0): + """Launch vessel to specified orbit""" + if self.has_mechjeb: + return self._launch_with_mechjeb(target_altitude, target_inclination) + else: + return self._launch_manual(target_altitude, target_inclination) + + def _launch_with_mechjeb(self, altitude, inclination): + """Launch using MechJeb autopilot""" + ascent = self.mj.ascent_autopilot + ascent.desired_orbit_altitude = altitude + ascent.desired_inclination = inclination + ascent.enabled = True + + # Enable staging + self.mj.staging_controller.enabled = True + + # Wait for completion + while ascent.enabled: + telem = self.monitor.get_telemetry() + print(f"Alt: {telem.altitude:.0f}m, Speed: {telem.speed:.0f}m/s, " + f"Ap: {telem.apoapsis:.0f}m") + time.sleep(5) + + return True + + def _launch_manual(self, altitude, inclination): + """Manual launch implementation""" + vessel = self.vessel + + # Launch + vessel.control.activate_next_stage() + vessel.auto_pilot.engage() + vessel.auto_pilot.target_pitch_and_heading(90, 90) + + # Simple gravity turn + turn_start = 250 + turn_end = 45000 + + while self.monitor.apoapsis() < altitude: + alt = self.monitor.altitude() + + # Gravity turn logic + if turn_start < alt < turn_end: + progress = (alt - turn_start) / (turn_end - turn_start) + pitch = 90 - (progress * 90) + vessel.auto_pilot.target_pitch_and_heading(pitch, 90) + + time.sleep(0.5) + + vessel.control.throttle = 0.0 + + # Coast to apoapsis and circularize + while vessel.orbit.time_to_apoapsis > 60: + time.sleep(1) + + vessel.control.throttle = 1.0 + while self.monitor.periapsis() < altitude * 0.9: + time.sleep(0.1) + + vessel.control.throttle = 0.0 + vessel.auto_pilot.disengage() + + return True + + def transfer_to_body(self, target_body_name): + """Execute interplanetary transfer""" + target_body = self.conn.space_center.bodies[target_body_name] + + if self.has_mechjeb: + # Use MechJeb maneuver planner + planner = self.mj.maneuver_planner + hohmann = planner.operation_hohmann + hohmann.make_nodes(target_body) + + # Execute with node executor + executor = self.mj.node_executor + executor.tolerance = 1.0 + executor.enabled = True + + while executor.enabled: + time.sleep(1) + + print(f"Transfer to {target_body_name} complete") + else: + print("Manual transfer planning not implemented") + return False + + return True + + def autonomous_docking(self, target_vessel): + """Perform autonomous docking with target vessel""" + if not self.has_mechjeb: + print("Autonomous docking requires MechJeb") + return False + + # Set target + self.conn.space_center.target_vessel = target_vessel + + # Use MechJeb docking autopilot + docking = self.mj.docking_autopilot + docking.speed_limit = 0.5 + docking.enabled = True + + print(f"Docking with {target_vessel.name}...") + + while docking.enabled: + time.sleep(2) + print(f"Docking status: {docking.status}") + + print("Docking complete!") + return True +``` + +### context_3_examples + +```python +""" +Complete automated mission example using the mission controller +Demonstrates multi-phase mission with error handling and telemetry +""" +import krpc +import time +from mission_controller import MissionController, OrbitalMechanics + +def main(): + # Connect to KSP + print("Connecting to Kerbal Space Program...") + conn = krpc.connect(name='Automated Mission Controller') + + # Initialize mission controller + mission = MissionController(conn) + print(f"Mission controller initialized for {mission.vessel.name}") + + try: + # Phase 1: Launch to Low Kerbin Orbit + print("\n=== PHASE 1: LAUNCH TO ORBIT ===") + success = mission.launch_to_orbit( + target_altitude=100000, + target_inclination=0 + ) + + if not success: + print("Launch failed!") + return + + print("Successfully reached orbit") + telem = mission.monitor.get_telemetry() + print(f"Final orbit: {telem.apoapsis:.0f} x {telem.periapsis:.0f} km") + + # Phase 2: Wait for optimal transfer window (simplified) + print("\n=== PHASE 2: TRANSFER WINDOW ===") + print("Calculating optimal transfer window to Mun...") + + # In a real mission, this would calculate proper phase angles + time.sleep(5) # Simulated calculation time + + # Phase 3: Execute transfer + print("\n=== PHASE 3: INTERPLANETARY TRANSFER ===") + success = mission.transfer_to_body('Mun') + + if not success: + print("Transfer planning failed!") + return + + # Phase 4: Monitor transfer progress + print("\n=== PHASE 4: CRUISE PHASE ===") + print("Transfer burn complete. Monitoring trajectory...") + + # Wait until we're in Mun's SOI + mun = conn.space_center.bodies['Mun'] + while mission.vessel.orbit.body.name != 'Mun': + time.sleep(10) + distance = mission.vessel.orbit.body.position(mun, + mission.vessel.orbit.body.reference_frame).magnitude + print(f"Distance to Mun: {distance/1000:.0f} km") + + print("Entered Mun sphere of influence!") + + # Phase 5: Orbit insertion + print("\n=== PHASE 5: ORBIT INSERTION ===") + if mission.has_mechjeb: + # Use MechJeb for circularization + planner = mission.mj.maneuver_planner + circularize = planner.operation_circularize + circularize.make_nodes() + + executor = mission.mj.node_executor + executor.enabled = True + + while executor.enabled: + time.sleep(1) + + print("Mun orbit achieved!") + + # Phase 6: Landing (if equipped) + print("\n=== PHASE 6: SURFACE OPERATIONS ===") + if mission.has_mechjeb and has_landing_capability(mission.vessel): + landing = mission.mj.landing_autopilot + landing.enabled = True + landing.touchdown_speed = 2.0 + landing.land_somewhere = True + + print("Beginning automated landing...") + while landing.enabled: + altitude = mission.monitor.altitude() + print(f"Descent altitude: {altitude:.0f} m") + time.sleep(5) + + print("Landed successfully!") + + # Simulate surface operations + print("Conducting surface experiments...") + time.sleep(30) + + print("\n=== MISSION COMPLETE ===") + print("All objectives achieved successfully!") + + except Exception as e: + print(f"Mission error: {e}") + # Emergency procedures + mission.vessel.control.throttle = 0.0 + if mission.vessel.auto_pilot.enabled: + mission.vessel.auto_pilot.disengage() + +def has_landing_capability(vessel): + """Check if vessel has landing gear or parachutes""" + for part in vessel.parts.all: + if part.parachute or part.landing_gear: + return True + return False + +if __name__ == "__main__": + main() +``` \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index 7a1f581..286b5b5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -642,14 +642,14 @@ cron = ["capturer (>=2.4)"] [[package]] name = "crewai" -version = "0.165.1" +version = "0.186.1" description = "Cutting-edge framework for orchestrating role-playing, autonomous AI agents. By fostering collaborative intelligence, CrewAI empowers agents to work together seamlessly, tackling complex tasks." optional = false python-versions = "<3.14,>=3.10" groups = ["main"] files = [ - {file = "crewai-0.165.1-py3-none-any.whl", hash = "sha256:9bdc8e26dfddd54a2a7046cc8625ea37a4cbd9588fa4d372317325421523ec25"}, - {file = "crewai-0.165.1.tar.gz", hash = "sha256:8f0c1e13fad39092ed7e2116722ec01361cb68a0ed5a05158374d1262cc49b8f"}, + {file = "crewai-0.186.1-py3-none-any.whl", hash = "sha256:92acde629f079d2c701ff8f5d648a270e64274d80c7f3cf0131c420a890d84d1"}, + {file = "crewai-0.186.1.tar.gz", hash = "sha256:3fd12954082c301434a7d8a2b20ddaf610eb6da1bba3a76aa38402e5c6462fbf"}, ] [package.dependencies] @@ -663,7 +663,7 @@ json5 = ">=0.10.0" jsonref = ">=1.1.0" litellm = "1.74.9" onnxruntime = "1.22.0" -openai = "<1.100.0" +openai = ">=1.13.3" openpyxl = ">=3.1.5" opentelemetry-api = ">=1.30.0" opentelemetry-exporter-otlp-proto-http = ">=1.30.0" @@ -688,7 +688,8 @@ mem0 = ["mem0ai (>=0.1.94)"] openpyxl = ["openpyxl (>=3.1.5)"] pandas = ["pandas (>=2.2.3)"] pdfplumber = ["pdfplumber (>=0.11.4)"] -tools = ["crewai-tools (>=0.62.1,<0.63.0)"] +qdrant = ["qdrant-client[fastembed] (>=1.14.3)"] +tools = ["crewai-tools (>=0.71.0,<0.72.0)"] [[package]] name = "cryptography" @@ -1065,6 +1066,75 @@ protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4 [package.extras] grpc = ["grpcio (>=1.44.0,<2.0.0)"] +[[package]] +name = "greenlet" +version = "3.2.4" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\"" +files = [ + {file = "greenlet-3.2.4-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:8c68325b0d0acf8d91dde4e6f930967dd52a5302cd4062932a6b2e7c2969f47c"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:94385f101946790ae13da500603491f04a76b6e4c059dab271b3ce2e283b2590"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f10fd42b5ee276335863712fa3da6608e93f70629c631bf77145021600abc23c"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c8c9e331e58180d0d83c5b7999255721b725913ff6bc6cf39fa2a45841a4fd4b"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58b97143c9cc7b86fc458f215bd0932f1757ce649e05b640fea2e79b54cedb31"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c2ca18a03a8cfb5b25bc1cbe20f3d9a4c80d8c3b13ba3df49ac3961af0b1018d"}, + {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fe0a28a7b952a21e2c062cd5756d34354117796c6d9215a87f55e38d15402c5"}, + {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8854167e06950ca75b898b104b63cc646573aa5fef1353d4508ecdd1ee76254f"}, + {file = "greenlet-3.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:73f49b5368b5359d04e18d15828eecc1806033db5233397748f4ca813ff1056c"}, + {file = "greenlet-3.2.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94abf90142c2a18151632371140b3dba4dee031633fe614cb592dbb6c9e17bc3"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:4d1378601b85e2e5171b99be8d2dc85f594c79967599328f95c1dc1a40f1c633"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0db5594dce18db94f7d1650d7489909b57afde4c580806b8d9203b6e79cdc079"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8"}, + {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52"}, + {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:55e9c5affaa6775e2c6b67659f3a71684de4c549b3dd9afca3bc773533d284fa"}, + {file = "greenlet-3.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:9c40adce87eaa9ddb593ccb0fa6a07caf34015a29bf8d344811665b573138db9"}, + {file = "greenlet-3.2.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f28588772bb5fb869a8eb331374ec06f24a83a9c25bfa1f38b6993afe9c1e968"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5c9320971821a7cb77cfab8d956fa8e39cd07ca44b6070db358ceb7f8797c8c9"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c60a6d84229b271d44b70fb6e5fa23781abb5d742af7b808ae3f6efd7c9c60f6"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0"}, + {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0"}, + {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f"}, + {file = "greenlet-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02"}, + {file = "greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671"}, + {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b"}, + {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae"}, + {file = "greenlet-3.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b"}, + {file = "greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337"}, + {file = "greenlet-3.2.4-cp314-cp314-win_amd64.whl", hash = "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01"}, + {file = "greenlet-3.2.4-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:b6a7c19cf0d2742d0809a4c05975db036fdff50cd294a93632d6a310bf9ac02c"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:27890167f55d2387576d1f41d9487ef171849ea0359ce1510ca6e06c8bece11d"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:18d9260df2b5fbf41ae5139e1be4e796d99655f023a636cd0e11e6406cca7d58"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:671df96c1f23c4a0d4077a325483c1503c96a1b7d9db26592ae770daa41233d4"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:16458c245a38991aa19676900d48bd1a6f2ce3e16595051a4db9d012154e8433"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9913f1a30e4526f432991f89ae263459b1c64d1608c0d22a5c79c287b3c70df"}, + {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b90654e092f928f110e0007f572007c9727b5265f7632c2fa7415b4689351594"}, + {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:81701fd84f26330f0d5f4944d4e92e61afe6319dcd9775e39396e39d7c3e5f98"}, + {file = "greenlet-3.2.4-cp39-cp39-win32.whl", hash = "sha256:65458b409c1ed459ea899e939f0e1cdb14f58dbc803f2f93c5eab5694d32671b"}, + {file = "greenlet-3.2.4-cp39-cp39-win_amd64.whl", hash = "sha256:d2e685ade4dafd447ede19c31277a224a239a0a1a4eca4e6390efedf20260cfb"}, + {file = "greenlet-3.2.4.tar.gz", hash = "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d"}, +] + +[package.extras] +docs = ["Sphinx", "furo"] +test = ["objgraph", "psutil", "setuptools"] + [[package]] name = "grpcio" version = "1.74.0" @@ -1629,6 +1699,21 @@ files = [ [package.extras] dev = ["build (==1.2.2.post1)", "coverage (==7.5.4) ; python_version < \"3.9\"", "coverage (==7.8.0) ; python_version >= \"3.9\"", "mypy (==1.14.1) ; python_version < \"3.9\"", "mypy (==1.15.0) ; python_version >= \"3.9\"", "pip (==25.0.1)", "pylint (==3.2.7) ; python_version < \"3.9\"", "pylint (==3.3.6) ; python_version >= \"3.9\"", "ruff (==0.11.2)", "twine (==6.1.0)", "uv (==0.6.11)"] +[[package]] +name = "jsonpatch" +version = "1.33" +description = "Apply JSON-Patches (RFC 6902)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +groups = ["main"] +files = [ + {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, + {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, +] + +[package.dependencies] +jsonpointer = ">=1.9" + [[package]] name = "jsonpickle" version = "4.1.1" @@ -1648,6 +1733,18 @@ docs = ["furo", "rst.linker (>=1.9)", "sphinx (>=3.5)"] packaging = ["build", "setuptools (>=61.2)", "setuptools_scm[toml] (>=6.0)", "twine"] testing = ["PyYAML", "atheris (>=2.3.0,<2.4.0) ; python_version < \"3.12\"", "bson", "ecdsa", "feedparser", "gmpy2", "numpy", "pandas", "pymongo", "pytest (>=6.0,!=8.1.*)", "pytest-benchmark", "pytest-benchmark[histogram]", "pytest-checkdocs (>=1.2.3)", "pytest-enabler (>=1.0.1)", "pytest-ruff (>=0.2.1)", "scikit-learn", "scipy (>=1.9.3) ; python_version > \"3.10\"", "scipy ; python_version <= \"3.10\"", "simplejson", "sqlalchemy", "ujson"] +[[package]] +name = "jsonpointer" +version = "3.0.0" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, +] + [[package]] name = "jsonref" version = "1.1.0" @@ -1739,6 +1836,127 @@ websocket-client = ">=0.32.0,<0.40.0 || >0.40.0,<0.41.dev0 || >=0.43.dev0" [package.extras] adal = ["adal (>=1.0.2)"] +[[package]] +name = "langchain" +version = "0.3.27" +description = "Building applications with LLMs through composability" +optional = false +python-versions = "<4.0,>=3.9" +groups = ["main"] +files = [ + {file = "langchain-0.3.27-py3-none-any.whl", hash = "sha256:7b20c4f338826acb148d885b20a73a16e410ede9ee4f19bb02011852d5f98798"}, + {file = "langchain-0.3.27.tar.gz", hash = "sha256:aa6f1e6274ff055d0fd36254176770f356ed0a8994297d1df47df341953cec62"}, +] + +[package.dependencies] +langchain-core = ">=0.3.72,<1.0.0" +langchain-text-splitters = ">=0.3.9,<1.0.0" +langsmith = ">=0.1.17" +pydantic = ">=2.7.4,<3.0.0" +PyYAML = ">=5.3" +requests = ">=2,<3" +SQLAlchemy = ">=1.4,<3" + +[package.extras] +anthropic = ["langchain-anthropic"] +aws = ["langchain-aws"] +azure-ai = ["langchain-azure-ai"] +cohere = ["langchain-cohere"] +community = ["langchain-community"] +deepseek = ["langchain-deepseek"] +fireworks = ["langchain-fireworks"] +google-genai = ["langchain-google-genai"] +google-vertexai = ["langchain-google-vertexai"] +groq = ["langchain-groq"] +huggingface = ["langchain-huggingface"] +mistralai = ["langchain-mistralai"] +ollama = ["langchain-ollama"] +openai = ["langchain-openai"] +perplexity = ["langchain-perplexity"] +together = ["langchain-together"] +xai = ["langchain-xai"] + +[[package]] +name = "langchain-core" +version = "0.3.76" +description = "Building applications with LLMs through composability" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "langchain_core-0.3.76-py3-none-any.whl", hash = "sha256:46e0eb48c7ac532432d51f8ca1ece1804c82afe9ae3dcf027b867edadf82b3ec"}, + {file = "langchain_core-0.3.76.tar.gz", hash = "sha256:71136a122dd1abae2c289c5809d035cf12b5f2bb682d8a4c1078cd94feae7419"}, +] + +[package.dependencies] +jsonpatch = ">=1.33,<2.0" +langsmith = ">=0.3.45" +packaging = ">=23.2" +pydantic = ">=2.7.4" +PyYAML = ">=5.3" +tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10.0.0" +typing-extensions = ">=4.7" + +[[package]] +name = "langchain-openai" +version = "0.3.33" +description = "An integration package connecting OpenAI and LangChain" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "langchain_openai-0.3.33-py3-none-any.whl", hash = "sha256:2d52aab6d2af61da9bb9470616ce782128f4be59df965caee3dece30ae6b2bc4"}, + {file = "langchain_openai-0.3.33.tar.gz", hash = "sha256:2dec058332ea9e8977cd91df6515b95952e187ac7484f349c3fe91d936a92375"}, +] + +[package.dependencies] +langchain-core = ">=0.3.76,<1.0.0" +openai = ">=1.104.2,<2.0.0" +tiktoken = ">=0.7,<1" + +[[package]] +name = "langchain-text-splitters" +version = "0.3.11" +description = "LangChain text splitting utilities" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "langchain_text_splitters-0.3.11-py3-none-any.whl", hash = "sha256:cf079131166a487f1372c8ab5d0bfaa6c0a4291733d9c43a34a16ac9bcd6a393"}, + {file = "langchain_text_splitters-0.3.11.tar.gz", hash = "sha256:7a50a04ada9a133bbabb80731df7f6ddac51bc9f1b9cab7fa09304d71d38a6cc"}, +] + +[package.dependencies] +langchain-core = ">=0.3.75,<2.0.0" + +[[package]] +name = "langsmith" +version = "0.4.29" +description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "langsmith-0.4.29-py3-none-any.whl", hash = "sha256:20f39c96057d47a83b6df2b18a5137e2389b5b41f34fe0a64a8d6812de3c0ccf"}, + {file = "langsmith-0.4.29.tar.gz", hash = "sha256:7014606b6710cc1b14333c75cdb981d5bea3ed488626a026bad51d2a61e354c4"}, +] + +[package.dependencies] +httpx = ">=0.23.0,<1" +orjson = {version = ">=3.9.14", markers = "platform_python_implementation != \"PyPy\""} +packaging = ">=23.2" +pydantic = ">=1,<3" +requests = ">=2.0.0" +requests-toolbelt = ">=1.0.0" +zstandard = ">=0.23.0" + +[package.extras] +langsmith-pyo3 = ["langsmith-pyo3 (>=0.1.0rc2)"] +openai-agents = ["openai-agents (>=0.0.3)"] +otel = ["opentelemetry-api (>=1.30.0)", "opentelemetry-exporter-otlp-proto-http (>=1.30.0)", "opentelemetry-sdk (>=1.30.0)"] +pytest = ["pytest (>=7.0.0)", "rich (>=13.9.4)", "vcrpy (>=7.0.0)"] +vcr = ["vcrpy (>=7.0.0)"] + [[package]] name = "litellm" version = "1.74.9" @@ -2330,14 +2548,14 @@ sympy = "*" [[package]] name = "openai" -version = "1.99.0" +version = "1.108.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "openai-1.99.0-py3-none-any.whl", hash = "sha256:9d762c299eba9b0b3a55c3905e8457520e73a7601a258b763aa046475fac2b98"}, - {file = "openai-1.99.0.tar.gz", hash = "sha256:7b985693da4dc9783394b785212bb67a65352cb6b867b1756b0e5e8321b4aba9"}, + {file = "openai-1.108.0-py3-none-any.whl", hash = "sha256:31f2e58230e2703f13ddbb50c285f39dacf7fca64ab19882fd8a7a0b2bccd781"}, + {file = "openai-1.108.0.tar.gz", hash = "sha256:e859c64e4202d7f5956f19280eee92bb281f211c41cdd5be9e63bf51a024ff72"}, ] [package.dependencies] @@ -3804,6 +4022,21 @@ requests = ">=2.0.0" [package.extras] rsa = ["oauthlib[signedtoken] (>=3.0.0)"] +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main"] +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + [[package]] name = "rich" version = "14.1.0" @@ -4039,6 +4272,102 @@ files = [ {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] +[[package]] +name = "sqlalchemy" +version = "2.0.43" +description = "Database Abstraction Library" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "SQLAlchemy-2.0.43-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:21ba7a08a4253c5825d1db389d4299f64a100ef9800e4624c8bf70d8f136e6ed"}, + {file = "SQLAlchemy-2.0.43-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11b9503fa6f8721bef9b8567730f664c5a5153d25e247aadc69247c4bc605227"}, + {file = "SQLAlchemy-2.0.43-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07097c0a1886c150ef2adba2ff7437e84d40c0f7dcb44a2c2b9c905ccfc6361c"}, + {file = "SQLAlchemy-2.0.43-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:cdeff998cb294896a34e5b2f00e383e7c5c4ef3b4bfa375d9104723f15186443"}, + {file = "SQLAlchemy-2.0.43-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:bcf0724a62a5670e5718957e05c56ec2d6850267ea859f8ad2481838f889b42c"}, + {file = "SQLAlchemy-2.0.43-cp37-cp37m-win32.whl", hash = "sha256:c697575d0e2b0a5f0433f679bda22f63873821d991e95a90e9e52aae517b2e32"}, + {file = "SQLAlchemy-2.0.43-cp37-cp37m-win_amd64.whl", hash = "sha256:d34c0f6dbefd2e816e8f341d0df7d4763d382e3f452423e752ffd1e213da2512"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:70322986c0c699dca241418fcf18e637a4369e0ec50540a2b907b184c8bca069"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:87accdbba88f33efa7b592dc2e8b2a9c2cdbca73db2f9d5c510790428c09c154"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c00e7845d2f692ebfc7d5e4ec1a3fd87698e4337d09e58d6749a16aedfdf8612"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:022e436a1cb39b13756cf93b48ecce7aa95382b9cfacceb80a7d263129dfd019"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c5e73ba0d76eefc82ec0219d2301cb33bfe5205ed7a2602523111e2e56ccbd20"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9c2e02f06c68092b875d5cbe4824238ab93a7fa35d9c38052c033f7ca45daa18"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-win32.whl", hash = "sha256:e7a903b5b45b0d9fa03ac6a331e1c1d6b7e0ab41c63b6217b3d10357b83c8b00"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-win_amd64.whl", hash = "sha256:4bf0edb24c128b7be0c61cd17eef432e4bef507013292415f3fb7023f02b7d4b"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:52d9b73b8fb3e9da34c2b31e6d99d60f5f99fd8c1225c9dad24aeb74a91e1d29"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f42f23e152e4545157fa367b2435a1ace7571cab016ca26038867eb7df2c3631"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fb1a8c5438e0c5ea51afe9c6564f951525795cf432bed0c028c1cb081276685"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db691fa174e8f7036afefe3061bc40ac2b770718be2862bfb03aabae09051aca"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe2b3b4927d0bc03d02ad883f402d5de201dbc8894ac87d2e981e7d87430e60d"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4d3d9b904ad4a6b175a2de0738248822f5ac410f52c2fd389ada0b5262d6a1e3"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-win32.whl", hash = "sha256:5cda6b51faff2639296e276591808c1726c4a77929cfaa0f514f30a5f6156921"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-win_amd64.whl", hash = "sha256:c5d1730b25d9a07727d20ad74bc1039bbbb0a6ca24e6769861c1aa5bf2c4c4a8"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:20d81fc2736509d7a2bd33292e489b056cbae543661bb7de7ce9f1c0cd6e7f24"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b9fc27650ff5a2c9d490c13c14906b918b0de1f8fcbb4c992712d8caf40e83"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6772e3ca8a43a65a37c88e2f3e2adfd511b0b1da37ef11ed78dea16aeae85bd9"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a113da919c25f7f641ffbd07fbc9077abd4b3b75097c888ab818f962707eb48"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4286a1139f14b7d70141c67a8ae1582fc2b69105f1b09d9573494eb4bb4b2687"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:529064085be2f4d8a6e5fab12d36ad44f1909a18848fcfbdb59cc6d4bbe48efe"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-win32.whl", hash = "sha256:b535d35dea8bbb8195e7e2b40059e2253acb2b7579b73c1b432a35363694641d"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-win_amd64.whl", hash = "sha256:1c6d85327ca688dbae7e2b06d7d84cfe4f3fffa5b5f9e21bb6ce9d0e1a0e0e0a"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e7c08f57f75a2bb62d7ee80a89686a5e5669f199235c6d1dac75cd59374091c3"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:14111d22c29efad445cd5021a70a8b42f7d9152d8ba7f73304c4d82460946aaa"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21b27b56eb2f82653168cefe6cb8e970cdaf4f3a6cb2c5e3c3c1cf3158968ff9"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c5a9da957c56e43d72126a3f5845603da00e0293720b03bde0aacffcf2dc04f"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d79f9fdc9584ec83d1b3c75e9f4595c49017f5594fee1a2217117647225d738"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9df7126fd9db49e3a5a3999442cc67e9ee8971f3cb9644250107d7296cb2a164"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-win32.whl", hash = "sha256:7f1ac7828857fcedb0361b48b9ac4821469f7694089d15550bbcf9ab22564a1d"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-win_amd64.whl", hash = "sha256:971ba928fcde01869361f504fcff3b7143b47d30de188b11c6357c0505824197"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4e6aeb2e0932f32950cf56a8b4813cb15ff792fc0c9b3752eaf067cfe298496a"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:61f964a05356f4bca4112e6334ed7c208174511bd56e6b8fc86dad4d024d4185"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46293c39252f93ea0910aababa8752ad628bcce3a10d3f260648dd472256983f"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:136063a68644eca9339d02e6693932116f6a8591ac013b0014479a1de664e40a"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6e2bf13d9256398d037fef09fd8bf9b0bf77876e22647d10761d35593b9ac547"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:44337823462291f17f994d64282a71c51d738fc9ef561bf265f1d0fd9116a782"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-win32.whl", hash = "sha256:13194276e69bb2af56198fef7909d48fd34820de01d9c92711a5fa45497cc7ed"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-win_amd64.whl", hash = "sha256:334f41fa28de9f9be4b78445e68530da3c5fa054c907176460c81494f4ae1f5e"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ceb5c832cc30663aeaf5e39657712f4c4241ad1f638d487ef7216258f6d41fe7"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11f43c39b4b2ec755573952bbcc58d976779d482f6f832d7f33a8d869ae891bf"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:413391b2239db55be14fa4223034d7e13325a1812c8396ecd4f2c08696d5ccad"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c379e37b08c6c527181a397212346be39319fb64323741d23e46abd97a400d34"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:03d73ab2a37d9e40dec4984d1813d7878e01dbdc742448d44a7341b7a9f408c7"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8cee08f15d9e238ede42e9bbc1d6e7158d0ca4f176e4eab21f88ac819ae3bd7b"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-win32.whl", hash = "sha256:b3edaec7e8b6dc5cd94523c6df4f294014df67097c8217a89929c99975811414"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-win_amd64.whl", hash = "sha256:227119ce0a89e762ecd882dc661e0aa677a690c914e358f0dd8932a2e8b2765b"}, + {file = "sqlalchemy-2.0.43-py3-none-any.whl", hash = "sha256:1681c21dd2ccee222c2fe0bef671d1aef7c504087c9c4e800371cfcc8ac966fc"}, + {file = "sqlalchemy-2.0.43.tar.gz", hash = "sha256:788bfcef6787a7764169cfe9859fe425bf44559619e1d9f56f5bddf2ebf6f417"}, +] + +[package.dependencies] +greenlet = {version = ">=1", markers = "python_version < \"3.14\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +typing-extensions = ">=4.6.0" + +[package.extras] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (>=1)"] +aioodbc = ["aioodbc", "greenlet (>=1)"] +aiosqlite = ["aiosqlite", "greenlet (>=1)", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (>=1)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (>=1)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx_oracle (>=8)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (>=1)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3_binary"] + [[package]] name = "stack-data" version = "0.6.3" @@ -4803,7 +5132,119 @@ enabler = ["pytest-enabler (>=2.2)"] test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more_itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] type = ["pytest-mypy"] +[[package]] +name = "zstandard" +version = "0.25.0" +description = "Zstandard bindings for Python" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "zstandard-0.25.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e59fdc271772f6686e01e1b3b74537259800f57e24280be3f29c8a0deb1904dd"}, + {file = "zstandard-0.25.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4d441506e9b372386a5271c64125f72d5df6d2a8e8a2a45a0ae09b03cb781ef7"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:ab85470ab54c2cb96e176f40342d9ed41e58ca5733be6a893b730e7af9c40550"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e05ab82ea7753354bb054b92e2f288afb750e6b439ff6ca78af52939ebbc476d"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:78228d8a6a1c177a96b94f7e2e8d012c55f9c760761980da16ae7546a15a8e9b"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2b6bd67528ee8b5c5f10255735abc21aa106931f0dbaf297c7be0c886353c3d0"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4b6d83057e713ff235a12e73916b6d356e3084fd3d14ced499d84240f3eecee0"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9174f4ed06f790a6869b41cba05b43eeb9a35f8993c4422ab853b705e8112bbd"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:25f8f3cd45087d089aef5ba3848cd9efe3ad41163d3400862fb42f81a3a46701"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3756b3e9da9b83da1796f8809dd57cb024f838b9eeafde28f3cb472012797ac1"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:81dad8d145d8fd981b2962b686b2241d3a1ea07733e76a2f15435dfb7fb60150"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a5a419712cf88862a45a23def0ae063686db3d324cec7edbe40509d1a79a0aab"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e7360eae90809efd19b886e59a09dad07da4ca9ba096752e61a2e03c8aca188e"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:75ffc32a569fb049499e63ce68c743155477610532da1eb38e7f24bf7cd29e74"}, + {file = "zstandard-0.25.0-cp310-cp310-win32.whl", hash = "sha256:106281ae350e494f4ac8a80470e66d1fe27e497052c8d9c3b95dc4cf1ade81aa"}, + {file = "zstandard-0.25.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea9d54cc3d8064260114a0bbf3479fc4a98b21dffc89b3459edd506b69262f6e"}, + {file = "zstandard-0.25.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:933b65d7680ea337180733cf9e87293cc5500cc0eb3fc8769f4d3c88d724ec5c"}, + {file = "zstandard-0.25.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3f79487c687b1fc69f19e487cd949bf3aae653d181dfb5fde3bf6d18894706f"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:0bbc9a0c65ce0eea3c34a691e3c4b6889f5f3909ba4822ab385fab9057099431"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:01582723b3ccd6939ab7b3a78622c573799d5d8737b534b86d0e06ac18dbde4a"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5f1ad7bf88535edcf30038f6919abe087f606f62c00a87d7e33e7fc57cb69fcc"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:06acb75eebeedb77b69048031282737717a63e71e4ae3f77cc0c3b9508320df6"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9300d02ea7c6506f00e627e287e0492a5eb0371ec1670ae852fefffa6164b072"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfd06b1c5584b657a2892a6014c2f4c20e0db0208c159148fa78c65f7e0b0277"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f373da2c1757bb7f1acaf09369cdc1d51d84131e50d5fa9863982fd626466313"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6c0e5a65158a7946e7a7affa6418878ef97ab66636f13353b8502d7ea03c8097"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c8e167d5adf59476fa3e37bee730890e389410c354771a62e3c076c86f9f7778"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:98750a309eb2f020da61e727de7d7ba3c57c97cf6213f6f6277bb7fb42a8e065"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:22a086cff1b6ceca18a8dd6096ec631e430e93a8e70a9ca5efa7561a00f826fa"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:72d35d7aa0bba323965da807a462b0966c91608ef3a48ba761678cb20ce5d8b7"}, + {file = "zstandard-0.25.0-cp311-cp311-win32.whl", hash = "sha256:f5aeea11ded7320a84dcdd62a3d95b5186834224a9e55b92ccae35d21a8b63d4"}, + {file = "zstandard-0.25.0-cp311-cp311-win_amd64.whl", hash = "sha256:daab68faadb847063d0c56f361a289c4f268706b598afbf9ad113cbe5c38b6b2"}, + {file = "zstandard-0.25.0-cp311-cp311-win_arm64.whl", hash = "sha256:22a06c5df3751bb7dc67406f5374734ccee8ed37fc5981bf1ad7041831fa1137"}, + {file = "zstandard-0.25.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7b3c3a3ab9daa3eed242d6ecceead93aebbb8f5f84318d82cee643e019c4b73b"}, + {file = "zstandard-0.25.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:913cbd31a400febff93b564a23e17c3ed2d56c064006f54efec210d586171c00"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:011d388c76b11a0c165374ce660ce2c8efa8e5d87f34996aa80f9c0816698b64"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6dffecc361d079bb48d7caef5d673c88c8988d3d33fb74ab95b7ee6da42652ea"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7149623bba7fdf7e7f24312953bcf73cae103db8cae49f8154dd1eadc8a29ecb"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6a573a35693e03cf1d67799fd01b50ff578515a8aeadd4595d2a7fa9f3ec002a"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5a56ba0db2d244117ed744dfa8f6f5b366e14148e00de44723413b2f3938a902"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:10ef2a79ab8e2974e2075fb984e5b9806c64134810fac21576f0668e7ea19f8f"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aaf21ba8fb76d102b696781bddaa0954b782536446083ae3fdaa6f16b25a1c4b"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1869da9571d5e94a85a5e8d57e4e8807b175c9e4a6294e3b66fa4efb074d90f6"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:809c5bcb2c67cd0ed81e9229d227d4ca28f82d0f778fc5fea624a9def3963f91"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f27662e4f7dbf9f9c12391cb37b4c4c3cb90ffbd3b1fb9284dadbbb8935fa708"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:99c0c846e6e61718715a3c9437ccc625de26593fea60189567f0118dc9db7512"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:474d2596a2dbc241a556e965fb76002c1ce655445e4e3bf38e5477d413165ffa"}, + {file = "zstandard-0.25.0-cp312-cp312-win32.whl", hash = "sha256:23ebc8f17a03133b4426bcc04aabd68f8236eb78c3760f12783385171b0fd8bd"}, + {file = "zstandard-0.25.0-cp312-cp312-win_amd64.whl", hash = "sha256:ffef5a74088f1e09947aecf91011136665152e0b4b359c42be3373897fb39b01"}, + {file = "zstandard-0.25.0-cp312-cp312-win_arm64.whl", hash = "sha256:181eb40e0b6a29b3cd2849f825e0fa34397f649170673d385f3598ae17cca2e9"}, + {file = "zstandard-0.25.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec996f12524f88e151c339688c3897194821d7f03081ab35d31d1e12ec975e94"}, + {file = "zstandard-0.25.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a1a4ae2dec3993a32247995bdfe367fc3266da832d82f8438c8570f989753de1"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:e96594a5537722fdfb79951672a2a63aec5ebfb823e7560586f7484819f2a08f"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bfc4e20784722098822e3eee42b8e576b379ed72cca4a7cb856ae733e62192ea"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:457ed498fc58cdc12fc48f7950e02740d4f7ae9493dd4ab2168a47c93c31298e"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:fd7a5004eb1980d3cefe26b2685bcb0b17989901a70a1040d1ac86f1d898c551"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e735494da3db08694d26480f1493ad2cf86e99bdd53e8e9771b2752a5c0246a"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3a39c94ad7866160a4a46d772e43311a743c316942037671beb264e395bdd611"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:172de1f06947577d3a3005416977cce6168f2261284c02080e7ad0185faeced3"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3c83b0188c852a47cd13ef3bf9209fb0a77fa5374958b8c53aaa699398c6bd7b"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1673b7199bbe763365b81a4f3252b8e80f44c9e323fc42940dc8843bfeaf9851"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0be7622c37c183406f3dbf0cba104118eb16a4ea7359eeb5752f0794882fc250"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5f5e4c2a23ca271c218ac025bd7d635597048b366d6f31f420aaeb715239fc98"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f187a0bb61b35119d1926aee039524d1f93aaf38a9916b8c4b78ac8514a0aaf"}, + {file = "zstandard-0.25.0-cp313-cp313-win32.whl", hash = "sha256:7030defa83eef3e51ff26f0b7bfb229f0204b66fe18e04359ce3474ac33cbc09"}, + {file = "zstandard-0.25.0-cp313-cp313-win_amd64.whl", hash = "sha256:1f830a0dac88719af0ae43b8b2d6aef487d437036468ef3c2ea59c51f9d55fd5"}, + {file = "zstandard-0.25.0-cp313-cp313-win_arm64.whl", hash = "sha256:85304a43f4d513f5464ceb938aa02c1e78c2943b29f44a750b48b25ac999a049"}, + {file = "zstandard-0.25.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e29f0cf06974c899b2c188ef7f783607dbef36da4c242eb6c82dcd8b512855e3"}, + {file = "zstandard-0.25.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:05df5136bc5a011f33cd25bc9f506e7426c0c9b3f9954f056831ce68f3b6689f"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:f604efd28f239cc21b3adb53eb061e2a205dc164be408e553b41ba2ffe0ca15c"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223415140608d0f0da010499eaa8ccdb9af210a543fac54bce15babbcfc78439"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e54296a283f3ab5a26fc9b8b5d4978ea0532f37b231644f367aa588930aa043"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ca54090275939dc8ec5dea2d2afb400e0f83444b2fc24e07df7fdef677110859"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e09bb6252b6476d8d56100e8147b803befa9a12cea144bbe629dd508800d1ad0"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a9ec8c642d1ec73287ae3e726792dd86c96f5681eb8df274a757bf62b750eae7"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a4089a10e598eae6393756b036e0f419e8c1d60f44a831520f9af41c14216cf2"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f67e8f1a324a900e75b5e28ffb152bcac9fbed1cc7b43f99cd90f395c4375344"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:9654dbc012d8b06fc3d19cc825af3f7bf8ae242226df5f83936cb39f5fdc846c"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4203ce3b31aec23012d3a4cf4a2ed64d12fea5269c49aed5e4c3611b938e4088"}, + {file = "zstandard-0.25.0-cp314-cp314-win32.whl", hash = "sha256:da469dc041701583e34de852d8634703550348d5822e66a0c827d39b05365b12"}, + {file = "zstandard-0.25.0-cp314-cp314-win_amd64.whl", hash = "sha256:c19bcdd826e95671065f8692b5a4aa95c52dc7a02a4c5a0cac46deb879a017a2"}, + {file = "zstandard-0.25.0-cp314-cp314-win_arm64.whl", hash = "sha256:d7541afd73985c630bafcd6338d2518ae96060075f9463d7dc14cfb33514383d"}, + {file = "zstandard-0.25.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b9af1fe743828123e12b41dd8091eca1074d0c1569cc42e6e1eee98027f2bbd0"}, + {file = "zstandard-0.25.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4b14abacf83dfb5c25eb4e4a79520de9e7e205f72c9ee7702f91233ae57d33a2"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:a51ff14f8017338e2f2e5dab738ce1ec3b5a851f23b18c1ae1359b1eecbee6df"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3b870ce5a02d4b22286cf4944c628e0f0881b11b3f14667c1d62185a99e04f53"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:05353cef599a7b0b98baca9b068dd36810c3ef0f42bf282583f438caf6ddcee3"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:19796b39075201d51d5f5f790bf849221e58b48a39a5fc74837675d8bafc7362"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:53e08b2445a6bc241261fea89d065536f00a581f02535f8122eba42db9375530"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1f3689581a72eaba9131b1d9bdbfe520ccd169999219b41000ede2fca5c1bfdb"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d8c56bb4e6c795fc77d74d8e8b80846e1fb8292fc0b5060cd8131d522974b751"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:53f94448fe5b10ee75d246497168e5825135d54325458c4bfffbaafabcc0a577"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c2ba942c94e0691467ab901fc51b6f2085ff48f2eea77b1a48240f011e8247c7"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:07b527a69c1e1c8b5ab1ab14e2afe0675614a09182213f21a0717b62027b5936"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:51526324f1b23229001eb3735bc8c94f9c578b1bd9e867a0a646a3b17109f388"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89c4b48479a43f820b749df49cd7ba2dbc2b1b78560ecb5ab52985574fd40b27"}, + {file = "zstandard-0.25.0-cp39-cp39-win32.whl", hash = "sha256:1cd5da4d8e8ee0e88be976c294db744773459d51bb32f707a0f166e5ad5c8649"}, + {file = "zstandard-0.25.0-cp39-cp39-win_amd64.whl", hash = "sha256:37daddd452c0ffb65da00620afb8e17abd4adaae6ce6310702841760c2c26860"}, + {file = "zstandard-0.25.0.tar.gz", hash = "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b"}, +] + +[package.extras] +cffi = ["cffi (>=1.17,<2.0) ; platform_python_implementation != \"PyPy\" and python_version < \"3.14\"", "cffi (>=2.0.0b) ; platform_python_implementation != \"PyPy\" and python_version >= \"3.14\""] + [metadata] lock-version = "2.1" python-versions = ">=3.11,<3.14" -content-hash = "d6d2193162fb4f639f19f7503590d7dccb0404fbfaf28705da9bc418471bb866" +content-hash = "86b7c29786bd85bbac5181ef27e1f407a2c4cf66aa26bed02f6cf76b93dbbfd9" diff --git a/pyproject.toml b/pyproject.toml index 744e95c..6aa8a5a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,9 +10,11 @@ readme = "README.md" requires-python = ">=3.11,<3.14" dependencies = [ "krpc (>=0.5.4,<0.6.0)", - "crewai (>=0.165.1,<0.166.0)", - "openai (==1.99.0)", - "anthropic (>=0.64.0,<0.65.0)" + "crewai (>=0.186.1,<0.187.0)", + "openai (>=1.104.2,<2.0.0)", + "anthropic (>=0.64.0,<0.65.0)", + "langchain (>=0.3.27,<0.4.0)", + "langchain-openai (>=0.3.33,<0.4.0)" ]