From a229941cf518a873bf2eb868f96f686edddcb05a Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sat, 14 Mar 2026 18:36:49 +0100 Subject: [PATCH 01/30] Update and rename import 'package:web/web.dart'; to dev/import/package web/paperweb.dart --- dev/import/package web/paperweb.dart | 457 +++++++++++++++++++++++++++ import 'package:web/web.dart'; | 1 - 2 files changed, 457 insertions(+), 1 deletion(-) create mode 100644 dev/import/package web/paperweb.dart delete mode 100644 import 'package:web/web.dart'; diff --git a/dev/import/package web/paperweb.dart b/dev/import/package web/paperweb.dart new file mode 100644 index 0000000..6b989dd --- /dev/null +++ b/dev/import/package web/paperweb.dart @@ -0,0 +1,457 @@ + +:paperweb_website: +.. https://fastht.ml: +:fastht.ml: name the webasite .. https://aura.paperweb: +:aura.paperweb: .. projectstructure: +:extension: .. tags: +:notebookxlsl: +:quantum: +:model: +:sentence: .. similarity: +.. text-generation: +.. image-to-3d: +.. audio-classification: +:aura.Xlsl: +.. science: +.. code: +.. medical: +.. not-for-all-audiences: +.. chemistry +.. biology: +.. synthetic: +.. agent: +.. pretty_name: ..paperweb: +:quantumpaper: +.. image_categories: +:100B {Yakub, Seriki}, +:title: -> {Aura.Xlsl (Revision 668d721)}, +:year: -> 2025, +:url: ->{https://huggingface.co/datasets/Seriki/Aura.Xlsl}, +:doi: -> {10.57967/hf/6674}, +:publisher: -> {Aura / Hugging Face} +:Auraxlslpaper: -> +:Serai: -> +:QuantumIDE: -> +.. : +Interactive drag-and-drop quantum circuit simulator with GPU-accelerated backend. + +:Features: +- Drag-and-drop quantum gates (H, X, Y, Z, CNOT, TOFFOLI) +- Multi-qubit circuit simulation +- Real-time amplitude visualization +- Save/load circuits as JSON +- Batch GPU simulation support +- Fractional/negative amplitude support (Aura math integration) + +:Installation: +git clone <[repo-url](https://github.com/Web4application/Aura_Full_Project.xlsl.git)> +cd AuraQuantumIDE +pip install -r requirements.txt +uvicorn api.main:app --reload +https://github.com/Web4application/Aura_Full_Project.xlsl.git + + +:first-project: + +.. auraxlslproject: + ├── :data: + │ └── :Aura.xlsl: .. your data hub: + ├── :src: + │ ├── -> :init: + │ ├── .. ai_pipeline: :ML: regression/classification + │ ├── .. quantum_pipeline: :Qiskit: :quantum: :circuits: + │ ├── .. lifespan_analysis: :survival: :curves: :hazard: :ratio: + │ └── .. utils: -> helpers to load Excel + ├── .. xlslnotebooks:/ + │ └── exploration.ipynb .. experiments: + ├── requirements.txt + └── main.py # orchestrator script +—————:: + +.. aurxlslpaper:(https://github.com/Web4application/Aura_Full_Project.xlsl/tree/15c2f6180005733d51e16b816c0738a37bb0986a/AuraQuantum)(localhost.mobi/rss-feed/my-news/ace6114490bf69dae76498fe4dc2447b1b3ce415) +.. AuraQuantumpaper: https://github.com/Web4application/Aura_Full_Project.xlsl/tree/15c2f6180005733d51e16b816c0738a37bb0986a/AuraQuantum/localhost.mobi/rss-feed/my-news/ace6114490bf69dae76498fe4dc2447b1b3ce415 + + +:.xlsl: —> Logic Spreadsheet (Core) +.. Purpose: + | A structured, Excel-compatible file format designed as the hub for mathematics, physics, reasoning, and simulation data. | +.. Structure: + • Reserved sheets: Pure_Mathematics, Further_Mathematics, Applied_Physics, Reasoning_Logic, Simulation_Problems, Teleportation_Simulation. + +:Tabular format with rows: +| entities | columns | attributes. + +:Use_Cases: + .. Knowledge base for AI-assisted reasoning. + .. STEM modeling and theoretical experimentation. + .. Foundation for linking with other Aura + +.. extensions: + +:![aura_diagram.png](https://huggingface.co/datasets/Seriki/Aura.Xlsl/raw/main/assets/aura_diadram.html) +.. : +2. :.xqsl: -> Quantum Spreadsheet Language + +.. Purpose: + Represents quantum states, entanglement, and teleportation in tabular form. + Structure + • Core sheets: Qubits, Entanglement, Teleportation, Noise_Models. + • Normalization rules: |α|² + |β|² = 1. + Use-Cases + • AI-assisted quantum state reasoning. + • Interoperability with Qiskit, Cirq, Rigetti simulators. + • Teleportation experiment modeling. +⸻ + +3. :.xsim: -> Simulation Spreadsheet + +.. Purpose: + Dedicated container for applied simulations across physics, math, and multi-disciplinary problems. + :Structure: -> | Simulation_ID | Input_Data | Governing_Equations | Solver_Method | Output_Parameters | Error_Margin | Notes | + :Use-Cases: + • Energy cost of teleportation. + • Wormhole/dimensional collapse simulations. + • Linking spreadsheet experiments to computational solvers (Python, MATLAB). +⸻ + +4. :.xrls: Reasoning Layer Spreadsheet + +:Purpose: + Encodes logical reasoning in structured tabular form, bridging raw data and inference. +:Structure: + | Premise | Logical_Operator | Secondary_Premise | Conclusion | Truth_Value | Confidence (%) | Notes | +:Use-Cases: + - AI symbolic logic and contradiction checking. + - Automated reasoning validation for STEM hypotheses. + - Embedding deductive reasoning into simulations. +⸻ + +5. :.xai: + .. AI: Enhanced Spreadsheet + + .. Purpose: + Hybrid format combining data + AI context memory inside a single file. +- Structure + • Data layer: conventional tabular data. + • AI layer: structured logs of prompts, responses, metadata. +:Use-Cases: + • Context-aware spreadsheets (AI remembers past queries). + • Distributed AI collaboration (file carries its own “assistant”). + • Research reproducibility: all AI reasoning embedded with data. +⸻ + +6. :.xdim: +7. ..Dimensional: Models File + +- Purpose_ + Encodes higher-dimensional mathematics and geometry, for theories beyond 3D space-time. + +.. Structure: + ⸻ + +| Model_ID | Dimension_Count | Geometry_Type | Transformation_Matrix | Tensor_Fields | Physical_Interpretation | Notes | +⸻ + +:Rules: + • Must specify at least 3D baseline. + • Higher-D transformations expressed via matrices or tensors. + + ⸻ + +:Use_Cases:_ + • Teleportation and wormhole modeling. + • Multiverse/dimensional physics research. + • Coupling with .xqsl for quantum state behavior in higher dimensions. + + ⸻ +7. .. Ecosystem_Workflow: + + 1. .xlsl = Hub → holds general STEM and logic sheets. + 2. .xqsl = Quantum extension → state transfer, entanglement, teleportation. + 3. .xsim = Simulation → runs applied case studies. + 4. .xrls = Logic → validates reasoning and inferences. + 5. .xai = AI-enhanced → keeps reasoning memory and context. + 6. .xdim = Higher dimensions → advanced teleportation and + + ⸻ + 1. :Ethics_Notes: + + • - Tracks considerations around privacy, consent, data anonymization, and AI fairness. + • - Can store notes about potential biases in AI models or quantum simulations. + • - Useful for documenting decisions to comply with research ethics or regulatory standards. + 2. + + ⸻ :Economics_Records: + + • Records costs of interventions, treatments, or experiments. + • Can calculate cost-benefit analyses or ROI for clinical trials, lifespan interventions, or quantum computing experiments. + • Includes metrics like budget, actual expenditure, projected savings, and economic feasibility. + + ⸻ + 3. :Simulation_Scenarios: + +- • Enables “what-if” analysis across multiple domains such as diet, medication, stress, or environmental factors. +- • Stores initial conditions, parameters, and expected outputs for each simulation. +- • Can feed into AI or quantum pipelines to test different hypotheses before running real experiments. + + ⸻ + 4. ..Visualization_Config: + +- • Contains preferred chart types, axis mappings, thresholds, and color schemes. +- • Supports automated plotting in Python, ensuring consistency in presentation and reporting. +- • Useful for dashboards or publication-ready figures generated from data in other sheets. + + ⸻ + :Collaboration_Log: + +- • Tracks team members, contributions, timestamps, and changes to data or models. + • Can include versioning information for sheets and pipelines. + • Supports multi-researcher projects, making it easier to manage tasks and credit work. + 6. Deployment_confog + • Contains configuration details for serving AI models, quantum simulations, or hybrid workflows. + • Includes endpoints, API keys, server details, runtime environment settings, and deployment notes. + • Allows seamless transition from experimentation to production-ready workflows. +## expansion: + + ⸻ +.. notebooksxlsl: + 1. | Ethics_Notes | - privacy, - bias | - fairness | - consent | - logs | - Economics - -spreadsheet | – intervention | costs - resource | allocation - | - ROI calculations | + 6. | Simulation_Scenarios | – “what-if” experiments for diet, drugs, stress, or environmental factors. + 7. | Visualization_Config | – chart types, axes, thresholds, color schemes for automated plotting. + 8. |Collaboration_Log | – contributors, changes, timestamps, versioning. + 9. | Deployment_dimensional | – endpoints, runtime configurations, API keys, server settings for + + ⸻ +:Ai_quantum_workflows: + | Advanced_Mathematics → | tensors, eigenvalues, PDEs, applied formulas. | + | Physics_Experiments → | parameters for mechanics, thermodynamics, electromagnetism, quantum circuits. | + | Reasoning_Problems → | logic puzzles, hypotheses, formal deductions, experimental design.| + | Genomics_Deep → full gene sequences, variant analysis, epigenetic factors. | + Healthcare_Analytics → survival curves, hazard ratios, population studies. | + Environment_Scenarios → climate, pollution, lifestyle, and external stressors. | + | AI_Results_Log → historical model performance, predictions, and metrics for reference. | + | Dual-format support ensures .xlsl branding while Python can read/write it as .xlsx. + + ⸻ +:All_layers_interconnect: +AI can pull features from lifespan or environment data, quantum simulations can optimize interventions, and analytics can feed visualizations automatically. + • Project management and collaboration are integrated, ensuring reproducibility, ethics tracking, and versioning. + • STEM research is fully supported: mathematical models, physics parameters, reasoning experiments, and genomics data are all accessible in one system. | +You typed Aura.xlsl. Likely you meant Aura.xlsx (Excel workbook). + + ⸻ +:.xlsl: + is not a part of Microsoft Excel extension. Excel only recognizes formats like: + • .xlsx → Standard workbook + • .xls → Legacy workbook (Excel 97–2003) + • .xlsm → Workbook with macros + • .csv → Comma-separated values + + ⸻ +:Project_Structure: + .. xlsl: + + .. conda-build: + :auraxlslproject: + - ├── .data/ + │ └── .Auraxlsl # fully expanded workbook with 25+ sheets + - ├── .src/ + │ - ├── __init__.py + │ - ├── .file_loader.py :handles: .xlsl/.xlsx reading & writing + - │ ├── .utils.py :helper_functions: + - │ ├── :ai_pipeline.py: .. ML .. models .. predictions + │ - ├── .quantum_pipeline.py .. Qiskit .. circuits + │ └── :lifespan_analysis.py: placeholder for lifespan analytics + ├── :notebooks:/ + │ └── .. exploration.ipynb: :experimentation: :visualization: + ├.── :requirements.txt: + └── :main.py: + + :orchestrator_script: + + ———— + +:Features: + +• Loads and saves Aura.xlsl while internally using .xlsx compatibility. + Contains all previously created + +.. spreadsheets: + +:Overview: +.. | Data | AI Input | Quantum Input | Results | + +| LifespanData | AI Modeling, Quantum_Optimization, Environment Factors, Clinical Trials, Genomic | + +| AI Pipeline Config | Quantum Results | + +|Pure Mathematics| + | Further Mathematics | Applied Physics | + +| Reasoning Logic | Simulation Problems | + +| Ethics Notes| + | Economics| Simulation Scenarios | + +:VisualizationbConfig: + + ..Collaboration_Log: + +:Deployment:: + + + Supports AI pipelines, quantum simulations, and +lifespan analytics. Modular, ready for expansion and collaboration. + +Yes. We can add all of these layers now, making Aura.xlsx/.xlsl a fully integrated, multidisciplinary research hub. Each sheet will be structured to support both data storage and computational workflows, while remaining fully compatible with Python and Excel. + +:Implementation: plan for new sheets + +1. :Ethics_Notes: +Tracks privacy, consent, bias, and fairness considerations. + Can store annotations for AI and quantum experiments. + 2. :Economics: Records intervention costs, resource allocation, projected ROI, and notes for each trial or scenario. + :Simulation_Scenarios: + Holds parameters for “what-if” experiments across diet, drugs, stress, and environmental conditions. + • Supports direct integration with AI or quantum workflows. + 4. :Visualization_Config: + • Defines chart types, axes, thresholds, and color schemes. + • Supports automated plotting from Python scripts for reproducibility. + 5. :Collaboration_Log: + • Logs contributors, tasks, changes, timestamps, and versioning information. + • Useful for multi-researcher projects and audit trails. + 6. :Deployment: + • Stores endpoint URLs, API keys, runtime environments, and configuration notes for AI models and quantum simulations. + :Facilitates_transitioning: from experimentation to production-ready workflows. +Optional advanced sheets: + :Advanced_Mathematics: → tensors, matrices, PDEs, applied formulas. + • :Physics_Experiments: → mechanics, thermodynamics, electromagnetism, quantum parameters. + • :Reasoning_Problems: → formal logic problems, experimental design, hypotheses. + • :Genomics_Deep: → gene sequences, variants, epigenetic factors. + • :Healthcare_Analytics: → survival curves, hazard ratios, cohort analysis. + • :Environment_Scenarios: → climate, pollution, lifestyle, external stressors. + • :AI_Results_Log: → historical model outputs, metrics, and predictions. +.. Outcome: + +:Dual_format_support: + retain .xlsl branding while Python reads/writes as .xlsx + + - Interconnected_sheets: AI models can draw features from lifespan, genomics, or environment data; quantum simulations can optimize experimental parameters. + - Project management: collaboration logs, ethics notes, and deployment configs are integrated. + - STEM research support: mathematics, physics, reasoning, genomics, and healthcare analytics are all accessible within one system. +⸻ + +:Implementation: plan for new sheets + +.. Ethics_Notes: + • Tracks privacy, consent, bias, and fairness considerations. +:: + Can store annotations for AI and quantum experiments. + 2. .. Economics: + • Records intervention costs, resource allocation, projected ROI, and notes for each trial or scenario. + + 3. .. Simulation_Scenarios: + • Holds parameters for “what-if” experiments across diet, drugs, stress, and environmental conditions. + • .. Supports: direct integration with AI or quantum workflows. + 4. .. Visualization_Config: + • Defines chart types, axes, thresholds, and color schemes. + • .. Supports: automated plotting from Python scripts for reproducibility. + 5. .. Collaboration_Log: + • Logs contributors, tasks, changes, timestamps, and versioning information. + • ..Useful: for multi-researcher projects and audit trails. + + 6. :Deployment: + • Stores endpoint URLs, API keys, runtime environments, and configuration notes for AI models and quantum simulations. + • .. Facilitates: transitioning from experimentation to production-ready workflows. +:Optional: + .. advanced_sheets: + • Advanced_Mathematics → tensors, matrices, PDEs, applied formulas. + • :Physics_Experiments: → mechanics, thermodynamics, electromagnetism, quantum parameters. + • :Reasoning_Problems: → formal logic problems, experimental design, hypotheses. + • :Genomics_Deep: → gene sequences, variants, epigenetic factors. + • :Healthcare_Analytics: → survival curves, hazard ratios, cohort analysis. + • :Environment_Scenarios: → climate, pollution, lifestyle, external stressors. + • :AI_Results_Log: → historical model outputs, metrics, and predictions. +:Outcome: + • Dual-format support: retain .xlsl branding while Python reads/writes as .xlsx. + • :Interconnected: sheets: AI models can draw features from lifespan, genomics, or environment data; quantum simulations can optimize experimental parameters. + • :Project_management: collaboration logs, ethics notes, and deployment configs are integrated. + • :STEM:research support: mathematics, physics, reasoning, genomics, and healthcare analytics are all accessible within one system. +:: + +• This structure turns Aura into a complete, scalable research ecosystem, capable of supporting AI, quantum computing, lifespan analysis, applied STEM research, simulations, visualizations, and project governance in one unified workbook. +:auraxlslproject: + +The expanded Aura project workbook is now ready with all new sheets for a complete multidisciplinary hub. It includes: + +.. Advanced_Mathematics: -> matrices, eigenvalues, PDEs, tensor calculus + .. Physics_Experiments: -> mechanics, thermodynamics, electromagnetism, quantum circuits + .. Reasoning_Problems: -> logic puzzles, hypotheses, experimental design + • .. Genomics_Deep: –> gene variants, effects, notes + .. Healthcare_Analytics: –> survival rates, hazard ratios, population studies + • .. Environment_Scenarios: –> pollution, lifestyle, expected impacts + • .. AI_Results_Log: –> model results, datasets, metrics, notes +This brings Aura.xlsl to a total of sheets, making it a fully functional research and project hub supporting AI, quantum computing, lifespan studies, applied STEM research, ethics, economics, simulations, visualization, collaboration, and deployment. + + +You can download the full workbook here +:Aura_Full_Project.xlsl: + + +image + +image + +image + +Performs a book search. +[Try it now](https://developers.google.com/books/docs/v1/reference/volumes/list#try-it). + +## Request + +## + +[HTTP.Request GET](https://www.googleapis.com/books/v1/volumes?q={aura.Xlsl}) + +https://huggingface/datasets?other=medical + +[aura.paperweb](https://www.googleapis.com/huggingface/datasets?r=Xlsl.paper.notebook.xlsl.model.lmlm.medical.niology.local.cs.ai.arxiv}src="https://huggingface.co/datasets/HelioAI/Helio1-Reasoning-50K-RU/embed/viewer/default/train")(https://www.googleapis.com/books/v1/volumes?q=%7Baura.xlslpaperwebworkbook%7D) diff --git a/import 'package:web/web.dart'; b/import 'package:web/web.dart'; deleted file mode 100644 index 8b13789..0000000 --- a/import 'package:web/web.dart'; +++ /dev/null @@ -1 +0,0 @@ - From f10fd92bc3454bce63a238f0566577500a17a20a Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sat, 14 Mar 2026 19:27:39 +0100 Subject: [PATCH 02/30] Update and rename Aura.rst.xlsl to indtall.md/index.md --- Aura.rst.xlsl | 456 -------------------------------------------- indtall.md/index.md | 31 +++ 2 files changed, 31 insertions(+), 456 deletions(-) delete mode 100644 Aura.rst.xlsl create mode 100644 indtall.md/index.md diff --git a/Aura.rst.xlsl b/Aura.rst.xlsl deleted file mode 100644 index 8d0dea7..0000000 --- a/Aura.rst.xlsl +++ /dev/null @@ -1,456 +0,0 @@ -:paperweb_website: -.. https://fastht.ml: -:fastht.ml: :name the webasite: .. https://aura.paperweb: -:aura.paperweb: .. projectstructure: -:extension: .. tags: -:notebookxlsl: -:quantum: -:model: -:sentence: .. similarity: -.. text-generation: -.. image-to-3d: -.. audio-classification: -:aura.Xlsl: -.. science: -.. code: -.. medical: -.. not-for-all-audiences: -.. chemistry -.. biology: -.. synthetic: -.. agent: -.. pretty_name: ..paperweb: -:quantumpaper: -.. image_categories: -:100B {Yakub, Seriki}, -:title: -> {Aura.Xlsl (Revision 668d721)}, -:year: -> 2025, -:url: ->{https://huggingface.co/datasets/Seriki/Aura.Xlsl}, -:doi: -> {10.57967/hf/6674}, -:publisher: -> {Aura / Hugging Face} -:Auraxlslpaper: -> -:Serai: -> -:QuantumIDE: -> -.. : -Interactive drag-and-drop quantum circuit simulator with GPU-accelerated backend. - -:Features: -- Drag-and-drop quantum gates (H, X, Y, Z, CNOT, TOFFOLI) -- Multi-qubit circuit simulation -- Real-time amplitude visualization -- Save/load circuits as JSON -- Batch GPU simulation support -- Fractional/negative amplitude support (Aura math integration) - -:Installation: -git clone <[repo-url](https://github.com/Web4application/Aura_Full_Project.xlsl.git)> -cd AuraQuantumIDE -pip install -r requirements.txt -uvicorn api.main:app --reload -https://github.com/Web4application/Aura_Full_Project.xlsl.git - - -:first-project: - -.. auraxlslproject: - ├── :data: - │ └── :Aura.xlsl: .. your data hub: - ├── :src: - │ ├── -> :init: - │ ├── .. ai_pipeline: :ML: regression/classification - │ ├── .. quantum_pipeline: :Qiskit: :quantum: :circuits: - │ ├── .. lifespan_analysis: :survival: :curves: :hazard: :ratio: - │ └── .. utils: -> helpers to load Excel - ├── .. xlslnotebooks:/ - │ └── exploration.ipynb .. experiments: - ├── requirements.txt - └── main.py # orchestrator script -—————:: - -.. aurxlslpaper:(https://github.com/Web4application/Aura_Full_Project.xlsl/tree/15c2f6180005733d51e16b816c0738a37bb0986a/AuraQuantum)(localhost.mobi/rss-feed/my-news/ace6114490bf69dae76498fe4dc2447b1b3ce415) -.. AuraQuantumpaper: https://github.com/Web4application/Aura_Full_Project.xlsl/tree/15c2f6180005733d51e16b816c0738a37bb0986a/AuraQuantum/localhost.mobi/rss-feed/my-news/ace6114490bf69dae76498fe4dc2447b1b3ce415 - - -:.xlsl: —> Logic Spreadsheet (Core) -.. Purpose: - | A structured, Excel-compatible file format designed as the hub for mathematics, physics, reasoning, and simulation data. | -.. Structure: - • Reserved sheets: Pure_Mathematics, Further_Mathematics, Applied_Physics, Reasoning_Logic, Simulation_Problems, Teleportation_Simulation. - -:Tabular format with rows: -| entities | columns | attributes. - -:Use_Cases: - .. Knowledge base for AI-assisted reasoning. - .. STEM modeling and theoretical experimentation. - .. Foundation for linking with other Aura - -.. extensions: - -:![aura_diagram.png](https://huggingface.co/datasets/Seriki/Aura.Xlsl/raw/main/assets/aura_diadram.html) -.. : -2. :.xqsl: -> Quantum Spreadsheet Language - -.. Purpose: - Represents quantum states, entanglement, and teleportation in tabular form. - Structure - • Core sheets: Qubits, Entanglement, Teleportation, Noise_Models. - • Normalization rules: |α|² + |β|² = 1. - Use-Cases - • AI-assisted quantum state reasoning. - • Interoperability with Qiskit, Cirq, Rigetti simulators. - • Teleportation experiment modeling. -⸻ - -3. :.xsim: -> Simulation Spreadsheet - -.. Purpose: - Dedicated container for applied simulations across physics, math, and multi-disciplinary problems. - :Structure: -> | Simulation_ID | Input_Data | Governing_Equations | Solver_Method | Output_Parameters | Error_Margin | Notes | - :Use-Cases: - • Energy cost of teleportation. - • Wormhole/dimensional collapse simulations. - • Linking spreadsheet experiments to computational solvers (Python, MATLAB). -⸻ - -4. :.xrls: Reasoning Layer Spreadsheet - -:Purpose: - Encodes logical reasoning in structured tabular form, bridging raw data and inference. -:Structure: - | Premise | Logical_Operator | Secondary_Premise | Conclusion | Truth_Value | Confidence (%) | Notes | -:Use-Cases: - - AI symbolic logic and contradiction checking. - - Automated reasoning validation for STEM hypotheses. - - Embedding deductive reasoning into simulations. -⸻ - -5. :.xai: - .. AI: Enhanced Spreadsheet - - .. Purpose: - Hybrid format combining data + AI context memory inside a single file. -- Structure - • Data layer: conventional tabular data. - • AI layer: structured logs of prompts, responses, metadata. -:Use-Cases: - • Context-aware spreadsheets (AI remembers past queries). - • Distributed AI collaboration (file carries its own “assistant”). - • Research reproducibility: all AI reasoning embedded with data. -⸻ - -6. :.xdim: -7. ..Dimensional: Models File - -- Purpose_ - Encodes higher-dimensional mathematics and geometry, for theories beyond 3D space-time. - -.. Structure: - ⸻ - -| Model_ID | Dimension_Count | Geometry_Type | Transformation_Matrix | Tensor_Fields | Physical_Interpretation | Notes | -⸻ - -:Rules: - • Must specify at least 3D baseline. - • Higher-D transformations expressed via matrices or tensors. - - ⸻ - -:Use_Cases:_ - • Teleportation and wormhole modeling. - • Multiverse/dimensional physics research. - • Coupling with .xqsl for quantum state behavior in higher dimensions. - - ⸻ -7. .. Ecosystem_Workflow: - - 1. .xlsl = Hub → holds general STEM and logic sheets. - 2. .xqsl = Quantum extension → state transfer, entanglement, teleportation. - 3. .xsim = Simulation → runs applied case studies. - 4. .xrls = Logic → validates reasoning and inferences. - 5. .xai = AI-enhanced → keeps reasoning memory and context. - 6. .xdim = Higher dimensions → advanced teleportation and - - ⸻ - 1. :Ethics_Notes: - - • - Tracks considerations around privacy, consent, data anonymization, and AI fairness. - • - Can store notes about potential biases in AI models or quantum simulations. - • - Useful for documenting decisions to comply with research ethics or regulatory standards. - 2. - - ⸻ :Economics_Records: - - • Records costs of interventions, treatments, or experiments. - • Can calculate cost-benefit analyses or ROI for clinical trials, lifespan interventions, or quantum computing experiments. - • Includes metrics like budget, actual expenditure, projected savings, and economic feasibility. - - ⸻ - 3. :Simulation_Scenarios: - -- • Enables “what-if” analysis across multiple domains such as diet, medication, stress, or environmental factors. -- • Stores initial conditions, parameters, and expected outputs for each simulation. -- • Can feed into AI or quantum pipelines to test different hypotheses before running real experiments. - - ⸻ - 4. ..Visualization_Config: - -- • Contains preferred chart types, axis mappings, thresholds, and color schemes. -- • Supports automated plotting in Python, ensuring consistency in presentation and reporting. -- • Useful for dashboards or publication-ready figures generated from data in other sheets. - - ⸻ - :Collaboration_Log: - -- • Tracks team members, contributions, timestamps, and changes to data or models. - • Can include versioning information for sheets and pipelines. - • Supports multi-researcher projects, making it easier to manage tasks and credit work. - 6. Deployment_confog - • Contains configuration details for serving AI models, quantum simulations, or hybrid workflows. - • Includes endpoints, API keys, server details, runtime environment settings, and deployment notes. - • Allows seamless transition from experimentation to production-ready workflows. -## expansion: - - ⸻ -.. notebooksxlsl: - 1. | Ethics_Notes | - privacy, - bias | - fairness | - consent | - logs | - Economics - -spreadsheet | – intervention | costs - resource | allocation - | - ROI calculations | - 6. | Simulation_Scenarios | – “what-if” experiments for diet, drugs, stress, or environmental factors. - 7. | Visualization_Config | – chart types, axes, thresholds, color schemes for automated plotting. - 8. |Collaboration_Log | – contributors, changes, timestamps, versioning. - 9. | Deployment_dimensional | – endpoints, runtime configurations, API keys, server settings for - - ⸻ -:Ai_quantum_workflows: - | Advanced_Mathematics → | tensors, eigenvalues, PDEs, applied formulas. | - | Physics_Experiments → | parameters for mechanics, thermodynamics, electromagnetism, quantum circuits. | - | Reasoning_Problems → | logic puzzles, hypotheses, formal deductions, experimental design.| - | Genomics_Deep → full gene sequences, variant analysis, epigenetic factors. | - Healthcare_Analytics → survival curves, hazard ratios, population studies. | - Environment_Scenarios → climate, pollution, lifestyle, and external stressors. | - | AI_Results_Log → historical model performance, predictions, and metrics for reference. | - | Dual-format support ensures .xlsl branding while Python can read/write it as .xlsx. - - ⸻ -:All_layers_interconnect: -AI can pull features from lifespan or environment data, quantum simulations can optimize interventions, and analytics can feed visualizations automatically. - • Project management and collaboration are integrated, ensuring reproducibility, ethics tracking, and versioning. - • STEM research is fully supported: mathematical models, physics parameters, reasoning experiments, and genomics data are all accessible in one system. | -You typed Aura.xlsl. Likely you meant Aura.xlsx (Excel workbook). - - ⸻ -:.xlsl: - is not a part of Microsoft Excel extension. Excel only recognizes formats like: - • .xlsx → Standard workbook - • .xls → Legacy workbook (Excel 97–2003) - • .xlsm → Workbook with macros - • .csv → Comma-separated values - - ⸻ -:Project_Structure: - .. xlsl: - - .. conda-build: - :auraxlslproject: - - ├── .data/ - │ └── .Auraxlsl # fully expanded workbook with 25+ sheets - - ├── .src/ - │ - ├── __init__.py - │ - ├── .file_loader.py :handles: .xlsl/.xlsx reading & writing - - │ ├── .utils.py :helper_functions: - - │ ├── :ai_pipeline.py: .. ML .. models .. predictions - │ - ├── .quantum_pipeline.py .. Qiskit .. circuits - │ └── :lifespan_analysis.py: placeholder for lifespan analytics - ├── :notebooks:/ - │ └── .. exploration.ipynb: :experimentation: :visualization: - ├.── :requirements.txt: - └── :main.py: - - :orchestrator_script: - - ———— - -:Features: - -• Loads and saves Aura.xlsl while internally using .xlsx compatibility. - Contains all previously created - -.. spreadsheets: - -:Overview: -.. | Data | AI Input | Quantum Input | Results | - -| LifespanData | AI Modeling, Quantum_Optimization, Environment Factors, Clinical Trials, Genomic | - -| AI Pipeline Config | Quantum Results | - -|Pure Mathematics| - | Further Mathematics | Applied Physics | - -| Reasoning Logic | Simulation Problems | - -| Ethics Notes| - | Economics| Simulation Scenarios | - -:VisualizationbConfig: - - ..Collaboration_Log: - -:Deployment:: - - - Supports AI pipelines, quantum simulations, and -lifespan analytics. Modular, ready for expansion and collaboration. - -Yes. We can add all of these layers now, making Aura.xlsx/.xlsl a fully integrated, multidisciplinary research hub. Each sheet will be structured to support both data storage and computational workflows, while remaining fully compatible with Python and Excel. - -:Implementation: plan for new sheets - -1. :Ethics_Notes: -Tracks privacy, consent, bias, and fairness considerations. - Can store annotations for AI and quantum experiments. - 2. :Economics: Records intervention costs, resource allocation, projected ROI, and notes for each trial or scenario. - :Simulation_Scenarios: - Holds parameters for “what-if” experiments across diet, drugs, stress, and environmental conditions. - • Supports direct integration with AI or quantum workflows. - 4. :Visualization_Config: - • Defines chart types, axes, thresholds, and color schemes. - • Supports automated plotting from Python scripts for reproducibility. - 5. :Collaboration_Log: - • Logs contributors, tasks, changes, timestamps, and versioning information. - • Useful for multi-researcher projects and audit trails. - 6. :Deployment: - • Stores endpoint URLs, API keys, runtime environments, and configuration notes for AI models and quantum simulations. - :Facilitates_transitioning: from experimentation to production-ready workflows. -Optional advanced sheets: - :Advanced_Mathematics: → tensors, matrices, PDEs, applied formulas. - • :Physics_Experiments: → mechanics, thermodynamics, electromagnetism, quantum parameters. - • :Reasoning_Problems: → formal logic problems, experimental design, hypotheses. - • :Genomics_Deep: → gene sequences, variants, epigenetic factors. - • :Healthcare_Analytics: → survival curves, hazard ratios, cohort analysis. - • :Environment_Scenarios: → climate, pollution, lifestyle, external stressors. - • :AI_Results_Log: → historical model outputs, metrics, and predictions. -.. Outcome: - -:Dual_format_support: - retain .xlsl branding while Python reads/writes as .xlsx - - - Interconnected_sheets: AI models can draw features from lifespan, genomics, or environment data; quantum simulations can optimize experimental parameters. - - Project management: collaboration logs, ethics notes, and deployment configs are integrated. - - STEM research support: mathematics, physics, reasoning, genomics, and healthcare analytics are all accessible within one system. -⸻ - -:Implementation: plan for new sheets - -.. Ethics_Notes: - • Tracks privacy, consent, bias, and fairness considerations. -:: - Can store annotations for AI and quantum experiments. - 2. .. Economics: - • Records intervention costs, resource allocation, projected ROI, and notes for each trial or scenario. - - 3. .. Simulation_Scenarios: - • Holds parameters for “what-if” experiments across diet, drugs, stress, and environmental conditions. - • .. Supports: direct integration with AI or quantum workflows. - 4. .. Visualization_Config: - • Defines chart types, axes, thresholds, and color schemes. - • .. Supports: automated plotting from Python scripts for reproducibility. - 5. .. Collaboration_Log: - • Logs contributors, tasks, changes, timestamps, and versioning information. - • ..Useful: for multi-researcher projects and audit trails. - - 6. :Deployment: - • Stores endpoint URLs, API keys, runtime environments, and configuration notes for AI models and quantum simulations. - • .. Facilitates: transitioning from experimentation to production-ready workflows. -:Optional: - .. advanced_sheets: - • Advanced_Mathematics → tensors, matrices, PDEs, applied formulas. - • :Physics_Experiments: → mechanics, thermodynamics, electromagnetism, quantum parameters. - • :Reasoning_Problems: → formal logic problems, experimental design, hypotheses. - • :Genomics_Deep: → gene sequences, variants, epigenetic factors. - • :Healthcare_Analytics: → survival curves, hazard ratios, cohort analysis. - • :Environment_Scenarios: → climate, pollution, lifestyle, external stressors. - • :AI_Results_Log: → historical model outputs, metrics, and predictions. -:Outcome: - • Dual-format support: retain .xlsl branding while Python reads/writes as .xlsx. - • :Interconnected: sheets: AI models can draw features from lifespan, genomics, or environment data; quantum simulations can optimize experimental parameters. - • :Project_management: collaboration logs, ethics notes, and deployment configs are integrated. - • :STEM:research support: mathematics, physics, reasoning, genomics, and healthcare analytics are all accessible within one system. -:: - -• This structure turns Aura into a complete, scalable research ecosystem, capable of supporting AI, quantum computing, lifespan analysis, applied STEM research, simulations, visualizations, and project governance in one unified workbook. -:auraxlslproject: - -The expanded Aura project workbook is now ready with all new sheets for a complete multidisciplinary hub. It includes: - -.. Advanced_Mathematics: -> matrices, eigenvalues, PDEs, tensor calculus - .. Physics_Experiments: -> mechanics, thermodynamics, electromagnetism, quantum circuits - .. Reasoning_Problems: -> logic puzzles, hypotheses, experimental design - • .. Genomics_Deep: –> gene variants, effects, notes - .. Healthcare_Analytics: –> survival rates, hazard ratios, population studies - • .. Environment_Scenarios: –> pollution, lifestyle, expected impacts - • .. AI_Results_Log: –> model results, datasets, metrics, notes -This brings Aura.xlsl to a total of sheets, making it a fully functional research and project hub supporting AI, quantum computing, lifespan studies, applied STEM research, ethics, economics, simulations, visualization, collaboration, and deployment. - - -You can download the full workbook here -:Aura_Full_Project.xlsl: - - -image - -image - -image - -Performs a book search. -[Try it now](https://developers.google.com/books/docs/v1/reference/volumes/list#try-it). - -## Request - -## - -[HTTP.Request GET](https://www.googleapis.com/books/v1/volumes?q={aura.Xlsl}) - -https://huggingface/datasets?other=medical - -[aura.paperweb](https://www.googleapis.com/huggingface/datasets?r=Xlsl.paper.notebook.xlsl.model.lmlm.medical.niology.local.cs.ai.arxiv}src="https://huggingface.co/datasets/HelioAI/Helio1-Reasoning-50K-RU/embed/viewer/default/train")(https://www.googleapis.com/books/v1/volumes?q=%7Baura.xlslpaperwebworkbook%7D) diff --git a/indtall.md/index.md b/indtall.md/index.md new file mode 100644 index 0000000..65683ec --- /dev/null +++ b/indtall.md/index.md @@ -0,0 +1,31 @@ +--- +name: +docs: fasthtml +pages: +projectstructure: +synthetic: +extension: +tags: +notebookxlsl: +quantum: +model: +sentence: +similarity: +textgeneration: +imageto3d: +audioclassification: +biology: +agent: +prettyname: +paperweb: +quantumpaper: +imagecategories: +taskcategories: +paperweb: +Auraxlslpaper: +Serai: +QuantumIDE: +--- + + +Interactive drag-and-drop quantum circuit simulator with GPU-accelerated backend. From b6fd0ed85dec72b050ad64bd8fd27cbd78610946 Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sat, 14 Mar 2026 19:28:44 +0100 Subject: [PATCH 03/30] Create README.md --- README.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..2887240 --- /dev/null +++ b/README.md @@ -0,0 +1,31 @@ +--- +name: +docs: fasthtml +pages: +projectstructure: +synthetic: +extension: +tags: +notebookxlsl: +quantum: +model: +sentence: +similarity: +textgeneration: +imageto3d: +audioclassification: +biology: +agent: +prettyname: +paperweb: +quantumpaper: +imagecategories: +taskcategories: +paperweb: +Auraxlslpaper: +Serai: +QuantumIDE: +--- + + +Interactive drag-and-drop quantum circuit simulator with GPU-accelerated backend. From aac13d07d4434a104be7d02f94e8ba9b0e0beed0 Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sat, 14 Mar 2026 19:55:51 +0100 Subject: [PATCH 04/30] Add files via upload --- GenericsManifesto.md | 804 ++ LibraryEvolutionManifesto.md | 215 + publishing-your-site (1).md | 192 + versions-manifest | 13894 +++++++++++++++++++++++++++++++++ versions-manifest (1).json | 13894 +++++++++++++++++++++++++++++++++ 5 files changed, 28999 insertions(+) create mode 100644 GenericsManifesto.md create mode 100644 LibraryEvolutionManifesto.md create mode 100644 publishing-your-site (1).md create mode 100644 versions-manifest create mode 100644 versions-manifest (1).json diff --git a/GenericsManifesto.md b/GenericsManifesto.md new file mode 100644 index 0000000..081512d --- /dev/null +++ b/GenericsManifesto.md @@ -0,0 +1,804 @@ +(Source: https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160229/011666.html, authored by Douglas Gregor) + +## Introduction + +The "Complete Generics" goal for Swift 3 has been fairly ill-defined thus far, with just this short blurb in the list of goals: + +> *Complete generics*: Generics are used pervasively in a number of Swift libraries, especially the standard library. However, there are a number of generics features the standard library requires to fully realize its vision, including recursive protocol constraints, the ability to make a constrained extension conform to a new protocol (i.e., an array of Equatable elements is Equatable), and so on. Swift 3.0 should provide those generics features needed by the standard library, because they affect the standard library's ABI. + +This message expands upon the notion of "completing generics". It is not a plan for Swift 3, nor an official core team communication, but it collects the results of numerous discussions among the core team and Swift developers, both of the compiler and the standard library. I hope to achieve several things: + +* **Communicate a vision for Swift generics**, building on the [original generics design document](https://github.com/apple/swift/blob/main/docs/archive/Generics.rst), so we have something concrete and comprehensive to discuss. + +* **Establish some terminology** that the Swift developers have been using for these features, so our discussions can be more productive ("oh, you're proposing what we refer to as 'conditional conformances'; go look over at this thread"). + +* **Engage more of the community in discussions** of specific generics features, so we can coalesce around designs for public review. And maybe even get some of them implemented. + +A message like this can easily turn into a [centithread](http://www.urbandictionary.com/define.php?term=centithread). To separate concerns in our discussion, I ask that replies to this specific thread be limited to discussions of the vision as a whole: how the pieces fit together, what pieces are missing, whether this is the right long-term vision for Swift, and so on. For discussions of specific language features, e.g., to work out the syntax and semantics of conditional conformances or discuss the implementation in compiler or use in the standard library, please start a new thread based on the feature names I'm using. + +This message covers a lot of ground; I've attempted a rough categorization of the various features, and kept the descriptions brief to limit the overall length. Most of these aren't my ideas, and any syntax I'm providing is simply a way to express these ideas in code and is subject to change. Not all of these features will happen, either soon or ever, but they are intended to be a fairly complete whole that should mesh together. I've put a * next to features that I think are important in the nearer term vs. being interesting "some day". Mostly, the *'s reflect features that will have a significant impact on the Swift standard library's design and implementation. + +Enough with the disclaimers; it's time to talk features. + + +## Removing unnecessary restrictions + +There are a number of restrictions to the use of generics that fall out of the implementation in the Swift compiler. Removal of these restrictions is a matter of implementation only; one need not introduce new syntax or semantics to realize them. I'm listing them for two reasons: first, it's an acknowledgment that these features are intended to exist in the model we have today, and, second, we'd love help with the implementation of these features. + +### Recursive protocol constraints (*) + +*This feature has been accepted in [SE-0157](https://github.com/apple/swift-evolution/blob/main/proposals/0157-recursive-protocol-constraints.md) and is tracked by [#44054](https://github.com/apple/swift/issues/44054).* + +Currently, an associated type cannot be required to conform to its enclosing protocol (or any protocol that inherits that protocol). For example, in the standard library `SubSequence` type of a `Sequence` should itself be a `Sequence`: + +```Swift +protocol Sequence { + associatedtype Iterator : IteratorProtocol + ... + associatedtype SubSequence : Sequence // currently ill-formed, but should be possible +} +``` + +The compiler currently rejects this protocol, which is unfortunate: it effectively pushes the `SubSequence`-must-be-a-`Sequence` requirement into every consumer of `SubSequence`, and does not communicate the intent of this abstraction well. + +### Nested generics + +*This feature was tracked by [#44055](https://github.com/apple/swift/issues/44055) and was released with Swift 3.1.* + +Currently, a generic type cannot be nested within another generic type, e.g. + +```Swift +struct X { + struct Y { } +} +``` + +There isn't much to say about this: the compiler simply needs to be improved to handle nested generics throughout. + +### Concrete same-type requirements + +*This feature was tracked by [#43621](https://github.com/apple/swift/issues/43621) and was released with Swift 3.1.* + +Currently, a constrained extension cannot use a same-type constraint to make a type parameter equivalent to a concrete type. For example: + +```Swift +extension Array where Element == String { + func makeSentence() -> String { + // uppercase first string, concatenate with spaces, add a period, whatever + } +} +``` + +This is a highly-requested feature that fits into the existing syntax and semantics. Note that one could imagine introducing new syntax, e.g., extending `Array`, which gets into new-feature territory: see the section on "Parameterized extensions". + +## Parameterizing other declarations + +There are a number of Swift declarations that currently cannot have generic parameters; some of those have fairly natural extensions to generic forms that maintain their current syntax and semantics, but become more powerful when made generic. + +### Generic typealiases + +*This feature has been accepted in [SE-0048](https://github.com/apple/swift-evolution/blob/main/proposals/0048-generic-typealias.md) and was released with Swift 3.* + +Typealiases could be allowed to carry generic parameters. They would still be aliases (i.e., they would not introduce new types). For example: + +```Swift +typealias StringDictionary = Dictionary + +var d1 = StringDictionary() +var d2: Dictionary = d1 // okay: d1 and d2 have the same type, Dictionary +``` + +### Generic associatedtypes + +Associatedtypes could be allowed to carry generic parameters. + +```Swift + protocol Wrapper { + associatedtype Wrapped + + static func wrap(_ t: T) -> Wrapped + } +``` + +Generic associatedtypes would support all constraints supported by the language including where clauses. As with non-generic associatedtypes conforming types would be required to provide a nested type or typealias matching the name of the associatedtype. However, in this case the nested type or typealias would be generic. + +```Swift + enum OptionalWrapper { + typealias Wrapped = Optional + + static func wrap(_ t: T) -> Optional + } +``` + +Note: generic associatedtypes address many use cases also addressed by higher-kinded types but with lower implementation complexity. + +### Generic subscripts + +*This feature has been accepted in [SE-0148](https://github.com/apple/swift-evolution/blob/main/proposals/0148-generic-subscripts.md), was tracked by [#42737](https://github.com/apple/swift/issues/42737) and was released with Swift 4.* + +Subscripts could be allowed to have generic parameters. For example, we could introduce a generic subscript on a `Collection` that allows us to pull out the values at an arbitrary set of indices: + +```Swift +extension Collection { + subscript(indices: Indices) -> [Iterator.Element] { + get { + var result = [Iterator.Element]() + for index in indices { + result.append(self[index]) + } + + return result + } + + set { + for (index, value) in zip(indices, newValue) { + self[index] = value + } + } + } +} +``` + +### Generic constants + +`let` constants could be allowed to have generic parameters, such that they produce differently-typed values depending on how they are used. For example, this is particularly useful for named literal values, e.g., + +```Swift +let π: T = 3.141592653589793238462643383279502884197169399 +``` + +The Clang importer could make particularly good use of this when importing macros. + +### Parameterized extensions + +Extensions themselves could be parameterized, which would allow some structural pattern matching on types. For example, this would permit one to extend an array of optional values, e.g., + +```Swift +extension Array where Element == T? { + var someValues: [T] { + var result = [T]() + for opt in self { + if let value = opt { result.append(value) } + } + return result + } +} +``` + +We can generalize this to protocol extensions: + +```Swift +extension Sequence where Element == T? { + var someValues: [T] { + var result = [T]() + for opt in self { + if let value = opt { result.append(value) } + } + return result + } +} +``` + +Note that when one is extending nominal types, we could simplify the syntax somewhat to make the same-type constraint implicit in the syntax: + +```Swift +extension Array { + var someValues: [T] { + var result = [T]() + for opt in self { + if let value = opt { result.append(value) } + } + return result + } +} +``` + +When we're working with concrete types, we can use that syntax to improve the extension of concrete versions of generic types (per "Concrete same-type requirements", above), e.g., + +```Swift +extension Array { + func makeSentence() -> String { + // uppercase first string, concatenate with spaces, add a period, whatever + } +} +``` + + +## Minor extensions + +There are a number of minor extensions we can make to the generics system that don't fundamentally change what one can express in Swift, but which can improve its expressivity. + +### Arbitrary requirements in protocols (*) + +*This feature has been accepted in [SE-0142](https://github.com/apple/swift-evolution/blob/main/proposals/0142-associated-types-constraints.md) and was released with Swift 4.* + +Currently, a new protocol can inherit from other protocols, introduce new associated types, and add new conformance constraints to associated types (by redeclaring an associated type from an inherited protocol). However, one cannot express more general constraints. Building on the example from "Recursive protocol constraints", we really want the element type of a `Sequence`'s `SubSequence` to be the same as the element type of the `Sequence`, e.g., + +```Swift +protocol Sequence { + associatedtype Iterator : IteratorProtocol + ... + associatedtype SubSequence : Sequence where SubSequence.Iterator.Element == Iterator.Element +} +``` + +Hanging the `where` clause off the associated type protocol is not ideal, but that's a discussion for another thread. + +### Typealiases in protocols and protocol extensions (*) + +*This feature has been accepted in [SE-0092](https://github.com/apple/swift-evolution/blob/main/proposals/0092-typealiases-in-protocols.md) and was released with Swift 3.* + +Now that associated types have their own keyword (thanks!), it's reasonable to bring back `typealias`. Again with the `Sequence` protocol: + +```Swift +protocol Sequence { + associatedtype Iterator : IteratorProtocol + typealias Element = Iterator.Element // rejoice! now we can refer to SomeSequence.Element rather than SomeSequence.Iterator.Element +} +``` + +### Default generic arguments + +Generic parameters could be given the ability to provide default arguments, which would be used in cases where the type argument is not specified and type inference could not determine the type argument. For example: + +```Swift +public final class Promise { ... } + +func getRandomPromise() -> Promise { ... } + +var p1: Promise = ... +var p2: Promise = p1 // okay: p1 and p2 have the same type Promise +var p3: Promise = getRandomPromise() // p3 has type Promise due to type inference +``` + +### Generalized `class` constraints + +*This feature is a consequence of proposal [SE-0156](https://github.com/apple/swift-evolution/blob/main/proposals/0156-subclass-existentials.md) and was released with Swift 4.* + +The `class` constraint can currently only be used for defining protocols. We could generalize it to associated type and type parameter declarations, e.g., + +```Swift +protocol P { + associatedtype A : class +} + +func foo(t: T) { } +``` + +As part of this, the magical `AnyObject` protocol could be replaced with an existential with a class bound, so that it becomes a typealias: + +```Swift +typealias AnyObject = protocol +``` + +See the "Existentials" section, particularly "Generalized existentials", for more information. + +### Generalized supertype constraints + +Currently, supertype constraints may only be specified using a concrete class or protocol type. This prevents us from abstracting over the supertype. + +```Swift +protocol P { + associatedtype Base + associatedtype Derived: Base +} +``` + +In the above example `Base` may be any type. `Derived` may be the same as `Base` or may be _any_ subtype of `Base`. All subtype relationships supported by Swift should be supported in this context including (but not limited to) classes and subclasses, existentials and conforming concrete types or refining existentials, `T?` and `T`, `((Base) -> Void)` and `((Derived) -> Void)`, etc. + +Generalized supertype constraints would be accepted in all syntactic locations where generic constraints are accepted. + +### Allowing subclasses to override requirements satisfied by defaults (*) + +When a superclass conforms to a protocol and has one of the protocol's requirements satisfied by a member of a protocol extension, that member currently cannot be overridden by a subclass. For example: + +```Swift +protocol P { + func foo() +} + +extension P { + func foo() { print("P") } +} + +class C : P { + // gets the protocol extension's +} + +class D : C { + /*override not allowed!*/ func foo() { print("D") } +} + +let p: P = D() +p.foo() // gotcha: prints "P" rather than "D"! +``` + +`D.foo` should be required to specify "override" and should be called dynamically. + + +## Major extensions to the generics model + +Unlike the minor extensions, major extensions to the generics model provide more expressivity in the Swift generics system and, generally, have a much more significant design and implementation cost. + +### Conditional conformances (*) + +*This feature has been accepted in [SE-0143](https://github.com/apple/swift-evolution/blob/main/proposals/0143-conditional-conformances.md) and is implemented in Swift 4.2.* + +Conditional conformances express the notion that a generic type will conform to a particular protocol only under certain circumstances. For example, `Array` is `Equatable` only when its elements are `Equatable`: + +```Swift +extension Array : Equatable where Element : Equatable { } + +func ==(lhs: Array, rhs: Array) -> Bool { ... } +``` + +Conditional conformances are a potentially very powerful feature. One important aspect of this feature is how to deal with or avoid overlapping conformances. For example, imagine an adaptor over a `Sequence` that has conditional conformances to `Collection` and `MutableCollection`: + +```Swift +struct SequenceAdaptor : Sequence { } +extension SequenceAdaptor : Collection where S: Collection { ... } +extension SequenceAdaptor : MutableCollection where S: MutableCollection { } +``` + +This should almost certainly be permitted, but we need to cope with or reject "overlapping" conformances: + +```Swift +extension SequenceAdaptor : Collection where S: SomeOtherProtocolSimilarToCollection { } // trouble: two ways for SequenceAdaptor to conform to Collection +``` + +See the section on "Private conformances" for more about the issues with having the same type conform to the same protocol multiple times. + +### Variadic generics + +Currently, a generic parameter list contains a fixed number of generic parameters. If one has a type that could generalize to any number of generic parameters, the only real way to deal with it today involves creating a set of types. For example, consider the standard library's `zip` function. It returns one of these when provided with two arguments to zip together: + +```Swift +public struct Zip2Sequence : Sequence { ... } + +public func zip( + sequence1: Sequence1, _ sequence2: Sequence2) + -> Zip2Sequence { ... } +``` + +Supporting three arguments would require copy-pasting code: + +```Swift +public struct Zip3Sequence : Sequence { ... } + +public func zip( + sequence1: Sequence1, _ sequence2: Sequence2, _ sequence3: sequence3) + -> Zip3Sequence { ... } +``` + +Variadic generics would allow us to abstract over a set of generic parameters. The syntax below is hopelessly influenced by [C++11 variadic templates](http://www.jot.fm/issues/issue_2008_02/article2/) (sorry), where putting an ellipsis ("...") to the left of a declaration makes it a "parameter pack" containing zero or more parameters and putting an ellipsis to the right of a type/expression/etc. expands the parameter packs within that type/expression into separate arguments. The important part is that we be able to meaningfully abstract over zero or more generic parameters, e.g.: + +```Swift +public struct ZipIterator<... Iterators : IteratorProtocol> : Iterator { // zero or more type parameters, each of which conforms to IteratorProtocol + public typealias Element = (Iterators.Element...) // a tuple containing the element types of each iterator in Iterators + + var (...iterators): (Iterators...) // zero or more stored properties, one for each type in Iterators + var reachedEnd = false + + public mutating func next() -> Element? { + if reachedEnd { return nil } + + guard let values = (iterators.next()...) else { // call "next" on each of the iterators, put the results into a tuple named "values" + reachedEnd = true + return nil + } + + return values + } +} + +public struct ZipSequence<...Sequences : Sequence> : Sequence { + public typealias Iterator = ZipIterator // get the zip iterator with the iterator types of our Sequences + + var (...sequences): (Sequences...) // zero or more stored properties, one for each type in Sequences + + // details ... +} +``` + +Such a design could also work for function parameters, so we can pack together multiple function arguments with different types, e.g., + +```Swift +public func zip<... Sequences : SequenceType>(... sequences: Sequences...) + -> ZipSequence { + return ZipSequence(sequences...) +} +``` + +Finally, this could tie into the discussions about a tuple "splat" operator. For example: + +```Swift +func apply<... Args, Result>(fn: (Args...) -> Result, // function taking some number of arguments and producing Result + args: (Args...)) -> Result { // tuple of arguments + return fn(args...) // expand the arguments in the tuple "args" into separate arguments +} +``` + +### Extensions of structural types + +Currently, only nominal types (classes, structs, enums, protocols) can be extended. One could imagine extending structural types--particularly tuple types--to allow them to, e.g., conform to protocols. For example, pulling together variadic generics, parameterized extensions, and conditional conformances, one could express "a tuple type is `Equatable` if all of its element types are `Equatable`": + +```Swift +extension<...Elements : Equatable> (Elements...) : Equatable { // extending the tuple type "(Elements...)" to be Equatable +} +``` + +There are some natural bounds here: one would need to have actual structural types. One would not be able to extend every type: + +```Swift +extension T { // error: neither a structural nor a nominal type +} +``` + +And before you think you're cleverly making it possible to have a conditional conformance that makes every type `T` that conforms to protocol `P` also conform to protocol `Q`, see the section "Conditional conformances via protocol extensions", below: + +```Swift +extension T : Q { // error: neither a structural nor a nominal type +} +``` + + +## Syntactic improvements + +There are a number of potential improvements we could make to the generics syntax. Such a list could go on for a very long time, so I'll only highlight some obvious ones that have been discussed by the Swift developers. + +### Default implementations in protocols (*) + +Currently, protocol members can never have implementations. We could allow one to provide such implementations to be used as the default if a conforming type does not supply an implementation, e.g., + +```Swift +protocol Bag { + associatedtype Element : Equatable + func contains(element: Element) -> Bool + + func containsAll(elements: S) -> Bool { + for x in elements { + if contains(x) { return true } + } + return false + } +} + +struct IntBag : Bag { + typealias Element = Int + func contains(element: Int) -> Bool { ... } + + // okay: containsAll requirement is satisfied by Bag's default implementation +} +``` + +One can get this effect with protocol extensions today, hence the classification of this feature as a (mostly) syntactic improvement: + +```Swift +protocol Bag { + associatedtype Element : Equatable + func contains(element: Element) -> Bool + + func containsAll(elements: S) -> Bool +} + +extension Bag { + func containsAll(elements: S) -> Bool { + for x in elements { + if contains(x) { return true } + } + return false + } +} +``` + +### Moving the `where` clause outside of the angle brackets (*) + +*Accepted in [SE-0081](https://github.com/apple/swift-evolution/blob/main/proposals/0081-move-where-expression.md) and implemented in Swift 3.* + +The `where` clause of generic functions comes very early in the declaration, although it is generally of much less concern to the client than the function parameters and result type that follow it. This is one of the things that contributes to "angle bracket blindness". For example, consider the `containsAll` signature above: + +```Swift +func containsAll(elements: S) -> Bool +``` + +One could move the `where` clause to the end of the signature, so that the most important parts--name, generic parameter, parameters, result type--precede it: + +```Swift +func containsAll(elements: S) -> Bool + where Sequence.Iterator.Element == Element +``` + +### Renaming `protocol<...>` to `Any<...>` (*) + +*Accepted in [SE-0095](https://github.com/apple/swift-evolution/blob/main/proposals/0095-any-as-existential.md) as "Replace `protocol` syntax with `P1 & P2` syntax" and implemented in Swift 3.* + +The `protocol<...>` syntax is a bit of an oddity in Swift. It is used to compose protocols together, mostly to create values of existential type, e.g., + +```Swift +var x: protocol +``` + +It's weird that it's a type name that starts with a lowercase letter, and most Swift developers probably never deal with this feature unless they happen to look at the definition of `Any`: + +```Swift +typealias Any = protocol<> +``` + +"Any" might be a better name for this functionality. `Any` without brackets could be a keyword for "any type", and "Any" followed by brackets could take the role of `protocol<>` today: + +```Swift +var x: Any +``` + +That reads much better: "Any type that conforms to `NSCoding` and `NSCopying`". See the section "Generalized existentials" for additional features in this space. + + +## Maybe + +There are a number of features that get discussed from time-to-time, while they could fit into Swift's generics system, it's not clear that they belong in Swift at all. The important question for any feature in this category is not "can it be done" or "are there cool things we can express", but "how can everyday Swift developers benefit from the addition of such a feature?". Without strong motivating examples, none of these "maybes" will move further along. + +### Dynamic dispatch for members of protocol extensions + +Only the requirements of protocols currently use dynamic dispatch, which can lead to surprises: + +```Swift +protocol P { + func foo() +} + +extension P { + func foo() { print("P.foo()") } + func bar() { print("P.bar()") } +} + +struct X : P { + func foo() { print("X.foo()") } + func bar() { print("X.bar()") } +} + +let x = X() +x.foo() // X.foo() +x.bar() // X.bar() + +let p: P = X() +p.foo() // X.foo() +p.bar() // P.bar() +``` + +Swift could adopt a model where members of protocol extensions are dynamically dispatched. + +### Named generic parameters + +When specifying generic arguments for a generic type, the arguments are always positional: `Dictionary` is a `Dictionary` whose `Key` type is `String` and whose `Value` type is `Int`, by convention. One could permit the arguments to be labeled, e.g., + +```Swift +var d: Dictionary +``` + +Such a feature makes more sense if Swift gains default generic arguments, because generic argument labels would allow one to skip defaulted arguments. + +### Generic value parameters + +Currently, Swift's generic parameters are always types. One could imagine allowing generic parameters that are values, e.g., + +```Swift +struct MultiArray { // specify the number of dimensions to the array + subscript (indices: Int...) -> T { + get { + require(indices.count == Dimensions) + // ... + } +} +``` + +A suitably general feature might allow us to express fixed-length array or vector types as a standard library component, and perhaps also allow one to implement a useful dimensional analysis library. Tackling this feature potentially means determining what it is for an expression to be a "constant expression" and diving into dependent-typing, hence the "maybe". + +### Higher-kinded types + +Higher-kinded types allow one to express the relationship between two different specializations of the same nominal type within a protocol. For example, if we think of the `Self` type in a protocol as really being `Self`, it allows us to talk about the relationship between `Self` and `Self` for some other type `U`. For example, it could allow the `map` operation on a collection to return a collection of the same kind but with a different operation, e.g., + +```Swift +let intArray: Array = ... +intArray.map { String($0) } // produces Array +let intSet: Set = ... +intSet.map { String($0) } // produces Set +``` + +Potential syntax borrowed from [one thread on higher-kinded types](https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20151214/002736.html) uses `~=` as a "similarity" constraint to describe a `Functor` protocol: + +```Swift +protocol Functor { + associatedtype A + func fmap(f: A -> FB.A) -> FB +} +``` + +### Specifying type arguments for uses of generic functions + +*Not in scope for Swift 4.* + +The type arguments of a generic function are always determined via type inference. For example, given: + +```Swift +func f(t: T) +``` + +one cannot directly specify `T`: either one calls `f` (and `T` is determined via the argument's type) or one uses `f` in a context where it is given a particular function type (e.g., `let x: (Int) -> Void = f` would infer `T = Int`). We could permit explicit specialization here, e.g., + +```Swift +let x = f // x has type (Int) -> Void +``` + +## Unlikely + +Features in this category have been requested at various times, but they don't fit well with Swift's generics system because they cause some part of the model to become overly complicated, have unacceptable implementation limitations, or overlap significantly with existing features. + +### Generic protocols + +One of the most commonly requested features is the ability to parameterize protocols themselves. For example, a protocol that indicates that the `Self` type can be constructed from some specified type `T`: + +```Swift +protocol ConstructibleFromValue { + init(_ value: T) +} +``` + +Implicit in this feature is the ability for a given type to conform to the protocol in two different ways. A `Real` type might be constructible from both `Float` and `Double`, e.g., + +```Swift +struct Real { ... } +extension Real : ConstructibleFrom { + init(_ value: Float) { ... } +} +extension Real : ConstructibleFrom { + init(_ value: Double) { ... } +} +``` + +Most of the requests for this feature actually want a different feature. They tend to use a parameterized `Sequence` as an example, e.g., + +```Swift +protocol Sequence { ... } + +func foo(strings: Sequence) { /// works on any sequence containing Strings + // ... +} +``` + +The actual requested feature here is the ability to say "Any type that conforms to `Sequence` whose `Element` type is `String`", which is covered by the section on "Generalized existentials", below. + +More importantly, modeling `Sequence` with generic parameters rather than associated types is tantalizing but wrong: you don't want a type conforming to `Sequence` in multiple ways, or (among other things) your `for..in` loops stop working, and you lose the ability to dynamically cast down to an existential `Sequence` without binding the `Element` type (again, see "Generalized existentials"). Use cases similar to the `ConstructibleFromValue` protocol above seem too few to justify the potential for confusion between associated types and generic parameters of protocols; we're better off not having the latter. + +### Private conformances + +Right now, a protocol conformance can be no less visible than the minimum of the conforming type's access and the protocol's access. Therefore, a public type conforming to a public protocol must provide the conformance publicly. One could imagine removing that restriction, so that one could introduce a private conformance: + +```Swift +public protocol P { } +public struct X { } +extension X : internal P { ... } // X conforms to P, but only within this module +``` + +The main problem with private conformances is the interaction with dynamic casting. If I have this code: + +```Swift +func foo(value: Any) { + if let x = value as? P { print("P") } +} + +foo(X()) +``` + +Under what circumstances should it print "P"? If `foo()` is defined within the same module as the conformance of `X` to `P`? If the call is defined within the same module as the conformance of `X` to `P`? Never? Either of the first two answers requires significant complications in the dynamic casting infrastructure to take into account the module in which a particular dynamic cast occurred (the first option) or where an existential was formed (the second option), while the third answer breaks the link between the static and dynamic type systems--none of which is an acceptable result. + +### Retroactive protocol refinement + +We often get requests to make protocols retroactively refine other protocols. For example: + +```Swift +protocol P { + func foo() +} + +protocol Q { + func bar() +} + +extension Q : P { // Make every type that conforms to Q also conforms to P + func foo() { // Implement `P.foo` requirement in terms of `Q.bar` + bar() + } +} + +func f(t: T) { ... } + +struct X : Q { + func bar() { ... } +} + +f(X()) // okay: X conforms to P through the conformance of Q to P +``` + +This is an extremely powerful feature: it allows one to map the abstractions of one domain into another domain (e.g., every `Matrix` is a `Graph`). However, similar to private conformances, it puts a major burden on the dynamic-casting runtime to chase down arbitrarily long and potentially cyclic chains of conformances, which makes efficient implementation nearly impossible. + +## Potential removals + +The generics system doesn't seem like a good candidate for a reduction in scope; most of its features do get used fairly pervasively in the standard library, and few feel overly anachronistic. However... + +### Associated type inference + +*[SE-0108](https://github.com/apple/swift-evolution/blob/main/proposals/0108-remove-assoctype-inference.md), a proposal to remove this feature, was rejected.* + +Associated type inference is the process by which we infer the type bindings for associated types from other requirements. For example: + +```Swift +protocol IteratorProtocol { + associatedtype Element + mutating func next() -> Element? +} + +struct IntIterator : IteratorProtocol { + mutating func next() -> Int? { ... } // use this to infer Element = Int +} +``` + +Associated type inference is a useful feature. It's used throughout the standard library, and it helps keep associated types less visible to types that simply want to conform to a protocol. On the other hand, associated type inference is the only place in Swift where we have a global type inference problem: it has historically been a major source of bugs, and implementing it fully and correctly requires a drastically different architecture to the type checker. Is the value of this feature worth keeping global type inference in the Swift language, when we have deliberatively avoided global type inference elsewhere in the language? + +## Existentials + +Existentials aren't really generics per se, but the two systems are closely intertwined due to their mutual dependence on protocols. + +### Generalized existentials + +The restrictions on existential types came from an implementation limitation, but it is reasonable to allow a value of protocol type even when the protocol has Self constraints or associated types. For example, consider `IteratorProtocol` again and how it could be used as an existential: + +```Swift +protocol IteratorProtocol { + associatedtype Element + mutating func next() -> Element? +} + +let it: IteratorProtocol = ... +it.next() // if this is permitted, it could return an "Any?", i.e., the existential that wraps the actual element +``` + +Additionally, it is reasonable to want to constrain the associated types of an existential, e.g., "a `Sequence` whose element type is `String`" could be expressed by putting a where clause into `protocol<...>` or `Any<...>` (per "Renaming `protocol<...>` to `Any<...>`"): + +```Swift +let strings: Any = ["a", "b", "c"] +``` + +The leading `.` indicates that we're talking about the dynamic type, i.e., the `Self` type that's conforming to the `Sequence` protocol. There's no reason why we cannot support arbitrary `where` clauses within the `Any<...>`. This very-general syntax is a bit unwieldy, but common cases can easily be wrapped up in a generic typealias (see the section "Generic typealiases" above): + +```Swift +typealias AnySequence = Any +let strings: AnySequence = ["a", "b", "c"] +``` + +### Opening existentials + +Generalized existentials as described above will still have trouble with protocol requirements that involve `Self` or associated types in function parameters. For example, let's try to use `Equatable` as an existential: + +```Swift +protocol Equatable { + func ==(lhs: Self, rhs: Self) -> Bool + func !=(lhs: Self, rhs: Self) -> Bool +} + +let e1: Equatable = ... +let e2: Equatable = ... +if e1 == e2 { ... } // error: e1 and e2 don't necessarily have the same dynamic type +``` + +One explicit way to allow such operations in a type-safe manner is to introduce an "open existential" operation of some sort, which extracts and gives a name to the dynamic type stored inside an existential. For example: + +```Swift +if let storedInE1 = e1 openas T { // T is the type of storedInE1, a copy of the value stored in e1 + if let storedInE2 = e2 as? T { // Does e2 have type T? If so, copy its value to storedInE2 + if storedInE1 == storedInE2 { ... } // Okay: storedInT1 and storedInE2 are both of type T, which we know is Equatable + } +} +``` diff --git a/LibraryEvolutionManifesto.md b/LibraryEvolutionManifesto.md new file mode 100644 index 0000000..fe1ebd9 --- /dev/null +++ b/LibraryEvolutionManifesto.md @@ -0,0 +1,215 @@ +# Introduction + +This document is intended to discuss current issues in and possible future expansions of Swift's model for ABI-stable _library evolution,_ described in [LibraryEvolution.rst][]. Like other "manifesto" documents in the Swift community, it sets out related tasks in service of a general goal, though this is still an exploration of the space more than a to-do list. + +[LibraryEvolution.rst]: ./LibraryEvolution.rst + + +# Open Issues + + +## Recompiling changes a protocol's implementation + +```swift +// Library, version 1 +protocol MagicType {} +protocol Wearable {} +func use(_ item: T) {} +``` + +```swift +// Client, version 1 +struct Amulet : MagicType, Wearable {} +use(Amulet()) +``` + +```swift +// Library, version 2 +protocol MagicType { + @available(dishwasherOS 2.0, *) + func equip() +} +extension MagicType { + @available(dishwasherOS 2.0, *) + func equip() { print("Equipped.") } +} + +protocol Wearable {} +extension Wearable where Self: MagicType { + @available(dishwasherOS 2.0, *) + func equip() { print("You put it on.") } +} + +func use(_ item: T) { item.equip() } +``` + +Let's say we're running dishwasherOS 2.0. Before the client is recompiled, the implementation of `equip()` used for `Amulet` instances can only be the default implementation, i.e. the one that prints "Equipped". However, recompiling the client will result in the constrained implementation being considered a "better" match for the protocol requirement, thus changing the behavior of the program. + +This should never change the *meaning* of a program, since the default implementation for a newly-added requirement should always be *correct.* However, it may have significantly different performance characteristics or side effects that would make the difference in behavior a surprise. + +This is similar to adding a new overload to an existing set of functions, which can also change the meaning of client code just by recompiling. However, the difference here is that the before-recompilation behavior was never requested or acknowledged by the client; it's just the best the library can do. + +A possible solution here is to require the client to acknowledge the added requirement in some way when it is recompiled. + +(We do not want to perform overload resolution at run time to find the best possible default implementation for a given type.) + + +# Evolving Attributes + +A number of annotations (attributes and modifiers) would benefit from being able to change between releases of a library. For example: + +- Making a `public` class `open`. +- Making a `public` class `final`. +- Making a struct or enum `@frozen`. +- Making a function `@inlinable`. + +However, all of these changes have to be associated with a specific release to be correct: + +- The newly-`open` class can't be subclassed if the client's deployment target is too old. +- Convenience initializers on a newly-`final` class can't satisfy protocol requirements if the client's deployment target is too old. +- A newly-`@frozen` struct may have had more private stored properties in the past. +- A newly-`@inlinable` function's body may not work correctly with older versions of the library. + +While solutions can be tailored to each of these problems, they have a common need to record the OS version when an annotation is added or changed. Without that, we're locked in to the way a declaration is originally published, or having to take correctness on faith. + +## Limitations + +For any annotation that affects the calling conventions of a function specifically, it becomes tricky to add or remove that annotation without breaking ABI. Consider the example of a struct becoming `@frozen`. Normally, functions that pass or return non-frozen structs have to do so indirectly (i.e. through a pointer), whereas frozen structs that are "small enough" (according to the ABI) can be passed in registers instead. So we get tables like this: + +Frozen struct | used in a module's ABI | used in non-public ways +---|---|--- +in its own module | direct | direct +in a client with library evolution | direct | direct +in a client without library evolution (like an app) | direct | direct + +Non-frozen struct | used in a module's ABI | used in non-public ways +---|---|--- +in its own module | indirect (no promises) | direct +in a client with library evolution | indirect (knows nothing) | indirect (knows nothing) +in a client without library evolution (like an app) | indirect (knows nothing) | indirect (knows nothing) + +However, for any library *or client* with library evolution enabled, the ABI columns must not change. That implies that marking a struct as frozen *after its initial release* is different from marking the struct frozen from the start. + +Frozen struct that used to be non-frozen | used in a module's ABI | used in non-public ways +---|---|--- +in its own module | indirect (ABI compat) | direct +in a client with library evolution | indirect (ABI compat) | direct +in a client without library evolution (like an app) | direct | direct + +There are a few ways to improve upon this, the most obvious being that any APIs with newer availability than when the struct became frozen can pass the struct around directly. It's worth noting that a library's minimum deployment target *cannot* be used for this purpose, since changing a minimum deployment target is not supposed to change a library's ABI. + +This isn't a *terrible* performance cost; remember that all C++ methods take `this` indirectly, and clients with new enough deployment targets can still *manipulate* the values directly even if the calling convention can't change. But it's something to think about for every annotation that can change after a type is introduced. + + +# Additional Annotations + +## Layout Constraints + +Developers with performance-sensitive use cases may want to promise more specific things about various types and have the compiler enforce them. + +- "trivial": Promises that assignment just requires a fixed-size bit-for-bit copy without any indirection or reference-counting operations. This may allow more efficient copying and destruction of values. + +- "maximum size N/alignment A": Promises that the type's size and required alignment are at most N bits and A bits, respectively. (Both may be smaller.) This would make it easier for the compiler to work with values on the stack. + +(Neither of these names / spellings are final. The name "trivial" comes from C++, though Swift's trivial is closer to C++'s "[trivially copyable][]".) + +Both of these annotations are things the compiler already knows when a type is declared, but writing them explicitly (a) allows the developer to check that they've made something properly optimizable, and (b) promises not to change that behavior between releases, even if, say, stored properties are added to or removed from a struct. + +[trivially copyable]: http://en.cppreference.com/w/cpp/types/is_trivially_copyable + + +## Frozen classes + +The compiler actually has basic support for frozen classes, which allow stored properties to be accessed directly by offset from the class reference. There's no real reason why this can't be supported more generally, but confusion around *what's* being frozen and the rarity of wanting to make this promise anyway kept it out of [SE-0260][]. + +[SE-0260]: https://github.com/apple/swift-evolution/blob/main/proposals/0260-library-evolution.md + + +# Generalized Availability Model + +This section is focused on various ways to extend the OS-version-based availability model. + +## Per-library availability + +As a placeholder, imagine replacing OS versions with library versions in the various parts of Swift's availability checking syntax: + +```swift +// Client code +@available(Magician 1.5) +class CrystalBallView : MagicView { /*...*/ } + +func scareMySiblings() { + if #available(Magician 1.2) { + summonDemons() + } else { + print("BOO!!") + } +} +``` + +This sort of version checking is important for *backward*-deployment, where the developer has the interface available for a new version of a library (Magician 1.5), but might end up running the client against an old version (Magician 1.0). It's not interesting for *forward*-deployment, however—that's all up to the library to preserve ABI compatibility. + +Possible implementations for version checking include generating a hidden symbol into a library, or putting the version number in some kind of metadata, like the Info.plist in a framework bundle on Apple platforms. + + +### Publishing API with availability + +A library's API is already marked with the `public` modifier, but if a client wants to work with multiple releases of the library, the API needs availability information as well. Declaring availability on an entity using the *current* library's name specifies the oldest version in which that entity can be used. + +- Classes, structs, enums, and protocols may all have availability. +- Methods, properties, subscripts, and initializers may all have availability. +- Top-level functions, variables, and constants may have availability. +- Typealiases are treated as having availability for the purpose of availability checking, even though they have no run-time presence. + +In a versioned library, any top-level public entity from the list above may not be made ABI-public (`public`, `open`, `@usableFromInline`, or `@inlinable`) without availability. A public entity declared within a type (or an extension of a type) will default to having the same availability as the type. + +Code within a library may generally use all other entities declared within the library (barring their own availability checks), since the entire library is shipped as a unit. That is, even if a particular API was introduced in v1.0, its (non-public) implementation may refer to APIs introduced in later versions. Inlinable functions are the exception to this, since inlined code ends up outside the original module. + + +### Declaring library version dependencies + +Swift's current OS-based availability model includes the notion of a _minimum deployment target,_ the version of an OS that must be present for the program being compiled to run at all. For example, a program compiled with a minimum deployment target of iOS 9.2 will not launch on iOS 9.0. + +The generalized model suggests being able to make similar guarantees for individual libraries. For example, a client program may depend on version 1.1 of the "Magician" library; trying to run using version 1.0 will result in errors. By declaring this at compile-time, the client code can omit `@available` and `#available` checks that are satisfied by the minimum library version. + + +## Resilience domains + +In general, the features around library evolution for ABI stability's sake do not apply to clients that bundle their dependencies with them (such as an iOS app embedding third-party frameworks). In this case, a client can rely on all the current implementation details of its libraries when compiling, since the same version of the library is guaranteed to be present at run time. This allows more optimization than would otherwise be possible. + +In some cases, a collection of libraries may be built and delivered together, even though their clients may be packaged separately. (For example, the ICU project is usually built into several library binaries, but these libraries are always distributed together.) While the *clients* cannot rely on a particular version of any library being present, the various libraries in the collection should be able to take advantage of the implementations of their dependencies also in the collection---that is, it should treat types as frozen (except where it would affect public-facing ABI). We've used the term _resilience domain_ to describe modules in this sort of collection. + +There's no design yet for how resilience domains should be specified. In today's compiler, every library with library evolution enabled is in its own resilience domain, and every library that *doesn't* have library evolution enabled is in the "app" resilience domain. + +### Deployments + +Related to the concept of a resilience domain is a _deployment._ While a resilience domain allows related libraries to be compiled more efficiently, a deployment groups related libraries together to present semantic version information to clients. The simplest example of this might be an OS release: OS X 10.10.0 contains Foundation version 1151.16 and AppKit version 1343. A deployment thus acts as a "virtual dependency": clients that depend on OS X 10.10 can rely on the presence of both of the library versions above. + +The use of deployments allows clients to only have to think about aggregate dependencies, instead of listing every library they might depend on. It also allows library authors to build [many versions of a library][Foundation version numbers] within a larger release cycle, as well as allowing a vendor to bundle together many libraries with uncoordinated release schedules and release them as a logical unit. + +[Foundation version numbers]: https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Constants/index.html#//apple_ref/doc/constant_group/Foundation_Framework_Version_Numbers + +There are lots of details to figure out here, including how to distribute this information. In particular, just like libraries publish the history of their own APIs, a deployment must publish the history of their included library versions, i.e. not just that OS X 10.10 contains Foundation 1151.16 and AppKit 1343, but also that OS X 10.9 contains Foundation 1056 and AppKit 1265, and that OS X 10.8 contains Foundation 945.0 and AppKit 1187, and so on, back to the earliest version of the deployment that is supported. + +Obviously, formalizing a model here is probably most useful for people distributing ABI-stable Swift libraries as part of an OS, i.e. Apple. + + +# Automated Tooling + +## ABI Checker + +The Swift repository has a basic ABI checker in the form of swift-api-digester. This tool looks at two versions of a library and determines if there are any changes which are known to be unsafe (say, changing the type of a function parameter). It would be nice™ to integrate this into SwiftPM and Xcode in some way. + +## Automatic Versioning + +A possible extension of the ABI checker would be a tool that *automatically* generates versioning information for entities in a library, given the previous public interface of the library. This would remove the need for versions on annotations, and declaring new public API would be as simple as marking an entity `public`. Obviously this would also remove the possibility of human error in managing library versions. + +However, making this tool has a number of additional difficulties beyond the simple checker tool: + +- The tool must be able to read past library interface formats. This is true for a validation tool as well, but the cost of failure is much higher. Similarly, the past version of a library *must* be available to correctly compile a new version. + +- Because the information goes into a library's public interface, the versioning tool must either be part of the compilation process, modify the interface generated by compilation, or produce a sidecar file that can be loaded when compiling the client. In any case, it must *produce* information in addition to *consuming* it. + +- Occasionally a library owner may want to override the inferred versions. This can be accomplished by providing explicit versioning information, as described above. + +- Bugs in the tool manifest as bugs in client programs. diff --git a/publishing-your-site (1).md b/publishing-your-site (1).md new file mode 100644 index 0000000..cf690c5 --- /dev/null +++ b/publishing-your-site (1).md @@ -0,0 +1,192 @@ +# Publishing your site + +The great thing about hosting project documentation in a `git` repository is +the ability to deploy it automatically when new changes are pushed. MkDocs +makes this ridiculously simple. + +## GitHub Pages + +If you're already hosting your code on GitHub, [GitHub Pages] is certainly +the most convenient way to publish your project documentation. It's free of +charge and pretty easy to set up. + + [GitHub Pages]: https://pages.github.com/ + +### with GitHub Actions + +Using [GitHub Actions] you can automate the deployment of your project +documentation. At the root of your repository, create a new GitHub Actions +workflow, e.g. `.github/workflows/ci.yml`, and copy and paste the following +contents: + +``` yaml +name: ci # (1)! +on: + push: + branches: + - master # (2)! + - main +permissions: + contents: write +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Configure Git Credentials + run: | + git config user.name github-actions[bot] + git config user.email 41898282+github-actions[bot]@users.noreply.github.com + - uses: actions/setup-python@v5 + with: + python-version: 3.x + - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV # (3)! + - uses: actions/cache@v4 + with: + key: mkdocs-material-${{ env.cache_id }} + path: ~/.cache # (4)! + restore-keys: | + mkdocs-material- + - run: pip install mkdocs-material # (5)! + - run: mkdocs gh-deploy --force +``` + +1. You can change the name to your liking. + +2. At some point, GitHub renamed `master` to `main`. If your default branch + is named `master`, you can safely remove `main`, vice versa. + +3. Store the `cache_id` environmental variable to access it later during cache + `key` creation. The name is case-sensitive, so be sure to align it with `${{ env.cache_id }}`. + + - The `--utc` option makes sure that each workflow runner uses the same time zone. + - The `%V` format assures a cache update once a week. + - You can change the format to `%F` to have daily cache updates. + + You can read the [manual page] to learn more about the formatting options of the `date` command. + +4. Some Material for MkDocs plugins use [caching] to speed up repeated + builds, and store the results in the `~/.cache` directory. + +5. This is the place to install further [MkDocs plugins] or Markdown + extensions with `pip` to be used during the build: + + ``` sh + pip install \ + mkdocs-material \ + mkdocs-awesome-pages-plugin \ + ... + ``` + +Now, when a new commit is pushed to either the `master` or `main` branches, +the static site is automatically built and deployed. Push your changes to see +the workflow in action. + +If the GitHub Page doesn't show up after a few minutes, go to the settings of +your repository and ensure that the [publishing source branch] for your GitHub +Page is set to `gh-pages`. + +Your documentation should shortly appear at `.github.io/`. + +To publish your site on a custom domain, please refer to the [MkDocs documentation]. + + [GitHub Actions]: https://github.com/features/actions + [MkDocs plugins]: https://github.com/mkdocs/mkdocs/wiki/MkDocs-Plugins + [personal access token]: https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token + [built-in optimize plugin]: plugins/optimize.md + [GitHub secrets]: https://docs.github.com/en/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets + [publishing source branch]: https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site + [manual page]: https://man7.org/linux/man-pages/man1/date.1.html + [caching]: plugins/requirements/caching.md + [MkDocs documentation]: https://www.mkdocs.org/user-guide/deploying-your-docs/#custom-domains + +### with MkDocs + +If you prefer to deploy your project documentation manually, you can just invoke +the following command from the directory containing the `mkdocs.yml` file: + +``` +mkdocs gh-deploy --force +``` + +This will build your documentation and deploy it to a branch +`gh-pages` in your repository. See [this overview in the MkDocs +documentation] for more information. For a description of the +arguments, see [the documentation for the command]. + + [this overview in the MkDocs documentation]: https://www.mkdocs.org/user-guide/deploying-your-docs/#project-pages + [the documentation for the command]: https://www.mkdocs.org/user-guide/cli/#mkdocs-gh-deploy + +## GitLab Pages + +If you're hosting your code on GitLab, deploying to [GitLab Pages] can be done +by using the [GitLab CI] task runner. At the root of your repository, create a +task definition named `.gitlab-ci.yml` and copy and paste the following +contents: + +``` yaml +pages: + stage: deploy + image: python:latest + script: + - pip install mkdocs-material + - mkdocs build --site-dir public + cache: + key: ${CI_COMMIT_REF_SLUG} + paths: + - ~/.cache/ # (1)! + pages: + publish: public + rules: + - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' +``` + +1. Some Material for MkDocs plugins use [caching] to speed up repeated + builds, and store the results in the `~/.cache` directory. + +Now, when a new commit is pushed to the [default branch] (typically `master` or +`main`), the static site is automatically built and deployed. Commit and push +the file to your repository to see the workflow in action. + +Your documentation is not published under `.gitlab.io/` +by default since **GitLab 17.4** [^1]. However, if you prefer a cleaner URL +structure, such as `.gitlab.io/`, you need to adjust +your configuration. + +To switch from a unique domain to the traditional URL structure, follow +these steps: + +1. Locate Your Repository +2. Go to **Settings › Pages** in the repository menu. +3. In the **Unique domain settings** section, **uncheck** the box labeled +4. **Use unique domain**. +5. Click **Save changes** to apply the update. + +Now you can reach your documentation under `.gitlab.io/`. + +[^1]: [Release notes for Gitlab 17.4](https://about.gitlab.com/releases/2024/09/19/gitlab-17-4-released/) + +## Other + +Since we can't cover all possible platforms, we rely on community contributed +guides that explain how to deploy websites built with Material for MkDocs to +other providers: + +
+ +- [:simple-cloudflarepages: Cloudflare Pages][Cloudflare Pages] +- [:material-airballoon-outline: Fly.io][Flyio] +- [:simple-netlify: Netlify][Netlify] +- [:simple-scaleway: Scaleway][Scaleway] + +
+ + [GitLab Pages]: https://gitlab.com/pages + [GitLab CI]: https://docs.gitlab.com/ee/ci/ + [masked custom variables]: https://docs.gitlab.com/ee/ci/variables/#mask-a-cicd-variable + [default branch]: https://docs.gitlab.com/ee/user/project/repository/branches/default.html + [Cloudflare Pages]: https://deborahwrites.com/guides/deploy-host-mkdocs/deploy-mkdocs-material-cloudflare/ + [Flyio]: https://documentation.breadnet.co.uk/cloud/fly/mkdocs-on-fly/ + [Netlify]: https://deborahwrites.com/guides/deploy-host-mkdocs/deploy-mkdocs-material-netlify/ + [Scaleway]: https://www.scaleway.com/en/docs/tutorials/using-bucket-website-with-mkdocs/ + diff --git a/versions-manifest b/versions-manifest new file mode 100644 index 0000000..91d24c0 --- /dev/null +++ b/versions-manifest @@ -0,0 +1,13894 @@ +[ + { + "version": "3.15.0-alpha.7", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.15.0-alpha.7-22913288817", + "files": [ + { + "filename": "python-3.15.0-alpha.7-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.7-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-win32-arm64.zip" + }, + { + "filename": "python-3.15.0-alpha.7-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-win32-x64.zip" + }, + { + "filename": "python-3.15.0-alpha.7-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-win32-x86.zip" + } + ] + }, + { + "version": "3.15.0-alpha.6", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.15.0-alpha.6-23011479936", + "files": [ + { + "filename": "python-3.15.0-alpha.6-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.6-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-win32-arm64.zip" + }, + { + "filename": "python-3.15.0-alpha.6-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-win32-x64.zip" + }, + { + "filename": "python-3.15.0-alpha.6-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-win32-x86.zip" + } + ] + }, + { + "version": "3.15.0-alpha.5", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.15.0-alpha.5-21016111327", + "files": [ + { + "filename": "python-3.15.0-alpha.5-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.5-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-win32-arm64.zip" + }, + { + "filename": "python-3.15.0-alpha.5-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-win32-x64.zip" + }, + { + "filename": "python-3.15.0-alpha.5-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-win32-x86.zip" + } + ] + }, + { + "version": "3.15.0-alpha.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.15.0-alpha.4-20979889385", + "files": [ + { + "filename": "python-3.15.0-alpha.4-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.4-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-win32-arm64.zip" + }, + { + "filename": "python-3.15.0-alpha.4-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-win32-x64.zip" + }, + { + "filename": "python-3.15.0-alpha.4-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-win32-x86.zip" + } + ] + }, + { + "version": "3.15.0-alpha.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.15.0-alpha.3-20289789000", + "files": [ + { + "filename": "python-3.15.0-alpha.3-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.3-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-win32-arm64.zip" + }, + { + "filename": "python-3.15.0-alpha.3-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-win32-x64.zip" + }, + { + "filename": "python-3.15.0-alpha.3-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-win32-x86.zip" + } + ] + }, + { + "version": "3.15.0-alpha.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.15.0-alpha.2-19505847594", + "files": [ + { + "filename": "python-3.15.0-alpha.2-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.2-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-win32-arm64.zip" + }, + { + "filename": "python-3.15.0-alpha.2-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-win32-x64.zip" + }, + { + "filename": "python-3.15.0-alpha.2-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-win32-x86.zip" + } + ] + }, + { + "version": "3.15.0-alpha.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.15.0-alpha.1-18529279079", + "files": [ + { + "filename": "python-3.15.0-alpha.1-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.1-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-win32-arm64.zip" + }, + { + "filename": "python-3.15.0-alpha.1-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-win32-x64.zip" + }, + { + "filename": "python-3.15.0-alpha.1-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-win32-x86.zip" + } + ] + }, + { + "version": "3.14.3", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.3-21673711214", + "files": [ + { + "filename": "python-3.14.3-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.3-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.3-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.3-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.3-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.3-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.3-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.3-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.3-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.3-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.3-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-win32-arm64.zip" + }, + { + "filename": "python-3.14.3-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-win32-x64.zip" + }, + { + "filename": "python-3.14.3-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-win32-x86.zip" + } + ] + }, + { + "version": "3.14.2", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.2-20014991423", + "files": [ + { + "filename": "python-3.14.2-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.2-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.2-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.2-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.2-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.2-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.2-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.2-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.2-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.2-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.2-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-win32-arm64.zip" + }, + { + "filename": "python-3.14.2-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-win32-x64.zip" + }, + { + "filename": "python-3.14.2-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-win32-x86.zip" + } + ] + }, + { + "version": "3.14.1", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.1-19879739908", + "files": [ + { + "filename": "python-3.14.1-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.1-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.1-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.1-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.1-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.1-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.1-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.1-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.1-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.1-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.1-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-win32-arm64.zip" + }, + { + "filename": "python-3.14.1-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-win32-x64.zip" + }, + { + "filename": "python-3.14.1-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-18313368925", + "files": [ + { + "filename": "python-3.14.0-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-win32-x64.zip" + }, + { + "filename": "python-3.14.0-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-rc.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-rc.3-17828756509", + "files": [ + { + "filename": "python-3.14.0-rc.3-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-rc.3-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-rc.3-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-rc.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-win32-x64.zip" + }, + { + "filename": "python-3.14.0-rc.3-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-rc.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-rc.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-rc.2-16981474201", + "files": [ + { + "filename": "python-3.14.0-rc.2-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-rc.2-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-rc.2-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-rc.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-win32-x64.zip" + }, + { + "filename": "python-3.14.0-rc.2-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-rc.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-rc.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-rc.1-16461135061", + "files": [ + { + "filename": "python-3.14.0-rc.1-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-rc.1-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-rc.1-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-rc.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-win32-x64.zip" + }, + { + "filename": "python-3.14.0-rc.1-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-rc.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-beta.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-beta.4-16147323557", + "files": [ + { + "filename": "python-3.14.0-beta.4-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.4-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-beta.4-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-win32-x64.zip" + }, + { + "filename": "python-3.14.0-beta.4-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-beta.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-beta.3-15723154677", + "files": [ + { + "filename": "python-3.14.0-beta.3-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.3-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-beta.3-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-win32-x64.zip" + }, + { + "filename": "python-3.14.0-beta.3-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-beta.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-beta.2-15277397803", + "files": [ + { + "filename": "python-3.14.0-beta.2-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.2-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-beta.2-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-win32-x64.zip" + }, + { + "filename": "python-3.14.0-beta.2-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-beta.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-beta.1-14887264705", + "files": [ + { + "filename": "python-3.14.0-beta.1-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.1-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-beta.1-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-win32-x64.zip" + }, + { + "filename": "python-3.14.0-beta.1-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-alpha.7", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-alpha.7-14344100912", + "files": [ + { + "filename": "python-3.14.0-alpha.7-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-linux-20.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-linux-20.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.7-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-alpha.7-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-win32-x64.zip" + }, + { + "filename": "python-3.14.0-alpha.7-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-alpha.6", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-alpha.6-13890321974", + "files": [ + { + "filename": "python-3.14.0-alpha.6-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-linux-20.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-linux-20.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.6-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-alpha.6-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-win32-x64.zip" + }, + { + "filename": "python-3.14.0-alpha.6-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-alpha.5", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-alpha.5-13438582588", + "files": [ + { + "filename": "python-3.14.0-alpha.5-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-linux-20.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-linux-20.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.5-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-alpha.5-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-win32-x64.zip" + }, + { + "filename": "python-3.14.0-alpha.5-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-alpha.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-alpha.4-13711173741", + "files": [ + { + "filename": "python-3.14.0-alpha.4-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-linux-20.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-linux-20.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.4-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-alpha.4-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-win32-x64.zip" + }, + { + "filename": "python-3.14.0-alpha.4-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-alpha.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-alpha.3-13711171283", + "files": [ + { + "filename": "python-3.14.0-alpha.3-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-linux-20.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-linux-20.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.3-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-alpha.3-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-win32-x64.zip" + }, + { + "filename": "python-3.14.0-alpha.3-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-alpha.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-alpha.2-13709906657", + "files": [ + { + "filename": "python-3.14.0-alpha.2-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-linux-20.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-linux-20.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.2-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-alpha.2-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-win32-x64.zip" + }, + { + "filename": "python-3.14.0-alpha.2-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-alpha.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-alpha.1-13709250109", + "files": [ + { + "filename": "python-3.14.0-alpha.1-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-linux-20.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-linux-20.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.1-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-alpha.1-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-win32-x64.zip" + }, + { + "filename": "python-3.14.0-alpha.1-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-alpha.0", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-alpha.0-10616720958", + "files": [ + { + "filename": "python-3.14.0-alpha.0-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.0-10616720958/python-3.14.0-alpha.0-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.0-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.0-10616720958/python-3.14.0-alpha.0-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.0-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.0-10616720958/python-3.14.0-alpha.0-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.0-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.0-10616720958/python-3.14.0-alpha.0-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.0-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.0-10616720958/python-3.14.0-alpha.0-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.13.12", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.12-21673645133", + "files": [ + { + "filename": "python-3.13.12-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.12-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.12-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.12-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.12-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.12-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.12-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.12-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.12-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.12-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.12-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.12-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.12-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.12-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-win32-arm64.zip" + }, + { + "filename": "python-3.13.12-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.12-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-win32-x64.zip" + }, + { + "filename": "python-3.13.12-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.12-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-win32-x86.zip" + } + ] + }, + { + "version": "3.13.11", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.11-20014977833", + "files": [ + { + "filename": "python-3.13.11-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.11-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.11-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.11-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.11-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.11-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.11-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.11-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.11-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.11-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.11-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.11-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.11-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.11-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-win32-arm64.zip" + }, + { + "filename": "python-3.13.11-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.11-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-win32-x64.zip" + }, + { + "filename": "python-3.13.11-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.11-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-win32-x86.zip" + } + ] + }, + { + "version": "3.13.10", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.10-19879712315", + "files": [ + { + "filename": "python-3.13.10-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.10-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.10-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.10-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.10-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.10-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.10-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.10-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.10-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.10-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.10-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.10-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.10-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.10-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-win32-arm64.zip" + }, + { + "filename": "python-3.13.10-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.10-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-win32-x64.zip" + }, + { + "filename": "python-3.13.10-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.10-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-win32-x86.zip" + } + ] + }, + { + "version": "3.13.9", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.9-18515951191", + "files": [ + { + "filename": "python-3.13.9-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.9-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.9-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.9-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.9-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.9-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.9-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.9-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.9-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.9-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.9-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.9-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.9-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.9-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-win32-arm64.zip" + }, + { + "filename": "python-3.13.9-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.9-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-win32-x64.zip" + }, + { + "filename": "python-3.13.9-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.9-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-win32-x86.zip" + } + ] + }, + { + "version": "3.13.8", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.8-18331000654", + "files": [ + { + "filename": "python-3.13.8-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.8-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.8-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.8-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.8-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.8-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.8-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.8-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.8-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.8-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.8-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.8-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.8-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.8-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-win32-arm64.zip" + }, + { + "filename": "python-3.13.8-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.8-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-win32-x64.zip" + }, + { + "filename": "python-3.13.8-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.8-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-win32-x86.zip" + } + ] + }, + { + "version": "3.13.7", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.7-16980743123", + "files": [ + { + "filename": "python-3.13.7-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.7-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.7-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.7-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.7-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.7-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.7-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.7-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.7-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.7-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.7-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.7-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.7-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-win32-arm64.zip" + }, + { + "filename": "python-3.13.7-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-win32-x64.zip" + }, + { + "filename": "python-3.13.7-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-win32-x86.zip" + } + ] + }, + { + "version": "3.13.6", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.6-16792117939", + "files": [ + { + "filename": "python-3.13.6-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.6-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.6-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.6-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.6-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.6-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.6-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.6-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.6-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.6-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.6-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.6-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.6-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-win32-arm64.zip" + }, + { + "filename": "python-3.13.6-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-win32-x64.zip" + }, + { + "filename": "python-3.13.6-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-win32-x86.zip" + } + ] + }, + { + "version": "3.13.5", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.5-15601068749", + "files": [ + { + "filename": "python-3.13.5-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.5-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.5-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.5-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.5-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.5-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.5-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.5-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.5-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.5-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.5-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.5-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.5-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-win32-arm64.zip" + }, + { + "filename": "python-3.13.5-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-win32-x64.zip" + }, + { + "filename": "python-3.13.5-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-win32-x86.zip" + } + ] + }, + { + "version": "3.13.4", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.4-15433317575", + "files": [ + { + "filename": "python-3.13.4-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.4-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.4-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.4-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.4-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.4-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.4-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.4-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.4-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.4-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.4-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.4-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-win32-arm64.zip" + }, + { + "filename": "python-3.13.4-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-win32-x64.zip" + }, + { + "filename": "python-3.13.4-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-win32-x86.zip" + } + ] + }, + { + "version": "3.13.3", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.3-14344076652", + "files": [ + { + "filename": "python-3.13.3-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.3-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.3-linux-20.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-linux-20.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.3-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.3-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.3-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.3-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.3-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.3-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.3-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.3-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.3-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-win32-arm64.zip" + }, + { + "filename": "python-3.13.3-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-win32-x64.zip" + }, + { + "filename": "python-3.13.3-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-win32-x86.zip" + } + ] + }, + { + "version": "3.13.2", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.2-13708744326", + "files": [ + { + "filename": "python-3.13.2-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.2-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.2-linux-20.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-linux-20.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.2-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.2-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.2-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.2-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.2-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.2-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.2-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.2-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.2-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-win32-arm64.zip" + }, + { + "filename": "python-3.13.2-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-win32-x64.zip" + }, + { + "filename": "python-3.13.2-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-win32-x86.zip" + } + ] + }, + { + "version": "3.13.1", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.1-13437882550", + "files": [ + { + "filename": "python-3.13.1-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.1-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.1-linux-20.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-linux-20.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.1-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.1-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.1-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.1-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.1-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.1-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.1-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.1-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.1-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-win32-arm64.zip" + }, + { + "filename": "python-3.13.1-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-win32-x64.zip" + }, + { + "filename": "python-3.13.1-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-13707372259", + "files": [ + { + "filename": "python-3.13.0-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.0-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.0-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-linux-20.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-linux-20.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.0-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.0-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.0-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.0-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.0-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.0-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-win32-arm64.zip" + }, + { + "filename": "python-3.13.0-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.0-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-win32-x64.zip" + }, + { + "filename": "python-3.13.0-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.0-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-rc.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-rc.3-11128690802", + "files": [ + { + "filename": "python-3.13.0-rc.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.3-11128690802/python-3.13.0-rc.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.3-11128690802/python-3.13.0-rc.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.3-11128690802/python-3.13.0-rc.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.3-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.3-11128690802/python-3.13.0-rc.3-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.3-11128690802/python-3.13.0-rc.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.3-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.3-11128690802/python-3.13.0-rc.3-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.3-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.3-11128690802/python-3.13.0-rc.3-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.3-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.3-11128690802/python-3.13.0-rc.3-win32-arm64.zip" + }, + { + "filename": "python-3.13.0-rc.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.3-11128690802/python-3.13.0-rc.3-win32-x64.zip" + }, + { + "filename": "python-3.13.0-rc.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.3-11128690802/python-3.13.0-rc.3-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-rc.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-rc.2-10765745850", + "files": [ + { + "filename": "python-3.13.0-rc.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.2-10765745850/python-3.13.0-rc.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.2-10765745850/python-3.13.0-rc.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.2-10765745850/python-3.13.0-rc.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.2-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.2-10765745850/python-3.13.0-rc.2-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.2-10765745850/python-3.13.0-rc.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.2-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.2-10765745850/python-3.13.0-rc.2-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.2-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.2-10765745850/python-3.13.0-rc.2-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.2-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.2-10765745850/python-3.13.0-rc.2-win32-arm64.zip" + }, + { + "filename": "python-3.13.0-rc.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.2-10765745850/python-3.13.0-rc.2-win32-x64.zip" + }, + { + "filename": "python-3.13.0-rc.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.2-10765745850/python-3.13.0-rc.2-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-rc.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-rc.1-10616689957", + "files": [ + { + "filename": "python-3.13.0-rc.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.1-10616689957/python-3.13.0-rc.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.1-10616689957/python-3.13.0-rc.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.1-10616689957/python-3.13.0-rc.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.1-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.1-10616689957/python-3.13.0-rc.1-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.1-10616689957/python-3.13.0-rc.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.1-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.1-10616689957/python-3.13.0-rc.1-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.1-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.1-10616689957/python-3.13.0-rc.1-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.1-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.1-10616689957/python-3.13.0-rc.1-win32-arm64.zip" + }, + { + "filename": "python-3.13.0-rc.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.1-10616689957/python-3.13.0-rc.1-win32-x64.zip" + }, + { + "filename": "python-3.13.0-rc.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.1-10616689957/python-3.13.0-rc.1-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-beta.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-beta.4-9993951762", + "files": [ + { + "filename": "python-3.13.0-beta.4-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.4-9993951762/python-3.13.0-beta.4-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.4-9993951762/python-3.13.0-beta.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.4-9993951762/python-3.13.0-beta.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.4-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.4-9993951762/python-3.13.0-beta.4-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.4-9993951762/python-3.13.0-beta.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.4-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.4-9993951762/python-3.13.0-beta.4-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.4-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.4-9993951762/python-3.13.0-beta.4-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.4-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.4-9993951762/python-3.13.0-beta.4-win32-arm64.zip" + }, + { + "filename": "python-3.13.0-beta.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.4-9993951762/python-3.13.0-beta.4-win32-x64.zip" + }, + { + "filename": "python-3.13.0-beta.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.4-9993951762/python-3.13.0-beta.4-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-beta.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-beta.3-9947073700", + "files": [ + { + "filename": "python-3.13.0-beta.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.3-9947073700/python-3.13.0-beta.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.3-9947073700/python-3.13.0-beta.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.3-9947073700/python-3.13.0-beta.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.3-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.3-9947073700/python-3.13.0-beta.3-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.3-9947073700/python-3.13.0-beta.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.3-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.3-9947073700/python-3.13.0-beta.3-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.3-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.3-9947073700/python-3.13.0-beta.3-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.3-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.3-9947073700/python-3.13.0-beta.3-win32-arm64.zip" + }, + { + "filename": "python-3.13.0-beta.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.3-9947073700/python-3.13.0-beta.3-win32-x64.zip" + }, + { + "filename": "python-3.13.0-beta.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.3-9947073700/python-3.13.0-beta.3-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-beta.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-beta.2-9668929533", + "files": [ + { + "filename": "python-3.13.0-beta.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.2-9668929533/python-3.13.0-beta.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.2-9668929533/python-3.13.0-beta.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.2-9668929533/python-3.13.0-beta.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.2-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.2-9668929533/python-3.13.0-beta.2-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.2-9668929533/python-3.13.0-beta.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.2-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.2-9668929533/python-3.13.0-beta.2-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.2-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.2-9668929533/python-3.13.0-beta.2-win32-arm64.zip" + }, + { + "filename": "python-3.13.0-beta.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.2-9668929533/python-3.13.0-beta.2-win32-x64.zip" + }, + { + "filename": "python-3.13.0-beta.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.2-9668929533/python-3.13.0-beta.2-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-beta.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-beta.1-9019422448", + "files": [ + { + "filename": "python-3.13.0-beta.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.1-9019422448/python-3.13.0-beta.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.1-9019422448/python-3.13.0-beta.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.1-9019422448/python-3.13.0-beta.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.1-9019422448/python-3.13.0-beta.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.1-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.1-9019422448/python-3.13.0-beta.1-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.1-9019422448/python-3.13.0-beta.1-win32-x64.zip" + }, + { + "filename": "python-3.13.0-beta.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.1-9019422448/python-3.13.0-beta.1-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-alpha.6", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-alpha.6-8625706540", + "files": [ + { + "filename": "python-3.13.0-alpha.6-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.6-8625706540/python-3.13.0-alpha.6-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.6-8625706540/python-3.13.0-alpha.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.6-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.6-8625706540/python-3.13.0-alpha.6-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.6-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.6-8625706540/python-3.13.0-alpha.6-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.6-8625706540/python-3.13.0-alpha.6-win32-x64.zip" + }, + { + "filename": "python-3.13.0-alpha.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.6-8625706540/python-3.13.0-alpha.6-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-alpha.5", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-alpha.5-8258852403", + "files": [ + { + "filename": "python-3.13.0-alpha.5-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.5-8258852403/python-3.13.0-alpha.5-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.5-8258852403/python-3.13.0-alpha.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.5-8258852403/python-3.13.0-alpha.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.5-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.5-8258852403/python-3.13.0-alpha.5-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.5-8258852403/python-3.13.0-alpha.5-win32-x64.zip" + }, + { + "filename": "python-3.13.0-alpha.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.5-8258852403/python-3.13.0-alpha.5-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-alpha.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-alpha.4-7925502275", + "files": [ + { + "filename": "python-3.13.0-alpha.4-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.4-7925502275/python-3.13.0-alpha.4-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.4-7925502275/python-3.13.0-alpha.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.4-7925502275/python-3.13.0-alpha.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.4-7925502275/python-3.13.0-alpha.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.4-7925502275/python-3.13.0-alpha.4-win32-x64.zip" + }, + { + "filename": "python-3.13.0-alpha.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.4-7925502275/python-3.13.0-alpha.4-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-alpha.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-alpha.3-7565276339", + "files": [ + { + "filename": "python-3.13.0-alpha.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.3-7565276339/python-3.13.0-alpha.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.3-7565276339/python-3.13.0-alpha.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.3-7565276339/python-3.13.0-alpha.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.3-7565276339/python-3.13.0-alpha.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.3-7565276339/python-3.13.0-alpha.3-win32-x64.zip" + }, + { + "filename": "python-3.13.0-alpha.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.3-7565276339/python-3.13.0-alpha.3-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-alpha.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-alpha.2-6966007093", + "files": [ + { + "filename": "python-3.13.0-alpha.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.2-6966007093/python-3.13.0-alpha.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.2-6966007093/python-3.13.0-alpha.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.2-6966007093/python-3.13.0-alpha.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.2-6966007093/python-3.13.0-alpha.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.2-6966007093/python-3.13.0-alpha.2-win32-x64.zip" + }, + { + "filename": "python-3.13.0-alpha.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.2-6966007093/python-3.13.0-alpha.2-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-alpha.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-alpha.1-6531259803", + "files": [ + { + "filename": "python-3.13.0-alpha.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.1-6531259803/python-3.13.0-alpha.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.1-6531259803/python-3.13.0-alpha.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.1-6531259803/python-3.13.0-alpha.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.1-6531259803/python-3.13.0-alpha.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.1-6531259803/python-3.13.0-alpha.1-win32-x64.zip" + }, + { + "filename": "python-3.13.0-alpha.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.1-6531259803/python-3.13.0-alpha.1-win32-x86.zip" + } + ] + }, + { + "version": "3.12.13", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.13-22652080177", + "files": [ + { + "filename": "python-3.12.13-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.13-22652080177/python-3.12.13-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.13-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.13-22652080177/python-3.12.13-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.13-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.13-22652080177/python-3.12.13-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.13-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.13-22652080177/python-3.12.13-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.12.12", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.12-18393146713", + "files": [ + { + "filename": "python-3.12.12-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.12-18393146713/python-3.12.12-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.12-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.12-18393146713/python-3.12.12-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.12-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.12-18393146713/python-3.12.12-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.12-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.12-18393146713/python-3.12.12-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.12.11", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.11-15433310049", + "files": [ + { + "filename": "python-3.12.11-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.11-15433310049/python-3.12.11-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.11-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.11-15433310049/python-3.12.11-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.11-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.11-15433310049/python-3.12.11-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.11-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.11-15433310049/python-3.12.11-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.12.10", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.10-14343898437", + "files": [ + { + "filename": "python-3.12.10-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.10-14343898437/python-3.12.10-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.10-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.10-14343898437/python-3.12.10-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.10-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.10-14343898437/python-3.12.10-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.10-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.10-14343898437/python-3.12.10-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.10-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.10-14343898437/python-3.12.10-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.10-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.10-14343898437/python-3.12.10-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.10-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.10-14343898437/python-3.12.10-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.12.10-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.10-14343898437/python-3.12.10-win32-arm64.zip" + }, + { + "filename": "python-3.12.10-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.10-14343898437/python-3.12.10-win32-x64.zip" + }, + { + "filename": "python-3.12.10-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.10-14343898437/python-3.12.10-win32-x86.zip" + } + ] + }, + { + "version": "3.12.9", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.9-13149478207", + "files": [ + { + "filename": "python-3.12.9-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.9-13149478207/python-3.12.9-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.9-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.9-13149478207/python-3.12.9-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.9-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.9-13149478207/python-3.12.9-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.9-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.9-13149478207/python-3.12.9-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.9-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.9-13149478207/python-3.12.9-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.9-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.9-13149478207/python-3.12.9-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.9-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.9-13149478207/python-3.12.9-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.12.9-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.9-13149478207/python-3.12.9-win32-arm64.zip" + }, + { + "filename": "python-3.12.9-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.9-13149478207/python-3.12.9-win32-x64.zip" + }, + { + "filename": "python-3.12.9-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.9-13149478207/python-3.12.9-win32-x86.zip" + } + ] + }, + { + "version": "3.12.8", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.8-12154062663", + "files": [ + { + "filename": "python-3.12.8-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.8-12154062663/python-3.12.8-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.8-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.8-12154062663/python-3.12.8-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.8-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.8-12154062663/python-3.12.8-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.8-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.8-12154062663/python-3.12.8-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.8-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.8-12154062663/python-3.12.8-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.8-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.8-12154062663/python-3.12.8-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.8-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.8-12154062663/python-3.12.8-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.12.8-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.8-12154062663/python-3.12.8-win32-arm64.zip" + }, + { + "filename": "python-3.12.8-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.8-12154062663/python-3.12.8-win32-x64.zip" + }, + { + "filename": "python-3.12.8-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.8-12154062663/python-3.12.8-win32-x86.zip" + } + ] + }, + { + "version": "3.12.7", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.7-11128208086", + "files": [ + { + "filename": "python-3.12.7-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.7-11128208086/python-3.12.7-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.7-11128208086/python-3.12.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.7-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.7-11128208086/python-3.12.7-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.7-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.7-11128208086/python-3.12.7-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.7-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.7-11128208086/python-3.12.7-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.7-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.7-11128208086/python-3.12.7-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.7-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.7-11128208086/python-3.12.7-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.12.7-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.7-11128208086/python-3.12.7-win32-arm64.zip" + }, + { + "filename": "python-3.12.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.7-11128208086/python-3.12.7-win32-x64.zip" + }, + { + "filename": "python-3.12.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.7-11128208086/python-3.12.7-win32-x86.zip" + } + ] + }, + { + "version": "3.12.6", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.6-10765725458", + "files": [ + { + "filename": "python-3.12.6-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.6-10765725458/python-3.12.6-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.6-10765725458/python-3.12.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.6-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.6-10765725458/python-3.12.6-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.6-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.6-10765725458/python-3.12.6-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.6-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.6-10765725458/python-3.12.6-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.6-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.6-10765725458/python-3.12.6-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.6-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.6-10765725458/python-3.12.6-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.12.6-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.6-10765725458/python-3.12.6-win32-arm64.zip" + }, + { + "filename": "python-3.12.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.6-10765725458/python-3.12.6-win32-x64.zip" + }, + { + "filename": "python-3.12.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.6-10765725458/python-3.12.6-win32-x86.zip" + } + ] + }, + { + "version": "3.12.5", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.5-10375840348", + "files": [ + { + "filename": "python-3.12.5-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.5-10375840348/python-3.12.5-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.5-10375840348/python-3.12.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.5-10375840348/python-3.12.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.5-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.5-10375840348/python-3.12.5-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.5-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.5-10375840348/python-3.12.5-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.5-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.5-10375840348/python-3.12.5-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.5-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.5-10375840348/python-3.12.5-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.12.5-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.5-10375840348/python-3.12.5-win32-arm64.zip" + }, + { + "filename": "python-3.12.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.5-10375840348/python-3.12.5-win32-x64.zip" + }, + { + "filename": "python-3.12.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.5-10375840348/python-3.12.5-win32-x86.zip" + } + ] + }, + { + "version": "3.12.4", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.4-9947065640", + "files": [ + { + "filename": "python-3.12.4-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.4-9947065640/python-3.12.4-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.4-9947065640/python-3.12.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.4-9947065640/python-3.12.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.4-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.4-9947065640/python-3.12.4-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.4-9947065640/python-3.12.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.4-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.4-9947065640/python-3.12.4-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.4-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.4-9947065640/python-3.12.4-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.12.4-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.4-9947065640/python-3.12.4-win32-arm64.zip" + }, + { + "filename": "python-3.12.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.4-9947065640/python-3.12.4-win32-x64.zip" + }, + { + "filename": "python-3.12.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.4-9947065640/python-3.12.4-win32-x86.zip" + } + ] + }, + { + "version": "3.12.3", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.3-11057844995", + "files": [ + { + "filename": "python-3.12.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.3-11057844995/python-3.12.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.3-11057844995/python-3.12.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.3-11057844995/python-3.12.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.3-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.3-11057844995/python-3.12.3-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.3-11057844995/python-3.12.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.3-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.3-11057844995/python-3.12.3-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.3-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.3-11057844995/python-3.12.3-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.12.3-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.3-11057844995/python-3.12.3-win32-arm64.zip" + }, + { + "filename": "python-3.12.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.3-11057844995/python-3.12.3-win32-x64.zip" + }, + { + "filename": "python-3.12.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.3-11057844995/python-3.12.3-win32-x86.zip" + } + ] + }, + { + "version": "3.12.2", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.2-11057786931", + "files": [ + { + "filename": "python-3.12.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.2-11057786931/python-3.12.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.2-11057786931/python-3.12.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.2-11057786931/python-3.12.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.2-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.2-11057786931/python-3.12.2-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.2-11057786931/python-3.12.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.2-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.2-11057786931/python-3.12.2-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.2-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.2-11057786931/python-3.12.2-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.12.2-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.2-11057786931/python-3.12.2-win32-arm64.zip" + }, + { + "filename": "python-3.12.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.2-11057786931/python-3.12.2-win32-x64.zip" + }, + { + "filename": "python-3.12.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.2-11057786931/python-3.12.2-win32-x86.zip" + } + ] + }, + { + "version": "3.12.1", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.1-11057762749", + "files": [ + { + "filename": "python-3.12.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.1-11057762749/python-3.12.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.1-11057762749/python-3.12.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.1-11057762749/python-3.12.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.1-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.1-11057762749/python-3.12.1-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.1-11057762749/python-3.12.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.1-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.1-11057762749/python-3.12.1-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.1-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.1-11057762749/python-3.12.1-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.12.1-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.1-11057762749/python-3.12.1-win32-arm64.zip" + }, + { + "filename": "python-3.12.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.1-11057762749/python-3.12.1-win32-x64.zip" + }, + { + "filename": "python-3.12.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.1-11057762749/python-3.12.1-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-11057302691", + "files": [ + { + "filename": "python-3.12.0-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-11057302691/python-3.12.0-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.0-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-11057302691/python-3.12.0-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-11057302691/python-3.12.0-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-11057302691/python-3.12.0-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.0-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-11057302691/python-3.12.0-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-11057302691/python-3.12.0-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.0-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-11057302691/python-3.12.0-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-11057302691/python-3.12.0-win32-arm64.zip" + }, + { + "filename": "python-3.12.0-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-11057302691/python-3.12.0-win32-x64.zip" + }, + { + "filename": "python-3.12.0-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-11057302691/python-3.12.0-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-rc.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-rc.3-6244011669", + "files": [ + { + "filename": "python-3.12.0-rc.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.3-6244011669/python-3.12.0-rc.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.3-6244011669/python-3.12.0-rc.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.3-6244011669/python-3.12.0-rc.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.3-6244011669/python-3.12.0-rc.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.3-6244011669/python-3.12.0-rc.3-win32-x64.zip" + }, + { + "filename": "python-3.12.0-rc.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.3-6244011669/python-3.12.0-rc.3-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-rc.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-rc.2-6097043201", + "files": [ + { + "filename": "python-3.12.0-rc.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.2-6097043201/python-3.12.0-rc.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.2-6097043201/python-3.12.0-rc.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.2-6097043201/python-3.12.0-rc.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.2-6097043201/python-3.12.0-rc.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.2-6097043201/python-3.12.0-rc.2-win32-x64.zip" + }, + { + "filename": "python-3.12.0-rc.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.2-6097043201/python-3.12.0-rc.2-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-rc.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-rc.1-5785015073", + "files": [ + { + "filename": "python-3.12.0-rc.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.1-5785015073/python-3.12.0-rc.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.1-5785015073/python-3.12.0-rc.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.1-5785015073/python-3.12.0-rc.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.1-5785015073/python-3.12.0-rc.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.1-5785015073/python-3.12.0-rc.1-win32-x64.zip" + }, + { + "filename": "python-3.12.0-rc.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.1-5785015073/python-3.12.0-rc.1-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-beta.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-beta.4-5528170069", + "files": [ + { + "filename": "python-3.12.0-beta.4-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.4-5528170069/python-3.12.0-beta.4-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.4-5528170069/python-3.12.0-beta.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.4-5528170069/python-3.12.0-beta.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.4-5528170069/python-3.12.0-beta.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.4-5528170069/python-3.12.0-beta.4-win32-x64.zip" + }, + { + "filename": "python-3.12.0-beta.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.4-5528170069/python-3.12.0-beta.4-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-beta.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-beta.3-5331639816", + "files": [ + { + "filename": "python-3.12.0-beta.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.3-5331639816/python-3.12.0-beta.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.3-5331639816/python-3.12.0-beta.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.3-5331639816/python-3.12.0-beta.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.3-5331639816/python-3.12.0-beta.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.3-5331639816/python-3.12.0-beta.3-win32-x64.zip" + }, + { + "filename": "python-3.12.0-beta.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.3-5331639816/python-3.12.0-beta.3-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-beta.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-beta.2-5200633613", + "files": [ + { + "filename": "python-3.12.0-beta.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.2-5200633613/python-3.12.0-beta.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.2-5200633613/python-3.12.0-beta.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.2-5200633613/python-3.12.0-beta.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.2-5200633613/python-3.12.0-beta.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.2-5200633613/python-3.12.0-beta.2-win32-x64.zip" + }, + { + "filename": "python-3.12.0-beta.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.2-5200633613/python-3.12.0-beta.2-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-beta.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-beta.1-5076755295", + "files": [ + { + "filename": "python-3.12.0-beta.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.1-5076755295/python-3.12.0-beta.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.1-5076755295/python-3.12.0-beta.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.1-5076755295/python-3.12.0-beta.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.1-5076755295/python-3.12.0-beta.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.1-5076755295/python-3.12.0-beta.1-win32-x64.zip" + }, + { + "filename": "python-3.12.0-beta.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.1-5076755295/python-3.12.0-beta.1-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-alpha.7", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-alpha.7-4618531320", + "files": [ + { + "filename": "python-3.12.0-alpha.7-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.7-4618531320/python-3.12.0-alpha.7-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.7-4618531320/python-3.12.0-alpha.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.7-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.7-4618531320/python-3.12.0-alpha.7-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.7-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.7-4618531320/python-3.12.0-alpha.7-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.7-4618531320/python-3.12.0-alpha.7-win32-x64.zip" + }, + { + "filename": "python-3.12.0-alpha.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.7-4618531320/python-3.12.0-alpha.7-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-alpha.6", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-alpha.6-4362036571", + "files": [ + { + "filename": "python-3.12.0-alpha.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.6-4362036571/python-3.12.0-alpha.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.6-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.6-4362036571/python-3.12.0-alpha.6-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.6-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.6-4362036571/python-3.12.0-alpha.6-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.6-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.6-4362036571/python-3.12.0-alpha.6-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.6-4362036571/python-3.12.0-alpha.6-win32-x64.zip" + }, + { + "filename": "python-3.12.0-alpha.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.6-4362036571/python-3.12.0-alpha.6-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-alpha.5", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-alpha.5-4122183364", + "files": [ + { + "filename": "python-3.12.0-alpha.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.5-4122183364/python-3.12.0-alpha.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.5-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.5-4122183364/python-3.12.0-alpha.5-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.5-4122183364/python-3.12.0-alpha.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.5-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.5-4122183364/python-3.12.0-alpha.5-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.5-4122183364/python-3.12.0-alpha.5-win32-x64.zip" + }, + { + "filename": "python-3.12.0-alpha.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.5-4122183364/python-3.12.0-alpha.5-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-alpha.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-alpha.4-3890631539", + "files": [ + { + "filename": "python-3.12.0-alpha.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.4-3890631539/python-3.12.0-alpha.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.4-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.4-3890631539/python-3.12.0-alpha.4-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.4-3890631539/python-3.12.0-alpha.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.4-3890631539/python-3.12.0-alpha.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.4-3890631539/python-3.12.0-alpha.4-win32-x64.zip" + }, + { + "filename": "python-3.12.0-alpha.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.4-3890631539/python-3.12.0-alpha.4-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-alpha.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-alpha.3-3638209027", + "files": [ + { + "filename": "python-3.12.0-alpha.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.3-3638209027/python-3.12.0-alpha.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.3-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.3-3638209027/python-3.12.0-alpha.3-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.3-3638209027/python-3.12.0-alpha.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.3-3638209027/python-3.12.0-alpha.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.3-3638209027/python-3.12.0-alpha.3-win32-x64.zip" + }, + { + "filename": "python-3.12.0-alpha.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.3-3638209027/python-3.12.0-alpha.3-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-alpha.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-alpha.2-3524742960", + "files": [ + { + "filename": "python-3.12.0-alpha.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.2-3524742960/python-3.12.0-alpha.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.2-3524742960/python-3.12.0-alpha.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.2-3524742960/python-3.12.0-alpha.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.2-3524742960/python-3.12.0-alpha.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.2-3524742960/python-3.12.0-alpha.2-win32-x64.zip" + }, + { + "filename": "python-3.12.0-alpha.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.2-3524742960/python-3.12.0-alpha.2-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-alpha.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-alpha.1-3427281458", + "files": [ + { + "filename": "python-3.12.0-alpha.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.1-3427281458/python-3.12.0-alpha.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.1-3427281458/python-3.12.0-alpha.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.1-3427281458/python-3.12.0-alpha.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.1-3427281458/python-3.12.0-alpha.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.1-3427281458/python-3.12.0-alpha.1-win32-x64.zip" + }, + { + "filename": "python-3.12.0-alpha.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.1-3427281458/python-3.12.0-alpha.1-win32-x86.zip" + } + ] + }, + { + "version": "3.11.15", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.15-22631496413", + "files": [ + { + "filename": "python-3.11.15-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.15-22631496413/python-3.11.15-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.15-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.15-22631496413/python-3.11.15-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.15-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.15-22631496413/python-3.11.15-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.15-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.15-22631496413/python-3.11.15-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.11.14", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.14-18393181605", + "files": [ + { + "filename": "python-3.11.14-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.14-18393181605/python-3.11.14-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.14-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.14-18393181605/python-3.11.14-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.14-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.14-18393181605/python-3.11.14-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.14-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.14-18393181605/python-3.11.14-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.11.13", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.13-15433298024", + "files": [ + { + "filename": "python-3.11.13-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.13-15433298024/python-3.11.13-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.13-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.13-15433298024/python-3.11.13-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.13-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.13-15433298024/python-3.11.13-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.13-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.13-15433298024/python-3.11.13-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.11.12", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.12-14343939122", + "files": [ + { + "filename": "python-3.11.12-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.12-14343939122/python-3.11.12-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.12-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.12-14343939122/python-3.11.12-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.12-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.12-14343939122/python-3.11.12-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.12-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.12-14343939122/python-3.11.12-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.12-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.12-14343939122/python-3.11.12-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.11.11", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.11-12160100664", + "files": [ + { + "filename": "python-3.11.11-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.11-12160100664/python-3.11.11-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.11-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.11-12160100664/python-3.11.11-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.11-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.11-12160100664/python-3.11.11-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.11-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.11-12160100664/python-3.11.11-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.11-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.11-12160100664/python-3.11.11-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.11.10", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.10-10765870205", + "files": [ + { + "filename": "python-3.11.10-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.10-10765870205/python-3.11.10-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.10-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.10-10765870205/python-3.11.10-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.10-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.10-10765870205/python-3.11.10-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.10-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.10-10765870205/python-3.11.10-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.10-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.10-10765870205/python-3.11.10-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.11.9", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.9-9947079978", + "files": [ + { + "filename": "python-3.11.9-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.9-9947079978/python-3.11.9-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.11.9-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.9-9947079978/python-3.11.9-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.9-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.9-9947079978/python-3.11.9-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.9-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.9-9947079978/python-3.11.9-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.9-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.9-9947079978/python-3.11.9-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.9-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.9-9947079978/python-3.11.9-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.9-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.9-9947079978/python-3.11.9-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.11.9-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.9-9947079978/python-3.11.9-win32-arm64.zip" + }, + { + "filename": "python-3.11.9-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.9-9947079978/python-3.11.9-win32-x64.zip" + }, + { + "filename": "python-3.11.9-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.9-9947079978/python-3.11.9-win32-x86.zip" + } + ] + }, + { + "version": "3.11.8", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.8-11113201752", + "files": [ + { + "filename": "python-3.11.8-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.8-11113201752/python-3.11.8-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.11.8-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.8-11113201752/python-3.11.8-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.8-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.8-11113201752/python-3.11.8-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.8-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.8-11113201752/python-3.11.8-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.8-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.8-11113201752/python-3.11.8-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.8-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.8-11113201752/python-3.11.8-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.8-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.8-11113201752/python-3.11.8-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.11.8-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.8-11113201752/python-3.11.8-win32-arm64.zip" + }, + { + "filename": "python-3.11.8-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.8-11113201752/python-3.11.8-win32-x64.zip" + }, + { + "filename": "python-3.11.8-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.8-11113201752/python-3.11.8-win32-x86.zip" + } + ] + }, + { + "version": "3.11.7", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.7-11113197120", + "files": [ + { + "filename": "python-3.11.7-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.7-11113197120/python-3.11.7-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.11.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.7-11113197120/python-3.11.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.7-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.7-11113197120/python-3.11.7-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.7-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.7-11113197120/python-3.11.7-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.7-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.7-11113197120/python-3.11.7-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.7-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.7-11113197120/python-3.11.7-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.7-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.7-11113197120/python-3.11.7-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.11.7-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.7-11113197120/python-3.11.7-win32-arm64.zip" + }, + { + "filename": "python-3.11.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.7-11113197120/python-3.11.7-win32-x64.zip" + }, + { + "filename": "python-3.11.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.7-11113197120/python-3.11.7-win32-x86.zip" + } + ] + }, + { + "version": "3.11.6", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.6-11113179737", + "files": [ + { + "filename": "python-3.11.6-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.6-11113179737/python-3.11.6-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.11.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.6-11113179737/python-3.11.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.6-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.6-11113179737/python-3.11.6-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.6-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.6-11113179737/python-3.11.6-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.6-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.6-11113179737/python-3.11.6-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.6-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.6-11113179737/python-3.11.6-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.6-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.6-11113179737/python-3.11.6-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.11.6-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.6-11113179737/python-3.11.6-win32-arm64.zip" + }, + { + "filename": "python-3.11.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.6-11113179737/python-3.11.6-win32-x64.zip" + }, + { + "filename": "python-3.11.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.6-11113179737/python-3.11.6-win32-x86.zip" + } + ] + }, + { + "version": "3.11.5", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.5-11113174019", + "files": [ + { + "filename": "python-3.11.5-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.5-11113174019/python-3.11.5-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.11.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.5-11113174019/python-3.11.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.5-11113174019/python-3.11.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.5-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.5-11113174019/python-3.11.5-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.5-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.5-11113174019/python-3.11.5-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.5-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.5-11113174019/python-3.11.5-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.5-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.5-11113174019/python-3.11.5-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.11.5-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.5-11113174019/python-3.11.5-win32-arm64.zip" + }, + { + "filename": "python-3.11.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.5-11113174019/python-3.11.5-win32-x64.zip" + }, + { + "filename": "python-3.11.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.5-11113174019/python-3.11.5-win32-x86.zip" + } + ] + }, + { + "version": "3.11.4", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.4-11113170699", + "files": [ + { + "filename": "python-3.11.4-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.4-11113170699/python-3.11.4-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.11.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.4-11113170699/python-3.11.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.4-11113170699/python-3.11.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.4-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.4-11113170699/python-3.11.4-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.4-11113170699/python-3.11.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.4-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.4-11113170699/python-3.11.4-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.4-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.4-11113170699/python-3.11.4-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.11.4-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.4-11113170699/python-3.11.4-win32-arm64.zip" + }, + { + "filename": "python-3.11.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.4-11113170699/python-3.11.4-win32-x64.zip" + }, + { + "filename": "python-3.11.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.4-11113170699/python-3.11.4-win32-x86.zip" + } + ] + }, + { + "version": "3.11.3", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.3-11059198104", + "files": [ + { + "filename": "python-3.11.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.3-11059198104/python-3.11.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.11.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.3-11059198104/python-3.11.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.3-11059198104/python-3.11.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.3-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.3-11059198104/python-3.11.3-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.3-11059198104/python-3.11.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.3-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.3-11059198104/python-3.11.3-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.3-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.3-11059198104/python-3.11.3-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.11.3-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.3-11059198104/python-3.11.3-win32-arm64.zip" + }, + { + "filename": "python-3.11.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.3-11059198104/python-3.11.3-win32-x64.zip" + }, + { + "filename": "python-3.11.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.3-11059198104/python-3.11.3-win32-x86.zip" + } + ] + }, + { + "version": "3.11.2", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.2-11059137522", + "files": [ + { + "filename": "python-3.11.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.2-11059137522/python-3.11.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.11.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.2-11059137522/python-3.11.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.2-11059137522/python-3.11.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.2-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.2-11059137522/python-3.11.2-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.2-11059137522/python-3.11.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.2-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.2-11059137522/python-3.11.2-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.2-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.2-11059137522/python-3.11.2-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.11.2-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.2-11059137522/python-3.11.2-win32-arm64.zip" + }, + { + "filename": "python-3.11.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.2-11059137522/python-3.11.2-win32-x64.zip" + }, + { + "filename": "python-3.11.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.2-11059137522/python-3.11.2-win32-x86.zip" + } + ] + }, + { + "version": "3.11.1", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.1-11058799881", + "files": [ + { + "filename": "python-3.11.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.1-11058799881/python-3.11.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.11.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.1-11058799881/python-3.11.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.1-11058799881/python-3.11.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.1-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.1-11058799881/python-3.11.1-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.1-11058799881/python-3.11.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.1-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.1-11058799881/python-3.11.1-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.1-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.1-11058799881/python-3.11.1-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.11.1-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.1-11058799881/python-3.11.1-win32-arm64.zip" + }, + { + "filename": "python-3.11.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.1-11058799881/python-3.11.1-win32-x64.zip" + }, + { + "filename": "python-3.11.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.1-11058799881/python-3.11.1-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-11058707212", + "files": [ + { + "filename": "python-3.11.0-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-11058707212/python-3.11.0-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.11.0-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-11058707212/python-3.11.0-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-11058707212/python-3.11.0-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-11058707212/python-3.11.0-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.0-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-11058707212/python-3.11.0-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-11058707212/python-3.11.0-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.0-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-11058707212/python-3.11.0-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-11058707212/python-3.11.0-win32-arm64.zip" + }, + { + "filename": "python-3.11.0-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-11058707212/python-3.11.0-win32-x64.zip" + }, + { + "filename": "python-3.11.0-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-11058707212/python-3.11.0-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-rc.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-rc.2-3172748327", + "files": [ + { + "filename": "python-3.11.0-rc.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.2-3172748327/python-3.11.0-rc.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-rc.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.2-3172748327/python-3.11.0-rc.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-rc.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.2-3172748327/python-3.11.0-rc.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-rc.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.2-3172748327/python-3.11.0-rc.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-rc.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.2-3172748327/python-3.11.0-rc.2-win32-x64.zip" + }, + { + "filename": "python-3.11.0-rc.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.2-3172748327/python-3.11.0-rc.2-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-rc.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-rc.1-2830636759", + "files": [ + { + "filename": "python-3.11.0-rc.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.1-2830636759/python-3.11.0-rc.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-rc.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.1-2830636759/python-3.11.0-rc.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-rc.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.1-2830636759/python-3.11.0-rc.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-rc.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.1-2830636759/python-3.11.0-rc.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-rc.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.1-2830636759/python-3.11.0-rc.1-win32-x64.zip" + }, + { + "filename": "python-3.11.0-rc.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.1-2830636759/python-3.11.0-rc.1-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-beta.5", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-beta.5-2747645645", + "files": [ + { + "filename": "python-3.11.0-beta.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.5-2747645645/python-3.11.0-beta.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.5-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.5-2747645645/python-3.11.0-beta.5-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.5-2747645645/python-3.11.0-beta.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.5-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.5-2747645645/python-3.11.0-beta.5-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.5-2747645645/python-3.11.0-beta.5-win32-x64.zip" + }, + { + "filename": "python-3.11.0-beta.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.5-2747645645/python-3.11.0-beta.5-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-beta.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-beta.4-2661435468", + "files": [ + { + "filename": "python-3.11.0-beta.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.4-2661435468/python-3.11.0-beta.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.4-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.4-2661435468/python-3.11.0-beta.4-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.4-2661435468/python-3.11.0-beta.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.4-2661435468/python-3.11.0-beta.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.4-2661435468/python-3.11.0-beta.4-win32-x64.zip" + }, + { + "filename": "python-3.11.0-beta.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.4-2661435468/python-3.11.0-beta.4-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-beta.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-beta.3-2426427485", + "files": [ + { + "filename": "python-3.11.0-beta.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.3-2426427485/python-3.11.0-beta.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.3-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.3-2426427485/python-3.11.0-beta.3-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.3-2426427485/python-3.11.0-beta.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.3-2426427485/python-3.11.0-beta.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.3-2426427485/python-3.11.0-beta.3-win32-x64.zip" + }, + { + "filename": "python-3.11.0-beta.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.3-2426427485/python-3.11.0-beta.3-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-beta.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-beta.2-2419602742", + "files": [ + { + "filename": "python-3.11.0-beta.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.2-2419602742/python-3.11.0-beta.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.2-2419602742/python-3.11.0-beta.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.2-2419602742/python-3.11.0-beta.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.2-2419602742/python-3.11.0-beta.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.2-2419602742/python-3.11.0-beta.2-win32-x64.zip" + }, + { + "filename": "python-3.11.0-beta.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.2-2419602742/python-3.11.0-beta.2-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-beta.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-beta.1-2290009903", + "files": [ + { + "filename": "python-3.11.0-beta.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.1-2290009903/python-3.11.0-beta.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.1-2290009903/python-3.11.0-beta.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.1-2290009903/python-3.11.0-beta.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.1-2290009903/python-3.11.0-beta.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.1-2290009903/python-3.11.0-beta.1-win32-x64.zip" + }, + { + "filename": "python-3.11.0-beta.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.1-2290009903/python-3.11.0-beta.1-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-alpha.7", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-alpha.7-2171175503", + "files": [ + { + "filename": "python-3.11.0-alpha.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.7-2171175503/python-3.11.0-alpha.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.7-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.7-2171175503/python-3.11.0-alpha.7-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.7-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.7-2171175503/python-3.11.0-alpha.7-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.7-2171175503/python-3.11.0-alpha.7-win32-x64.zip" + }, + { + "filename": "python-3.11.0-alpha.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.7-2171175503/python-3.11.0-alpha.7-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-alpha.6", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-alpha.6-2009545975", + "files": [ + { + "filename": "python-3.11.0-alpha.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.6-2009545975/python-3.11.0-alpha.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.6-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.6-2009545975/python-3.11.0-alpha.6-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.6-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.6-2009545975/python-3.11.0-alpha.6-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.6-2009545975/python-3.11.0-alpha.6-win32-x64.zip" + }, + { + "filename": "python-3.11.0-alpha.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.6-2009545975/python-3.11.0-alpha.6-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-alpha.5", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-alpha.5-1793751460", + "files": [ + { + "filename": "python-3.11.0-alpha.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.5-1793751460/python-3.11.0-alpha.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.5-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.5-1793751460/python-3.11.0-alpha.5-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.5-1793751460/python-3.11.0-alpha.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.5-1793751460/python-3.11.0-alpha.5-win32-x64.zip" + }, + { + "filename": "python-3.11.0-alpha.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.5-1793751460/python-3.11.0-alpha.5-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-alpha.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-alpha.4-1754961913", + "files": [ + { + "filename": "python-3.11.0-alpha.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.4-1754961913/python-3.11.0-alpha.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.4-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.4-1754961913/python-3.11.0-alpha.4-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.4-1754961913/python-3.11.0-alpha.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.4-1754961913/python-3.11.0-alpha.4-win32-x64.zip" + }, + { + "filename": "python-3.11.0-alpha.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.4-1754961913/python-3.11.0-alpha.4-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-alpha.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-alpha.3-120611", + "files": [ + { + "filename": "python-3.11.0-alpha.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.3-120611/python-3.11.0-alpha.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.3-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.3-120611/python-3.11.0-alpha.3-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.3-120611/python-3.11.0-alpha.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.3-120611/python-3.11.0-alpha.3-win32-x64.zip" + }, + { + "filename": "python-3.11.0-alpha.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.3-120611/python-3.11.0-alpha.3-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-alpha.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-alpha.2-118811", + "files": [ + { + "filename": "python-3.11.0-alpha.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.2-118811/python-3.11.0-alpha.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.2-118811/python-3.11.0-alpha.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.2-118811/python-3.11.0-alpha.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.2-118811/python-3.11.0-alpha.2-win32-x64.zip" + }, + { + "filename": "python-3.11.0-alpha.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.2-118811/python-3.11.0-alpha.2-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-alpha.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-alpha.1-117932", + "files": [ + { + "filename": "python-3.11.0-alpha.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.1-117932/python-3.11.0-alpha.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.1-117932/python-3.11.0-alpha.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.1-117932/python-3.11.0-alpha.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.1-117932/python-3.11.0-alpha.1-win32-x64.zip" + }, + { + "filename": "python-3.11.0-alpha.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.1-117932/python-3.11.0-alpha.1-win32-x86.zip" + } + ] + }, + { + "version": "3.10.20", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.20-22630057857", + "files": [ + { + "filename": "python-3.10.20-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.20-22630057857/python-3.10.20-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.20-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.20-22630057857/python-3.10.20-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.20-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.20-22630057857/python-3.10.20-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.20-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.20-22630057857/python-3.10.20-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.20-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.20-22630057857/python-3.10.20-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.10.19", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.19-18393196481", + "files": [ + { + "filename": "python-3.10.19-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.19-18393196481/python-3.10.19-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.19-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.19-18393196481/python-3.10.19-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.19-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.19-18393196481/python-3.10.19-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.19-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.19-18393196481/python-3.10.19-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.19-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.19-18393196481/python-3.10.19-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.10.18", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.18-15433209320", + "files": [ + { + "filename": "python-3.10.18-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.18-15433209320/python-3.10.18-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.18-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.18-15433209320/python-3.10.18-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.18-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.18-15433209320/python-3.10.18-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.18-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.18-15433209320/python-3.10.18-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.18-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.18-15433209320/python-3.10.18-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.10.17", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.17-14343836466", + "files": [ + { + "filename": "python-3.10.17-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.17-14343836466/python-3.10.17-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.17-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.17-14343836466/python-3.10.17-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.17-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.17-14343836466/python-3.10.17-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.17-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.17-14343836466/python-3.10.17-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.17-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.17-14343836466/python-3.10.17-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.17-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.17-14343836466/python-3.10.17-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.10.16", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.16-12302993382", + "files": [ + { + "filename": "python-3.10.16-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.16-12302993382/python-3.10.16-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.16-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.16-12302993382/python-3.10.16-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.16-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.16-12302993382/python-3.10.16-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.16-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.16-12302993382/python-3.10.16-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.16-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.16-12302993382/python-3.10.16-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.16-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.16-12302993382/python-3.10.16-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.10.15", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.15-10765692022", + "files": [ + { + "filename": "python-3.10.15-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.15-10765692022/python-3.10.15-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.15-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.15-10765692022/python-3.10.15-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.15-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.15-10765692022/python-3.10.15-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.15-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.15-10765692022/python-3.10.15-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.15-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.15-10765692022/python-3.10.15-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.15-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.15-10765692022/python-3.10.15-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.10.14", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.14-9962525809", + "files": [ + { + "filename": "python-3.10.14-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.14-9962525809/python-3.10.14-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.14-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.14-9962525809/python-3.10.14-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.14-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.14-9962525809/python-3.10.14-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.14-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.14-9962525809/python-3.10.14-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.14-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.14-9962525809/python-3.10.14-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.14-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.14-9962525809/python-3.10.14-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.10.13", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.13-11113412466", + "files": [ + { + "filename": "python-3.10.13-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.13-11113412466/python-3.10.13-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.13-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.13-11113412466/python-3.10.13-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.13-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.13-11113412466/python-3.10.13-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.13-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.13-11113412466/python-3.10.13-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.13-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.13-11113412466/python-3.10.13-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.13-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.13-11113412466/python-3.10.13-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.10.12", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.12-11114375244", + "files": [ + { + "filename": "python-3.10.12-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.12-11114375244/python-3.10.12-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.12-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.12-11114375244/python-3.10.12-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.12-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.12-11114375244/python-3.10.12-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.12-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.12-11114375244/python-3.10.12-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.12-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.12-11114375244/python-3.10.12-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.12-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.12-11114375244/python-3.10.12-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.10.11", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.11-11114431484", + "files": [ + { + "filename": "python-3.10.11-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.11-11114431484/python-3.10.11-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.10.11-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.11-11114431484/python-3.10.11-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.11-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.11-11114431484/python-3.10.11-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.11-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.11-11114431484/python-3.10.11-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.11-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.11-11114431484/python-3.10.11-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.11-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.11-11114431484/python-3.10.11-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.11-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.11-11114431484/python-3.10.11-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.10.11-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.11-11114431484/python-3.10.11-win32-x64.zip" + }, + { + "filename": "python-3.10.11-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.11-11114431484/python-3.10.11-win32-x86.zip" + } + ] + }, + { + "version": "3.10.10", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.10-11156136298", + "files": [ + { + "filename": "python-3.10.10-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.10-11156136298/python-3.10.10-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.10.10-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.10-11156136298/python-3.10.10-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.10-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.10-11156136298/python-3.10.10-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.10-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.10-11156136298/python-3.10.10-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.10-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.10-11156136298/python-3.10.10-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.10-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.10-11156136298/python-3.10.10-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.10-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.10-11156136298/python-3.10.10-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.10.10-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.10-11156136298/python-3.10.10-win32-x64.zip" + }, + { + "filename": "python-3.10.10-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.10-11156136298/python-3.10.10-win32-x86.zip" + } + ] + }, + { + "version": "3.10.9", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.9-11156110083", + "files": [ + { + "filename": "python-3.10.9-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.9-11156110083/python-3.10.9-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.10.9-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.9-11156110083/python-3.10.9-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.9-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.9-11156110083/python-3.10.9-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.9-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.9-11156110083/python-3.10.9-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.9-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.9-11156110083/python-3.10.9-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.9-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.9-11156110083/python-3.10.9-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.9-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.9-11156110083/python-3.10.9-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.10.9-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.9-11156110083/python-3.10.9-win32-x64.zip" + }, + { + "filename": "python-3.10.9-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.9-11156110083/python-3.10.9-win32-x86.zip" + } + ] + }, + { + "version": "3.10.8", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.8-11157050441", + "files": [ + { + "filename": "python-3.10.8-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.8-11157050441/python-3.10.8-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.10.8-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.8-11157050441/python-3.10.8-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.8-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.8-11157050441/python-3.10.8-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.8-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.8-11157050441/python-3.10.8-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.8-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.8-11157050441/python-3.10.8-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.8-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.8-11157050441/python-3.10.8-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.8-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.8-11157050441/python-3.10.8-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.10.8-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.8-11157050441/python-3.10.8-win32-x64.zip" + }, + { + "filename": "python-3.10.8-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.8-11157050441/python-3.10.8-win32-x86.zip" + } + ] + }, + { + "version": "3.10.7", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.7-11156088973", + "files": [ + { + "filename": "python-3.10.7-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.7-11156088973/python-3.10.7-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.10.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.7-11156088973/python-3.10.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.7-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.7-11156088973/python-3.10.7-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.7-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.7-11156088973/python-3.10.7-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.7-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.7-11156088973/python-3.10.7-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.7-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.7-11156088973/python-3.10.7-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.7-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.7-11156088973/python-3.10.7-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.10.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.7-11156088973/python-3.10.7-win32-x64.zip" + }, + { + "filename": "python-3.10.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.7-11156088973/python-3.10.7-win32-x86.zip" + } + ] + }, + { + "version": "3.10.6", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.6-11156080153", + "files": [ + { + "filename": "python-3.10.6-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.6-11156080153/python-3.10.6-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.10.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.6-11156080153/python-3.10.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.6-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.6-11156080153/python-3.10.6-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.6-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.6-11156080153/python-3.10.6-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.6-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.6-11156080153/python-3.10.6-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.6-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.6-11156080153/python-3.10.6-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.6-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.6-11156080153/python-3.10.6-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.10.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.6-11156080153/python-3.10.6-win32-x64.zip" + }, + { + "filename": "python-3.10.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.6-11156080153/python-3.10.6-win32-x86.zip" + } + ] + }, + { + "version": "3.10.5", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.5-11156057491", + "files": [ + { + "filename": "python-3.10.5-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.5-11156057491/python-3.10.5-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.10.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.5-11156057491/python-3.10.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.5-11156057491/python-3.10.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.5-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.5-11156057491/python-3.10.5-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.5-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.5-11156057491/python-3.10.5-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.5-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.5-11156057491/python-3.10.5-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.5-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.5-11156057491/python-3.10.5-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.10.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.5-11156057491/python-3.10.5-win32-x64.zip" + }, + { + "filename": "python-3.10.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.5-11156057491/python-3.10.5-win32-x86.zip" + } + ] + }, + { + "version": "3.10.4", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.4-11156037683", + "files": [ + { + "filename": "python-3.10.4-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.4-11156037683/python-3.10.4-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.10.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.4-11156037683/python-3.10.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.4-11156037683/python-3.10.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.4-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.4-11156037683/python-3.10.4-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.4-11156037683/python-3.10.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.4-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.4-11156037683/python-3.10.4-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.4-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.4-11156037683/python-3.10.4-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.10.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.4-11156037683/python-3.10.4-win32-x64.zip" + }, + { + "filename": "python-3.10.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.4-11156037683/python-3.10.4-win32-x86.zip" + } + ] + }, + { + "version": "3.10.3", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.3-2000219088", + "files": [ + { + "filename": "python-3.10.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.3-2000219088/python-3.10.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.3-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.3-2000219088/python-3.10.3-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.3-2000219088/python-3.10.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.3-2000219088/python-3.10.3-win32-x64.zip" + }, + { + "filename": "python-3.10.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.3-2000219088/python-3.10.3-win32-x86.zip" + } + ] + }, + { + "version": "3.10.2", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.2-1805098134", + "files": [ + { + "filename": "python-3.10.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.2-1805098134/python-3.10.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.2-1805098134/python-3.10.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.2-1805098134/python-3.10.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.2-1805098134/python-3.10.2-win32-x64.zip" + }, + { + "filename": "python-3.10.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.2-1805098134/python-3.10.2-win32-x86.zip" + } + ] + }, + { + "version": "3.10.1", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.1-120613", + "files": [ + { + "filename": "python-3.10.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.1-120613/python-3.10.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.1-120613/python-3.10.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.1-120613/python-3.10.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.1-120613/python-3.10.1-win32-x64.zip" + }, + { + "filename": "python-3.10.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.1-120613/python-3.10.1-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-117927", + "files": [ + { + "filename": "python-3.10.0-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-117927/python-3.10.0-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-117927/python-3.10.0-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-117927/python-3.10.0-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-117927/python-3.10.0-win32-x64.zip" + }, + { + "filename": "python-3.10.0-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-117927/python-3.10.0-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-rc.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-rc.2-116172", + "files": [ + { + "filename": "python-3.10.0-rc.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-rc.2-116172/python-3.10.0-rc.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-rc.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-rc.2-116172/python-3.10.0-rc.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-rc.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-rc.2-116172/python-3.10.0-rc.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-rc.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-rc.2-116172/python-3.10.0-rc.2-win32-x64.zip" + }, + { + "filename": "python-3.10.0-rc.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-rc.2-116172/python-3.10.0-rc.2-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-rc.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-rc.1-114570", + "files": [ + { + "filename": "python-3.10.0-rc.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-rc.1-114570/python-3.10.0-rc.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-rc.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-rc.1-114570/python-3.10.0-rc.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-rc.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-rc.1-114570/python-3.10.0-rc.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-rc.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-rc.1-114570/python-3.10.0-rc.1-win32-x64.zip" + }, + { + "filename": "python-3.10.0-rc.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-rc.1-114570/python-3.10.0-rc.1-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-beta.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-beta.4-113274", + "files": [ + { + "filename": "python-3.10.0-beta.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.4-113274/python-3.10.0-beta.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.4-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.4-113274/python-3.10.0-beta.4-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.4-113274/python-3.10.0-beta.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.4-113274/python-3.10.0-beta.4-win32-x64.zip" + }, + { + "filename": "python-3.10.0-beta.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.4-113274/python-3.10.0-beta.4-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-beta.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-beta.3-112036", + "files": [ + { + "filename": "python-3.10.0-beta.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.3-112036/python-3.10.0-beta.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.3-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.3-112036/python-3.10.0-beta.3-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.3-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.3-112036/python-3.10.0-beta.3-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.3-112036/python-3.10.0-beta.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.3-112036/python-3.10.0-beta.3-win32-x64.zip" + }, + { + "filename": "python-3.10.0-beta.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.3-112036/python-3.10.0-beta.3-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-beta.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-beta.2-110345", + "files": [ + { + "filename": "python-3.10.0-beta.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.2-110345/python-3.10.0-beta.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.2-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.2-110345/python-3.10.0-beta.2-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.2-110345/python-3.10.0-beta.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.2-110345/python-3.10.0-beta.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.2-110345/python-3.10.0-beta.2-win32-x64.zip" + }, + { + "filename": "python-3.10.0-beta.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.2-110345/python-3.10.0-beta.2-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-beta.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-beta.1-107003", + "files": [ + { + "filename": "python-3.10.0-beta.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.1-107003/python-3.10.0-beta.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.1-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.1-107003/python-3.10.0-beta.1-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.1-107003/python-3.10.0-beta.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.1-107003/python-3.10.0-beta.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.1-107003/python-3.10.0-beta.1-win32-x64.zip" + }, + { + "filename": "python-3.10.0-beta.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.1-107003/python-3.10.0-beta.1-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-alpha.7", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-alpha.7-104142", + "files": [ + { + "filename": "python-3.10.0-alpha.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.7-104142/python-3.10.0-alpha.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.7-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.7-104142/python-3.10.0-alpha.7-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.7-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.7-104142/python-3.10.0-alpha.7-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.7-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.7-104142/python-3.10.0-alpha.7-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.7-104142/python-3.10.0-alpha.7-win32-x64.zip" + }, + { + "filename": "python-3.10.0-alpha.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.7-104142/python-3.10.0-alpha.7-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-alpha.6", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-alpha.6-101284", + "files": [ + { + "filename": "python-3.10.0-alpha.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.6-101284/python-3.10.0-alpha.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.6-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.6-101284/python-3.10.0-alpha.6-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.6-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.6-101284/python-3.10.0-alpha.6-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.6-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.6-101284/python-3.10.0-alpha.6-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.6-101284/python-3.10.0-alpha.6-win32-x64.zip" + }, + { + "filename": "python-3.10.0-alpha.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.6-101284/python-3.10.0-alpha.6-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-alpha.5", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-alpha.5-100730", + "files": [ + { + "filename": "python-3.10.0-alpha.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.5-100730/python-3.10.0-alpha.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.5-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.5-100730/python-3.10.0-alpha.5-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.5-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.5-100730/python-3.10.0-alpha.5-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.5-100730/python-3.10.0-alpha.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.5-100730/python-3.10.0-alpha.5-win32-x64.zip" + }, + { + "filename": "python-3.10.0-alpha.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.5-100730/python-3.10.0-alpha.5-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-alpha.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-alpha.4-96713", + "files": [ + { + "filename": "python-3.10.0-alpha.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.4-96713/python-3.10.0-alpha.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.4-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.4-96713/python-3.10.0-alpha.4-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.4-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.4-96713/python-3.10.0-alpha.4-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.4-96713/python-3.10.0-alpha.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.4-96713/python-3.10.0-alpha.4-win32-x64.zip" + }, + { + "filename": "python-3.10.0-alpha.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.4-96713/python-3.10.0-alpha.4-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-alpha.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-alpha.3-96712", + "files": [ + { + "filename": "python-3.10.0-alpha.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.3-96712/python-3.10.0-alpha.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.3-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.3-96712/python-3.10.0-alpha.3-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.3-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.3-96712/python-3.10.0-alpha.3-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.3-96712/python-3.10.0-alpha.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.3-96712/python-3.10.0-alpha.3-win32-x64.zip" + }, + { + "filename": "python-3.10.0-alpha.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.3-96712/python-3.10.0-alpha.3-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-alpha.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-alpha.2-96711", + "files": [ + { + "filename": "python-3.10.0-alpha.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.2-96711/python-3.10.0-alpha.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.2-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.2-96711/python-3.10.0-alpha.2-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.2-96711/python-3.10.0-alpha.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.2-96711/python-3.10.0-alpha.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.2-96711/python-3.10.0-alpha.2-win32-x64.zip" + }, + { + "filename": "python-3.10.0-alpha.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.2-96711/python-3.10.0-alpha.2-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-alpha.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-alpha.1-96710", + "files": [ + { + "filename": "python-3.10.0-alpha.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.1-96710/python-3.10.0-alpha.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.1-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.1-96710/python-3.10.0-alpha.1-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.1-96710/python-3.10.0-alpha.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.1-96710/python-3.10.0-alpha.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.1-96710/python-3.10.0-alpha.1-win32-x64.zip" + }, + { + "filename": "python-3.10.0-alpha.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.1-96710/python-3.10.0-alpha.1-win32-x86.zip" + } + ] + }, + { + "version": "3.9.25", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.25-19039189640", + "files": [ + { + "filename": "python-3.9.25-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.25-19039189640/python-3.9.25-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.25-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.25-19039189640/python-3.9.25-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.25-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.25-19039189640/python-3.9.25-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.25-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.25-19039189640/python-3.9.25-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.25-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.25-19039189640/python-3.9.25-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.24", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.24-18393164954", + "files": [ + { + "filename": "python-3.9.24-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.24-18393164954/python-3.9.24-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.24-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.24-18393164954/python-3.9.24-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.24-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.24-18393164954/python-3.9.24-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.24-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.24-18393164954/python-3.9.24-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.24-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.24-18393164954/python-3.9.24-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.23", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.23-15433290661", + "files": [ + { + "filename": "python-3.9.23-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.23-15433290661/python-3.9.23-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.23-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.23-15433290661/python-3.9.23-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.23-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.23-15433290661/python-3.9.23-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.23-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.23-15433290661/python-3.9.23-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.23-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.23-15433290661/python-3.9.23-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.22", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.22-14344111503", + "files": [ + { + "filename": "python-3.9.22-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.22-14344111503/python-3.9.22-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.22-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.22-14344111503/python-3.9.22-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.22-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.22-14344111503/python-3.9.22-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.22-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.22-14344111503/python-3.9.22-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.22-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.22-14344111503/python-3.9.22-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.22-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.22-14344111503/python-3.9.22-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.21", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.21-12303000710", + "files": [ + { + "filename": "python-3.9.21-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.21-12303000710/python-3.9.21-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.21-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.21-12303000710/python-3.9.21-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.21-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.21-12303000710/python-3.9.21-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.21-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.21-12303000710/python-3.9.21-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.21-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.21-12303000710/python-3.9.21-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.21-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.21-12303000710/python-3.9.21-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.20", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.20-10765735733", + "files": [ + { + "filename": "python-3.9.20-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.20-10765735733/python-3.9.20-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.20-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.20-10765735733/python-3.9.20-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.20-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.20-10765735733/python-3.9.20-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.20-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.20-10765735733/python-3.9.20-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.20-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.20-10765735733/python-3.9.20-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.20-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.20-10765735733/python-3.9.20-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.19", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.19-9962534424", + "files": [ + { + "filename": "python-3.9.19-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.19-9962534424/python-3.9.19-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.19-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.19-9962534424/python-3.9.19-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.19-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.19-9962534424/python-3.9.19-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.19-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.19-9962534424/python-3.9.19-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.19-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.19-9962534424/python-3.9.19-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.19-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.19-9962534424/python-3.9.19-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.18", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.18-11183952707", + "files": [ + { + "filename": "python-3.9.18-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.18-11183952707/python-3.9.18-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.18-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.18-11183952707/python-3.9.18-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.18-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.18-11183952707/python-3.9.18-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.18-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.18-11183952707/python-3.9.18-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.18-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.18-11183952707/python-3.9.18-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.18-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.18-11183952707/python-3.9.18-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.17", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.17-11183917965", + "files": [ + { + "filename": "python-3.9.17-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.17-11183917965/python-3.9.17-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.17-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.17-11183917965/python-3.9.17-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.17-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.17-11183917965/python-3.9.17-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.17-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.17-11183917965/python-3.9.17-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.17-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.17-11183917965/python-3.9.17-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.17-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.17-11183917965/python-3.9.17-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.16", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.16-11183815643", + "files": [ + { + "filename": "python-3.9.16-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.16-11183815643/python-3.9.16-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.16-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.16-11183815643/python-3.9.16-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.16-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.16-11183815643/python-3.9.16-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.16-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.16-11183815643/python-3.9.16-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.16-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.16-11183815643/python-3.9.16-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.16-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.16-11183815643/python-3.9.16-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.15", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.15-11183782044", + "files": [ + { + "filename": "python-3.9.15-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.15-11183782044/python-3.9.15-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.15-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.15-11183782044/python-3.9.15-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.15-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.15-11183782044/python-3.9.15-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.15-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.15-11183782044/python-3.9.15-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.15-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.15-11183782044/python-3.9.15-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.15-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.15-11183782044/python-3.9.15-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.14", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.14-11183735553", + "files": [ + { + "filename": "python-3.9.14-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.14-11183735553/python-3.9.14-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.14-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.14-11183735553/python-3.9.14-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.14-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.14-11183735553/python-3.9.14-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.14-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.14-11183735553/python-3.9.14-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.14-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.14-11183735553/python-3.9.14-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.14-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.14-11183735553/python-3.9.14-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.13", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.13-11183687820", + "files": [ + { + "filename": "python-3.9.13-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.13-11183687820/python-3.9.13-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.9.13-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.13-11183687820/python-3.9.13-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.13-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.13-11183687820/python-3.9.13-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.13-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.13-11183687820/python-3.9.13-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.13-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.13-11183687820/python-3.9.13-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.13-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.13-11183687820/python-3.9.13-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.13-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.13-11183687820/python-3.9.13-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.9.13-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.13-11183687820/python-3.9.13-win32-x64.zip" + }, + { + "filename": "python-3.9.13-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.13-11183687820/python-3.9.13-win32-x86.zip" + } + ] + }, + { + "version": "3.9.12", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.12-11183622568", + "files": [ + { + "filename": "python-3.9.12-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.12-11183622568/python-3.9.12-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.9.12-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.12-11183622568/python-3.9.12-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.12-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.12-11183622568/python-3.9.12-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.12-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.12-11183622568/python-3.9.12-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.12-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.12-11183622568/python-3.9.12-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.12-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.12-11183622568/python-3.9.12-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.12-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.12-11183622568/python-3.9.12-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.9.12-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.12-11183622568/python-3.9.12-win32-x64.zip" + }, + { + "filename": "python-3.9.12-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.12-11183622568/python-3.9.12-win32-x86.zip" + } + ] + }, + { + "version": "3.9.11", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.11-2018436241", + "files": [ + { + "filename": "python-3.9.11-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.11-2018436241/python-3.9.11-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.11-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.11-2018436241/python-3.9.11-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.11-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.11-2018436241/python-3.9.11-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.11-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.11-2018436241/python-3.9.11-win32-x64.zip" + }, + { + "filename": "python-3.9.11-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.11-2018436241/python-3.9.11-win32-x86.zip" + } + ] + }, + { + "version": "3.9.10", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.10-1788162477", + "files": [ + { + "filename": "python-3.9.10-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.10-1788162477/python-3.9.10-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.10-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.10-1788162477/python-3.9.10-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.10-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.10-1788162477/python-3.9.10-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.10-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.10-1788162477/python-3.9.10-win32-x64.zip" + }, + { + "filename": "python-3.9.10-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.10-1788162477/python-3.9.10-win32-x86.zip" + } + ] + }, + { + "version": "3.9.9", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.9-119268", + "files": [ + { + "filename": "python-3.9.9-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.9-119268/python-3.9.9-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.9-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.9-119268/python-3.9.9-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.9-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.9-119268/python-3.9.9-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.9-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.9-119268/python-3.9.9-win32-x64.zip" + }, + { + "filename": "python-3.9.9-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.9-119268/python-3.9.9-win32-x86.zip" + } + ] + }, + { + "version": "3.9.8", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.8-118810", + "files": [ + { + "filename": "python-3.9.8-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.8-118810/python-3.9.8-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.8-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.8-118810/python-3.9.8-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.8-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.8-118810/python-3.9.8-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.8-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.8-118810/python-3.9.8-win32-x64.zip" + }, + { + "filename": "python-3.9.8-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.8-118810/python-3.9.8-win32-x86.zip" + } + ] + }, + { + "version": "3.9.7", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.7-1812317133", + "files": [ + { + "filename": "python-3.9.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.7-1812317133/python-3.9.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.7-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.7-1812317133/python-3.9.7-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.7-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.7-1812317133/python-3.9.7-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.7-1812317133/python-3.9.7-win32-x64.zip" + }, + { + "filename": "python-3.9.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.7-1812317133/python-3.9.7-win32-x86.zip" + } + ] + }, + { + "version": "3.9.6", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.6-117960", + "files": [ + { + "filename": "python-3.9.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.6-117960/python-3.9.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.6-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.6-117960/python-3.9.6-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.6-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.6-117960/python-3.9.6-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.6-117960/python-3.9.6-win32-x64.zip" + }, + { + "filename": "python-3.9.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.6-117960/python-3.9.6-win32-x86.zip" + } + ] + }, + { + "version": "3.9.5", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.5-109482", + "files": [ + { + "filename": "python-3.9.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.5-109482/python-3.9.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.5-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.5-109482/python-3.9.5-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.5-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.5-109482/python-3.9.5-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.5-109482/python-3.9.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.5-109482/python-3.9.5-win32-x64.zip" + }, + { + "filename": "python-3.9.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.5-109482/python-3.9.5-win32-x86.zip" + } + ] + }, + { + "version": "3.9.4", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.4-103698", + "files": [ + { + "filename": "python-3.9.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.4-103698/python-3.9.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.4-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.4-103698/python-3.9.4-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.4-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.4-103698/python-3.9.4-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.4-103698/python-3.9.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.4-103698/python-3.9.4-win32-x64.zip" + }, + { + "filename": "python-3.9.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.4-103698/python-3.9.4-win32-x86.zip" + } + ] + }, + { + "version": "3.9.3", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.3-103669", + "files": [ + { + "filename": "python-3.9.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.3-103669/python-3.9.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.3-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.3-103669/python-3.9.3-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.3-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.3-103669/python-3.9.3-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.3-103669/python-3.9.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.3-103669/python-3.9.3-win32-x64.zip" + }, + { + "filename": "python-3.9.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.3-103669/python-3.9.3-win32-x86.zip" + } + ] + }, + { + "version": "3.9.2", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.2-99799", + "files": [ + { + "filename": "python-3.9.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-99799/python-3.9.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.2-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-99799/python-3.9.2-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-99799/python-3.9.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-99799/python-3.9.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-99799/python-3.9.2-win32-x64.zip" + }, + { + "filename": "python-3.9.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-99799/python-3.9.2-win32-x86.zip" + } + ] + }, + { + "version": "3.9.2-rc.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.2-rc.1-99844", + "files": [ + { + "filename": "python-3.9.2-rc.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-rc.1-99844/python-3.9.2-rc.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.2-rc.1-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-rc.1-99844/python-3.9.2-rc.1-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.2-rc.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-rc.1-99844/python-3.9.2-rc.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.2-rc.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-rc.1-99844/python-3.9.2-rc.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.2-rc.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-rc.1-99844/python-3.9.2-rc.1-win32-x64.zip" + }, + { + "filename": "python-3.9.2-rc.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-rc.1-99844/python-3.9.2-rc.1-win32-x86.zip" + } + ] + }, + { + "version": "3.9.1", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.1-96692", + "files": [ + { + "filename": "python-3.9.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-96692/python-3.9.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.1-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-96692/python-3.9.1-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-96692/python-3.9.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-96692/python-3.9.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-96692/python-3.9.1-win32-x64.zip" + }, + { + "filename": "python-3.9.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-96692/python-3.9.1-win32-x86.zip" + } + ] + }, + { + "version": "3.9.1-rc.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.1-rc.1-91591", + "files": [ + { + "filename": "python-3.9.1-rc.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-rc.1-91591/python-3.9.1-rc.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.1-rc.1-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-rc.1-91591/python-3.9.1-rc.1-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.1-rc.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-rc.1-91591/python-3.9.1-rc.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.1-rc.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-rc.1-91591/python-3.9.1-rc.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.1-rc.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-rc.1-91591/python-3.9.1-rc.1-win32-x64.zip" + }, + { + "filename": "python-3.9.1-rc.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-rc.1-91591/python-3.9.1-rc.1-win32-x86.zip" + } + ] + }, + { + "version": "3.9.0", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.0-96741", + "files": [ + { + "filename": "python-3.9.0-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-96741/python-3.9.0-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.0-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-96741/python-3.9.0-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-96741/python-3.9.0-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-96741/python-3.9.0-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-96741/python-3.9.0-win32-x64.zip" + }, + { + "filename": "python-3.9.0-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-96741/python-3.9.0-win32-x86.zip" + } + ] + }, + { + "version": "3.9.0-rc.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.0-rc.2-90045", + "files": [ + { + "filename": "python-3.9.0-rc.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.2-90045/python-3.9.0-rc.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.0-rc.2-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.2-90045/python-3.9.0-rc.2-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-rc.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.2-90045/python-3.9.0-rc.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-rc.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.2-90045/python-3.9.0-rc.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-rc.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.2-90045/python-3.9.0-rc.2-win32-x64.zip" + }, + { + "filename": "python-3.9.0-rc.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.2-90045/python-3.9.0-rc.2-win32-x86.zip" + } + ] + }, + { + "version": "3.9.0-rc.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.0-rc.1-90074", + "files": [ + { + "filename": "python-3.9.0-rc.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.1-90074/python-3.9.0-rc.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.0-rc.1-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.1-90074/python-3.9.0-rc.1-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-rc.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.1-90074/python-3.9.0-rc.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-rc.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.1-90074/python-3.9.0-rc.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-rc.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.1-90074/python-3.9.0-rc.1-win32-x64.zip" + }, + { + "filename": "python-3.9.0-rc.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.1-90074/python-3.9.0-rc.1-win32-x86.zip" + } + ] + }, + { + "version": "3.9.0-beta.5", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.0-beta.5-89866", + "files": [ + { + "filename": "python-3.9.0-beta.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.5-89866/python-3.9.0-beta.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.0-beta.5-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.5-89866/python-3.9.0-beta.5-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-beta.5-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.5-89866/python-3.9.0-beta.5-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-beta.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.5-89866/python-3.9.0-beta.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-beta.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.5-89866/python-3.9.0-beta.5-win32-x64.zip" + }, + { + "filename": "python-3.9.0-beta.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.5-89866/python-3.9.0-beta.5-win32-x86.zip" + } + ] + }, + { + "version": "3.9.0-beta.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.0-beta.4-89867", + "files": [ + { + "filename": "python-3.9.0-beta.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.4-89867/python-3.9.0-beta.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.0-beta.4-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.4-89867/python-3.9.0-beta.4-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-beta.4-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.4-89867/python-3.9.0-beta.4-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-beta.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.4-89867/python-3.9.0-beta.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-beta.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.4-89867/python-3.9.0-beta.4-win32-x64.zip" + }, + { + "filename": "python-3.9.0-beta.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.4-89867/python-3.9.0-beta.4-win32-x86.zip" + } + ] + }, + { + "version": "3.8.18", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.18-12303122501", + "files": [ + { + "filename": "python-3.8.18-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.18-12303122501/python-3.8.18-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.18-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.18-12303122501/python-3.8.18-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.18-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.18-12303122501/python-3.8.18-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.18-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.18-12303122501/python-3.8.18-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.8.18-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.18-12303122501/python-3.8.18-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.18-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.18-12303122501/python-3.8.18-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.8.17", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.17-11228156509", + "files": [ + { + "filename": "python-3.8.17-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.17-11228156509/python-3.8.17-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.17-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.17-11228156509/python-3.8.17-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.17-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.17-11228156509/python-3.8.17-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.17-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.17-11228156509/python-3.8.17-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.8.17-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.17-11228156509/python-3.8.17-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.17-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.17-11228156509/python-3.8.17-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.8.16", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.16-11228150325", + "files": [ + { + "filename": "python-3.8.16-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.16-11228150325/python-3.8.16-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.16-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.16-11228150325/python-3.8.16-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.16-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.16-11228150325/python-3.8.16-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.16-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.16-11228150325/python-3.8.16-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.8.16-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.16-11228150325/python-3.8.16-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.16-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.16-11228150325/python-3.8.16-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.8.15", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.15-11228144472", + "files": [ + { + "filename": "python-3.8.15-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.15-11228144472/python-3.8.15-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.15-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.15-11228144472/python-3.8.15-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.15-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.15-11228144472/python-3.8.15-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.15-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.15-11228144472/python-3.8.15-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.8.15-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.15-11228144472/python-3.8.15-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.15-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.15-11228144472/python-3.8.15-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.8.14", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.14-11228133045", + "files": [ + { + "filename": "python-3.8.14-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.14-11228133045/python-3.8.14-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.14-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.14-11228133045/python-3.8.14-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.14-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.14-11228133045/python-3.8.14-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.14-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.14-11228133045/python-3.8.14-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.8.14-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.14-11228133045/python-3.8.14-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.14-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.14-11228133045/python-3.8.14-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.8.13", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.13-11228121154", + "files": [ + { + "filename": "python-3.8.13-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.13-11228121154/python-3.8.13-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.13-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.13-11228121154/python-3.8.13-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.13-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.13-11228121154/python-3.8.13-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.13-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.13-11228121154/python-3.8.13-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.8.13-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.13-11228121154/python-3.8.13-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.13-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.13-11228121154/python-3.8.13-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.8.12", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.12-11297040709", + "files": [ + { + "filename": "python-3.8.12-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.12-11297040709/python-3.8.12-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.12-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.12-11297040709/python-3.8.12-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.12-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.12-11297040709/python-3.8.12-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.12-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.12-11297040709/python-3.8.12-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.8.12-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.12-11297040709/python-3.8.12-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.12-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.12-11297040709/python-3.8.12-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.8.11", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.11-113062", + "files": [ + { + "filename": "python-3.8.11-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.11-113062/python-3.8.11-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.11-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.11-113062/python-3.8.11-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.8.11-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.11-113062/python-3.8.11-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.8.10", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.10-8879978422", + "files": [ + { + "filename": "python-3.8.10-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.10-8879978422/python-3.8.10-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.8.10-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.10-8879978422/python-3.8.10-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.10-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.10-8879978422/python-3.8.10-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.10-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.10-8879978422/python-3.8.10-win32-x64.zip" + }, + { + "filename": "python-3.8.10-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.10-8879978422/python-3.8.10-win32-x86.zip" + } + ] + }, + { + "version": "3.8.9", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.9-104257", + "files": [ + { + "filename": "python-3.8.9-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.9-104257/python-3.8.9-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.9-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.9-104257/python-3.8.9-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.8.9-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.9-104257/python-3.8.9-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.8.9-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.9-104257/python-3.8.9-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.9-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.9-104257/python-3.8.9-win32-x64.zip" + }, + { + "filename": "python-3.8.9-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.9-104257/python-3.8.9-win32-x86.zip" + } + ] + }, + { + "version": "3.8.8", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.8-99800", + "files": [ + { + "filename": "python-3.8.8-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.8-99800/python-3.8.8-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.8-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.8-99800/python-3.8.8-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.8.8-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.8-99800/python-3.8.8-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.8.8-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.8-99800/python-3.8.8-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.8-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.8-99800/python-3.8.8-win32-x64.zip" + }, + { + "filename": "python-3.8.8-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.8-99800/python-3.8.8-win32-x86.zip" + } + ] + }, + { + "version": "3.8.7", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.7-96742", + "files": [ + { + "filename": "python-3.8.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.7-96742/python-3.8.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.7-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.7-96742/python-3.8.7-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.8.7-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.7-96742/python-3.8.7-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.8.7-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.7-96742/python-3.8.7-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.7-96742/python-3.8.7-win32-x64.zip" + }, + { + "filename": "python-3.8.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.7-96742/python-3.8.7-win32-x86.zip" + } + ] + }, + { + "version": "3.8.6", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.6-117961", + "files": [ + { + "filename": "python-3.8.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.6-117961/python-3.8.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.6-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.6-117961/python-3.8.6-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.8.6-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.6-117961/python-3.8.6-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.6-117961/python-3.8.6-win32-x64.zip" + }, + { + "filename": "python-3.8.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.6-117961/python-3.8.6-win32-x86.zip" + } + ] + }, + { + "version": "3.8.5", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.5-96743", + "files": [ + { + "filename": "python-3.8.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.5-96743/python-3.8.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.5-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.5-96743/python-3.8.5-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.8.5-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.5-96743/python-3.8.5-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.8.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.5-96743/python-3.8.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.5-96743/python-3.8.5-win32-x64.zip" + }, + { + "filename": "python-3.8.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.5-96743/python-3.8.5-win32-x86.zip" + } + ] + }, + { + "version": "3.8.4", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.4-96744", + "files": [ + { + "filename": "python-3.8.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.4-96744/python-3.8.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.4-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.4-96744/python-3.8.4-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.8.4-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.4-96744/python-3.8.4-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.8.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.4-96744/python-3.8.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.4-96744/python-3.8.4-win32-x64.zip" + }, + { + "filename": "python-3.8.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.4-96744/python-3.8.4-win32-x86.zip" + } + ] + }, + { + "version": "3.8.3", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.3-96745", + "files": [ + { + "filename": "python-3.8.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.3-96745/python-3.8.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.3-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.3-96745/python-3.8.3-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.8.3-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.3-96745/python-3.8.3-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.8.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.3-96745/python-3.8.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.3-96745/python-3.8.3-win32-x64.zip" + }, + { + "filename": "python-3.8.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.3-96745/python-3.8.3-win32-x86.zip" + } + ] + }, + { + "version": "3.8.2", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.2-96746", + "files": [ + { + "filename": "python-3.8.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.2-96746/python-3.8.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.2-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.2-96746/python-3.8.2-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.8.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.2-96746/python-3.8.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.8.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.2-96746/python-3.8.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.2-96746/python-3.8.2-win32-x64.zip" + }, + { + "filename": "python-3.8.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.2-96746/python-3.8.2-win32-x86.zip" + } + ] + }, + { + "version": "3.8.1", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.1-96747", + "files": [ + { + "filename": "python-3.8.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.1-96747/python-3.8.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.1-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.1-96747/python-3.8.1-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.8.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.1-96747/python-3.8.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.8.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.1-96747/python-3.8.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.1-96747/python-3.8.1-win32-x64.zip" + }, + { + "filename": "python-3.8.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.1-96747/python-3.8.1-win32-x86.zip" + } + ] + }, + { + "version": "3.8.0", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.0-96748", + "files": [ + { + "filename": "python-3.8.0-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.0-96748/python-3.8.0-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.0-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.0-96748/python-3.8.0-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.8.0-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.0-96748/python-3.8.0-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.8.0-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.0-96748/python-3.8.0-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.0-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.0-96748/python-3.8.0-win32-x64.zip" + }, + { + "filename": "python-3.8.0-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.0-96748/python-3.8.0-win32-x86.zip" + } + ] + }, + { + "version": "3.7.17", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.17-5356448435", + "files": [ + { + "filename": "python-3.7.17-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.17-5356448435/python-3.7.17-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.17-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.17-5356448435/python-3.7.17-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.17-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.17-5356448435/python-3.7.17-linux-22.04-x64.tar.gz" + } + ] + }, + { + "version": "3.7.16", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.16-4343262312", + "files": [ + { + "filename": "python-3.7.16-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.16-4343262312/python-3.7.16-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.16-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.16-4343262312/python-3.7.16-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.16-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.16-4343262312/python-3.7.16-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.16-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.16-4343262312/python-3.7.16-linux-22.04-x64.tar.gz" + } + ] + }, + { + "version": "3.7.15", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.15-3272001243", + "files": [ + { + "filename": "python-3.7.15-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.15-3272001243/python-3.7.15-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.15-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.15-3272001243/python-3.7.15-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.15-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.15-3272001243/python-3.7.15-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.15-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.15-3272001243/python-3.7.15-linux-22.04-x64.tar.gz" + } + ] + }, + { + "version": "3.7.14", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.14-3008342067", + "files": [ + { + "filename": "python-3.7.14-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.14-3008342067/python-3.7.14-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.14-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.14-3008342067/python-3.7.14-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.14-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.14-3008342067/python-3.7.14-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.14-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.14-3008342067/python-3.7.14-linux-22.04-x64.tar.gz" + } + ] + }, + { + "version": "3.7.13", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.13-2268493565", + "files": [ + { + "filename": "python-3.7.13-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.13-2268493565/python-3.7.13-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.13-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.13-2268493565/python-3.7.13-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.13-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.13-2268493565/python-3.7.13-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.13-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.13-2268493565/python-3.7.13-linux-22.04-x64.tar.gz" + } + ] + }, + { + "version": "3.7.12", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.12-116024", + "files": [ + { + "filename": "python-3.7.12-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.12-116024/python-3.7.12-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.12-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.12-116024/python-3.7.12-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.12-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.12-116024/python-3.7.12-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.7.11", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.11-113063", + "files": [ + { + "filename": "python-3.7.11-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.11-113063/python-3.7.11-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.11-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.11-113063/python-3.7.11-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.11-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.11-113063/python-3.7.11-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.7.10", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.10-99135", + "files": [ + { + "filename": "python-3.7.10-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.10-99135/python-3.7.10-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.10-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.10-99135/python-3.7.10-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.7.10-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.10-99135/python-3.7.10-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.10-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.10-99135/python-3.7.10-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.7.9", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.9-109486", + "files": [ + { + "filename": "python-3.7.9-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.9-109486/python-3.7.9-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.9-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.9-109486/python-3.7.9-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.7.9-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.9-109486/python-3.7.9-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.9-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.9-109486/python-3.7.9-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.9-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.9-109486/python-3.7.9-win32-x64.zip" + }, + { + "filename": "python-3.7.9-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.9-109486/python-3.7.9-win32-x86.zip" + } + ] + }, + { + "version": "3.7.8", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.8-96788", + "files": [ + { + "filename": "python-3.7.8-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.8-96788/python-3.7.8-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.8-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.8-96788/python-3.7.8-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.7.8-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.8-96788/python-3.7.8-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.8-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.8-96788/python-3.7.8-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.8-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.8-96788/python-3.7.8-win32-x64.zip" + }, + { + "filename": "python-3.7.8-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.8-96788/python-3.7.8-win32-x86.zip" + } + ] + }, + { + "version": "3.7.7", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.7-96789", + "files": [ + { + "filename": "python-3.7.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.7-96789/python-3.7.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.7-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.7-96789/python-3.7.7-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.7.7-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.7-96789/python-3.7.7-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.7-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.7-96789/python-3.7.7-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.7-96789/python-3.7.7-win32-x64.zip" + }, + { + "filename": "python-3.7.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.7-96789/python-3.7.7-win32-x86.zip" + } + ] + }, + { + "version": "3.7.6", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.6-96790", + "files": [ + { + "filename": "python-3.7.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.6-96790/python-3.7.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.6-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.6-96790/python-3.7.6-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.7.6-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.6-96790/python-3.7.6-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.6-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.6-96790/python-3.7.6-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.6-96790/python-3.7.6-win32-x64.zip" + }, + { + "filename": "python-3.7.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.6-96790/python-3.7.6-win32-x86.zip" + } + ] + }, + { + "version": "3.7.5", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.5-96791", + "files": [ + { + "filename": "python-3.7.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.5-96791/python-3.7.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.5-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.5-96791/python-3.7.5-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.7.5-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.5-96791/python-3.7.5-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.5-96791/python-3.7.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.5-96791/python-3.7.5-win32-x64.zip" + }, + { + "filename": "python-3.7.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.5-96791/python-3.7.5-win32-x86.zip" + } + ] + }, + { + "version": "3.7.4", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.4-4113504688", + "files": [ + { + "filename": "python-3.7.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.4-4113504688/python-3.7.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.4-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.4-4113504688/python-3.7.4-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.4-4113504688/python-3.7.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.4-4113504688/python-3.7.4-win32-x64.zip" + }, + { + "filename": "python-3.7.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.4-4113504688/python-3.7.4-win32-x86.zip" + } + ] + }, + { + "version": "3.7.3", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.3-4112631780", + "files": [ + { + "filename": "python-3.7.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.3-4112631780/python-3.7.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.3-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.3-4112631780/python-3.7.3-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.3-4112631780/python-3.7.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.3-4112631780/python-3.7.3-win32-x64.zip" + }, + { + "filename": "python-3.7.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.3-4112631780/python-3.7.3-win32-x86.zip" + } + ] + }, + { + "version": "3.7.2", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.2-4113113291", + "files": [ + { + "filename": "python-3.7.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.2-4113113291/python-3.7.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.2-4113113291/python-3.7.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.2-4113113291/python-3.7.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.2-4113113291/python-3.7.2-win32-x64.zip" + }, + { + "filename": "python-3.7.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.2-4113113291/python-3.7.2-win32-x86.zip" + } + ] + }, + { + "version": "3.7.1", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.1-96792", + "files": [ + { + "filename": "python-3.7.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.1-96792/python-3.7.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.1-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.1-96792/python-3.7.1-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.7.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.1-96792/python-3.7.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.1-96792/python-3.7.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.1-96792/python-3.7.1-win32-x64.zip" + }, + { + "filename": "python-3.7.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.1-96792/python-3.7.1-win32-x86.zip" + } + ] + }, + { + "version": "3.6.15", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.6.15-116025", + "files": [ + { + "filename": "python-3.6.15-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.15-116025/python-3.6.15-darwin-x64.tar.gz" + }, + { + "filename": "python-3.6.15-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.15-116025/python-3.6.15-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.6.15-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.15-116025/python-3.6.15-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.6.14", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.6.14-113064", + "files": [ + { + "filename": "python-3.6.14-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.14-113064/python-3.6.14-darwin-x64.tar.gz" + }, + { + "filename": "python-3.6.14-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.14-113064/python-3.6.14-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.6.14-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.14-113064/python-3.6.14-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.6.13", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.6.13-99136", + "files": [ + { + "filename": "python-3.6.13-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.13-99136/python-3.6.13-darwin-x64.tar.gz" + }, + { + "filename": "python-3.6.13-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.13-99136/python-3.6.13-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.6.13-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.13-99136/python-3.6.13-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.6.13-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.13-99136/python-3.6.13-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.6.12", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.6.12-89897", + "files": [ + { + "filename": "python-3.6.12-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.12-89897/python-3.6.12-darwin-x64.tar.gz" + }, + { + "filename": "python-3.6.12-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.12-89897/python-3.6.12-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.6.12-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.12-89897/python-3.6.12-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.6.12-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.12-89897/python-3.6.12-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.6.11", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.6.11-90018", + "files": [ + { + "filename": "python-3.6.11-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.11-90018/python-3.6.11-darwin-x64.tar.gz" + }, + { + "filename": "python-3.6.11-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.11-90018/python-3.6.11-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.6.11-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.11-90018/python-3.6.11-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.6.11-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.11-90018/python-3.6.11-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.6.10", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.6.10-90019", + "files": [ + { + "filename": "python-3.6.10-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.10-90019/python-3.6.10-darwin-x64.tar.gz" + }, + { + "filename": "python-3.6.10-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.10-90019/python-3.6.10-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.6.10-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.10-90019/python-3.6.10-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.6.10-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.10-90019/python-3.6.10-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.6.9", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.6.9-90020", + "files": [ + { + "filename": "python-3.6.9-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.9-90020/python-3.6.9-darwin-x64.tar.gz" + }, + { + "filename": "python-3.6.9-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.9-90020/python-3.6.9-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.6.9-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.9-90020/python-3.6.9-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.6.9-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.9-90020/python-3.6.9-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.6.8", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.6.8-109487", + "files": [ + { + "filename": "python-3.6.8-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.8-109487/python-3.6.8-darwin-x64.tar.gz" + }, + { + "filename": "python-3.6.8-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.8-109487/python-3.6.8-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.6.8-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.8-109487/python-3.6.8-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.6.8-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.8-109487/python-3.6.8-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.6.8-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.8-109487/python-3.6.8-win32-x64.zip" + }, + { + "filename": "python-3.6.8-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.8-109487/python-3.6.8-win32-x86.zip" + } + ] + }, + { + "version": "3.6.7", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.6.7-96904", + "files": [ + { + "filename": "python-3.6.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.7-96904/python-3.6.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.6.7-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.7-96904/python-3.6.7-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.6.7-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.7-96904/python-3.6.7-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.6.7-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.7-96904/python-3.6.7-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.6.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.7-96904/python-3.6.7-win32-x64.zip" + }, + { + "filename": "python-3.6.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.7-96904/python-3.6.7-win32-x86.zip" + } + ] + }, + { + "version": "3.5.10", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.5.10-90026", + "files": [ + { + "filename": "python-3.5.10-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.10-90026/python-3.5.10-darwin-x64.tar.gz" + }, + { + "filename": "python-3.5.10-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.10-90026/python-3.5.10-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.5.10-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.10-90026/python-3.5.10-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.5.10-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.10-90026/python-3.5.10-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.5.9", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.5.9-90181", + "files": [ + { + "filename": "python-3.5.9-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.9-90181/python-3.5.9-darwin-x64.tar.gz" + }, + { + "filename": "python-3.5.9-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.9-90181/python-3.5.9-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.5.9-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.9-90181/python-3.5.9-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.5.9-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.9-90181/python-3.5.9-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.5.4", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.5.4-97175", + "files": [ + { + "filename": "python-3.5.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.4-97175/python-3.5.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.5.4-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.4-97175/python-3.5.4-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.5.4-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.4-97175/python-3.5.4-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.5.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.4-97175/python-3.5.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.5.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.4-97175/python-3.5.4-win32-x64.zip" + }, + { + "filename": "python-3.5.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.4-97175/python-3.5.4-win32-x86.zip" + } + ] + }, + { + "version": "3.4.10", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.4.10", + "files": [ + { + "filename": "python-3.4.10-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.4.10/python-3.4.10-linux-18.04-x64.tar.gz" + } + ] + }, + { + "version": "3.4.4", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.4.4-88098", + "files": [ + { + "filename": "python-3.4.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.4.4-88098/python-3.4.4-win32-x64.zip" + }, + { + "filename": "python-3.4.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.4.4-88098/python-3.4.4-win32-x86.zip" + } + ] + }, + { + "version": "3.3.7", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.3.7", + "files": [ + { + "filename": "python-3.3.7-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.3.7/python-3.3.7-linux-18.04-x64.tar.gz" + } + ] + }, + { + "version": "3.3.5", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.3.5-88104", + "files": [ + { + "filename": "python-3.3.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.3.5-88104/python-3.3.5-win32-x64.zip" + }, + { + "filename": "python-3.3.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.3.5-88104/python-3.3.5-win32-x86.zip" + } + ] + }, + { + "version": "3.2.5", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.2.5-88105", + "files": [ + { + "filename": "python-3.2.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.2.5-88105/python-3.2.5-win32-x64.zip" + }, + { + "filename": "python-3.2.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.2.5-88105/python-3.2.5-win32-x86.zip" + } + ] + }, + { + "version": "3.1.4", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.1.4-88106", + "files": [ + { + "filename": "python-3.1.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.1.4-88106/python-3.1.4-win32-x64.zip" + }, + { + "filename": "python-3.1.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.1.4-88106/python-3.1.4-win32-x86.zip" + } + ] + }, + { + "version": "3.0.1", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.0.1-88107", + "files": [ + { + "filename": "python-3.0.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.0.1-88107/python-3.0.1-win32-x64.zip" + }, + { + "filename": "python-3.0.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.0.1-88107/python-3.0.1-win32-x86.zip" + } + ] + } +] diff --git a/versions-manifest (1).json b/versions-manifest (1).json new file mode 100644 index 0000000..91d24c0 --- /dev/null +++ b/versions-manifest (1).json @@ -0,0 +1,13894 @@ +[ + { + "version": "3.15.0-alpha.7", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.15.0-alpha.7-22913288817", + "files": [ + { + "filename": "python-3.15.0-alpha.7-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.7-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.7-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-win32-arm64.zip" + }, + { + "filename": "python-3.15.0-alpha.7-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-win32-x64.zip" + }, + { + "filename": "python-3.15.0-alpha.7-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.7-22913288817/python-3.15.0-alpha.7-win32-x86.zip" + } + ] + }, + { + "version": "3.15.0-alpha.6", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.15.0-alpha.6-23011479936", + "files": [ + { + "filename": "python-3.15.0-alpha.6-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.6-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.6-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-win32-arm64.zip" + }, + { + "filename": "python-3.15.0-alpha.6-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-win32-x64.zip" + }, + { + "filename": "python-3.15.0-alpha.6-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.6-23011479936/python-3.15.0-alpha.6-win32-x86.zip" + } + ] + }, + { + "version": "3.15.0-alpha.5", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.15.0-alpha.5-21016111327", + "files": [ + { + "filename": "python-3.15.0-alpha.5-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.5-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.5-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-win32-arm64.zip" + }, + { + "filename": "python-3.15.0-alpha.5-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-win32-x64.zip" + }, + { + "filename": "python-3.15.0-alpha.5-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.5-21016111327/python-3.15.0-alpha.5-win32-x86.zip" + } + ] + }, + { + "version": "3.15.0-alpha.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.15.0-alpha.4-20979889385", + "files": [ + { + "filename": "python-3.15.0-alpha.4-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.4-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.4-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-win32-arm64.zip" + }, + { + "filename": "python-3.15.0-alpha.4-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-win32-x64.zip" + }, + { + "filename": "python-3.15.0-alpha.4-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.4-20979889385/python-3.15.0-alpha.4-win32-x86.zip" + } + ] + }, + { + "version": "3.15.0-alpha.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.15.0-alpha.3-20289789000", + "files": [ + { + "filename": "python-3.15.0-alpha.3-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.3-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.3-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-win32-arm64.zip" + }, + { + "filename": "python-3.15.0-alpha.3-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-win32-x64.zip" + }, + { + "filename": "python-3.15.0-alpha.3-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.3-20289789000/python-3.15.0-alpha.3-win32-x86.zip" + } + ] + }, + { + "version": "3.15.0-alpha.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.15.0-alpha.2-19505847594", + "files": [ + { + "filename": "python-3.15.0-alpha.2-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.2-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.2-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-win32-arm64.zip" + }, + { + "filename": "python-3.15.0-alpha.2-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-win32-x64.zip" + }, + { + "filename": "python-3.15.0-alpha.2-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.2-19505847594/python-3.15.0-alpha.2-win32-x86.zip" + } + ] + }, + { + "version": "3.15.0-alpha.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.15.0-alpha.1-18529279079", + "files": [ + { + "filename": "python-3.15.0-alpha.1-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.15.0-alpha.1-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.1-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-win32-arm64.zip" + }, + { + "filename": "python-3.15.0-alpha.1-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-win32-x64.zip" + }, + { + "filename": "python-3.15.0-alpha.1-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.15.0-alpha.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.15.0-alpha.1-18529279079/python-3.15.0-alpha.1-win32-x86.zip" + } + ] + }, + { + "version": "3.14.3", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.3-21673711214", + "files": [ + { + "filename": "python-3.14.3-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.3-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.3-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.3-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.3-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.3-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.3-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.3-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.3-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.3-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.3-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-win32-arm64.zip" + }, + { + "filename": "python-3.14.3-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-win32-x64.zip" + }, + { + "filename": "python-3.14.3-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.3-21673711214/python-3.14.3-win32-x86.zip" + } + ] + }, + { + "version": "3.14.2", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.2-20014991423", + "files": [ + { + "filename": "python-3.14.2-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.2-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.2-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.2-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.2-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.2-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.2-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.2-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.2-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.2-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.2-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-win32-arm64.zip" + }, + { + "filename": "python-3.14.2-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-win32-x64.zip" + }, + { + "filename": "python-3.14.2-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.2-20014991423/python-3.14.2-win32-x86.zip" + } + ] + }, + { + "version": "3.14.1", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.1-19879739908", + "files": [ + { + "filename": "python-3.14.1-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.1-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.1-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.1-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.1-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.1-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.1-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.1-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.1-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.1-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.1-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-win32-arm64.zip" + }, + { + "filename": "python-3.14.1-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-win32-x64.zip" + }, + { + "filename": "python-3.14.1-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.1-19879739908/python-3.14.1-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-18313368925", + "files": [ + { + "filename": "python-3.14.0-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-win32-x64.zip" + }, + { + "filename": "python-3.14.0-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-18313368925/python-3.14.0-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-rc.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-rc.3-17828756509", + "files": [ + { + "filename": "python-3.14.0-rc.3-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.3-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-rc.3-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-rc.3-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-rc.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-win32-x64.zip" + }, + { + "filename": "python-3.14.0-rc.3-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-rc.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.3-17828756509/python-3.14.0-rc.3-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-rc.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-rc.2-16981474201", + "files": [ + { + "filename": "python-3.14.0-rc.2-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.2-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-rc.2-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-rc.2-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-rc.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-win32-x64.zip" + }, + { + "filename": "python-3.14.0-rc.2-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-rc.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.2-16981474201/python-3.14.0-rc.2-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-rc.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-rc.1-16461135061", + "files": [ + { + "filename": "python-3.14.0-rc.1-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-rc.1-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-rc.1-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-rc.1-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-rc.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-win32-x64.zip" + }, + { + "filename": "python-3.14.0-rc.1-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-rc.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-rc.1-16461135061/python-3.14.0-rc.1-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-beta.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-beta.4-16147323557", + "files": [ + { + "filename": "python-3.14.0-beta.4-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.4-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.4-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-beta.4-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-win32-x64.zip" + }, + { + "filename": "python-3.14.0-beta.4-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.4-16147323557/python-3.14.0-beta.4-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-beta.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-beta.3-15723154677", + "files": [ + { + "filename": "python-3.14.0-beta.3-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.3-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.3-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-beta.3-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-win32-x64.zip" + }, + { + "filename": "python-3.14.0-beta.3-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.3-15723154677/python-3.14.0-beta.3-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-beta.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-beta.2-15277397803", + "files": [ + { + "filename": "python-3.14.0-beta.2-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.2-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.2-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-beta.2-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-win32-x64.zip" + }, + { + "filename": "python-3.14.0-beta.2-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.2-15277397803/python-3.14.0-beta.2-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-beta.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-beta.1-14887264705", + "files": [ + { + "filename": "python-3.14.0-beta.1-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-beta.1-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.1-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-beta.1-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-win32-x64.zip" + }, + { + "filename": "python-3.14.0-beta.1-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-beta.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-beta.1-14887264705/python-3.14.0-beta.1-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-alpha.7", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-alpha.7-14344100912", + "files": [ + { + "filename": "python-3.14.0-alpha.7-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-linux-20.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-linux-20.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.7-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.7-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-alpha.7-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-win32-x64.zip" + }, + { + "filename": "python-3.14.0-alpha.7-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.7-14344100912/python-3.14.0-alpha.7-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-alpha.6", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-alpha.6-13890321974", + "files": [ + { + "filename": "python-3.14.0-alpha.6-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-linux-20.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-linux-20.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.6-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.6-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-alpha.6-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-win32-x64.zip" + }, + { + "filename": "python-3.14.0-alpha.6-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.6-13890321974/python-3.14.0-alpha.6-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-alpha.5", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-alpha.5-13438582588", + "files": [ + { + "filename": "python-3.14.0-alpha.5-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-linux-20.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-linux-20.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.5-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.5-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-alpha.5-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-win32-x64.zip" + }, + { + "filename": "python-3.14.0-alpha.5-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.5-13438582588/python-3.14.0-alpha.5-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-alpha.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-alpha.4-13711173741", + "files": [ + { + "filename": "python-3.14.0-alpha.4-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-linux-20.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-linux-20.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.4-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.4-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-alpha.4-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-win32-x64.zip" + }, + { + "filename": "python-3.14.0-alpha.4-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.4-13711173741/python-3.14.0-alpha.4-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-alpha.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-alpha.3-13711171283", + "files": [ + { + "filename": "python-3.14.0-alpha.3-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-linux-20.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-linux-20.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.3-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.3-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-alpha.3-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-win32-x64.zip" + }, + { + "filename": "python-3.14.0-alpha.3-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.3-13711171283/python-3.14.0-alpha.3-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-alpha.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-alpha.2-13709906657", + "files": [ + { + "filename": "python-3.14.0-alpha.2-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-linux-20.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-linux-20.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.2-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.2-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-alpha.2-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-win32-x64.zip" + }, + { + "filename": "python-3.14.0-alpha.2-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.2-13709906657/python-3.14.0-alpha.2-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-alpha.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-alpha.1-13709250109", + "files": [ + { + "filename": "python-3.14.0-alpha.1-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-linux-20.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-linux-20.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.1-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.1-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-win32-arm64.zip" + }, + { + "filename": "python-3.14.0-alpha.1-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-win32-x64.zip" + }, + { + "filename": "python-3.14.0-alpha.1-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.14.0-alpha.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.1-13709250109/python-3.14.0-alpha.1-win32-x86.zip" + } + ] + }, + { + "version": "3.14.0-alpha.0", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.14.0-alpha.0-10616720958", + "files": [ + { + "filename": "python-3.14.0-alpha.0-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.0-10616720958/python-3.14.0-alpha.0-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.0-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.0-10616720958/python-3.14.0-alpha.0-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.0-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.0-10616720958/python-3.14.0-alpha.0-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.0-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.0-10616720958/python-3.14.0-alpha.0-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.14.0-alpha.0-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.14.0-alpha.0-10616720958/python-3.14.0-alpha.0-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.13.12", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.12-21673645133", + "files": [ + { + "filename": "python-3.13.12-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.12-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.12-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.12-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.12-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.12-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.12-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.12-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.12-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.12-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.12-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.12-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.12-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.12-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-win32-arm64.zip" + }, + { + "filename": "python-3.13.12-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.12-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-win32-x64.zip" + }, + { + "filename": "python-3.13.12-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.12-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.12-21673645133/python-3.13.12-win32-x86.zip" + } + ] + }, + { + "version": "3.13.11", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.11-20014977833", + "files": [ + { + "filename": "python-3.13.11-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.11-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.11-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.11-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.11-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.11-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.11-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.11-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.11-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.11-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.11-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.11-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.11-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.11-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-win32-arm64.zip" + }, + { + "filename": "python-3.13.11-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.11-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-win32-x64.zip" + }, + { + "filename": "python-3.13.11-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.11-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.11-20014977833/python-3.13.11-win32-x86.zip" + } + ] + }, + { + "version": "3.13.10", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.10-19879712315", + "files": [ + { + "filename": "python-3.13.10-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.10-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.10-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.10-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.10-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.10-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.10-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.10-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.10-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.10-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.10-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.10-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.10-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.10-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-win32-arm64.zip" + }, + { + "filename": "python-3.13.10-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.10-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-win32-x64.zip" + }, + { + "filename": "python-3.13.10-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.10-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.10-19879712315/python-3.13.10-win32-x86.zip" + } + ] + }, + { + "version": "3.13.9", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.9-18515951191", + "files": [ + { + "filename": "python-3.13.9-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.9-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.9-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.9-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.9-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.9-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.9-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.9-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.9-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.9-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.9-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.9-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.9-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.9-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-win32-arm64.zip" + }, + { + "filename": "python-3.13.9-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.9-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-win32-x64.zip" + }, + { + "filename": "python-3.13.9-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.9-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.9-18515951191/python-3.13.9-win32-x86.zip" + } + ] + }, + { + "version": "3.13.8", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.8-18331000654", + "files": [ + { + "filename": "python-3.13.8-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.8-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.8-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.8-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.8-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.8-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.8-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.8-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.8-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.8-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.8-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.8-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.8-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.8-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-win32-arm64.zip" + }, + { + "filename": "python-3.13.8-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.8-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-win32-x64.zip" + }, + { + "filename": "python-3.13.8-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.8-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.8-18331000654/python-3.13.8-win32-x86.zip" + } + ] + }, + { + "version": "3.13.7", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.7-16980743123", + "files": [ + { + "filename": "python-3.13.7-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.7-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.7-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.7-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.7-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.7-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.7-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.7-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.7-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.7-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.7-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.7-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.7-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-win32-arm64.zip" + }, + { + "filename": "python-3.13.7-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-win32-x64.zip" + }, + { + "filename": "python-3.13.7-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.7-16980743123/python-3.13.7-win32-x86.zip" + } + ] + }, + { + "version": "3.13.6", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.6-16792117939", + "files": [ + { + "filename": "python-3.13.6-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.6-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.6-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.6-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.6-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.6-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.6-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.6-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.6-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.6-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.6-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.6-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.6-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-win32-arm64.zip" + }, + { + "filename": "python-3.13.6-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-win32-x64.zip" + }, + { + "filename": "python-3.13.6-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.6-16792117939/python-3.13.6-win32-x86.zip" + } + ] + }, + { + "version": "3.13.5", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.5-15601068749", + "files": [ + { + "filename": "python-3.13.5-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.5-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.5-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.5-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.5-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.5-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.5-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.5-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.5-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.5-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.5-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.5-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.5-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-win32-arm64.zip" + }, + { + "filename": "python-3.13.5-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-win32-x64.zip" + }, + { + "filename": "python-3.13.5-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.5-15601068749/python-3.13.5-win32-x86.zip" + } + ] + }, + { + "version": "3.13.4", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.4-15433317575", + "files": [ + { + "filename": "python-3.13.4-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.4-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.4-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.4-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.4-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.4-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.4-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.4-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.4-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.4-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.4-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.4-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-win32-arm64.zip" + }, + { + "filename": "python-3.13.4-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-win32-x64.zip" + }, + { + "filename": "python-3.13.4-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.4-15433317575/python-3.13.4-win32-x86.zip" + } + ] + }, + { + "version": "3.13.3", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.3-14344076652", + "files": [ + { + "filename": "python-3.13.3-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.3-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.3-linux-20.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-linux-20.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.3-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.3-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.3-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.3-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.3-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.3-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.3-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.3-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.3-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-win32-arm64.zip" + }, + { + "filename": "python-3.13.3-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-win32-x64.zip" + }, + { + "filename": "python-3.13.3-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.3-14344076652/python-3.13.3-win32-x86.zip" + } + ] + }, + { + "version": "3.13.2", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.2-13708744326", + "files": [ + { + "filename": "python-3.13.2-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.2-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.2-linux-20.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-linux-20.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.2-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.2-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.2-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.2-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.2-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.2-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.2-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.2-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.2-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-win32-arm64.zip" + }, + { + "filename": "python-3.13.2-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-win32-x64.zip" + }, + { + "filename": "python-3.13.2-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.2-13708744326/python-3.13.2-win32-x86.zip" + } + ] + }, + { + "version": "3.13.1", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.1-13437882550", + "files": [ + { + "filename": "python-3.13.1-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.1-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.1-linux-20.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-linux-20.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.1-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.1-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.1-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.1-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.1-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.1-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.1-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.1-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.1-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-win32-arm64.zip" + }, + { + "filename": "python-3.13.1-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-win32-x64.zip" + }, + { + "filename": "python-3.13.1-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.1-13437882550/python-3.13.1-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-13707372259", + "files": [ + { + "filename": "python-3.13.0-darwin-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-darwin-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.0-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-darwin-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-darwin-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.0-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-linux-20.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-linux-20.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.0-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-linux-22.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-linux-22.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.0-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-linux-22.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-linux-22.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.0-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-linux-24.04-arm64-freethreaded.tar.gz", + "arch": "arm64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-linux-24.04-arm64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.0-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-linux-24.04-x64-freethreaded.tar.gz", + "arch": "x64-freethreaded", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-linux-24.04-x64-freethreaded.tar.gz" + }, + { + "filename": "python-3.13.0-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-win32-arm64-freethreaded.zip", + "arch": "arm64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-win32-arm64-freethreaded.zip" + }, + { + "filename": "python-3.13.0-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-win32-arm64.zip" + }, + { + "filename": "python-3.13.0-win32-x64-freethreaded.zip", + "arch": "x64-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-win32-x64-freethreaded.zip" + }, + { + "filename": "python-3.13.0-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-win32-x64.zip" + }, + { + "filename": "python-3.13.0-win32-x86-freethreaded.zip", + "arch": "x86-freethreaded", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-win32-x86-freethreaded.zip" + }, + { + "filename": "python-3.13.0-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-13707372259/python-3.13.0-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-rc.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-rc.3-11128690802", + "files": [ + { + "filename": "python-3.13.0-rc.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.3-11128690802/python-3.13.0-rc.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.3-11128690802/python-3.13.0-rc.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.3-11128690802/python-3.13.0-rc.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.3-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.3-11128690802/python-3.13.0-rc.3-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.3-11128690802/python-3.13.0-rc.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.3-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.3-11128690802/python-3.13.0-rc.3-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.3-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.3-11128690802/python-3.13.0-rc.3-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.3-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.3-11128690802/python-3.13.0-rc.3-win32-arm64.zip" + }, + { + "filename": "python-3.13.0-rc.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.3-11128690802/python-3.13.0-rc.3-win32-x64.zip" + }, + { + "filename": "python-3.13.0-rc.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.3-11128690802/python-3.13.0-rc.3-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-rc.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-rc.2-10765745850", + "files": [ + { + "filename": "python-3.13.0-rc.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.2-10765745850/python-3.13.0-rc.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.2-10765745850/python-3.13.0-rc.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.2-10765745850/python-3.13.0-rc.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.2-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.2-10765745850/python-3.13.0-rc.2-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.2-10765745850/python-3.13.0-rc.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.2-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.2-10765745850/python-3.13.0-rc.2-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.2-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.2-10765745850/python-3.13.0-rc.2-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.2-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.2-10765745850/python-3.13.0-rc.2-win32-arm64.zip" + }, + { + "filename": "python-3.13.0-rc.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.2-10765745850/python-3.13.0-rc.2-win32-x64.zip" + }, + { + "filename": "python-3.13.0-rc.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.2-10765745850/python-3.13.0-rc.2-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-rc.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-rc.1-10616689957", + "files": [ + { + "filename": "python-3.13.0-rc.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.1-10616689957/python-3.13.0-rc.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.1-10616689957/python-3.13.0-rc.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.1-10616689957/python-3.13.0-rc.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.1-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.1-10616689957/python-3.13.0-rc.1-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.1-10616689957/python-3.13.0-rc.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.1-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.1-10616689957/python-3.13.0-rc.1-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.1-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.1-10616689957/python-3.13.0-rc.1-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-rc.1-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.1-10616689957/python-3.13.0-rc.1-win32-arm64.zip" + }, + { + "filename": "python-3.13.0-rc.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.1-10616689957/python-3.13.0-rc.1-win32-x64.zip" + }, + { + "filename": "python-3.13.0-rc.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-rc.1-10616689957/python-3.13.0-rc.1-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-beta.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-beta.4-9993951762", + "files": [ + { + "filename": "python-3.13.0-beta.4-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.4-9993951762/python-3.13.0-beta.4-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.4-9993951762/python-3.13.0-beta.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.4-9993951762/python-3.13.0-beta.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.4-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.4-9993951762/python-3.13.0-beta.4-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.4-9993951762/python-3.13.0-beta.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.4-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.4-9993951762/python-3.13.0-beta.4-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.4-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.4-9993951762/python-3.13.0-beta.4-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.4-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.4-9993951762/python-3.13.0-beta.4-win32-arm64.zip" + }, + { + "filename": "python-3.13.0-beta.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.4-9993951762/python-3.13.0-beta.4-win32-x64.zip" + }, + { + "filename": "python-3.13.0-beta.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.4-9993951762/python-3.13.0-beta.4-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-beta.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-beta.3-9947073700", + "files": [ + { + "filename": "python-3.13.0-beta.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.3-9947073700/python-3.13.0-beta.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.3-9947073700/python-3.13.0-beta.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.3-9947073700/python-3.13.0-beta.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.3-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.3-9947073700/python-3.13.0-beta.3-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.3-9947073700/python-3.13.0-beta.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.3-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.3-9947073700/python-3.13.0-beta.3-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.3-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.3-9947073700/python-3.13.0-beta.3-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.3-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.3-9947073700/python-3.13.0-beta.3-win32-arm64.zip" + }, + { + "filename": "python-3.13.0-beta.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.3-9947073700/python-3.13.0-beta.3-win32-x64.zip" + }, + { + "filename": "python-3.13.0-beta.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.3-9947073700/python-3.13.0-beta.3-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-beta.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-beta.2-9668929533", + "files": [ + { + "filename": "python-3.13.0-beta.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.2-9668929533/python-3.13.0-beta.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.2-9668929533/python-3.13.0-beta.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.2-9668929533/python-3.13.0-beta.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.2-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.2-9668929533/python-3.13.0-beta.2-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.2-9668929533/python-3.13.0-beta.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.2-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.2-9668929533/python-3.13.0-beta.2-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.2-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.2-9668929533/python-3.13.0-beta.2-win32-arm64.zip" + }, + { + "filename": "python-3.13.0-beta.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.2-9668929533/python-3.13.0-beta.2-win32-x64.zip" + }, + { + "filename": "python-3.13.0-beta.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.2-9668929533/python-3.13.0-beta.2-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-beta.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-beta.1-9019422448", + "files": [ + { + "filename": "python-3.13.0-beta.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.1-9019422448/python-3.13.0-beta.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.1-9019422448/python-3.13.0-beta.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.1-9019422448/python-3.13.0-beta.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.1-9019422448/python-3.13.0-beta.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.1-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.1-9019422448/python-3.13.0-beta.1-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-beta.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.1-9019422448/python-3.13.0-beta.1-win32-x64.zip" + }, + { + "filename": "python-3.13.0-beta.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-beta.1-9019422448/python-3.13.0-beta.1-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-alpha.6", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-alpha.6-8625706540", + "files": [ + { + "filename": "python-3.13.0-alpha.6-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.6-8625706540/python-3.13.0-alpha.6-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.6-8625706540/python-3.13.0-alpha.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.6-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.6-8625706540/python-3.13.0-alpha.6-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.6-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.6-8625706540/python-3.13.0-alpha.6-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.6-8625706540/python-3.13.0-alpha.6-win32-x64.zip" + }, + { + "filename": "python-3.13.0-alpha.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.6-8625706540/python-3.13.0-alpha.6-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-alpha.5", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-alpha.5-8258852403", + "files": [ + { + "filename": "python-3.13.0-alpha.5-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.5-8258852403/python-3.13.0-alpha.5-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.5-8258852403/python-3.13.0-alpha.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.5-8258852403/python-3.13.0-alpha.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.5-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.5-8258852403/python-3.13.0-alpha.5-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.5-8258852403/python-3.13.0-alpha.5-win32-x64.zip" + }, + { + "filename": "python-3.13.0-alpha.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.5-8258852403/python-3.13.0-alpha.5-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-alpha.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-alpha.4-7925502275", + "files": [ + { + "filename": "python-3.13.0-alpha.4-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.4-7925502275/python-3.13.0-alpha.4-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.4-7925502275/python-3.13.0-alpha.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.4-7925502275/python-3.13.0-alpha.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.4-7925502275/python-3.13.0-alpha.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.4-7925502275/python-3.13.0-alpha.4-win32-x64.zip" + }, + { + "filename": "python-3.13.0-alpha.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.4-7925502275/python-3.13.0-alpha.4-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-alpha.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-alpha.3-7565276339", + "files": [ + { + "filename": "python-3.13.0-alpha.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.3-7565276339/python-3.13.0-alpha.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.3-7565276339/python-3.13.0-alpha.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.3-7565276339/python-3.13.0-alpha.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.3-7565276339/python-3.13.0-alpha.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.3-7565276339/python-3.13.0-alpha.3-win32-x64.zip" + }, + { + "filename": "python-3.13.0-alpha.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.3-7565276339/python-3.13.0-alpha.3-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-alpha.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-alpha.2-6966007093", + "files": [ + { + "filename": "python-3.13.0-alpha.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.2-6966007093/python-3.13.0-alpha.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.2-6966007093/python-3.13.0-alpha.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.2-6966007093/python-3.13.0-alpha.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.2-6966007093/python-3.13.0-alpha.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.2-6966007093/python-3.13.0-alpha.2-win32-x64.zip" + }, + { + "filename": "python-3.13.0-alpha.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.2-6966007093/python-3.13.0-alpha.2-win32-x86.zip" + } + ] + }, + { + "version": "3.13.0-alpha.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.13.0-alpha.1-6531259803", + "files": [ + { + "filename": "python-3.13.0-alpha.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.1-6531259803/python-3.13.0-alpha.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.1-6531259803/python-3.13.0-alpha.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.1-6531259803/python-3.13.0-alpha.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.1-6531259803/python-3.13.0-alpha.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.13.0-alpha.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.1-6531259803/python-3.13.0-alpha.1-win32-x64.zip" + }, + { + "filename": "python-3.13.0-alpha.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.13.0-alpha.1-6531259803/python-3.13.0-alpha.1-win32-x86.zip" + } + ] + }, + { + "version": "3.12.13", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.13-22652080177", + "files": [ + { + "filename": "python-3.12.13-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.13-22652080177/python-3.12.13-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.13-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.13-22652080177/python-3.12.13-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.13-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.13-22652080177/python-3.12.13-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.13-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.13-22652080177/python-3.12.13-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.12.12", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.12-18393146713", + "files": [ + { + "filename": "python-3.12.12-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.12-18393146713/python-3.12.12-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.12-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.12-18393146713/python-3.12.12-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.12-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.12-18393146713/python-3.12.12-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.12-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.12-18393146713/python-3.12.12-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.12.11", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.11-15433310049", + "files": [ + { + "filename": "python-3.12.11-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.11-15433310049/python-3.12.11-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.11-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.11-15433310049/python-3.12.11-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.11-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.11-15433310049/python-3.12.11-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.11-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.11-15433310049/python-3.12.11-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.12.10", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.10-14343898437", + "files": [ + { + "filename": "python-3.12.10-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.10-14343898437/python-3.12.10-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.10-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.10-14343898437/python-3.12.10-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.10-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.10-14343898437/python-3.12.10-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.10-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.10-14343898437/python-3.12.10-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.10-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.10-14343898437/python-3.12.10-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.10-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.10-14343898437/python-3.12.10-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.10-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.10-14343898437/python-3.12.10-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.12.10-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.10-14343898437/python-3.12.10-win32-arm64.zip" + }, + { + "filename": "python-3.12.10-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.10-14343898437/python-3.12.10-win32-x64.zip" + }, + { + "filename": "python-3.12.10-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.10-14343898437/python-3.12.10-win32-x86.zip" + } + ] + }, + { + "version": "3.12.9", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.9-13149478207", + "files": [ + { + "filename": "python-3.12.9-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.9-13149478207/python-3.12.9-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.9-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.9-13149478207/python-3.12.9-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.9-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.9-13149478207/python-3.12.9-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.9-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.9-13149478207/python-3.12.9-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.9-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.9-13149478207/python-3.12.9-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.9-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.9-13149478207/python-3.12.9-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.9-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.9-13149478207/python-3.12.9-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.12.9-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.9-13149478207/python-3.12.9-win32-arm64.zip" + }, + { + "filename": "python-3.12.9-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.9-13149478207/python-3.12.9-win32-x64.zip" + }, + { + "filename": "python-3.12.9-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.9-13149478207/python-3.12.9-win32-x86.zip" + } + ] + }, + { + "version": "3.12.8", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.8-12154062663", + "files": [ + { + "filename": "python-3.12.8-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.8-12154062663/python-3.12.8-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.8-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.8-12154062663/python-3.12.8-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.8-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.8-12154062663/python-3.12.8-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.8-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.8-12154062663/python-3.12.8-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.8-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.8-12154062663/python-3.12.8-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.8-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.8-12154062663/python-3.12.8-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.8-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.8-12154062663/python-3.12.8-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.12.8-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.8-12154062663/python-3.12.8-win32-arm64.zip" + }, + { + "filename": "python-3.12.8-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.8-12154062663/python-3.12.8-win32-x64.zip" + }, + { + "filename": "python-3.12.8-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.8-12154062663/python-3.12.8-win32-x86.zip" + } + ] + }, + { + "version": "3.12.7", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.7-11128208086", + "files": [ + { + "filename": "python-3.12.7-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.7-11128208086/python-3.12.7-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.7-11128208086/python-3.12.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.7-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.7-11128208086/python-3.12.7-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.7-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.7-11128208086/python-3.12.7-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.7-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.7-11128208086/python-3.12.7-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.7-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.7-11128208086/python-3.12.7-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.7-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.7-11128208086/python-3.12.7-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.12.7-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.7-11128208086/python-3.12.7-win32-arm64.zip" + }, + { + "filename": "python-3.12.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.7-11128208086/python-3.12.7-win32-x64.zip" + }, + { + "filename": "python-3.12.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.7-11128208086/python-3.12.7-win32-x86.zip" + } + ] + }, + { + "version": "3.12.6", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.6-10765725458", + "files": [ + { + "filename": "python-3.12.6-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.6-10765725458/python-3.12.6-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.6-10765725458/python-3.12.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.6-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.6-10765725458/python-3.12.6-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.6-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.6-10765725458/python-3.12.6-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.6-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.6-10765725458/python-3.12.6-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.6-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.6-10765725458/python-3.12.6-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.6-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.6-10765725458/python-3.12.6-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.12.6-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.6-10765725458/python-3.12.6-win32-arm64.zip" + }, + { + "filename": "python-3.12.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.6-10765725458/python-3.12.6-win32-x64.zip" + }, + { + "filename": "python-3.12.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.6-10765725458/python-3.12.6-win32-x86.zip" + } + ] + }, + { + "version": "3.12.5", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.5-10375840348", + "files": [ + { + "filename": "python-3.12.5-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.5-10375840348/python-3.12.5-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.5-10375840348/python-3.12.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.5-10375840348/python-3.12.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.5-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.5-10375840348/python-3.12.5-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.5-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.5-10375840348/python-3.12.5-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.5-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.5-10375840348/python-3.12.5-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.5-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.5-10375840348/python-3.12.5-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.12.5-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.5-10375840348/python-3.12.5-win32-arm64.zip" + }, + { + "filename": "python-3.12.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.5-10375840348/python-3.12.5-win32-x64.zip" + }, + { + "filename": "python-3.12.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.5-10375840348/python-3.12.5-win32-x86.zip" + } + ] + }, + { + "version": "3.12.4", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.4-9947065640", + "files": [ + { + "filename": "python-3.12.4-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.4-9947065640/python-3.12.4-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.4-9947065640/python-3.12.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.4-9947065640/python-3.12.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.4-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.4-9947065640/python-3.12.4-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.4-9947065640/python-3.12.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.4-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.4-9947065640/python-3.12.4-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.4-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.4-9947065640/python-3.12.4-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.12.4-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.4-9947065640/python-3.12.4-win32-arm64.zip" + }, + { + "filename": "python-3.12.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.4-9947065640/python-3.12.4-win32-x64.zip" + }, + { + "filename": "python-3.12.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.4-9947065640/python-3.12.4-win32-x86.zip" + } + ] + }, + { + "version": "3.12.3", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.3-11057844995", + "files": [ + { + "filename": "python-3.12.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.3-11057844995/python-3.12.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.3-11057844995/python-3.12.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.3-11057844995/python-3.12.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.3-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.3-11057844995/python-3.12.3-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.3-11057844995/python-3.12.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.3-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.3-11057844995/python-3.12.3-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.3-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.3-11057844995/python-3.12.3-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.12.3-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.3-11057844995/python-3.12.3-win32-arm64.zip" + }, + { + "filename": "python-3.12.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.3-11057844995/python-3.12.3-win32-x64.zip" + }, + { + "filename": "python-3.12.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.3-11057844995/python-3.12.3-win32-x86.zip" + } + ] + }, + { + "version": "3.12.2", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.2-11057786931", + "files": [ + { + "filename": "python-3.12.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.2-11057786931/python-3.12.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.2-11057786931/python-3.12.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.2-11057786931/python-3.12.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.2-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.2-11057786931/python-3.12.2-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.2-11057786931/python-3.12.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.2-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.2-11057786931/python-3.12.2-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.2-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.2-11057786931/python-3.12.2-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.12.2-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.2-11057786931/python-3.12.2-win32-arm64.zip" + }, + { + "filename": "python-3.12.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.2-11057786931/python-3.12.2-win32-x64.zip" + }, + { + "filename": "python-3.12.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.2-11057786931/python-3.12.2-win32-x86.zip" + } + ] + }, + { + "version": "3.12.1", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.1-11057762749", + "files": [ + { + "filename": "python-3.12.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.1-11057762749/python-3.12.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.1-11057762749/python-3.12.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.1-11057762749/python-3.12.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.1-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.1-11057762749/python-3.12.1-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.1-11057762749/python-3.12.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.1-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.1-11057762749/python-3.12.1-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.1-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.1-11057762749/python-3.12.1-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.12.1-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.1-11057762749/python-3.12.1-win32-arm64.zip" + }, + { + "filename": "python-3.12.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.1-11057762749/python-3.12.1-win32-x64.zip" + }, + { + "filename": "python-3.12.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.1-11057762749/python-3.12.1-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-11057302691", + "files": [ + { + "filename": "python-3.12.0-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-11057302691/python-3.12.0-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.0-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-11057302691/python-3.12.0-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-11057302691/python-3.12.0-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-11057302691/python-3.12.0-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.0-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-11057302691/python-3.12.0-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-11057302691/python-3.12.0-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.12.0-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-11057302691/python-3.12.0-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-11057302691/python-3.12.0-win32-arm64.zip" + }, + { + "filename": "python-3.12.0-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-11057302691/python-3.12.0-win32-x64.zip" + }, + { + "filename": "python-3.12.0-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-11057302691/python-3.12.0-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-rc.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-rc.3-6244011669", + "files": [ + { + "filename": "python-3.12.0-rc.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.3-6244011669/python-3.12.0-rc.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.3-6244011669/python-3.12.0-rc.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.3-6244011669/python-3.12.0-rc.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.3-6244011669/python-3.12.0-rc.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.3-6244011669/python-3.12.0-rc.3-win32-x64.zip" + }, + { + "filename": "python-3.12.0-rc.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.3-6244011669/python-3.12.0-rc.3-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-rc.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-rc.2-6097043201", + "files": [ + { + "filename": "python-3.12.0-rc.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.2-6097043201/python-3.12.0-rc.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.2-6097043201/python-3.12.0-rc.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.2-6097043201/python-3.12.0-rc.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.2-6097043201/python-3.12.0-rc.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.2-6097043201/python-3.12.0-rc.2-win32-x64.zip" + }, + { + "filename": "python-3.12.0-rc.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.2-6097043201/python-3.12.0-rc.2-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-rc.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-rc.1-5785015073", + "files": [ + { + "filename": "python-3.12.0-rc.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.1-5785015073/python-3.12.0-rc.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.1-5785015073/python-3.12.0-rc.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.1-5785015073/python-3.12.0-rc.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.1-5785015073/python-3.12.0-rc.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-rc.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.1-5785015073/python-3.12.0-rc.1-win32-x64.zip" + }, + { + "filename": "python-3.12.0-rc.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-rc.1-5785015073/python-3.12.0-rc.1-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-beta.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-beta.4-5528170069", + "files": [ + { + "filename": "python-3.12.0-beta.4-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.4-5528170069/python-3.12.0-beta.4-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.4-5528170069/python-3.12.0-beta.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.4-5528170069/python-3.12.0-beta.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.4-5528170069/python-3.12.0-beta.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.4-5528170069/python-3.12.0-beta.4-win32-x64.zip" + }, + { + "filename": "python-3.12.0-beta.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.4-5528170069/python-3.12.0-beta.4-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-beta.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-beta.3-5331639816", + "files": [ + { + "filename": "python-3.12.0-beta.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.3-5331639816/python-3.12.0-beta.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.3-5331639816/python-3.12.0-beta.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.3-5331639816/python-3.12.0-beta.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.3-5331639816/python-3.12.0-beta.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.3-5331639816/python-3.12.0-beta.3-win32-x64.zip" + }, + { + "filename": "python-3.12.0-beta.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.3-5331639816/python-3.12.0-beta.3-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-beta.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-beta.2-5200633613", + "files": [ + { + "filename": "python-3.12.0-beta.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.2-5200633613/python-3.12.0-beta.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.2-5200633613/python-3.12.0-beta.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.2-5200633613/python-3.12.0-beta.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.2-5200633613/python-3.12.0-beta.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.2-5200633613/python-3.12.0-beta.2-win32-x64.zip" + }, + { + "filename": "python-3.12.0-beta.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.2-5200633613/python-3.12.0-beta.2-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-beta.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-beta.1-5076755295", + "files": [ + { + "filename": "python-3.12.0-beta.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.1-5076755295/python-3.12.0-beta.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.1-5076755295/python-3.12.0-beta.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.1-5076755295/python-3.12.0-beta.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.1-5076755295/python-3.12.0-beta.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-beta.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.1-5076755295/python-3.12.0-beta.1-win32-x64.zip" + }, + { + "filename": "python-3.12.0-beta.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-beta.1-5076755295/python-3.12.0-beta.1-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-alpha.7", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-alpha.7-4618531320", + "files": [ + { + "filename": "python-3.12.0-alpha.7-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.7-4618531320/python-3.12.0-alpha.7-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.7-4618531320/python-3.12.0-alpha.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.7-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.7-4618531320/python-3.12.0-alpha.7-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.7-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.7-4618531320/python-3.12.0-alpha.7-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.7-4618531320/python-3.12.0-alpha.7-win32-x64.zip" + }, + { + "filename": "python-3.12.0-alpha.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.7-4618531320/python-3.12.0-alpha.7-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-alpha.6", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-alpha.6-4362036571", + "files": [ + { + "filename": "python-3.12.0-alpha.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.6-4362036571/python-3.12.0-alpha.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.6-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.6-4362036571/python-3.12.0-alpha.6-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.6-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.6-4362036571/python-3.12.0-alpha.6-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.6-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.6-4362036571/python-3.12.0-alpha.6-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.6-4362036571/python-3.12.0-alpha.6-win32-x64.zip" + }, + { + "filename": "python-3.12.0-alpha.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.6-4362036571/python-3.12.0-alpha.6-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-alpha.5", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-alpha.5-4122183364", + "files": [ + { + "filename": "python-3.12.0-alpha.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.5-4122183364/python-3.12.0-alpha.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.5-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.5-4122183364/python-3.12.0-alpha.5-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.5-4122183364/python-3.12.0-alpha.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.5-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.5-4122183364/python-3.12.0-alpha.5-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.5-4122183364/python-3.12.0-alpha.5-win32-x64.zip" + }, + { + "filename": "python-3.12.0-alpha.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.5-4122183364/python-3.12.0-alpha.5-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-alpha.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-alpha.4-3890631539", + "files": [ + { + "filename": "python-3.12.0-alpha.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.4-3890631539/python-3.12.0-alpha.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.4-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.4-3890631539/python-3.12.0-alpha.4-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.4-3890631539/python-3.12.0-alpha.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.4-3890631539/python-3.12.0-alpha.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.4-3890631539/python-3.12.0-alpha.4-win32-x64.zip" + }, + { + "filename": "python-3.12.0-alpha.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.4-3890631539/python-3.12.0-alpha.4-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-alpha.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-alpha.3-3638209027", + "files": [ + { + "filename": "python-3.12.0-alpha.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.3-3638209027/python-3.12.0-alpha.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.3-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.3-3638209027/python-3.12.0-alpha.3-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.3-3638209027/python-3.12.0-alpha.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.3-3638209027/python-3.12.0-alpha.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.3-3638209027/python-3.12.0-alpha.3-win32-x64.zip" + }, + { + "filename": "python-3.12.0-alpha.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.3-3638209027/python-3.12.0-alpha.3-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-alpha.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-alpha.2-3524742960", + "files": [ + { + "filename": "python-3.12.0-alpha.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.2-3524742960/python-3.12.0-alpha.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.2-3524742960/python-3.12.0-alpha.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.2-3524742960/python-3.12.0-alpha.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.2-3524742960/python-3.12.0-alpha.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.2-3524742960/python-3.12.0-alpha.2-win32-x64.zip" + }, + { + "filename": "python-3.12.0-alpha.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.2-3524742960/python-3.12.0-alpha.2-win32-x86.zip" + } + ] + }, + { + "version": "3.12.0-alpha.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.12.0-alpha.1-3427281458", + "files": [ + { + "filename": "python-3.12.0-alpha.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.1-3427281458/python-3.12.0-alpha.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.1-3427281458/python-3.12.0-alpha.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.1-3427281458/python-3.12.0-alpha.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.1-3427281458/python-3.12.0-alpha.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.12.0-alpha.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.1-3427281458/python-3.12.0-alpha.1-win32-x64.zip" + }, + { + "filename": "python-3.12.0-alpha.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.12.0-alpha.1-3427281458/python-3.12.0-alpha.1-win32-x86.zip" + } + ] + }, + { + "version": "3.11.15", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.15-22631496413", + "files": [ + { + "filename": "python-3.11.15-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.15-22631496413/python-3.11.15-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.15-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.15-22631496413/python-3.11.15-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.15-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.15-22631496413/python-3.11.15-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.15-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.15-22631496413/python-3.11.15-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.11.14", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.14-18393181605", + "files": [ + { + "filename": "python-3.11.14-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.14-18393181605/python-3.11.14-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.14-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.14-18393181605/python-3.11.14-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.14-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.14-18393181605/python-3.11.14-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.14-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.14-18393181605/python-3.11.14-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.11.13", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.13-15433298024", + "files": [ + { + "filename": "python-3.11.13-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.13-15433298024/python-3.11.13-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.13-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.13-15433298024/python-3.11.13-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.13-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.13-15433298024/python-3.11.13-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.13-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.13-15433298024/python-3.11.13-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.11.12", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.12-14343939122", + "files": [ + { + "filename": "python-3.11.12-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.12-14343939122/python-3.11.12-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.12-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.12-14343939122/python-3.11.12-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.12-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.12-14343939122/python-3.11.12-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.12-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.12-14343939122/python-3.11.12-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.12-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.12-14343939122/python-3.11.12-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.11.11", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.11-12160100664", + "files": [ + { + "filename": "python-3.11.11-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.11-12160100664/python-3.11.11-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.11-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.11-12160100664/python-3.11.11-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.11-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.11-12160100664/python-3.11.11-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.11-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.11-12160100664/python-3.11.11-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.11-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.11-12160100664/python-3.11.11-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.11.10", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.10-10765870205", + "files": [ + { + "filename": "python-3.11.10-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.10-10765870205/python-3.11.10-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.10-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.10-10765870205/python-3.11.10-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.10-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.10-10765870205/python-3.11.10-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.10-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.10-10765870205/python-3.11.10-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.10-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.10-10765870205/python-3.11.10-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.11.9", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.9-9947079978", + "files": [ + { + "filename": "python-3.11.9-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.9-9947079978/python-3.11.9-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.11.9-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.9-9947079978/python-3.11.9-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.9-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.9-9947079978/python-3.11.9-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.9-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.9-9947079978/python-3.11.9-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.9-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.9-9947079978/python-3.11.9-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.9-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.9-9947079978/python-3.11.9-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.9-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.9-9947079978/python-3.11.9-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.11.9-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.9-9947079978/python-3.11.9-win32-arm64.zip" + }, + { + "filename": "python-3.11.9-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.9-9947079978/python-3.11.9-win32-x64.zip" + }, + { + "filename": "python-3.11.9-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.9-9947079978/python-3.11.9-win32-x86.zip" + } + ] + }, + { + "version": "3.11.8", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.8-11113201752", + "files": [ + { + "filename": "python-3.11.8-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.8-11113201752/python-3.11.8-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.11.8-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.8-11113201752/python-3.11.8-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.8-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.8-11113201752/python-3.11.8-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.8-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.8-11113201752/python-3.11.8-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.8-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.8-11113201752/python-3.11.8-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.8-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.8-11113201752/python-3.11.8-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.8-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.8-11113201752/python-3.11.8-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.11.8-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.8-11113201752/python-3.11.8-win32-arm64.zip" + }, + { + "filename": "python-3.11.8-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.8-11113201752/python-3.11.8-win32-x64.zip" + }, + { + "filename": "python-3.11.8-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.8-11113201752/python-3.11.8-win32-x86.zip" + } + ] + }, + { + "version": "3.11.7", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.7-11113197120", + "files": [ + { + "filename": "python-3.11.7-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.7-11113197120/python-3.11.7-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.11.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.7-11113197120/python-3.11.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.7-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.7-11113197120/python-3.11.7-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.7-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.7-11113197120/python-3.11.7-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.7-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.7-11113197120/python-3.11.7-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.7-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.7-11113197120/python-3.11.7-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.7-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.7-11113197120/python-3.11.7-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.11.7-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.7-11113197120/python-3.11.7-win32-arm64.zip" + }, + { + "filename": "python-3.11.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.7-11113197120/python-3.11.7-win32-x64.zip" + }, + { + "filename": "python-3.11.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.7-11113197120/python-3.11.7-win32-x86.zip" + } + ] + }, + { + "version": "3.11.6", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.6-11113179737", + "files": [ + { + "filename": "python-3.11.6-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.6-11113179737/python-3.11.6-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.11.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.6-11113179737/python-3.11.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.6-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.6-11113179737/python-3.11.6-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.6-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.6-11113179737/python-3.11.6-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.6-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.6-11113179737/python-3.11.6-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.6-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.6-11113179737/python-3.11.6-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.6-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.6-11113179737/python-3.11.6-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.11.6-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.6-11113179737/python-3.11.6-win32-arm64.zip" + }, + { + "filename": "python-3.11.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.6-11113179737/python-3.11.6-win32-x64.zip" + }, + { + "filename": "python-3.11.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.6-11113179737/python-3.11.6-win32-x86.zip" + } + ] + }, + { + "version": "3.11.5", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.5-11113174019", + "files": [ + { + "filename": "python-3.11.5-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.5-11113174019/python-3.11.5-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.11.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.5-11113174019/python-3.11.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.5-11113174019/python-3.11.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.5-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.5-11113174019/python-3.11.5-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.5-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.5-11113174019/python-3.11.5-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.5-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.5-11113174019/python-3.11.5-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.5-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.5-11113174019/python-3.11.5-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.11.5-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.5-11113174019/python-3.11.5-win32-arm64.zip" + }, + { + "filename": "python-3.11.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.5-11113174019/python-3.11.5-win32-x64.zip" + }, + { + "filename": "python-3.11.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.5-11113174019/python-3.11.5-win32-x86.zip" + } + ] + }, + { + "version": "3.11.4", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.4-11113170699", + "files": [ + { + "filename": "python-3.11.4-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.4-11113170699/python-3.11.4-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.11.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.4-11113170699/python-3.11.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.4-11113170699/python-3.11.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.4-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.4-11113170699/python-3.11.4-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.4-11113170699/python-3.11.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.4-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.4-11113170699/python-3.11.4-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.4-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.4-11113170699/python-3.11.4-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.11.4-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.4-11113170699/python-3.11.4-win32-arm64.zip" + }, + { + "filename": "python-3.11.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.4-11113170699/python-3.11.4-win32-x64.zip" + }, + { + "filename": "python-3.11.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.4-11113170699/python-3.11.4-win32-x86.zip" + } + ] + }, + { + "version": "3.11.3", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.3-11059198104", + "files": [ + { + "filename": "python-3.11.3-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.3-11059198104/python-3.11.3-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.11.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.3-11059198104/python-3.11.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.3-11059198104/python-3.11.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.3-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.3-11059198104/python-3.11.3-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.3-11059198104/python-3.11.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.3-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.3-11059198104/python-3.11.3-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.3-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.3-11059198104/python-3.11.3-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.11.3-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.3-11059198104/python-3.11.3-win32-arm64.zip" + }, + { + "filename": "python-3.11.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.3-11059198104/python-3.11.3-win32-x64.zip" + }, + { + "filename": "python-3.11.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.3-11059198104/python-3.11.3-win32-x86.zip" + } + ] + }, + { + "version": "3.11.2", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.2-11059137522", + "files": [ + { + "filename": "python-3.11.2-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.2-11059137522/python-3.11.2-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.11.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.2-11059137522/python-3.11.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.2-11059137522/python-3.11.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.2-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.2-11059137522/python-3.11.2-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.2-11059137522/python-3.11.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.2-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.2-11059137522/python-3.11.2-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.2-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.2-11059137522/python-3.11.2-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.11.2-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.2-11059137522/python-3.11.2-win32-arm64.zip" + }, + { + "filename": "python-3.11.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.2-11059137522/python-3.11.2-win32-x64.zip" + }, + { + "filename": "python-3.11.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.2-11059137522/python-3.11.2-win32-x86.zip" + } + ] + }, + { + "version": "3.11.1", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.1-11058799881", + "files": [ + { + "filename": "python-3.11.1-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.1-11058799881/python-3.11.1-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.11.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.1-11058799881/python-3.11.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.1-11058799881/python-3.11.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.1-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.1-11058799881/python-3.11.1-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.1-11058799881/python-3.11.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.1-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.1-11058799881/python-3.11.1-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.1-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.1-11058799881/python-3.11.1-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.11.1-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.1-11058799881/python-3.11.1-win32-arm64.zip" + }, + { + "filename": "python-3.11.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.1-11058799881/python-3.11.1-win32-x64.zip" + }, + { + "filename": "python-3.11.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.1-11058799881/python-3.11.1-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-11058707212", + "files": [ + { + "filename": "python-3.11.0-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-11058707212/python-3.11.0-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.11.0-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-11058707212/python-3.11.0-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-11058707212/python-3.11.0-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-11058707212/python-3.11.0-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.0-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-11058707212/python-3.11.0-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-11058707212/python-3.11.0-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.11.0-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-11058707212/python-3.11.0-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-win32-arm64.zip", + "arch": "arm64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-11058707212/python-3.11.0-win32-arm64.zip" + }, + { + "filename": "python-3.11.0-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-11058707212/python-3.11.0-win32-x64.zip" + }, + { + "filename": "python-3.11.0-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-11058707212/python-3.11.0-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-rc.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-rc.2-3172748327", + "files": [ + { + "filename": "python-3.11.0-rc.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.2-3172748327/python-3.11.0-rc.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-rc.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.2-3172748327/python-3.11.0-rc.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-rc.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.2-3172748327/python-3.11.0-rc.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-rc.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.2-3172748327/python-3.11.0-rc.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-rc.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.2-3172748327/python-3.11.0-rc.2-win32-x64.zip" + }, + { + "filename": "python-3.11.0-rc.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.2-3172748327/python-3.11.0-rc.2-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-rc.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-rc.1-2830636759", + "files": [ + { + "filename": "python-3.11.0-rc.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.1-2830636759/python-3.11.0-rc.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-rc.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.1-2830636759/python-3.11.0-rc.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-rc.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.1-2830636759/python-3.11.0-rc.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-rc.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.1-2830636759/python-3.11.0-rc.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-rc.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.1-2830636759/python-3.11.0-rc.1-win32-x64.zip" + }, + { + "filename": "python-3.11.0-rc.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-rc.1-2830636759/python-3.11.0-rc.1-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-beta.5", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-beta.5-2747645645", + "files": [ + { + "filename": "python-3.11.0-beta.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.5-2747645645/python-3.11.0-beta.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.5-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.5-2747645645/python-3.11.0-beta.5-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.5-2747645645/python-3.11.0-beta.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.5-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.5-2747645645/python-3.11.0-beta.5-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.5-2747645645/python-3.11.0-beta.5-win32-x64.zip" + }, + { + "filename": "python-3.11.0-beta.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.5-2747645645/python-3.11.0-beta.5-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-beta.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-beta.4-2661435468", + "files": [ + { + "filename": "python-3.11.0-beta.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.4-2661435468/python-3.11.0-beta.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.4-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.4-2661435468/python-3.11.0-beta.4-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.4-2661435468/python-3.11.0-beta.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.4-2661435468/python-3.11.0-beta.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.4-2661435468/python-3.11.0-beta.4-win32-x64.zip" + }, + { + "filename": "python-3.11.0-beta.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.4-2661435468/python-3.11.0-beta.4-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-beta.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-beta.3-2426427485", + "files": [ + { + "filename": "python-3.11.0-beta.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.3-2426427485/python-3.11.0-beta.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.3-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.3-2426427485/python-3.11.0-beta.3-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.3-2426427485/python-3.11.0-beta.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.3-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.3-2426427485/python-3.11.0-beta.3-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.3-2426427485/python-3.11.0-beta.3-win32-x64.zip" + }, + { + "filename": "python-3.11.0-beta.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.3-2426427485/python-3.11.0-beta.3-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-beta.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-beta.2-2419602742", + "files": [ + { + "filename": "python-3.11.0-beta.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.2-2419602742/python-3.11.0-beta.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.2-2419602742/python-3.11.0-beta.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.2-2419602742/python-3.11.0-beta.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.2-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.2-2419602742/python-3.11.0-beta.2-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.2-2419602742/python-3.11.0-beta.2-win32-x64.zip" + }, + { + "filename": "python-3.11.0-beta.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.2-2419602742/python-3.11.0-beta.2-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-beta.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-beta.1-2290009903", + "files": [ + { + "filename": "python-3.11.0-beta.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.1-2290009903/python-3.11.0-beta.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.1-2290009903/python-3.11.0-beta.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.1-2290009903/python-3.11.0-beta.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.1-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.1-2290009903/python-3.11.0-beta.1-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-beta.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.1-2290009903/python-3.11.0-beta.1-win32-x64.zip" + }, + { + "filename": "python-3.11.0-beta.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-beta.1-2290009903/python-3.11.0-beta.1-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-alpha.7", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-alpha.7-2171175503", + "files": [ + { + "filename": "python-3.11.0-alpha.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.7-2171175503/python-3.11.0-alpha.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.7-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.7-2171175503/python-3.11.0-alpha.7-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.7-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.7-2171175503/python-3.11.0-alpha.7-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.7-2171175503/python-3.11.0-alpha.7-win32-x64.zip" + }, + { + "filename": "python-3.11.0-alpha.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.7-2171175503/python-3.11.0-alpha.7-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-alpha.6", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-alpha.6-2009545975", + "files": [ + { + "filename": "python-3.11.0-alpha.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.6-2009545975/python-3.11.0-alpha.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.6-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.6-2009545975/python-3.11.0-alpha.6-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.6-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.6-2009545975/python-3.11.0-alpha.6-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.6-2009545975/python-3.11.0-alpha.6-win32-x64.zip" + }, + { + "filename": "python-3.11.0-alpha.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.6-2009545975/python-3.11.0-alpha.6-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-alpha.5", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-alpha.5-1793751460", + "files": [ + { + "filename": "python-3.11.0-alpha.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.5-1793751460/python-3.11.0-alpha.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.5-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.5-1793751460/python-3.11.0-alpha.5-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.5-1793751460/python-3.11.0-alpha.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.5-1793751460/python-3.11.0-alpha.5-win32-x64.zip" + }, + { + "filename": "python-3.11.0-alpha.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.5-1793751460/python-3.11.0-alpha.5-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-alpha.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-alpha.4-1754961913", + "files": [ + { + "filename": "python-3.11.0-alpha.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.4-1754961913/python-3.11.0-alpha.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.4-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.4-1754961913/python-3.11.0-alpha.4-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.4-1754961913/python-3.11.0-alpha.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.4-1754961913/python-3.11.0-alpha.4-win32-x64.zip" + }, + { + "filename": "python-3.11.0-alpha.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.4-1754961913/python-3.11.0-alpha.4-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-alpha.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-alpha.3-120611", + "files": [ + { + "filename": "python-3.11.0-alpha.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.3-120611/python-3.11.0-alpha.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.3-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.3-120611/python-3.11.0-alpha.3-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.3-120611/python-3.11.0-alpha.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.3-120611/python-3.11.0-alpha.3-win32-x64.zip" + }, + { + "filename": "python-3.11.0-alpha.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.3-120611/python-3.11.0-alpha.3-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-alpha.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-alpha.2-118811", + "files": [ + { + "filename": "python-3.11.0-alpha.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.2-118811/python-3.11.0-alpha.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.2-118811/python-3.11.0-alpha.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.2-118811/python-3.11.0-alpha.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.2-118811/python-3.11.0-alpha.2-win32-x64.zip" + }, + { + "filename": "python-3.11.0-alpha.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.2-118811/python-3.11.0-alpha.2-win32-x86.zip" + } + ] + }, + { + "version": "3.11.0-alpha.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.11.0-alpha.1-117932", + "files": [ + { + "filename": "python-3.11.0-alpha.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.1-117932/python-3.11.0-alpha.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.1-117932/python-3.11.0-alpha.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.1-117932/python-3.11.0-alpha.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.11.0-alpha.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.1-117932/python-3.11.0-alpha.1-win32-x64.zip" + }, + { + "filename": "python-3.11.0-alpha.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.11.0-alpha.1-117932/python-3.11.0-alpha.1-win32-x86.zip" + } + ] + }, + { + "version": "3.10.20", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.20-22630057857", + "files": [ + { + "filename": "python-3.10.20-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.20-22630057857/python-3.10.20-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.20-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.20-22630057857/python-3.10.20-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.20-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.20-22630057857/python-3.10.20-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.20-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.20-22630057857/python-3.10.20-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.20-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.20-22630057857/python-3.10.20-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.10.19", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.19-18393196481", + "files": [ + { + "filename": "python-3.10.19-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.19-18393196481/python-3.10.19-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.19-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.19-18393196481/python-3.10.19-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.19-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.19-18393196481/python-3.10.19-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.19-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.19-18393196481/python-3.10.19-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.19-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.19-18393196481/python-3.10.19-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.10.18", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.18-15433209320", + "files": [ + { + "filename": "python-3.10.18-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.18-15433209320/python-3.10.18-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.18-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.18-15433209320/python-3.10.18-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.18-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.18-15433209320/python-3.10.18-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.18-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.18-15433209320/python-3.10.18-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.18-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.18-15433209320/python-3.10.18-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.10.17", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.17-14343836466", + "files": [ + { + "filename": "python-3.10.17-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.17-14343836466/python-3.10.17-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.17-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.17-14343836466/python-3.10.17-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.17-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.17-14343836466/python-3.10.17-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.17-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.17-14343836466/python-3.10.17-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.17-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.17-14343836466/python-3.10.17-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.17-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.17-14343836466/python-3.10.17-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.10.16", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.16-12302993382", + "files": [ + { + "filename": "python-3.10.16-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.16-12302993382/python-3.10.16-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.16-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.16-12302993382/python-3.10.16-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.16-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.16-12302993382/python-3.10.16-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.16-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.16-12302993382/python-3.10.16-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.16-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.16-12302993382/python-3.10.16-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.16-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.16-12302993382/python-3.10.16-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.10.15", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.15-10765692022", + "files": [ + { + "filename": "python-3.10.15-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.15-10765692022/python-3.10.15-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.15-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.15-10765692022/python-3.10.15-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.15-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.15-10765692022/python-3.10.15-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.15-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.15-10765692022/python-3.10.15-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.15-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.15-10765692022/python-3.10.15-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.15-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.15-10765692022/python-3.10.15-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.10.14", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.14-9962525809", + "files": [ + { + "filename": "python-3.10.14-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.14-9962525809/python-3.10.14-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.14-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.14-9962525809/python-3.10.14-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.14-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.14-9962525809/python-3.10.14-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.14-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.14-9962525809/python-3.10.14-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.14-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.14-9962525809/python-3.10.14-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.14-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.14-9962525809/python-3.10.14-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.10.13", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.13-11113412466", + "files": [ + { + "filename": "python-3.10.13-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.13-11113412466/python-3.10.13-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.13-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.13-11113412466/python-3.10.13-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.13-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.13-11113412466/python-3.10.13-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.13-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.13-11113412466/python-3.10.13-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.13-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.13-11113412466/python-3.10.13-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.13-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.13-11113412466/python-3.10.13-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.10.12", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.12-11114375244", + "files": [ + { + "filename": "python-3.10.12-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.12-11114375244/python-3.10.12-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.12-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.12-11114375244/python-3.10.12-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.12-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.12-11114375244/python-3.10.12-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.12-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.12-11114375244/python-3.10.12-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.12-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.12-11114375244/python-3.10.12-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.12-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.12-11114375244/python-3.10.12-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.10.11", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.11-11114431484", + "files": [ + { + "filename": "python-3.10.11-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.11-11114431484/python-3.10.11-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.10.11-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.11-11114431484/python-3.10.11-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.11-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.11-11114431484/python-3.10.11-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.11-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.11-11114431484/python-3.10.11-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.11-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.11-11114431484/python-3.10.11-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.11-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.11-11114431484/python-3.10.11-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.11-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.11-11114431484/python-3.10.11-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.10.11-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.11-11114431484/python-3.10.11-win32-x64.zip" + }, + { + "filename": "python-3.10.11-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.11-11114431484/python-3.10.11-win32-x86.zip" + } + ] + }, + { + "version": "3.10.10", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.10-11156136298", + "files": [ + { + "filename": "python-3.10.10-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.10-11156136298/python-3.10.10-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.10.10-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.10-11156136298/python-3.10.10-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.10-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.10-11156136298/python-3.10.10-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.10-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.10-11156136298/python-3.10.10-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.10-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.10-11156136298/python-3.10.10-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.10-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.10-11156136298/python-3.10.10-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.10-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.10-11156136298/python-3.10.10-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.10.10-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.10-11156136298/python-3.10.10-win32-x64.zip" + }, + { + "filename": "python-3.10.10-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.10-11156136298/python-3.10.10-win32-x86.zip" + } + ] + }, + { + "version": "3.10.9", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.9-11156110083", + "files": [ + { + "filename": "python-3.10.9-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.9-11156110083/python-3.10.9-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.10.9-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.9-11156110083/python-3.10.9-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.9-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.9-11156110083/python-3.10.9-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.9-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.9-11156110083/python-3.10.9-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.9-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.9-11156110083/python-3.10.9-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.9-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.9-11156110083/python-3.10.9-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.9-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.9-11156110083/python-3.10.9-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.10.9-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.9-11156110083/python-3.10.9-win32-x64.zip" + }, + { + "filename": "python-3.10.9-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.9-11156110083/python-3.10.9-win32-x86.zip" + } + ] + }, + { + "version": "3.10.8", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.8-11157050441", + "files": [ + { + "filename": "python-3.10.8-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.8-11157050441/python-3.10.8-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.10.8-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.8-11157050441/python-3.10.8-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.8-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.8-11157050441/python-3.10.8-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.8-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.8-11157050441/python-3.10.8-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.8-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.8-11157050441/python-3.10.8-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.8-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.8-11157050441/python-3.10.8-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.8-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.8-11157050441/python-3.10.8-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.10.8-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.8-11157050441/python-3.10.8-win32-x64.zip" + }, + { + "filename": "python-3.10.8-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.8-11157050441/python-3.10.8-win32-x86.zip" + } + ] + }, + { + "version": "3.10.7", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.7-11156088973", + "files": [ + { + "filename": "python-3.10.7-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.7-11156088973/python-3.10.7-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.10.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.7-11156088973/python-3.10.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.7-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.7-11156088973/python-3.10.7-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.7-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.7-11156088973/python-3.10.7-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.7-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.7-11156088973/python-3.10.7-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.7-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.7-11156088973/python-3.10.7-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.7-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.7-11156088973/python-3.10.7-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.10.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.7-11156088973/python-3.10.7-win32-x64.zip" + }, + { + "filename": "python-3.10.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.7-11156088973/python-3.10.7-win32-x86.zip" + } + ] + }, + { + "version": "3.10.6", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.6-11156080153", + "files": [ + { + "filename": "python-3.10.6-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.6-11156080153/python-3.10.6-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.10.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.6-11156080153/python-3.10.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.6-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.6-11156080153/python-3.10.6-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.6-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.6-11156080153/python-3.10.6-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.6-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.6-11156080153/python-3.10.6-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.6-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.6-11156080153/python-3.10.6-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.6-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.6-11156080153/python-3.10.6-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.10.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.6-11156080153/python-3.10.6-win32-x64.zip" + }, + { + "filename": "python-3.10.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.6-11156080153/python-3.10.6-win32-x86.zip" + } + ] + }, + { + "version": "3.10.5", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.5-11156057491", + "files": [ + { + "filename": "python-3.10.5-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.5-11156057491/python-3.10.5-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.10.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.5-11156057491/python-3.10.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.5-11156057491/python-3.10.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.5-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.5-11156057491/python-3.10.5-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.5-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.5-11156057491/python-3.10.5-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.5-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.5-11156057491/python-3.10.5-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.5-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.5-11156057491/python-3.10.5-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.10.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.5-11156057491/python-3.10.5-win32-x64.zip" + }, + { + "filename": "python-3.10.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.5-11156057491/python-3.10.5-win32-x86.zip" + } + ] + }, + { + "version": "3.10.4", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.4-11156037683", + "files": [ + { + "filename": "python-3.10.4-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.4-11156037683/python-3.10.4-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.10.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.4-11156037683/python-3.10.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.4-11156037683/python-3.10.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.4-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.4-11156037683/python-3.10.4-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.4-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.4-11156037683/python-3.10.4-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.10.4-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.4-11156037683/python-3.10.4-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.10.4-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.4-11156037683/python-3.10.4-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.10.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.4-11156037683/python-3.10.4-win32-x64.zip" + }, + { + "filename": "python-3.10.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.4-11156037683/python-3.10.4-win32-x86.zip" + } + ] + }, + { + "version": "3.10.3", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.3-2000219088", + "files": [ + { + "filename": "python-3.10.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.3-2000219088/python-3.10.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.3-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.3-2000219088/python-3.10.3-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.3-2000219088/python-3.10.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.3-2000219088/python-3.10.3-win32-x64.zip" + }, + { + "filename": "python-3.10.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.3-2000219088/python-3.10.3-win32-x86.zip" + } + ] + }, + { + "version": "3.10.2", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.2-1805098134", + "files": [ + { + "filename": "python-3.10.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.2-1805098134/python-3.10.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.2-1805098134/python-3.10.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.2-1805098134/python-3.10.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.2-1805098134/python-3.10.2-win32-x64.zip" + }, + { + "filename": "python-3.10.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.2-1805098134/python-3.10.2-win32-x86.zip" + } + ] + }, + { + "version": "3.10.1", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.1-120613", + "files": [ + { + "filename": "python-3.10.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.1-120613/python-3.10.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.1-120613/python-3.10.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.1-120613/python-3.10.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.1-120613/python-3.10.1-win32-x64.zip" + }, + { + "filename": "python-3.10.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.1-120613/python-3.10.1-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-117927", + "files": [ + { + "filename": "python-3.10.0-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-117927/python-3.10.0-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-117927/python-3.10.0-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-117927/python-3.10.0-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-117927/python-3.10.0-win32-x64.zip" + }, + { + "filename": "python-3.10.0-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-117927/python-3.10.0-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-rc.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-rc.2-116172", + "files": [ + { + "filename": "python-3.10.0-rc.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-rc.2-116172/python-3.10.0-rc.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-rc.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-rc.2-116172/python-3.10.0-rc.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-rc.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-rc.2-116172/python-3.10.0-rc.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-rc.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-rc.2-116172/python-3.10.0-rc.2-win32-x64.zip" + }, + { + "filename": "python-3.10.0-rc.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-rc.2-116172/python-3.10.0-rc.2-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-rc.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-rc.1-114570", + "files": [ + { + "filename": "python-3.10.0-rc.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-rc.1-114570/python-3.10.0-rc.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-rc.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-rc.1-114570/python-3.10.0-rc.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-rc.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-rc.1-114570/python-3.10.0-rc.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-rc.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-rc.1-114570/python-3.10.0-rc.1-win32-x64.zip" + }, + { + "filename": "python-3.10.0-rc.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-rc.1-114570/python-3.10.0-rc.1-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-beta.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-beta.4-113274", + "files": [ + { + "filename": "python-3.10.0-beta.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.4-113274/python-3.10.0-beta.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.4-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.4-113274/python-3.10.0-beta.4-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.4-113274/python-3.10.0-beta.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.4-113274/python-3.10.0-beta.4-win32-x64.zip" + }, + { + "filename": "python-3.10.0-beta.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.4-113274/python-3.10.0-beta.4-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-beta.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-beta.3-112036", + "files": [ + { + "filename": "python-3.10.0-beta.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.3-112036/python-3.10.0-beta.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.3-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.3-112036/python-3.10.0-beta.3-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.3-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.3-112036/python-3.10.0-beta.3-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.3-112036/python-3.10.0-beta.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.3-112036/python-3.10.0-beta.3-win32-x64.zip" + }, + { + "filename": "python-3.10.0-beta.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.3-112036/python-3.10.0-beta.3-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-beta.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-beta.2-110345", + "files": [ + { + "filename": "python-3.10.0-beta.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.2-110345/python-3.10.0-beta.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.2-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.2-110345/python-3.10.0-beta.2-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.2-110345/python-3.10.0-beta.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.2-110345/python-3.10.0-beta.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.2-110345/python-3.10.0-beta.2-win32-x64.zip" + }, + { + "filename": "python-3.10.0-beta.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.2-110345/python-3.10.0-beta.2-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-beta.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-beta.1-107003", + "files": [ + { + "filename": "python-3.10.0-beta.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.1-107003/python-3.10.0-beta.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.1-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.1-107003/python-3.10.0-beta.1-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.1-107003/python-3.10.0-beta.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.1-107003/python-3.10.0-beta.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-beta.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.1-107003/python-3.10.0-beta.1-win32-x64.zip" + }, + { + "filename": "python-3.10.0-beta.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-beta.1-107003/python-3.10.0-beta.1-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-alpha.7", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-alpha.7-104142", + "files": [ + { + "filename": "python-3.10.0-alpha.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.7-104142/python-3.10.0-alpha.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.7-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.7-104142/python-3.10.0-alpha.7-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.7-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.7-104142/python-3.10.0-alpha.7-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.7-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.7-104142/python-3.10.0-alpha.7-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.7-104142/python-3.10.0-alpha.7-win32-x64.zip" + }, + { + "filename": "python-3.10.0-alpha.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.7-104142/python-3.10.0-alpha.7-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-alpha.6", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-alpha.6-101284", + "files": [ + { + "filename": "python-3.10.0-alpha.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.6-101284/python-3.10.0-alpha.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.6-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.6-101284/python-3.10.0-alpha.6-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.6-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.6-101284/python-3.10.0-alpha.6-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.6-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.6-101284/python-3.10.0-alpha.6-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.6-101284/python-3.10.0-alpha.6-win32-x64.zip" + }, + { + "filename": "python-3.10.0-alpha.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.6-101284/python-3.10.0-alpha.6-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-alpha.5", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-alpha.5-100730", + "files": [ + { + "filename": "python-3.10.0-alpha.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.5-100730/python-3.10.0-alpha.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.5-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.5-100730/python-3.10.0-alpha.5-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.5-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.5-100730/python-3.10.0-alpha.5-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.5-100730/python-3.10.0-alpha.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.5-100730/python-3.10.0-alpha.5-win32-x64.zip" + }, + { + "filename": "python-3.10.0-alpha.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.5-100730/python-3.10.0-alpha.5-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-alpha.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-alpha.4-96713", + "files": [ + { + "filename": "python-3.10.0-alpha.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.4-96713/python-3.10.0-alpha.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.4-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.4-96713/python-3.10.0-alpha.4-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.4-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.4-96713/python-3.10.0-alpha.4-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.4-96713/python-3.10.0-alpha.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.4-96713/python-3.10.0-alpha.4-win32-x64.zip" + }, + { + "filename": "python-3.10.0-alpha.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.4-96713/python-3.10.0-alpha.4-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-alpha.3", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-alpha.3-96712", + "files": [ + { + "filename": "python-3.10.0-alpha.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.3-96712/python-3.10.0-alpha.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.3-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.3-96712/python-3.10.0-alpha.3-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.3-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.3-96712/python-3.10.0-alpha.3-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.3-96712/python-3.10.0-alpha.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.3-96712/python-3.10.0-alpha.3-win32-x64.zip" + }, + { + "filename": "python-3.10.0-alpha.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.3-96712/python-3.10.0-alpha.3-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-alpha.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-alpha.2-96711", + "files": [ + { + "filename": "python-3.10.0-alpha.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.2-96711/python-3.10.0-alpha.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.2-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.2-96711/python-3.10.0-alpha.2-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.2-96711/python-3.10.0-alpha.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.2-96711/python-3.10.0-alpha.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.2-96711/python-3.10.0-alpha.2-win32-x64.zip" + }, + { + "filename": "python-3.10.0-alpha.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.2-96711/python-3.10.0-alpha.2-win32-x86.zip" + } + ] + }, + { + "version": "3.10.0-alpha.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.10.0-alpha.1-96710", + "files": [ + { + "filename": "python-3.10.0-alpha.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.1-96710/python-3.10.0-alpha.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.1-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.1-96710/python-3.10.0-alpha.1-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.1-96710/python-3.10.0-alpha.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.1-96710/python-3.10.0-alpha.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.10.0-alpha.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.1-96710/python-3.10.0-alpha.1-win32-x64.zip" + }, + { + "filename": "python-3.10.0-alpha.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.10.0-alpha.1-96710/python-3.10.0-alpha.1-win32-x86.zip" + } + ] + }, + { + "version": "3.9.25", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.25-19039189640", + "files": [ + { + "filename": "python-3.9.25-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.25-19039189640/python-3.9.25-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.25-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.25-19039189640/python-3.9.25-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.25-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.25-19039189640/python-3.9.25-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.25-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.25-19039189640/python-3.9.25-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.25-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.25-19039189640/python-3.9.25-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.24", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.24-18393164954", + "files": [ + { + "filename": "python-3.9.24-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.24-18393164954/python-3.9.24-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.24-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.24-18393164954/python-3.9.24-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.24-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.24-18393164954/python-3.9.24-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.24-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.24-18393164954/python-3.9.24-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.24-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.24-18393164954/python-3.9.24-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.23", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.23-15433290661", + "files": [ + { + "filename": "python-3.9.23-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.23-15433290661/python-3.9.23-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.23-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.23-15433290661/python-3.9.23-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.23-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.23-15433290661/python-3.9.23-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.23-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.23-15433290661/python-3.9.23-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.23-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.23-15433290661/python-3.9.23-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.22", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.22-14344111503", + "files": [ + { + "filename": "python-3.9.22-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.22-14344111503/python-3.9.22-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.22-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.22-14344111503/python-3.9.22-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.22-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.22-14344111503/python-3.9.22-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.22-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.22-14344111503/python-3.9.22-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.22-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.22-14344111503/python-3.9.22-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.22-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.22-14344111503/python-3.9.22-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.21", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.21-12303000710", + "files": [ + { + "filename": "python-3.9.21-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.21-12303000710/python-3.9.21-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.21-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.21-12303000710/python-3.9.21-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.21-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.21-12303000710/python-3.9.21-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.21-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.21-12303000710/python-3.9.21-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.21-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.21-12303000710/python-3.9.21-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.21-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.21-12303000710/python-3.9.21-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.20", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.20-10765735733", + "files": [ + { + "filename": "python-3.9.20-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.20-10765735733/python-3.9.20-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.20-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.20-10765735733/python-3.9.20-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.20-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.20-10765735733/python-3.9.20-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.20-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.20-10765735733/python-3.9.20-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.20-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.20-10765735733/python-3.9.20-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.20-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.20-10765735733/python-3.9.20-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.19", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.19-9962534424", + "files": [ + { + "filename": "python-3.9.19-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.19-9962534424/python-3.9.19-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.19-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.19-9962534424/python-3.9.19-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.19-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.19-9962534424/python-3.9.19-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.19-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.19-9962534424/python-3.9.19-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.19-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.19-9962534424/python-3.9.19-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.19-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.19-9962534424/python-3.9.19-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.18", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.18-11183952707", + "files": [ + { + "filename": "python-3.9.18-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.18-11183952707/python-3.9.18-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.18-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.18-11183952707/python-3.9.18-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.18-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.18-11183952707/python-3.9.18-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.18-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.18-11183952707/python-3.9.18-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.18-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.18-11183952707/python-3.9.18-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.18-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.18-11183952707/python-3.9.18-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.17", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.17-11183917965", + "files": [ + { + "filename": "python-3.9.17-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.17-11183917965/python-3.9.17-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.17-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.17-11183917965/python-3.9.17-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.17-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.17-11183917965/python-3.9.17-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.17-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.17-11183917965/python-3.9.17-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.17-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.17-11183917965/python-3.9.17-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.17-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.17-11183917965/python-3.9.17-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.16", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.16-11183815643", + "files": [ + { + "filename": "python-3.9.16-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.16-11183815643/python-3.9.16-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.16-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.16-11183815643/python-3.9.16-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.16-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.16-11183815643/python-3.9.16-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.16-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.16-11183815643/python-3.9.16-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.16-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.16-11183815643/python-3.9.16-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.16-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.16-11183815643/python-3.9.16-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.15", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.15-11183782044", + "files": [ + { + "filename": "python-3.9.15-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.15-11183782044/python-3.9.15-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.15-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.15-11183782044/python-3.9.15-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.15-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.15-11183782044/python-3.9.15-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.15-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.15-11183782044/python-3.9.15-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.15-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.15-11183782044/python-3.9.15-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.15-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.15-11183782044/python-3.9.15-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.14", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.14-11183735553", + "files": [ + { + "filename": "python-3.9.14-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.14-11183735553/python-3.9.14-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.14-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.14-11183735553/python-3.9.14-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.14-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.14-11183735553/python-3.9.14-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.14-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.14-11183735553/python-3.9.14-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.14-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.14-11183735553/python-3.9.14-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.14-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.14-11183735553/python-3.9.14-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.9.13", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.13-11183687820", + "files": [ + { + "filename": "python-3.9.13-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.13-11183687820/python-3.9.13-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.9.13-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.13-11183687820/python-3.9.13-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.13-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.13-11183687820/python-3.9.13-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.13-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.13-11183687820/python-3.9.13-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.13-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.13-11183687820/python-3.9.13-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.13-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.13-11183687820/python-3.9.13-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.13-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.13-11183687820/python-3.9.13-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.9.13-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.13-11183687820/python-3.9.13-win32-x64.zip" + }, + { + "filename": "python-3.9.13-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.13-11183687820/python-3.9.13-win32-x86.zip" + } + ] + }, + { + "version": "3.9.12", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.12-11183622568", + "files": [ + { + "filename": "python-3.9.12-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.12-11183622568/python-3.9.12-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.9.12-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.12-11183622568/python-3.9.12-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.12-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.12-11183622568/python-3.9.12-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.12-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.12-11183622568/python-3.9.12-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.12-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.12-11183622568/python-3.9.12-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.9.12-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.12-11183622568/python-3.9.12-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.9.12-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.12-11183622568/python-3.9.12-linux-24.04-x64.tar.gz" + }, + { + "filename": "python-3.9.12-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.12-11183622568/python-3.9.12-win32-x64.zip" + }, + { + "filename": "python-3.9.12-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.12-11183622568/python-3.9.12-win32-x86.zip" + } + ] + }, + { + "version": "3.9.11", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.11-2018436241", + "files": [ + { + "filename": "python-3.9.11-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.11-2018436241/python-3.9.11-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.11-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.11-2018436241/python-3.9.11-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.11-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.11-2018436241/python-3.9.11-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.11-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.11-2018436241/python-3.9.11-win32-x64.zip" + }, + { + "filename": "python-3.9.11-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.11-2018436241/python-3.9.11-win32-x86.zip" + } + ] + }, + { + "version": "3.9.10", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.10-1788162477", + "files": [ + { + "filename": "python-3.9.10-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.10-1788162477/python-3.9.10-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.10-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.10-1788162477/python-3.9.10-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.10-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.10-1788162477/python-3.9.10-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.10-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.10-1788162477/python-3.9.10-win32-x64.zip" + }, + { + "filename": "python-3.9.10-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.10-1788162477/python-3.9.10-win32-x86.zip" + } + ] + }, + { + "version": "3.9.9", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.9-119268", + "files": [ + { + "filename": "python-3.9.9-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.9-119268/python-3.9.9-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.9-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.9-119268/python-3.9.9-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.9-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.9-119268/python-3.9.9-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.9-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.9-119268/python-3.9.9-win32-x64.zip" + }, + { + "filename": "python-3.9.9-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.9-119268/python-3.9.9-win32-x86.zip" + } + ] + }, + { + "version": "3.9.8", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.8-118810", + "files": [ + { + "filename": "python-3.9.8-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.8-118810/python-3.9.8-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.8-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.8-118810/python-3.9.8-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.8-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.8-118810/python-3.9.8-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.8-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.8-118810/python-3.9.8-win32-x64.zip" + }, + { + "filename": "python-3.9.8-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.8-118810/python-3.9.8-win32-x86.zip" + } + ] + }, + { + "version": "3.9.7", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.7-1812317133", + "files": [ + { + "filename": "python-3.9.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.7-1812317133/python-3.9.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.7-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.7-1812317133/python-3.9.7-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.7-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.7-1812317133/python-3.9.7-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.7-1812317133/python-3.9.7-win32-x64.zip" + }, + { + "filename": "python-3.9.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.7-1812317133/python-3.9.7-win32-x86.zip" + } + ] + }, + { + "version": "3.9.6", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.6-117960", + "files": [ + { + "filename": "python-3.9.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.6-117960/python-3.9.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.6-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.6-117960/python-3.9.6-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.6-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.6-117960/python-3.9.6-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.6-117960/python-3.9.6-win32-x64.zip" + }, + { + "filename": "python-3.9.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.6-117960/python-3.9.6-win32-x86.zip" + } + ] + }, + { + "version": "3.9.5", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.5-109482", + "files": [ + { + "filename": "python-3.9.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.5-109482/python-3.9.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.5-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.5-109482/python-3.9.5-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.5-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.5-109482/python-3.9.5-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.5-109482/python-3.9.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.5-109482/python-3.9.5-win32-x64.zip" + }, + { + "filename": "python-3.9.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.5-109482/python-3.9.5-win32-x86.zip" + } + ] + }, + { + "version": "3.9.4", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.4-103698", + "files": [ + { + "filename": "python-3.9.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.4-103698/python-3.9.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.4-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.4-103698/python-3.9.4-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.4-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.4-103698/python-3.9.4-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.4-103698/python-3.9.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.4-103698/python-3.9.4-win32-x64.zip" + }, + { + "filename": "python-3.9.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.4-103698/python-3.9.4-win32-x86.zip" + } + ] + }, + { + "version": "3.9.3", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.3-103669", + "files": [ + { + "filename": "python-3.9.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.3-103669/python-3.9.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.3-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.3-103669/python-3.9.3-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.3-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.3-103669/python-3.9.3-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.3-103669/python-3.9.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.3-103669/python-3.9.3-win32-x64.zip" + }, + { + "filename": "python-3.9.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.3-103669/python-3.9.3-win32-x86.zip" + } + ] + }, + { + "version": "3.9.2", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.2-99799", + "files": [ + { + "filename": "python-3.9.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-99799/python-3.9.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.2-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-99799/python-3.9.2-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-99799/python-3.9.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-99799/python-3.9.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-99799/python-3.9.2-win32-x64.zip" + }, + { + "filename": "python-3.9.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-99799/python-3.9.2-win32-x86.zip" + } + ] + }, + { + "version": "3.9.2-rc.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.2-rc.1-99844", + "files": [ + { + "filename": "python-3.9.2-rc.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-rc.1-99844/python-3.9.2-rc.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.2-rc.1-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-rc.1-99844/python-3.9.2-rc.1-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.2-rc.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-rc.1-99844/python-3.9.2-rc.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.2-rc.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-rc.1-99844/python-3.9.2-rc.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.2-rc.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-rc.1-99844/python-3.9.2-rc.1-win32-x64.zip" + }, + { + "filename": "python-3.9.2-rc.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.2-rc.1-99844/python-3.9.2-rc.1-win32-x86.zip" + } + ] + }, + { + "version": "3.9.1", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.1-96692", + "files": [ + { + "filename": "python-3.9.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-96692/python-3.9.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.1-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-96692/python-3.9.1-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-96692/python-3.9.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-96692/python-3.9.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-96692/python-3.9.1-win32-x64.zip" + }, + { + "filename": "python-3.9.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-96692/python-3.9.1-win32-x86.zip" + } + ] + }, + { + "version": "3.9.1-rc.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.1-rc.1-91591", + "files": [ + { + "filename": "python-3.9.1-rc.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-rc.1-91591/python-3.9.1-rc.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.1-rc.1-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-rc.1-91591/python-3.9.1-rc.1-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.1-rc.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-rc.1-91591/python-3.9.1-rc.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.1-rc.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-rc.1-91591/python-3.9.1-rc.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.1-rc.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-rc.1-91591/python-3.9.1-rc.1-win32-x64.zip" + }, + { + "filename": "python-3.9.1-rc.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.1-rc.1-91591/python-3.9.1-rc.1-win32-x86.zip" + } + ] + }, + { + "version": "3.9.0", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.0-96741", + "files": [ + { + "filename": "python-3.9.0-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-96741/python-3.9.0-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.0-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-96741/python-3.9.0-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-96741/python-3.9.0-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-96741/python-3.9.0-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-96741/python-3.9.0-win32-x64.zip" + }, + { + "filename": "python-3.9.0-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-96741/python-3.9.0-win32-x86.zip" + } + ] + }, + { + "version": "3.9.0-rc.2", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.0-rc.2-90045", + "files": [ + { + "filename": "python-3.9.0-rc.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.2-90045/python-3.9.0-rc.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.0-rc.2-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.2-90045/python-3.9.0-rc.2-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-rc.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.2-90045/python-3.9.0-rc.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-rc.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.2-90045/python-3.9.0-rc.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-rc.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.2-90045/python-3.9.0-rc.2-win32-x64.zip" + }, + { + "filename": "python-3.9.0-rc.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.2-90045/python-3.9.0-rc.2-win32-x86.zip" + } + ] + }, + { + "version": "3.9.0-rc.1", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.0-rc.1-90074", + "files": [ + { + "filename": "python-3.9.0-rc.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.1-90074/python-3.9.0-rc.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.0-rc.1-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.1-90074/python-3.9.0-rc.1-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-rc.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.1-90074/python-3.9.0-rc.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-rc.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.1-90074/python-3.9.0-rc.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-rc.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.1-90074/python-3.9.0-rc.1-win32-x64.zip" + }, + { + "filename": "python-3.9.0-rc.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-rc.1-90074/python-3.9.0-rc.1-win32-x86.zip" + } + ] + }, + { + "version": "3.9.0-beta.5", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.0-beta.5-89866", + "files": [ + { + "filename": "python-3.9.0-beta.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.5-89866/python-3.9.0-beta.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.0-beta.5-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.5-89866/python-3.9.0-beta.5-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-beta.5-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.5-89866/python-3.9.0-beta.5-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-beta.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.5-89866/python-3.9.0-beta.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-beta.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.5-89866/python-3.9.0-beta.5-win32-x64.zip" + }, + { + "filename": "python-3.9.0-beta.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.5-89866/python-3.9.0-beta.5-win32-x86.zip" + } + ] + }, + { + "version": "3.9.0-beta.4", + "stable": false, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.9.0-beta.4-89867", + "files": [ + { + "filename": "python-3.9.0-beta.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.4-89867/python-3.9.0-beta.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.9.0-beta.4-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.4-89867/python-3.9.0-beta.4-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-beta.4-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.4-89867/python-3.9.0-beta.4-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-beta.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.4-89867/python-3.9.0-beta.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.9.0-beta.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.4-89867/python-3.9.0-beta.4-win32-x64.zip" + }, + { + "filename": "python-3.9.0-beta.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.9.0-beta.4-89867/python-3.9.0-beta.4-win32-x86.zip" + } + ] + }, + { + "version": "3.8.18", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.18-12303122501", + "files": [ + { + "filename": "python-3.8.18-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.18-12303122501/python-3.8.18-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.18-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.18-12303122501/python-3.8.18-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.18-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.18-12303122501/python-3.8.18-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.18-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.18-12303122501/python-3.8.18-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.8.18-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.18-12303122501/python-3.8.18-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.18-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.18-12303122501/python-3.8.18-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.8.17", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.17-11228156509", + "files": [ + { + "filename": "python-3.8.17-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.17-11228156509/python-3.8.17-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.17-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.17-11228156509/python-3.8.17-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.17-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.17-11228156509/python-3.8.17-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.17-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.17-11228156509/python-3.8.17-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.8.17-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.17-11228156509/python-3.8.17-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.17-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.17-11228156509/python-3.8.17-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.8.16", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.16-11228150325", + "files": [ + { + "filename": "python-3.8.16-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.16-11228150325/python-3.8.16-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.16-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.16-11228150325/python-3.8.16-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.16-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.16-11228150325/python-3.8.16-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.16-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.16-11228150325/python-3.8.16-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.8.16-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.16-11228150325/python-3.8.16-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.16-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.16-11228150325/python-3.8.16-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.8.15", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.15-11228144472", + "files": [ + { + "filename": "python-3.8.15-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.15-11228144472/python-3.8.15-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.15-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.15-11228144472/python-3.8.15-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.15-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.15-11228144472/python-3.8.15-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.15-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.15-11228144472/python-3.8.15-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.8.15-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.15-11228144472/python-3.8.15-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.15-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.15-11228144472/python-3.8.15-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.8.14", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.14-11228133045", + "files": [ + { + "filename": "python-3.8.14-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.14-11228133045/python-3.8.14-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.14-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.14-11228133045/python-3.8.14-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.14-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.14-11228133045/python-3.8.14-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.14-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.14-11228133045/python-3.8.14-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.8.14-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.14-11228133045/python-3.8.14-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.14-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.14-11228133045/python-3.8.14-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.8.13", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.13-11228121154", + "files": [ + { + "filename": "python-3.8.13-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.13-11228121154/python-3.8.13-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.13-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.13-11228121154/python-3.8.13-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.13-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.13-11228121154/python-3.8.13-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.13-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.13-11228121154/python-3.8.13-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.8.13-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.13-11228121154/python-3.8.13-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.13-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.13-11228121154/python-3.8.13-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.8.12", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.12-11297040709", + "files": [ + { + "filename": "python-3.8.12-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.12-11297040709/python-3.8.12-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.12-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.12-11297040709/python-3.8.12-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.12-linux-22.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.12-11297040709/python-3.8.12-linux-22.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.12-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.12-11297040709/python-3.8.12-linux-22.04-x64.tar.gz" + }, + { + "filename": "python-3.8.12-linux-24.04-arm64.tar.gz", + "arch": "arm64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.12-11297040709/python-3.8.12-linux-24.04-arm64.tar.gz" + }, + { + "filename": "python-3.8.12-linux-24.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "24.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.12-11297040709/python-3.8.12-linux-24.04-x64.tar.gz" + } + ] + }, + { + "version": "3.8.11", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.11-113062", + "files": [ + { + "filename": "python-3.8.11-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.11-113062/python-3.8.11-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.11-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.11-113062/python-3.8.11-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.8.11-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.11-113062/python-3.8.11-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.8.10", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.10-8879978422", + "files": [ + { + "filename": "python-3.8.10-darwin-arm64.tar.gz", + "arch": "arm64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.10-8879978422/python-3.8.10-darwin-arm64.tar.gz" + }, + { + "filename": "python-3.8.10-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.10-8879978422/python-3.8.10-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.10-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.10-8879978422/python-3.8.10-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.10-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.10-8879978422/python-3.8.10-win32-x64.zip" + }, + { + "filename": "python-3.8.10-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.10-8879978422/python-3.8.10-win32-x86.zip" + } + ] + }, + { + "version": "3.8.9", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.9-104257", + "files": [ + { + "filename": "python-3.8.9-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.9-104257/python-3.8.9-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.9-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.9-104257/python-3.8.9-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.8.9-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.9-104257/python-3.8.9-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.8.9-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.9-104257/python-3.8.9-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.9-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.9-104257/python-3.8.9-win32-x64.zip" + }, + { + "filename": "python-3.8.9-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.9-104257/python-3.8.9-win32-x86.zip" + } + ] + }, + { + "version": "3.8.8", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.8-99800", + "files": [ + { + "filename": "python-3.8.8-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.8-99800/python-3.8.8-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.8-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.8-99800/python-3.8.8-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.8.8-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.8-99800/python-3.8.8-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.8.8-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.8-99800/python-3.8.8-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.8-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.8-99800/python-3.8.8-win32-x64.zip" + }, + { + "filename": "python-3.8.8-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.8-99800/python-3.8.8-win32-x86.zip" + } + ] + }, + { + "version": "3.8.7", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.7-96742", + "files": [ + { + "filename": "python-3.8.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.7-96742/python-3.8.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.7-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.7-96742/python-3.8.7-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.8.7-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.7-96742/python-3.8.7-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.8.7-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.7-96742/python-3.8.7-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.7-96742/python-3.8.7-win32-x64.zip" + }, + { + "filename": "python-3.8.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.7-96742/python-3.8.7-win32-x86.zip" + } + ] + }, + { + "version": "3.8.6", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.6-117961", + "files": [ + { + "filename": "python-3.8.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.6-117961/python-3.8.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.6-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.6-117961/python-3.8.6-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.8.6-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.6-117961/python-3.8.6-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.6-117961/python-3.8.6-win32-x64.zip" + }, + { + "filename": "python-3.8.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.6-117961/python-3.8.6-win32-x86.zip" + } + ] + }, + { + "version": "3.8.5", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.5-96743", + "files": [ + { + "filename": "python-3.8.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.5-96743/python-3.8.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.5-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.5-96743/python-3.8.5-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.8.5-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.5-96743/python-3.8.5-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.8.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.5-96743/python-3.8.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.5-96743/python-3.8.5-win32-x64.zip" + }, + { + "filename": "python-3.8.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.5-96743/python-3.8.5-win32-x86.zip" + } + ] + }, + { + "version": "3.8.4", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.4-96744", + "files": [ + { + "filename": "python-3.8.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.4-96744/python-3.8.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.4-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.4-96744/python-3.8.4-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.8.4-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.4-96744/python-3.8.4-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.8.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.4-96744/python-3.8.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.4-96744/python-3.8.4-win32-x64.zip" + }, + { + "filename": "python-3.8.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.4-96744/python-3.8.4-win32-x86.zip" + } + ] + }, + { + "version": "3.8.3", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.3-96745", + "files": [ + { + "filename": "python-3.8.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.3-96745/python-3.8.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.3-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.3-96745/python-3.8.3-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.8.3-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.3-96745/python-3.8.3-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.8.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.3-96745/python-3.8.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.3-96745/python-3.8.3-win32-x64.zip" + }, + { + "filename": "python-3.8.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.3-96745/python-3.8.3-win32-x86.zip" + } + ] + }, + { + "version": "3.8.2", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.2-96746", + "files": [ + { + "filename": "python-3.8.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.2-96746/python-3.8.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.2-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.2-96746/python-3.8.2-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.8.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.2-96746/python-3.8.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.8.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.2-96746/python-3.8.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.2-96746/python-3.8.2-win32-x64.zip" + }, + { + "filename": "python-3.8.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.2-96746/python-3.8.2-win32-x86.zip" + } + ] + }, + { + "version": "3.8.1", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.1-96747", + "files": [ + { + "filename": "python-3.8.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.1-96747/python-3.8.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.1-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.1-96747/python-3.8.1-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.8.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.1-96747/python-3.8.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.8.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.1-96747/python-3.8.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.1-96747/python-3.8.1-win32-x64.zip" + }, + { + "filename": "python-3.8.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.1-96747/python-3.8.1-win32-x86.zip" + } + ] + }, + { + "version": "3.8.0", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.8.0-96748", + "files": [ + { + "filename": "python-3.8.0-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.0-96748/python-3.8.0-darwin-x64.tar.gz" + }, + { + "filename": "python-3.8.0-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.0-96748/python-3.8.0-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.8.0-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.0-96748/python-3.8.0-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.8.0-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.0-96748/python-3.8.0-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.8.0-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.0-96748/python-3.8.0-win32-x64.zip" + }, + { + "filename": "python-3.8.0-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.8.0-96748/python-3.8.0-win32-x86.zip" + } + ] + }, + { + "version": "3.7.17", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.17-5356448435", + "files": [ + { + "filename": "python-3.7.17-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.17-5356448435/python-3.7.17-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.17-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.17-5356448435/python-3.7.17-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.17-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.17-5356448435/python-3.7.17-linux-22.04-x64.tar.gz" + } + ] + }, + { + "version": "3.7.16", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.16-4343262312", + "files": [ + { + "filename": "python-3.7.16-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.16-4343262312/python-3.7.16-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.16-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.16-4343262312/python-3.7.16-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.16-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.16-4343262312/python-3.7.16-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.16-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.16-4343262312/python-3.7.16-linux-22.04-x64.tar.gz" + } + ] + }, + { + "version": "3.7.15", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.15-3272001243", + "files": [ + { + "filename": "python-3.7.15-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.15-3272001243/python-3.7.15-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.15-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.15-3272001243/python-3.7.15-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.15-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.15-3272001243/python-3.7.15-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.15-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.15-3272001243/python-3.7.15-linux-22.04-x64.tar.gz" + } + ] + }, + { + "version": "3.7.14", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.14-3008342067", + "files": [ + { + "filename": "python-3.7.14-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.14-3008342067/python-3.7.14-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.14-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.14-3008342067/python-3.7.14-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.14-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.14-3008342067/python-3.7.14-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.14-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.14-3008342067/python-3.7.14-linux-22.04-x64.tar.gz" + } + ] + }, + { + "version": "3.7.13", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.13-2268493565", + "files": [ + { + "filename": "python-3.7.13-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.13-2268493565/python-3.7.13-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.13-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.13-2268493565/python-3.7.13-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.13-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.13-2268493565/python-3.7.13-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.13-linux-22.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "22.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.13-2268493565/python-3.7.13-linux-22.04-x64.tar.gz" + } + ] + }, + { + "version": "3.7.12", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.12-116024", + "files": [ + { + "filename": "python-3.7.12-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.12-116024/python-3.7.12-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.12-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.12-116024/python-3.7.12-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.12-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.12-116024/python-3.7.12-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.7.11", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.11-113063", + "files": [ + { + "filename": "python-3.7.11-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.11-113063/python-3.7.11-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.11-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.11-113063/python-3.7.11-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.11-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.11-113063/python-3.7.11-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.7.10", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.10-99135", + "files": [ + { + "filename": "python-3.7.10-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.10-99135/python-3.7.10-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.10-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.10-99135/python-3.7.10-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.7.10-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.10-99135/python-3.7.10-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.10-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.10-99135/python-3.7.10-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.7.9", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.9-109486", + "files": [ + { + "filename": "python-3.7.9-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.9-109486/python-3.7.9-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.9-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.9-109486/python-3.7.9-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.7.9-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.9-109486/python-3.7.9-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.9-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.9-109486/python-3.7.9-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.9-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.9-109486/python-3.7.9-win32-x64.zip" + }, + { + "filename": "python-3.7.9-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.9-109486/python-3.7.9-win32-x86.zip" + } + ] + }, + { + "version": "3.7.8", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.8-96788", + "files": [ + { + "filename": "python-3.7.8-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.8-96788/python-3.7.8-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.8-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.8-96788/python-3.7.8-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.7.8-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.8-96788/python-3.7.8-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.8-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.8-96788/python-3.7.8-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.8-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.8-96788/python-3.7.8-win32-x64.zip" + }, + { + "filename": "python-3.7.8-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.8-96788/python-3.7.8-win32-x86.zip" + } + ] + }, + { + "version": "3.7.7", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.7-96789", + "files": [ + { + "filename": "python-3.7.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.7-96789/python-3.7.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.7-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.7-96789/python-3.7.7-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.7.7-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.7-96789/python-3.7.7-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.7-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.7-96789/python-3.7.7-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.7-96789/python-3.7.7-win32-x64.zip" + }, + { + "filename": "python-3.7.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.7-96789/python-3.7.7-win32-x86.zip" + } + ] + }, + { + "version": "3.7.6", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.6-96790", + "files": [ + { + "filename": "python-3.7.6-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.6-96790/python-3.7.6-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.6-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.6-96790/python-3.7.6-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.7.6-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.6-96790/python-3.7.6-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.6-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.6-96790/python-3.7.6-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.6-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.6-96790/python-3.7.6-win32-x64.zip" + }, + { + "filename": "python-3.7.6-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.6-96790/python-3.7.6-win32-x86.zip" + } + ] + }, + { + "version": "3.7.5", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.5-96791", + "files": [ + { + "filename": "python-3.7.5-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.5-96791/python-3.7.5-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.5-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.5-96791/python-3.7.5-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.7.5-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.5-96791/python-3.7.5-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.5-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.5-96791/python-3.7.5-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.5-96791/python-3.7.5-win32-x64.zip" + }, + { + "filename": "python-3.7.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.5-96791/python-3.7.5-win32-x86.zip" + } + ] + }, + { + "version": "3.7.4", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.4-4113504688", + "files": [ + { + "filename": "python-3.7.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.4-4113504688/python-3.7.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.4-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.4-4113504688/python-3.7.4-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.4-4113504688/python-3.7.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.4-4113504688/python-3.7.4-win32-x64.zip" + }, + { + "filename": "python-3.7.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.4-4113504688/python-3.7.4-win32-x86.zip" + } + ] + }, + { + "version": "3.7.3", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.3-4112631780", + "files": [ + { + "filename": "python-3.7.3-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.3-4112631780/python-3.7.3-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.3-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.3-4112631780/python-3.7.3-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.3-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.3-4112631780/python-3.7.3-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.3-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.3-4112631780/python-3.7.3-win32-x64.zip" + }, + { + "filename": "python-3.7.3-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.3-4112631780/python-3.7.3-win32-x86.zip" + } + ] + }, + { + "version": "3.7.2", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.2-4113113291", + "files": [ + { + "filename": "python-3.7.2-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.2-4113113291/python-3.7.2-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.2-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.2-4113113291/python-3.7.2-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.2-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.2-4113113291/python-3.7.2-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.2-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.2-4113113291/python-3.7.2-win32-x64.zip" + }, + { + "filename": "python-3.7.2-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.2-4113113291/python-3.7.2-win32-x86.zip" + } + ] + }, + { + "version": "3.7.1", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.7.1-96792", + "files": [ + { + "filename": "python-3.7.1-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.1-96792/python-3.7.1-darwin-x64.tar.gz" + }, + { + "filename": "python-3.7.1-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.1-96792/python-3.7.1-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.7.1-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.1-96792/python-3.7.1-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.7.1-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.1-96792/python-3.7.1-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.7.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.1-96792/python-3.7.1-win32-x64.zip" + }, + { + "filename": "python-3.7.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.7.1-96792/python-3.7.1-win32-x86.zip" + } + ] + }, + { + "version": "3.6.15", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.6.15-116025", + "files": [ + { + "filename": "python-3.6.15-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.15-116025/python-3.6.15-darwin-x64.tar.gz" + }, + { + "filename": "python-3.6.15-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.15-116025/python-3.6.15-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.6.15-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.15-116025/python-3.6.15-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.6.14", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.6.14-113064", + "files": [ + { + "filename": "python-3.6.14-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.14-113064/python-3.6.14-darwin-x64.tar.gz" + }, + { + "filename": "python-3.6.14-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.14-113064/python-3.6.14-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.6.14-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.14-113064/python-3.6.14-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.6.13", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.6.13-99136", + "files": [ + { + "filename": "python-3.6.13-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.13-99136/python-3.6.13-darwin-x64.tar.gz" + }, + { + "filename": "python-3.6.13-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.13-99136/python-3.6.13-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.6.13-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.13-99136/python-3.6.13-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.6.13-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.13-99136/python-3.6.13-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.6.12", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.6.12-89897", + "files": [ + { + "filename": "python-3.6.12-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.12-89897/python-3.6.12-darwin-x64.tar.gz" + }, + { + "filename": "python-3.6.12-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.12-89897/python-3.6.12-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.6.12-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.12-89897/python-3.6.12-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.6.12-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.12-89897/python-3.6.12-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.6.11", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.6.11-90018", + "files": [ + { + "filename": "python-3.6.11-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.11-90018/python-3.6.11-darwin-x64.tar.gz" + }, + { + "filename": "python-3.6.11-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.11-90018/python-3.6.11-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.6.11-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.11-90018/python-3.6.11-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.6.11-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.11-90018/python-3.6.11-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.6.10", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.6.10-90019", + "files": [ + { + "filename": "python-3.6.10-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.10-90019/python-3.6.10-darwin-x64.tar.gz" + }, + { + "filename": "python-3.6.10-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.10-90019/python-3.6.10-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.6.10-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.10-90019/python-3.6.10-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.6.10-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.10-90019/python-3.6.10-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.6.9", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.6.9-90020", + "files": [ + { + "filename": "python-3.6.9-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.9-90020/python-3.6.9-darwin-x64.tar.gz" + }, + { + "filename": "python-3.6.9-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.9-90020/python-3.6.9-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.6.9-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.9-90020/python-3.6.9-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.6.9-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.9-90020/python-3.6.9-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.6.8", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.6.8-109487", + "files": [ + { + "filename": "python-3.6.8-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.8-109487/python-3.6.8-darwin-x64.tar.gz" + }, + { + "filename": "python-3.6.8-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.8-109487/python-3.6.8-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.6.8-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.8-109487/python-3.6.8-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.6.8-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.8-109487/python-3.6.8-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.6.8-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.8-109487/python-3.6.8-win32-x64.zip" + }, + { + "filename": "python-3.6.8-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.8-109487/python-3.6.8-win32-x86.zip" + } + ] + }, + { + "version": "3.6.7", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.6.7-96904", + "files": [ + { + "filename": "python-3.6.7-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.7-96904/python-3.6.7-darwin-x64.tar.gz" + }, + { + "filename": "python-3.6.7-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.7-96904/python-3.6.7-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.6.7-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.7-96904/python-3.6.7-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.6.7-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.7-96904/python-3.6.7-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.6.7-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.7-96904/python-3.6.7-win32-x64.zip" + }, + { + "filename": "python-3.6.7-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.6.7-96904/python-3.6.7-win32-x86.zip" + } + ] + }, + { + "version": "3.5.10", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.5.10-90026", + "files": [ + { + "filename": "python-3.5.10-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.10-90026/python-3.5.10-darwin-x64.tar.gz" + }, + { + "filename": "python-3.5.10-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.10-90026/python-3.5.10-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.5.10-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.10-90026/python-3.5.10-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.5.10-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.10-90026/python-3.5.10-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.5.9", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.5.9-90181", + "files": [ + { + "filename": "python-3.5.9-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.9-90181/python-3.5.9-darwin-x64.tar.gz" + }, + { + "filename": "python-3.5.9-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.9-90181/python-3.5.9-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.5.9-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.9-90181/python-3.5.9-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.5.9-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.9-90181/python-3.5.9-linux-20.04-x64.tar.gz" + } + ] + }, + { + "version": "3.5.4", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.5.4-97175", + "files": [ + { + "filename": "python-3.5.4-darwin-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.4-97175/python-3.5.4-darwin-x64.tar.gz" + }, + { + "filename": "python-3.5.4-linux-16.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "16.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.4-97175/python-3.5.4-linux-16.04-x64.tar.gz" + }, + { + "filename": "python-3.5.4-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.4-97175/python-3.5.4-linux-18.04-x64.tar.gz" + }, + { + "filename": "python-3.5.4-linux-20.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "20.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.4-97175/python-3.5.4-linux-20.04-x64.tar.gz" + }, + { + "filename": "python-3.5.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.4-97175/python-3.5.4-win32-x64.zip" + }, + { + "filename": "python-3.5.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.5.4-97175/python-3.5.4-win32-x86.zip" + } + ] + }, + { + "version": "3.4.10", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.4.10", + "files": [ + { + "filename": "python-3.4.10-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.4.10/python-3.4.10-linux-18.04-x64.tar.gz" + } + ] + }, + { + "version": "3.4.4", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.4.4-88098", + "files": [ + { + "filename": "python-3.4.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.4.4-88098/python-3.4.4-win32-x64.zip" + }, + { + "filename": "python-3.4.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.4.4-88098/python-3.4.4-win32-x86.zip" + } + ] + }, + { + "version": "3.3.7", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.3.7", + "files": [ + { + "filename": "python-3.3.7-linux-18.04-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "platform_version": "18.04", + "download_url": "https://github.com/actions/python-versions/releases/download/3.3.7/python-3.3.7-linux-18.04-x64.tar.gz" + } + ] + }, + { + "version": "3.3.5", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.3.5-88104", + "files": [ + { + "filename": "python-3.3.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.3.5-88104/python-3.3.5-win32-x64.zip" + }, + { + "filename": "python-3.3.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.3.5-88104/python-3.3.5-win32-x86.zip" + } + ] + }, + { + "version": "3.2.5", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.2.5-88105", + "files": [ + { + "filename": "python-3.2.5-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.2.5-88105/python-3.2.5-win32-x64.zip" + }, + { + "filename": "python-3.2.5-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.2.5-88105/python-3.2.5-win32-x86.zip" + } + ] + }, + { + "version": "3.1.4", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.1.4-88106", + "files": [ + { + "filename": "python-3.1.4-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.1.4-88106/python-3.1.4-win32-x64.zip" + }, + { + "filename": "python-3.1.4-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.1.4-88106/python-3.1.4-win32-x86.zip" + } + ] + }, + { + "version": "3.0.1", + "stable": true, + "release_url": "https://github.com/actions/python-versions/releases/tag/3.0.1-88107", + "files": [ + { + "filename": "python-3.0.1-win32-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.0.1-88107/python-3.0.1-win32-x64.zip" + }, + { + "filename": "python-3.0.1-win32-x86.zip", + "arch": "x86", + "platform": "win32", + "download_url": "https://github.com/actions/python-versions/releases/download/3.0.1-88107/python-3.0.1-win32-x86.zip" + } + ] + } +] From 5f513545b1338b660a397d75ec00db656cdb28b6 Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sat, 14 Mar 2026 19:58:58 +0100 Subject: [PATCH 05/30] Create LibraryEvolution.rst --- LibraryEvolution.rst | 456 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 456 insertions(+) create mode 100644 LibraryEvolution.rst diff --git a/LibraryEvolution.rst b/LibraryEvolution.rst new file mode 100644 index 0000000..9ee504a --- /dev/null +++ b/LibraryEvolution.rst @@ -0,0 +1,456 @@ +:paperweb_website: +.. https://fastht.ml: +:fastht.ml: name the webasite .. https://aura.paperweb: +:aura.paperweb: .. projectstructure: +:extension: .. tags: +:notebookxlsl: +:quantum: +:model: +:sentence: .. similarity: +.. text-generation: +.. image-to-3d: +.. audio-classification: +:aura.Xlsl: +.. science: +.. code: +.. medical: +.. not-for-all-audiences: +.. chemistry +.. biology: +.. synthetic: +.. agent: +.. pretty_name: ..paperweb: +:quantumpaper: +.. image_categories: +:100B {Yakub, Seriki}, +:title: -> {Aura.Xlsl (Revision 668d721)}, +:year: -> 2025, +:url: ->{https://huggingface.co/datasets/Seriki/Aura.Xlsl}, +:doi: -> {10.57967/hf/6674}, +:publisher: -> {Aura / Hugging Face} +:Auraxlslpaper: -> +:Serai: -> +:QuantumIDE: -> +.. : +Interactive drag-and-drop quantum circuit simulator with GPU-accelerated backend. + +:Features: +- Drag-and-drop quantum gates (H, X, Y, Z, CNOT, TOFFOLI) +- Multi-qubit circuit simulation +- Real-time amplitude visualization +- Save/load circuits as JSON +- Batch GPU simulation support +- Fractional/negative amplitude support (Aura math integration) + +:Installation: +git clone <[repo-url](https://github.com/Web4application/Aura_Full_Project.xlsl.git)> +cd AuraQuantumIDE +pip install -r requirements.txt +uvicorn api.main:app --reload +https://github.com/Web4application/Aura_Full_Project.xlsl.git + + +:first-project: + +.. auraxlslproject: + ├── :data: + │ └── :Aura.xlsl: .. your data hub: + ├── :src: + │ ├── -> :init: + │ ├── .. ai_pipeline: :ML: regression/classification + │ ├── .. quantum_pipeline: :Qiskit: :quantum: :circuits: + │ ├── .. lifespan_analysis: :survival: :curves: :hazard: :ratio: + │ └── .. utils: -> helpers to load Excel + ├── .. xlslnotebooks:/ + │ └── exploration.ipynb .. experiments: + ├── requirements.txt + └── main.py # orchestrator script +—————:: + +.. aurxlslpaper:(https://github.com/Web4application/Aura_Full_Project.xlsl/tree/15c2f6180005733d51e16b816c0738a37bb0986a/AuraQuantum)(localhost.mobi/rss-feed/my-news/ace6114490bf69dae76498fe4dc2447b1b3ce415) +.. AuraQuantumpaper: https://github.com/Web4application/Aura_Full_Project.xlsl/tree/15c2f6180005733d51e16b816c0738a37bb0986a/AuraQuantum/localhost.mobi/rss-feed/my-news/ace6114490bf69dae76498fe4dc2447b1b3ce415 + + +:.xlsl: —> Logic Spreadsheet (Core) +.. Purpose: + | A structured, Excel-compatible file format designed as the hub for mathematics, physics, reasoning, and simulation data. | +.. Structure: + • Reserved sheets: Pure_Mathematics, Further_Mathematics, Applied_Physics, Reasoning_Logic, Simulation_Problems, Teleportation_Simulation. + +:Tabular format with rows: +| entities | columns | attributes. + +:Use_Cases: + .. Knowledge base for AI-assisted reasoning. + .. STEM modeling and theoretical experimentation. + .. Foundation for linking with other Aura + +.. extensions: + +:![aura_diagram.png](https://huggingface.co/datasets/Seriki/Aura.Xlsl/raw/main/assets/aura_diadram.html) +.. : +2. :.xqsl: -> Quantum Spreadsheet Language + +.. Purpose: + Represents quantum states, entanglement, and teleportation in tabular form. + Structure + • Core sheets: Qubits, Entanglement, Teleportation, Noise_Models. + • Normalization rules: |α|² + |β|² = 1. + Use-Cases + • AI-assisted quantum state reasoning. + • Interoperability with Qiskit, Cirq, Rigetti simulators. + • Teleportation experiment modeling. +⸻ + +3. :.xsim: -> Simulation Spreadsheet + +.. Purpose: + Dedicated container for applied simulations across physics, math, and multi-disciplinary problems. + :Structure: -> | Simulation_ID | Input_Data | Governing_Equations | Solver_Method | Output_Parameters | Error_Margin | Notes | + :Use-Cases: + • Energy cost of teleportation. + • Wormhole/dimensional collapse simulations. + • Linking spreadsheet experiments to computational solvers (Python, MATLAB). +⸻ + +4. :.xrls: Reasoning Layer Spreadsheet + +:Purpose: + Encodes logical reasoning in structured tabular form, bridging raw data and inference. +:Structure: + | Premise | Logical_Operator | Secondary_Premise | Conclusion | Truth_Value | Confidence (%) | Notes | +:Use-Cases: + - AI symbolic logic and contradiction checking. + - Automated reasoning validation for STEM hypotheses. + - Embedding deductive reasoning into simulations. +⸻ + +5. :.xai: + .. AI: Enhanced Spreadsheet + + .. Purpose: + Hybrid format combining data + AI context memory inside a single file. +- Structure + • Data layer: conventional tabular data. + • AI layer: structured logs of prompts, responses, metadata. +:Use-Cases: + • Context-aware spreadsheets (AI remembers past queries). + • Distributed AI collaboration (file carries its own “assistant”). + • Research reproducibility: all AI reasoning embedded with data. +⸻ + +6. :.xdim: +7. ..Dimensional: Models File + +- Purpose_ + Encodes higher-dimensional mathematics and geometry, for theories beyond 3D space-time. + +.. Structure: + ⸻ + +| Model_ID | Dimension_Count | Geometry_Type | Transformation_Matrix | Tensor_Fields | Physical_Interpretation | Notes | +⸻ + +:Rules: + • Must specify at least 3D baseline. + • Higher-D transformations expressed via matrices or tensors. + + ⸻ + +:Use_Cases:_ + • Teleportation and wormhole modeling. + • Multiverse/dimensional physics research. + • Coupling with .xqsl for quantum state behavior in higher dimensions. + + ⸻ +7. .. Ecosystem_Workflow: + + 1. .xlsl = Hub → holds general STEM and logic sheets. + 2. .xqsl = Quantum extension → state transfer, entanglement, teleportation. + 3. .xsim = Simulation → runs applied case studies. + 4. .xrls = Logic → validates reasoning and inferences. + 5. .xai = AI-enhanced → keeps reasoning memory and context. + 6. .xdim = Higher dimensions → advanced teleportation and + + ⸻ + 1. :Ethics_Notes: + + • - Tracks considerations around privacy, consent, data anonymization, and AI fairness. + • - Can store notes about potential biases in AI models or quantum simulations. + • - Useful for documenting decisions to comply with research ethics or regulatory standards. + 2. + + ⸻ :Economics_Records: + + • Records costs of interventions, treatments, or experiments. + • Can calculate cost-benefit analyses or ROI for clinical trials, lifespan interventions, or quantum computing experiments. + • Includes metrics like budget, actual expenditure, projected savings, and economic feasibility. + + ⸻ + 3. :Simulation_Scenarios: + +- • Enables “what-if” analysis across multiple domains such as diet, medication, stress, or environmental factors. +- • Stores initial conditions, parameters, and expected outputs for each simulation. +- • Can feed into AI or quantum pipelines to test different hypotheses before running real experiments. + + ⸻ + 4. ..Visualization_Config: + +- • Contains preferred chart types, axis mappings, thresholds, and color schemes. +- • Supports automated plotting in Python, ensuring consistency in presentation and reporting. +- • Useful for dashboards or publication-ready figures generated from data in other sheets. + + ⸻ + :Collaboration_Log: + +- • Tracks team members, contributions, timestamps, and changes to data or models. + • Can include versioning information for sheets and pipelines. + • Supports multi-researcher projects, making it easier to manage tasks and credit work. + 6. Deployment_confog + • Contains configuration details for serving AI models, quantum simulations, or hybrid workflows. + • Includes endpoints, API keys, server details, runtime environment settings, and deployment notes. + • Allows seamless transition from experimentation to production-ready workflows. +## expansion: + + ⸻ +.. notebooksxlsl: + 1. | Ethics_Notes | - privacy, - bias | - fairness | - consent | - logs | - Economics - -spreadsheet | – intervention | costs - resource | allocation - | - ROI calculations | + 6. | Simulation_Scenarios | – “what-if” experiments for diet, drugs, stress, or environmental factors. + 7. | Visualization_Config | – chart types, axes, thresholds, color schemes for automated plotting. + 8. |Collaboration_Log | – contributors, changes, timestamps, versioning. + 9. | Deployment_dimensional | – endpoints, runtime configurations, API keys, server settings for + + ⸻ +:Ai_quantum_workflows: + | Advanced_Mathematics → | tensors, eigenvalues, PDEs, applied formulas. | + | Physics_Experiments → | parameters for mechanics, thermodynamics, electromagnetism, quantum circuits. | + | Reasoning_Problems → | logic puzzles, hypotheses, formal deductions, experimental design.| + | Genomics_Deep → full gene sequences, variant analysis, epigenetic factors. | + Healthcare_Analytics → survival curves, hazard ratios, population studies. | + Environment_Scenarios → climate, pollution, lifestyle, and external stressors. | + | AI_Results_Log → historical model performance, predictions, and metrics for reference. | + | Dual-format support ensures .xlsl branding while Python can read/write it as .xlsx. + + ⸻ +:All_layers_interconnect: +AI can pull features from lifespan or environment data, quantum simulations can optimize interventions, and analytics can feed visualizations automatically. + • Project management and collaboration are integrated, ensuring reproducibility, ethics tracking, and versioning. + • STEM research is fully supported: mathematical models, physics parameters, reasoning experiments, and genomics data are all accessible in one system. | +You typed Aura.xlsl. Likely you meant Aura.xlsx (Excel workbook). + + ⸻ +:.xlsl: + is not a part of Microsoft Excel extension. Excel only recognizes formats like: + • .xlsx → Standard workbook + • .xls → Legacy workbook (Excel 97–2003) + • .xlsm → Workbook with macros + • .csv → Comma-separated values + + ⸻ +:Project_Structure: + .. xlsl: + + .. conda-build: + :auraxlslproject: + - ├── .data/ + │ └── .Auraxlsl # fully expanded workbook with 25+ sheets + - ├── .src/ + │ - ├── __init__.py + │ - ├── .file_loader.py :handles: .xlsl/.xlsx reading & writing + - │ ├── .utils.py :helper_functions: + - │ ├── :ai_pipeline.py: .. ML .. models .. predictions + │ - ├── .quantum_pipeline.py .. Qiskit .. circuits + │ └── :lifespan_analysis.py: placeholder for lifespan analytics + ├── :notebooks:/ + │ └── .. exploration.ipynb: :experimentation: :visualization: + ├.── :requirements.txt: + └── :main.py: + + :orchestrator_script: + + ———— + +:Features: + +• Loads and saves Aura.xlsl while internally using .xlsx compatibility. + Contains all previously created + +.. spreadsheets: + +:Overview: +.. | Data | AI Input | Quantum Input | Results | + +| LifespanData | AI Modeling, Quantum_Optimization, Environment Factors, Clinical Trials, Genomic | + +| AI Pipeline Config | Quantum Results | + +|Pure Mathematics| + | Further Mathematics | Applied Physics | + +| Reasoning Logic | Simulation Problems | + +| Ethics Notes| + | Economics| Simulation Scenarios | + +:VisualizationbConfig: + + ..Collaboration_Log: + +:Deployment:: + + + Supports AI pipelines, quantum simulations, and +lifespan analytics. Modular, ready for expansion and collaboration. + +Yes. We can add all of these layers now, making Aura.xlsx/.xlsl a fully integrated, multidisciplinary research hub. Each sheet will be structured to support both data storage and computational workflows, while remaining fully compatible with Python and Excel. + +:Implementation: plan for new sheets + +1. :Ethics_Notes: +Tracks privacy, consent, bias, and fairness considerations. + Can store annotations for AI and quantum experiments. + 2. :Economics: Records intervention costs, resource allocation, projected ROI, and notes for each trial or scenario. + :Simulation_Scenarios: + Holds parameters for “what-if” experiments across diet, drugs, stress, and environmental conditions. + • Supports direct integration with AI or quantum workflows. + 4. :Visualization_Config: + • Defines chart types, axes, thresholds, and color schemes. + • Supports automated plotting from Python scripts for reproducibility. + 5. :Collaboration_Log: + • Logs contributors, tasks, changes, timestamps, and versioning information. + • Useful for multi-researcher projects and audit trails. + 6. :Deployment: + • Stores endpoint URLs, API keys, runtime environments, and configuration notes for AI models and quantum simulations. + :Facilitates_transitioning: from experimentation to production-ready workflows. +Optional advanced sheets: + :Advanced_Mathematics: → tensors, matrices, PDEs, applied formulas. + • :Physics_Experiments: → mechanics, thermodynamics, electromagnetism, quantum parameters. + • :Reasoning_Problems: → formal logic problems, experimental design, hypotheses. + • :Genomics_Deep: → gene sequences, variants, epigenetic factors. + • :Healthcare_Analytics: → survival curves, hazard ratios, cohort analysis. + • :Environment_Scenarios: → climate, pollution, lifestyle, external stressors. + • :AI_Results_Log: → historical model outputs, metrics, and predictions. +.. Outcome: + +:Dual_format_support: + retain .xlsl branding while Python reads/writes as .xlsx + + - Interconnected_sheets: AI models can draw features from lifespan, genomics, or environment data; quantum simulations can optimize experimental parameters. + - Project management: collaboration logs, ethics notes, and deployment configs are integrated. + - STEM research support: mathematics, physics, reasoning, genomics, and healthcare analytics are all accessible within one system. +⸻ + +:Implementation: plan for new sheets + +.. Ethics_Notes: + • Tracks privacy, consent, bias, and fairness considerations. +:: + Can store annotations for AI and quantum experiments. + 2. .. Economics: + • Records intervention costs, resource allocation, projected ROI, and notes for each trial or scenario. + + 3. .. Simulation_Scenarios: + • Holds parameters for “what-if” experiments across diet, drugs, stress, and environmental conditions. + • .. Supports: direct integration with AI or quantum workflows. + 4. .. Visualization_Config: + • Defines chart types, axes, thresholds, and color schemes. + • .. Supports: automated plotting from Python scripts for reproducibility. + 5. .. Collaboration_Log: + • Logs contributors, tasks, changes, timestamps, and versioning information. + • ..Useful: for multi-researcher projects and audit trails. + + 6. :Deployment: + • Stores endpoint URLs, API keys, runtime environments, and configuration notes for AI models and quantum simulations. + • .. Facilitates: transitioning from experimentation to production-ready workflows. +:Optional: + .. advanced_sheets: + • Advanced_Mathematics → tensors, matrices, PDEs, applied formulas. + • :Physics_Experiments: → mechanics, thermodynamics, electromagnetism, quantum parameters. + • :Reasoning_Problems: → formal logic problems, experimental design, hypotheses. + • :Genomics_Deep: → gene sequences, variants, epigenetic factors. + • :Healthcare_Analytics: → survival curves, hazard ratios, cohort analysis. + • :Environment_Scenarios: → climate, pollution, lifestyle, external stressors. + • :AI_Results_Log: → historical model outputs, metrics, and predictions. +:Outcome: + • Dual-format support: retain .xlsl branding while Python reads/writes as .xlsx. + • :Interconnected: sheets: AI models can draw features from lifespan, genomics, or environment data; quantum simulations can optimize experimental parameters. + • :Project_management: collaboration logs, ethics notes, and deployment configs are integrated. + • :STEM:research support: mathematics, physics, reasoning, genomics, and healthcare analytics are all accessible within one system. +:: + +• This structure turns Aura into a complete, scalable research ecosystem, capable of supporting AI, quantum computing, lifespan analysis, applied STEM research, simulations, visualizations, and project governance in one unified workbook. +:auraxlslproject: + +The expanded Aura project workbook is now ready with all new sheets for a complete multidisciplinary hub. It includes: + +.. Advanced_Mathematics: -> matrices, eigenvalues, PDEs, tensor calculus + .. Physics_Experiments: -> mechanics, thermodynamics, electromagnetism, quantum circuits + .. Reasoning_Problems: -> logic puzzles, hypotheses, experimental design + • .. Genomics_Deep: –> gene variants, effects, notes + .. Healthcare_Analytics: –> survival rates, hazard ratios, population studies + • .. Environment_Scenarios: –> pollution, lifestyle, expected impacts + • .. AI_Results_Log: –> model results, datasets, metrics, notes +This brings Aura.xlsl to a total of sheets, making it a fully functional research and project hub supporting AI, quantum computing, lifespan studies, applied STEM research, ethics, economics, simulations, visualization, collaboration, and deployment. + + +You can download the full workbook here +:Aura_Full_Project.xlsl: + + +image + +image + +image + +Performs a book search. +[Try it now](https://developers.google.com/books/docs/v1/reference/volumes/list#try-it). + +## Request + +## + +[HTTP.Request GET](https://www.googleapis.com/books/v1/volumes?q={aura.Xlsl}) + +https://huggingface/datasets?other=medical + +[aura.paperweb](https://www.googleapis.com/huggingface/datasets?r=Xlsl.paper.notebook.xlsl.model.lmlm.medical.niology.local.cs.ai.arxiv}src="https://huggingface.co/datasets/HelioAI/Helio1-Reasoning-50K-RU/embed/viewer/default/train")(https://www.googleapis.com/books/v1/volumes?q=%7Baura.xlslpaperwebworkbook%7D) From 19eef448804ee2d0567d63be525bfc223555f067 Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 15 Mar 2026 04:50:22 +0100 Subject: [PATCH 06/30] Create web.py --- web.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 web.py diff --git a/web.py b/web.py new file mode 100644 index 0000000..656b00e --- /dev/null +++ b/web.py @@ -0,0 +1,21 @@ +from pypdf import PdfReader, PdfWriter + +reader = PdfReader("input.pdf") +writer = PdfWriter() + +# 1. Standardize to 720p Web Size +WEB_WIDTH, WEB_HEIGHT = 1280, 720 + +for page in reader.pages: + page.scale_to_size(WEB_WIDTH, WEB_HEIGHT) + page.compress_content_streams() # Compress text/drawings + writer.add_page(page) + +# 2. STRIP METADATA: Set to None to remove all hidden info +writer.add_metadata({}) # Clears existing entries + +# 3. Final Optimization: Deduplicate images/fonts +writer.compress_identical_objects(remove_identicals=True, remove_orphans=True) + +with open("web_asset.pdf", "wb") as f: + writer.write(f) From 84bf6a444ec44bccf7ce3aef55e94a3c387510fd Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 15 Mar 2026 04:52:10 +0100 Subject: [PATCH 07/30] Create index.html --- index.html | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 index.html diff --git a/index.html b/index.html new file mode 100644 index 0000000..9524bec --- /dev/null +++ b/index.html @@ -0,0 +1,26 @@ + + + + + + +
+ + +
+ + From bbf482b91cbe02f691248c4a767d21059e7a6789 Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 15 Mar 2026 04:52:39 +0100 Subject: [PATCH 08/30] Rename web.py to web_asset.pdf --- web.py => web_asset.pdf | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename web.py => web_asset.pdf (100%) diff --git a/web.py b/web_asset.pdf similarity index 100% rename from web.py rename to web_asset.pdf From 2317f150cb9fe04db84926e38f5b94f0c8202c11 Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 15 Mar 2026 04:55:04 +0100 Subject: [PATCH 09/30] Update and rename web_asset.pdf to web_asset.pypdf --- web_asset.pdf => web_asset.pypdf | Bin 622 -> 624 bytes 1 file changed, 0 insertions(+), 0 deletions(-) rename web_asset.pdf => web_asset.pypdf (99%) diff --git a/web_asset.pdf b/web_asset.pypdf similarity index 99% rename from web_asset.pdf rename to web_asset.pypdf index 656b00e438e3ee15340a0fa23c9e5fff91f4ead5..10b69a215a990ef48d7a6bfcabcd5a9e8a1bf082 100644 GIT binary patch delta 17 ZcmaFI@_}VSETh82SXV}cjf>7O0suTK25A5Q delta 13 Vcmeys@{VOf?8G?NjZ4lj0st(O1}Xpm From 6a3f85c9793053fadf433bc9214ca474ca7bf909 Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 15 Mar 2026 04:55:40 +0100 Subject: [PATCH 10/30] Rename web_asset.pypdf to web_asset.pyx --- web_asset.pypdf => web_asset.pyx | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename web_asset.pypdf => web_asset.pyx (100%) diff --git a/web_asset.pypdf b/web_asset.pyx similarity index 100% rename from web_asset.pypdf rename to web_asset.pyx From ffe19c019c0408989c0db66f114f4a1bd267c8e6 Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 15 Mar 2026 04:56:38 +0100 Subject: [PATCH 11/30] Create index.html --- indtall.md/index.html | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 indtall.md/index.html diff --git a/indtall.md/index.html b/indtall.md/index.html new file mode 100644 index 0000000..9524bec --- /dev/null +++ b/indtall.md/index.html @@ -0,0 +1,26 @@ + + + + + + +
+ + +
+ + From 7bbf936bee64bbac4e3a35f664e899e5a05141b9 Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 15 Mar 2026 04:57:23 +0100 Subject: [PATCH 12/30] Create config.py --- indtall.md/scrips/config.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 indtall.md/scrips/config.py diff --git a/indtall.md/scrips/config.py b/indtall.md/scrips/config.py new file mode 100644 index 0000000..656b00e --- /dev/null +++ b/indtall.md/scrips/config.py @@ -0,0 +1,21 @@ +from pypdf import PdfReader, PdfWriter + +reader = PdfReader("input.pdf") +writer = PdfWriter() + +# 1. Standardize to 720p Web Size +WEB_WIDTH, WEB_HEIGHT = 1280, 720 + +for page in reader.pages: + page.scale_to_size(WEB_WIDTH, WEB_HEIGHT) + page.compress_content_streams() # Compress text/drawings + writer.add_page(page) + +# 2. STRIP METADATA: Set to None to remove all hidden info +writer.add_metadata({}) # Clears existing entries + +# 3. Final Optimization: Deduplicate images/fonts +writer.compress_identical_objects(remove_identicals=True, remove_orphans=True) + +with open("web_asset.pdf", "wb") as f: + writer.write(f) From 7a66658f42486e6fd64bec459464679064b73daf Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 10 May 2026 15:58:51 +0100 Subject: [PATCH 13/30] Rename http.dart to main.dart --- http.dart => main.dart | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename http.dart => main.dart (100%) diff --git a/http.dart b/main.dart similarity index 100% rename from http.dart rename to main.dart From 2573125f363bdc293d87ecb9693b37ba46c33b74 Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 10 May 2026 16:00:22 +0100 Subject: [PATCH 14/30] Rename web_asset.pyx to src/page.web4.py --- web_asset.pyx => src/page.web4.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename web_asset.pyx => src/page.web4.py (100%) diff --git a/web_asset.pyx b/src/page.web4.py similarity index 100% rename from web_asset.pyx rename to src/page.web4.py From aff0ccf20bfb8916b68b95aba73fc095b57842fa Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 10 May 2026 16:07:52 +0100 Subject: [PATCH 15/30] Update and rename README.md to Docs/README.md --- README.md => Docs/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename README.md => Docs/README.md (76%) diff --git a/README.md b/Docs/README.md similarity index 76% rename from README.md rename to Docs/README.md index 2887240..618f8f4 100644 --- a/README.md +++ b/Docs/README.md @@ -1,11 +1,11 @@ --- -name: -docs: fasthtml -pages: +name: auraxlsl paper and its ecosystem +docs: https://fasth.ml +pages: https://fastapi.com projectstructure: synthetic: extension: -tags: +tags: https://fastai1.core.ai notebookxlsl: quantum: model: From 65808559618521f54767c3d4d71729a3fe8fbd13 Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 10 May 2026 16:13:54 +0100 Subject: [PATCH 16/30] Update index.md --- index.md | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/index.md b/index.md index 8b13789..d7c239c 100644 --- a/index.md +++ b/index.md @@ -1 +1,32 @@ - +--- +name: auraxlsl paper and its ecosystem +docs: https://fasth.ml +pages: https://fastapi.com +projectstructure: +synthetic: +extension: +tags: https://fastai1.core.ai +notebookxlsl: +quantum: +model: +sentence: +similarity: +textgeneration: +imageto3d: +audioclassification: +biology: +agent: +prettyname: +paperweb: +quantumpaper: +imagecategories: +taskcategories: +paperweb: +Auraxlslpaper: +Serai: +QuantumIDE: +Interactive: drag-and-drop +quantum_circuit: +simulator_with_GPU: +accelerated_backend:: +--- From 0c871d3d1c23fe4ec5718810b57c8964e7a64250 Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 10 May 2026 16:17:56 +0100 Subject: [PATCH 17/30] Update index.md --- index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/index.md b/index.md index d7c239c..9b49d27 100644 --- a/index.md +++ b/index.md @@ -1,6 +1,6 @@ --- name: auraxlsl paper and its ecosystem -docs: https://fasth.ml +docs: https://fasth.ml/index.html#index.md pages: https://fastapi.com projectstructure: synthetic: @@ -17,7 +17,7 @@ audioclassification: biology: agent: prettyname: -paperweb: +paperweb: index.md/index.html quantumpaper: imagecategories: taskcategories: @@ -28,5 +28,5 @@ QuantumIDE: Interactive: drag-and-drop quantum_circuit: simulator_with_GPU: -accelerated_backend:: +accelerated_backend:: src/page.web4.py/index.html#index.md --- From e99dbe1994b753d9432f930bc9b824b92abfc619 Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 10 May 2026 16:19:00 +0100 Subject: [PATCH 18/30] Update and rename README.md to index.md --- Docs/{README.md => index.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename Docs/{README.md => index.md} (91%) diff --git a/Docs/README.md b/Docs/index.md similarity index 91% rename from Docs/README.md rename to Docs/index.md index 618f8f4..bdeabba 100644 --- a/Docs/README.md +++ b/Docs/index.md @@ -1,5 +1,5 @@ --- -name: auraxlsl paper and its ecosystem +name: auraxlsl paper and its ecosystem docs: https://fasth.ml pages: https://fastapi.com projectstructure: From 9fe1677eb6db2fb3c2e32b72697eee4e441f1fbc Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 10 May 2026 16:21:06 +0100 Subject: [PATCH 19/30] Rename git cl presubmit to ~/git/cl/presubmit --- git cl presubmit => ~/git/cl/presubmit | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename git cl presubmit => ~/git/cl/presubmit (100%) diff --git a/git cl presubmit b/~/git/cl/presubmit similarity index 100% rename from git cl presubmit rename to ~/git/cl/presubmit From 3d5321f643faee749d0bf9e5bd640e1c4a97d9b2 Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 10 May 2026 17:07:26 +0100 Subject: [PATCH 20/30] Update and rename index.md to index.rst --- src/{index.md => index.rst} | 66 +++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 28 deletions(-) rename src/{index.md => index.rst} (93%) diff --git a/src/index.md b/src/index.rst similarity index 93% rename from src/index.md rename to src/index.rst index 9ee504a..5dc77b3 100644 --- a/src/index.md +++ b/src/index.rst @@ -1,3 +1,4 @@ + :paperweb_website: .. https://fastht.ml: :fastht.ml: name the webasite .. https://aura.paperweb: @@ -41,39 +42,44 @@ .. unconditional-image-generation: .. video-classification: :reinforcement-learning: - :depth-estimation: - :license: creativeml-openrail-m -.. language: eng +:depth-estimation: +:license: creativeml-openrail-m +:language: eng :paper: :scientific_paper: -:paperweb: .. https://books.google.com.ng: +:paperweb_books: .. https://books.google.com.ng: .. xtend: -:workbook: -:quantum: +.. workbook: +.. quantum: .. teleportation: .. qubits: .. puremathematics: -.. data: -:playground: :https://books.google.com.ng: -:@https://aura.build: design all the entire pages on :https://aura.papeqreeb: +:data: +:playground: +.. @https://aura.build: design all the entire pages on https://aura.paperweb :fast.ai: documents everything with images :Author: Seriki_Yakub :Date: 2025 :project:Aura File Ecosystem — v0.1 -:bib: @misc{yakub_aura_2025, -:author: -> {Yakub, Seriki}, -:title: -> {Aura.Xlsl (Revision 668d721)}, -:year: -> 2025, -:url: ->{https://huggingface.co/datasets/Seriki/Aura.Xlsl}, -:doi: -> {10.57967/hf/6674}, -:publisher: -> {Aura / Hugging Face} +:bib: @misc{yakub_aura_2025 +:author: # -> {Yakub, Seriki} +:title: # -> {Aura.Xlsl (Revision 668d721)} +:year: -> 2025 +:url: -># {https://huggingface.co/datasets/Seriki/Aura.Xlsl} +:doi: # -> {10.57967/hf/6674}, +:publisher: # -> {Aura / Hugging Face} :Auraxlslpaper: -> :Serai: -> :QuantumIDE: -> -.. : -Interactive drag-and-drop quantum circuit simulator with GPU-accelerated backend. -:Features: +: .. : + +:Interactive:: - + :drag-and-drop: - :quantum: - + :circuit: - + :simulator with GPU-accelerated: - + :backend: + :Features: - Drag-and-drop quantum gates (H, X, Y, Z, CNOT, TOFFOLI) - Multi-qubit circuit simulation - Real-time amplitude visualization @@ -432,25 +438,29 @@ The expanded Aura project workbook is now ready with all new sheets for a comple This brings Aura.xlsl to a total of sheets, making it a fully functional research and project hub supporting AI, quantum computing, lifespan studies, applied STEM research, ethics, economics, simulations, visualization, collaboration, and deployment. -You can download the full workbook here +.. You can download the full workbook here: + :Aura_Full_Project.xlsl: - - image image image -Performs a book search. +:Performs a book search: + [Try it now](https://developers.google.com/books/docs/v1/reference/volumes/list#try-it). -## Request +: + Request: + + + -## +:[HTTP.Request GET](https://www.googleapis.com/books/v1/volumes?q={aura.Xlsl}): -[HTTP.Request GET](https://www.googleapis.com/books/v1/volumes?q={aura.Xlsl}) +.. https://huggingface/datasets?other=medical: +:[aura.paperweb]::(https://www.googleapis.com/huggingface/datasets?r=Xlsl.paper.notebook.xlsl.model.lmlm.medical.niology.local.cs.ai.arxiv}src="https://huggingface.co/datasets/HelioAI/Helio1-Reasoning-50K-RU/embed/viewer/default/train")(https://www.googleapis.com/books/v1/volumes?q=%7Baura.xlslpaperwebworkbook%7D) -https://huggingface/datasets?other=medical -[aura.paperweb](https://www.googleapis.com/huggingface/datasets?r=Xlsl.paper.notebook.xlsl.model.lmlm.medical.niology.local.cs.ai.arxiv}src="https://huggingface.co/datasets/HelioAI/Helio1-Reasoning-50K-RU/embed/viewer/default/train")(https://www.googleapis.com/books/v1/volumes?q=%7Baura.xlslpaperwebworkbook%7D) + From eee3008b2d927dae31aef7f44fd2fa8bd45d04d4 Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 10 May 2026 17:16:20 +0100 Subject: [PATCH 21/30] Update index.rst --- src/index.rst | 82 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 57 insertions(+), 25 deletions(-) diff --git a/src/index.rst b/src/index.rst index 5dc77b3..9125844 100644 --- a/src/index.rst +++ b/src/index.rst @@ -1,4 +1,3 @@ - :paperweb_website: .. https://fastht.ml: :fastht.ml: name the webasite .. https://aura.paperweb: @@ -72,7 +71,11 @@ :Serai: -> :QuantumIDE: -> -: .. : + + +Auraecosystem +================================ + :Interactive:: - :drag-and-drop: - :quantum: - @@ -349,26 +352,43 @@ lifespan analytics. Modular, ready for expansion and collaboration. Yes. We can add all of these layers now, making Aura.xlsx/.xlsl a fully integrated, multidisciplinary research hub. Each sheet will be structured to support both data storage and computational workflows, while remaining fully compatible with Python and Excel. -:Implementation: plan for new sheets +:Implementation: +plan for new sheets +================================ 1. :Ethics_Notes: Tracks privacy, consent, bias, and fairness considerations. Can store annotations for AI and quantum experiments. - 2. :Economics: Records intervention costs, resource allocation, projected ROI, and notes for each trial or scenario. + + :Economics: + +Records intervention costs, resource allocation, projected ROI, and notes for each trial or scenario. + :Simulation_Scenarios: + Holds parameters for “what-if” experiments across diet, drugs, stress, and environmental conditions. • Supports direct integration with AI or quantum workflows. - 4. :Visualization_Config: + + :Visualization_Config: + • Defines chart types, axes, thresholds, and color schemes. • Supports automated plotting from Python scripts for reproducibility. - 5. :Collaboration_Log: + +:Collaboration_Log: + • Logs contributors, tasks, changes, timestamps, and versioning information. • Useful for multi-researcher projects and audit trails. + 6. :Deployment: + • Stores endpoint URLs, API keys, runtime environments, and configuration notes for AI models and quantum simulations. - :Facilitates_transitioning: from experimentation to production-ready workflows. + + :Facilitates_transitioning: + +from experimentation to production-ready workflows. Optional advanced sheets: :Advanced_Mathematics: → tensors, matrices, PDEs, applied formulas. + • :Physics_Experiments: → mechanics, thermodynamics, electromagnetism, quantum parameters. • :Reasoning_Problems: → formal logic problems, experimental design, hypotheses. • :Genomics_Deep: → gene sequences, variants, epigenetic factors. @@ -380,35 +400,46 @@ Optional advanced sheets: :Dual_format_support: retain .xlsl branding while Python reads/writes as .xlsx - - Interconnected_sheets: AI models can draw features from lifespan, genomics, or environment data; quantum simulations can optimize experimental parameters. - - Project management: collaboration logs, ethics notes, and deployment configs are integrated. + - Interconnected_sheets: -> AI models can draw features from lifespan, genomics, or environment data; quantum simulations can optimize experimental parameters. + + - Project management: +collaboration logs, ethics notes, and deployment configs are integrated. - STEM research support: mathematics, physics, reasoning, genomics, and healthcare analytics are all accessible within one system. ⸻ -:Implementation: plan for new sheets +:Implementation: plan for new sheets -.. Ethics_Notes: - • Tracks privacy, consent, bias, and fairness considerations. -:: - Can store annotations for AI and quantum experiments. - 2. .. Economics: + +:Ethics_Notes: + • Tracks privacy, consent, bias, and fairness considerations. Can store annotations for AI and quantum experiments. + + +:Economics: -> • Records intervention costs, resource allocation, projected ROI, and notes for each trial or scenario. - 3. .. Simulation_Scenarios: + :Simulation_Scenarios: + • Holds parameters for “what-if” experiments across diet, drugs, stress, and environmental conditions. - • .. Supports: direct integration with AI or quantum workflows. - 4. .. Visualization_Config: + • .. Supports: -> direct integration with AI or quantum workflows. + 4. .. Visualization_Config: -> • Defines chart types, axes, thresholds, and color schemes. - • .. Supports: automated plotting from Python scripts for reproducibility. - 5. .. Collaboration_Log: + • .. Supports: -> automated plotting from Python scripts for reproducibility. + 5. .. Collaboration_Log: -> • Logs contributors, tasks, changes, timestamps, and versioning information. • ..Useful: for multi-researcher projects and audit trails. - 6. :Deployment: + + +:Deployment: + • Stores endpoint URLs, API keys, runtime environments, and configuration notes for AI models and quantum simulations. • .. Facilitates: transitioning from experimentation to production-ready workflows. -:Optional: - .. advanced_sheets: + +Optional +================================ + + :advanced_sheets: + • Advanced_Mathematics → tensors, matrices, PDEs, applied formulas. • :Physics_Experiments: → mechanics, thermodynamics, electromagnetism, quantum parameters. • :Reasoning_Problems: → formal logic problems, experimental design, hypotheses. @@ -420,8 +451,9 @@ Optional advanced sheets: • Dual-format support: retain .xlsl branding while Python reads/writes as .xlsx. • :Interconnected: sheets: AI models can draw features from lifespan, genomics, or environment data; quantum simulations can optimize experimental parameters. • :Project_management: collaboration logs, ethics notes, and deployment configs are integrated. - • :STEM:research support: mathematics, physics, reasoning, genomics, and healthcare analytics are all accessible within one system. -:: + +:STEM: +.. research support: -> mathematics, physics, reasoning, genomics, and healthcare analytics are all accessible within one system. • This structure turns Aura into a complete, scalable research ecosystem, capable of supporting AI, quantum computing, lifespan analysis, applied STEM research, simulations, visualizations, and project governance in one unified workbook. :auraxlslproject: From c5219f47faf03ee8956c1ff2eed8baf11f69c991 Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 10 May 2026 17:17:55 +0100 Subject: [PATCH 22/30] Update index.rst --- src/index.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/index.rst b/src/index.rst index 9125844..8e4f68c 100644 --- a/src/index.rst +++ b/src/index.rst @@ -4,7 +4,7 @@ :aura.paperweb: .. projectstructure: :extension: .. tags: :notebookxlsl: -:quantum: +:quantum: @lmlmmodels :model: :sentence: .. similarity: .. text-generation: @@ -18,7 +18,7 @@ .. chemistry .. biology: .. synthetic: -.. agent: +.. agent: @lmlm .. pretty_name: ..paperweb: :quantumpaper: .. image_categories: @@ -41,7 +41,7 @@ .. unconditional-image-generation: .. video-classification: :reinforcement-learning: -:depth-estimation: +:depth-estimation: @lmlm :license: creativeml-openrail-m :language: eng :paper: From 470e5dcd433a13bb4cb1efa299c59a8362e753f0 Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 10 May 2026 18:13:36 +0100 Subject: [PATCH 23/30] Update index.md --- index.md | 494 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 486 insertions(+), 8 deletions(-) diff --git a/index.md b/index.md index 9b49d27..9d928cc 100644 --- a/index.md +++ b/index.md @@ -1,11 +1,11 @@ --- name: auraxlsl paper and its ecosystem -docs: https://fasth.ml/index.html#index.md -pages: https://fastapi.com +docs: #https://fasth.ml/index.html#index.md +pages: #https://fastapi.com projectstructure: synthetic: extension: -tags: https://fastai1.core.ai +tags: #https://fastai1.core.ai notebookxlsl: quantum: model: @@ -17,16 +17,494 @@ audioclassification: biology: agent: prettyname: -paperweb: index.md/index.html +paperweb: #index.md/index.html quantumpaper: imagecategories: taskcategories: -paperweb: -Auraxlslpaper: +paperweb: Auraxlslpaper Serai: QuantumIDE: -Interactive: drag-and-drop +Interactive: drag and drop quantum_circuit: simulator_with_GPU: -accelerated_backend:: src/page.web4.py/index.html#index.md +accelerated_backend: #src/page.web4.py/index.html#index.md :paperweb_website: +#.. https://fastht.ml: +fasthtml: name the webasite #https://aura.paperweb +aurapaperweb: +.. projectstructure: +:extension: +.. tags: +notebookxlsl: +quantum: +.. models: #@lmlmmodels +sentence: +.. similarity: +.. text-generation: +.. image-to-3d: +.. audio-classification: +aura.Xlsl: +.. science: +.. code: +.. medical: +.. not-for-all-audiences: +.. chemistry: +.. biology: +.. synthetic: +.. agent: #@lmlm +.. pretty_name: +..paperweb: +quantumpaper: +.. image_categories: +:100B{Yakub, Seriki} +:title: #->{Aura.Xlsl(Revision668d721)} +year: #-> 2025 +.. url: #https://huggingface.co/datasets/Seriki/Aura.Xlsl +doi: #->{10.57967/hf/6674} +publisher: #->{Aura / Hugging Face} +Auraxlslpaper: +Serai: +QuantumIDE: +Interactive: +drag-and-drop: +quantum: +circuit: --- +# simulator with GPU-accelerated backend + +## Features + +- Drag-and-drop quantum gates (H, X, Y, Z, CNOT, TOFFOLI) +- Multi-qubit circuit simulation +- Real-time amplitude visualization +- Save/load circuits as JSON +- Batch GPU simulation support +- Fractional/negative amplitude support (Aura math integration) + + +Installation +```bash +git clone <[repo-url](https://github.com/Web4application/Aura_Full_Project.xlsl.git)> +cd AuraQuantumIDE +pip install -r requirements.txt +uvicorn api.main:app --reload +https://github.com/Web4application/Aura_Full_Project.xlsl.git +``` +```code +auraxlslproject + ├── :data: + │ └── :Aura.xlsl: .. your data hub: + ├── :src: + │ ├── -> :init: + │ ├── .. ai_pipeline: :ML: regression/classification + │ ├── .. quantum_pipeline: :Qiskit: :quantum: :circuits: + │ ├── .. lifespan_analysis: :survival: :curves: :hazard: :ratio: + │ └── .. utils: -> helpers to load Excel + ├── .. xlslnotebooks:/ + │ └── exploration.ipynb .. experiments: + ├── requirements.txt + └── main.py # orchestrator script +``` + +[aurxlslpaper](https://github.com/Web4application/Aura_Full_Project.xlsl/tree/15c2f6180005733d51e16b816c0738a37bb0986a/AuraQuantum/localhost.mobi/rss-feed/my-news/ace6114490bf69dae76498fe4dc2447b1b3ce415) + + +[AuraQuantumpaper](https://github.com/Web4application/Aura_Full_Project.xlsl/tree/15c2f6180005733d51e16b816c0738a37bb0986a/AuraQuantum/localhost.mobi/rss-feed/my-news/ace6114490bf69dae76498fe4dc2447b1b3ce415) + +# .xlsl: —> Logic Spreadsheet (Core) + +| Purpose | + | A structured, Excel-compatible file format designed as the hub for mathematics, physics, reasoning, and simulation data. | + + +# Structure: + • Reserved sheets: Pure_Mathematics, Further_Mathematics, Applied_Physics, Reasoning_Logic, Simulation_Problems, Teleportation_Simulation. + + :Tabular format with rows: + +| entities | columns | attributes. + +:Use_Cases: + .. Knowledge base for AI-assisted reasoning. + .. STEM modeling and theoretical experimentation. + .. Foundation for linking with other Aura + + .. extensions: + + :![aura_diagram.png](https://huggingface.co/datasets/Seriki/Aura.Xlsl/raw/main/assets/aura_diadram.html) + +2. :.xqsl: -> Quantum Spreadsheet Language + +.. Purpose: + Represents quantum states, entanglement, and teleportation in tabular form. + Structure + • Core sheets: Qubits, Entanglement, Teleportation, Noise_Models. + • Normalization rules: |α|² + |β|² = 1. + Use-Cases + • AI-assisted quantum state reasoning. + • Interoperability with Qiskit, Cirq, Rigetti simulators. + • Teleportation experiment modeling. +⸻ + + .xsim: -> Simulation Spreadsheet + +# Purpose + Dedicated container for applied simulations across physics, math, and multi-disciplinary problems. + :Structure: -> | Simulation_ID | Input_Data | Governing_Equations | Solver_Method | Output_Parameters | Error_Margin | Notes | + :Use-Cases: + • Energy cost of teleportation. + • Wormhole/dimensional collapse simulations. + • Linking spreadsheet experiments to computational solvers (Python, MATLAB). +⸻ + +4. .xrls: Reasoning Layer Spreadsheet + +# Purpose + Encodes logical reasoning in structured tabular form, bridging raw data and inference. +:Structure: + | Premise | Logical_Operator | Secondary_Premise | Conclusion | Truth_Value | Confidence (%) | Notes | +:Use-Cases: + - AI symbolic logic and contradiction checking. + - Automated reasoning validation for STEM hypotheses. + - Embedding deductive reasoning into simulations. +⸻ + +5. .xai: .. AI: Enhanced Spreadsheet + + # Purpose + Hybrid format combining data + AI context memory inside a single file.- Structure + • Data layer: conventional tabular data. + • AI layer: structured logs of prompts, responses, metadata. + + # Use-Cases + • Context-aware spreadsheets (AI remembers past queries). + • Distributed AI collaboration (file carries its own “assistant”). + • Research reproducibility: all AI reasoning embedded with data. +⸻ + +6. .xdim: ..Dimensional: Models File + + +# Purpose_ + Encodes higher-dimensional mathematics and geometry, for theories beyond 3D space-time. + + + # Structure +| Model_ID | Dimension_Count | Geometry_Type | Transformation_Matrix | Tensor_Fields | Physical_Interpretation | Notes | + +# Rules + • Must specify at least 3D baseline. + • Higher-D transformations expressed via matrices or tensors. + + ⸻ + +# :Use_Cases + • Teleportation and wormhole modeling. + • Multiverse/dimensional physics research. + • Coupling with .xqsl for quantum state behavior in higher dimensions. + + +# Ecosystem_Workflow + + 1. .xlsl = Hub → holds general STEM and logic sheets. + 2. .xqsl = Quantum extension → state transfer, entanglement, teleportation. + 3. .xsim = Simulation → runs applied case studies. + 4. .xrls = Logic → validates reasoning and inferences. + 5. .xai = AI-enhanced → keeps reasoning memory and context. + 6. .xdim = Higher dimensions → advanced teleportation and + + + + + # Ethics_Notes + + • - Tracks considerations around privacy, consent, data anonymization, and AI fairness. + • - Can store notes about potential biases in AI models or quantum simulations. + • - Useful for documenting decisions to comply with research ethics or regulatory standards. + 2. + + ⸻ + + # Economics_Records + + • Records costs of interventions, treatments, or experiments. + • Can calculate cost-benefit analyses or ROI for clinical trials, lifespan interventions, or quantum computing experiments. + • Includes metrics like budget, actual expenditure, projected savings, and economic feasibility. + + ⸻ + 3. # Simulation_Scenarios + +- • Enables “what-if” analysis across multiple domains such as diet, medication, stress, or environmental factors. +- • Stores initial conditions, parameters, and expected outputs for each simulation. +- • Can feed into AI or quantum pipelines to test different hypotheses before running real experiments. + +- + ⸻ + + # Visualization_Config_ + + • Contains preferred chart types, axis mappings, thresholds, and color schemes. +- • Supports automated plotting in Python, ensuring consistency in presentation and reporting. +- • Useful for dashboards or publication-ready figures generated from data in other sheets. + + ⸻ + # lCollaboration_Log + +- • Tracks team members, contributions, timestamps, and changes to data or models. + • Can include versioning information for sheets and pipelines. + • Supports multi-researcher projects, making it easier to manage tasks and credit work. + 6. Deployment_confog + • Contains configuration details for serving AI models, quantum simulations, or hybrid workflows. + • Includes endpoints, API keys, server details, runtime environment settings, and deployment notes. + • Allows seamless transition from experimentation to production-ready workflows. +## expansion: + + ⸻ + # notebooksxlsl + 1. | Ethics_Notes | - privacy, - bias | - fairness | - consent | - logs | - Economics - -spreadsheet | – intervention | costs - resource | allocation - | - ROI calculations | + 6. | Simulation_Scenarios | – “what-if” experiments for diet, drugs, stress, or environmental factors. + 7. | Visualization_Config | – chart types, axes, thresholds, color schemes for automated plotting. + 8. |Collaboration_Log | – contributors, changes, timestamps, versioning. + 9. | Deployment_dimensional | – endpoints, runtime configurations, API keys, server settings for + + ⸻ +# Ai_quantum_workflows + | Advanced_Mathematics → | tensors, eigenvalues, PDEs, applied formulas. | + | Physics_Experiments → | parameters for mechanics, thermodynamics, electromagnetism, quantum circuits. | + | Reasoning_Problems → | logic puzzles, hypotheses, formal deductions, experimental design.| + | Genomics_Deep → full gene sequences, variant analysis, epigenetic factors. | + Healthcare_Analytics → survival curves, hazard ratios, population studies. | + Environment_Scenarios → climate, pollution, lifestyle, and external stressors. | + | AI_Results_Log → historical model performance, predictions, and metrics for reference. | + | Dual-format support ensures .xlsl branding while Python can read/write it as .xlsx. + + ⸻ + + # All layers interconnect + +AI can pull features from lifespan or environment data, quantum simulations can optimize interventions, and analytics can feed visualizations automatically. + • Project management and collaboration are integrated, ensuring reproducibility, ethics tracking, and versioning. + • STEM research is fully supported: mathematical models, physics parameters, reasoning experiments, and genomics data are all accessible in one system. | +You typed Aura.xlsl. Likely you meant Aura.xlsx (Excel workbook). + ⸻ + # .xlsl + is not a part of Microsoft Excel extension. Excel only recognizes formats like: + • .xlsx → Standard workbook + • .xls → Legacy workbook (Excel 97–2003) + • .xlsm → Workbook with macros + • .csv → Comma-separated values + + ⸻ + +# Project_Structure + .. xlsl: + .. conda-build: + :auraxlslproject: + - ├── .data/ + │ └── .Auraxlsl # fully expanded workbook with 25+ sheets - ├── .src/ + │ - ├── __init__.py + │ - ├── .file_loader.py :handles: .xlsl/.xlsx reading & writing - │ ├── .utils.py :helper_functions: + - │ ├── :ai_pipeline.py: .. ML .. models .. predictions + │ - ├── .quantum_pipeline.py .. Qiskit .. circuits + │ └── :lifespan_analysis.py: placeholder for lifespan analytics + ├── :notebooks:/ + │ └── .. exploration.ipynb: :experimentation: :visualization: + ├.── :requirements.txt: + └── :main.py: # :orchestrator_script: + ———— + +:Features: + +• Loads and saves Aura.xlsl while internally using .xlsx compatibility. + Contains all previously created + + .. spreadsheets: + +:Overview: +.. | Data | AI Input | Quantum Input | Results | + +| LifespanData | AI Modeling, Quantum_Optimization, Environment Factors, Clinical Trials, Genomic | + +| AI Pipeline Config | Quantum Results | + +|Pure Mathematics| + | Further Mathematics | Applied Physics | + +| Reasoning Logic | Simulation Problems | + +| Ethics Notes| + | Economics| Simulation Scenarios | + +:VisualizationbConfig: + + ..Collaboration_Log: + +:Deployment:: + + + Supports AI pipelines, quantum simulations, and +lifespan analytics. Modular, ready for expansion and collaboration. + +Yes. We can add all of these layers now, making Aura.xlsx/.xlsl a fully integrated, multidisciplinary research hub. Each sheet will be structured to support both data storage and computational workflows, while remaining fully compatible with Python and Excel. + +# Implementation: plan for new sheets +================================ + + :Ethics_Notes: + +Tracks privacy, consent, bias, and fairness considerations. + Can store annotations for AI and quantum experiments. + + :Economics: + +Records intervention costs, resource allocation, projected ROI, and notes for each trial or scenario. + +:Simulation_Scenarios: + +Holds parameters for “what-if” experiments across diet, drugs, stress, and environmental conditions. + • Supports direct integration with AI or quantum workflows. + +:Visualization_Config: + +• Defines chart types, axes, thresholds, and color schemes. + • Supports automated plotting from Python scripts for reproducibility. + +:Collaboration_Log: + +• Logs contributors, tasks, changes, timestamps, and versioning information. + • Useful for multi-researcher projects and audit trails. + +:Deployment: + +• Stores endpoint URLs, API keys, runtime environments, and configuration notes for AI models and quantum simulations. + + :Facilitates_transitioning: + +from experimentation to production-ready workflows. +Optional advanced sheets: + :Advanced_Mathematics: → tensors, matrices, PDEs, applied formulas. + + :Physics_Experiments: → mechanics, thermodynamics, electromagnetism, quantum parameters. + + :Reasoning_Problems: → formal logic problems, experimental design, hypotheses. + +:Genomics_Deep: → gene sequences, variants, epigenetic factors. + +:Healthcare_Analytics: → survival curves, hazard ratios, cohort analysis. + +:Environment_Scenarios: → climate, pollution, lifestyle, external stressors. + + :AI_Results_Log: → historical model outputs, metrics, and predictions. + + .. Outcome: + +:Dual_format_support: + retain .xlsl branding while Python reads/writes as .xlsx + + - :Interconnected_sheets: -> AI models can draw features from lifespan, genomics, or environment data; quantum simulations can optimize experimental parameters. + +# Project management + +collaboration logs, ethics notes, and deployment configs are integrated. + - STEM research support: mathematics, physics, reasoning, genomics, and healthcare analytics are all accessible within one system. +⸻ + +:Implementation: plan for new sheets + +:Ethics_Notes: + • Tracks privacy, consent, bias, and fairness considerations. Can store annotations for AI and quantum experiments. + + +:Economics: -> + • Records intervention costs, resource allocation, projected ROI, and notes for each trial or scenario. + + :Simulation_Scenarios: + + • Holds parameters for “what-if” experiments across diet, drugs, stress, and environmental conditions. + • .. Supports: -> direct integration with AI or quantum workflows. + 4. .. Visualization_Config: -> + • Defines chart types, axes, thresholds, and color schemes. + • .. Supports: -> automated plotting from Python scripts for reproducibility. + 5. .. Collaboration_Log: -> + • Logs contributors, tasks, changes, timestamps, and versioning information. + • ..Useful: for multi-researcher projects and audit trails. + + + +:Deployment: + + • Stores endpoint URLs, API keys, runtime environments, and configuration notes for AI models and quantum simulations. + • .. Facilitates: transitioning from experimentation to production-ready workflows. + +Optional +================================ + + :advanced_sheets: + + • Advanced_Mathematics → tensors, matrices, PDEs, applied formulas. + • :Physics_Experiments: → mechanics, thermodynamics, electromagnetism, quantum parameters. + • :Reasoning_Problems: → formal logic problems, experimental design, hypotheses. + • :Genomics_Deep: → gene sequences, variants, epigenetic factors. + • :Healthcare_Analytics: → survival curves, hazard ratios, cohort analysis. + • :Environment_Scenarios: → climate, pollution, lifestyle, external stressors. + • :AI_Results_Log: → historical model outputs, metrics, and predictions. +:Outcome: + • Dual-format support: retain .xlsl branding while Python reads/writes as .xlsx. + • :Interconnected: sheets: AI models can draw features from lifespan, genomics, or environment data; quantum simulations can optimize experimental parameters. + • :Project_management: collaboration logs, ethics notes, and deployment configs are integrated. + +:STEM: +.. research support: -> mathematics, physics, reasoning, genomics, and healthcare analytics are all accessible within one system. + +• This structure turns Aura into a complete, scalable research ecosystem, capable of supporting AI, quantum computing, lifespan analysis, applied STEM research, simulations, visualizations, and project governance in one unified workbook. +:auraxlslproject: + +The expanded Aura project workbook is now ready with all new sheets for a complete multidisciplinary hub. It includes: + +.. Advanced_Mathematics: -> matrices, eigenvalues, PDEs, tensor calculus + .. Physics_Experiments: -> mechanics, thermodynamics, electromagnetism, quantum circuits + .. Reasoning_Problems: -> logic puzzles, hypotheses, experimental design + • .. Genomics_Deep: –> gene variants, effects, notes + .. Healthcare_Analytics: –> survival rates, hazard ratios, population studies + • .. Environment_Scenarios: –> pollution, lifestyle, expected impacts + • .. AI_Results_Log: –> model results, datasets, metrics, notes +This brings Aura.xlsl to a total of sheets, making it a fully functional research and project hub supporting AI, quantum computing, lifespan studies, applied STEM research, ethics, economics, simulations, visualization, collaboration, and deployment. + + From 63b7e7ab0ccf66cbdebb71eb60f95ecb4088c3f7 Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 10 May 2026 18:17:36 +0100 Subject: [PATCH 24/30] Update and rename index.md to Docs/readme.mdx --- index.md => Docs/readme.mdx | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) rename index.md => Docs/readme.mdx (98%) diff --git a/index.md b/Docs/readme.mdx similarity index 98% rename from index.md rename to Docs/readme.mdx index 9d928cc..c5027ef 100644 --- a/index.md +++ b/Docs/readme.mdx @@ -15,7 +15,7 @@ textgeneration: imageto3d: audioclassification: biology: -agent: +agent: prettyname: paperweb: #index.md/index.html quantumpaper: @@ -325,7 +325,7 @@ AI can pull features from lifespan or environment data, quantum simulations can You typed Aura.xlsl. Likely you meant Aura.xlsx (Excel workbook). ⸻ # .xlsl - is not a part of Microsoft Excel extension. Excel only recognizes formats like: + is not a part of Microsoft Excel extension. Excel only recognizes formats like: • .xlsx → Standard workbook • .xls → Legacy workbook (Excel 97–2003) • .xlsm → Workbook with macros @@ -373,8 +373,7 @@ You typed Aura.xlsl. Likely you meant Aura.xlsx (Excel workbook). | Economics| Simulation Scenarios | :VisualizationbConfig: - - ..Collaboration_Log: + ..Collaboration_Log: :Deployment:: @@ -453,10 +452,8 @@ collaboration logs, ethics notes, and deployment configs are integrated. :Economics: -> - • Records intervention costs, resource allocation, projected ROI, and notes for each trial or scenario. - + • Records intervention costs, resource allocation, projected ROI, and notes for each trial or scenario. :Simulation_Scenarios: - • Holds parameters for “what-if” experiments across diet, drugs, stress, and environmental conditions. • .. Supports: -> direct integration with AI or quantum workflows. 4. .. Visualization_Config: -> @@ -465,19 +462,15 @@ collaboration logs, ethics notes, and deployment configs are integrated. 5. .. Collaboration_Log: -> • Logs contributors, tasks, changes, timestamps, and versioning information. • ..Useful: for multi-researcher projects and audit trails. - - + :Deployment: - • Stores endpoint URLs, API keys, runtime environments, and configuration notes for AI models and quantum simulations. • .. Facilitates: transitioning from experimentation to production-ready workflows. Optional ================================ - - :advanced_sheets: - +:advanced_sheets: • Advanced_Mathematics → tensors, matrices, PDEs, applied formulas. • :Physics_Experiments: → mechanics, thermodynamics, electromagnetism, quantum parameters. • :Reasoning_Problems: → formal logic problems, experimental design, hypotheses. @@ -490,14 +483,16 @@ Optional • :Interconnected: sheets: AI models can draw features from lifespan, genomics, or environment data; quantum simulations can optimize experimental parameters. • :Project_management: collaboration logs, ethics notes, and deployment configs are integrated. -:STEM: +# STEM .. research support: -> mathematics, physics, reasoning, genomics, and healthcare analytics are all accessible within one system. • This structure turns Aura into a complete, scalable research ecosystem, capable of supporting AI, quantum computing, lifespan analysis, applied STEM research, simulations, visualizations, and project governance in one unified workbook. + :auraxlslproject: -The expanded Aura project workbook is now ready with all new sheets for a complete multidisciplinary hub. It includes: - +The expanded Aura project workbook is now ready with all new sheets for a complete multidisciplinary hub. + +# includes: .. Advanced_Mathematics: -> matrices, eigenvalues, PDEs, tensor calculus .. Physics_Experiments: -> mechanics, thermodynamics, electromagnetism, quantum circuits .. Reasoning_Problems: -> logic puzzles, hypotheses, experimental design From 8b0b67969e8e8fcdb56876f56452ad4b22c85875 Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 10 May 2026 18:33:58 +0100 Subject: [PATCH 25/30] Create Index.es.mjs --- lmstudio.ai/Index.es.mjs | 1 + 1 file changed, 1 insertion(+) create mode 100644 lmstudio.ai/Index.es.mjs diff --git a/lmstudio.ai/Index.es.mjs b/lmstudio.ai/Index.es.mjs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/lmstudio.ai/Index.es.mjs @@ -0,0 +1 @@ + From a01c19659a4a7c2b4fb1d5db84ef4b35719016db Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 10 May 2026 18:36:02 +0100 Subject: [PATCH 26/30] Add files via upload --- lmstudio.ai/llms-full (6).txt | 14493 ++++++++++++++++++++++++++++++++ 1 file changed, 14493 insertions(+) create mode 100644 lmstudio.ai/llms-full (6).txt diff --git a/lmstudio.ai/llms-full (6).txt b/lmstudio.ai/llms-full (6).txt new file mode 100644 index 0000000..986ddab --- /dev/null +++ b/lmstudio.ai/llms-full (6).txt @@ -0,0 +1,14493 @@ + + +*** + +LM Studio 0.4.1 [#lm-studio-041] + +Anthropic-compatible API [#anthropic-compatible-api] + +* New Anthropic-compatible endpoint: `POST /v1/messages`. + * Use Claude code models with LM Studio + * See docs for more details: [/docs/developer/anthropic-compat](/docs/developer/anthropic-compat). + +*** + +LM Studio 0.4.0 [#lm-studio-040] + +LM Studio native v1 REST API [#lm-studio-native-v1-rest-api] + +* Official release of LM Studio's native v1 REST API at `/api/v1/*` endpoints. + * [MCP via API](/docs/developer/core/mcp) + * [Stateful chats](/docs/developer/rest/stateful-chats) + * [Authentication](/docs/developer/core/authentication) configuration with API tokens + * Model [download](/docs/developer/rest/download), [load](/docs/developer/rest/load) and [unload](/docs/developer/rest/unload) endpoints + * See [overview](/docs/developer/rest) page for more details and [comparison](/docs/developer/rest#inference-endpoint-comparison) with OpenAI-compatible endpoints. + +*** + +LM Studio 0.3.29 • 2025‑10‑06 [#lm-studio-0329-20251006] + +OpenAI `/v1/responses` and variant listing [#openai-v1responses-and-variant-listing] + +* New OpenAI‑compatible endpoint: `POST /v1/responses`. + * Stateful interactions via `previous_response_id`. + * Custom tool calling and Remote MCP support (opt‑in). + * Reasoning support with `reasoning.effort` for `openai/gpt‑oss‑20b`. + * Streaming via SSE when `stream: true`. +* CLI: `lms ls --variants` lists all variants for multi‑variant models. +* Docs: [/docs/developer/openai-compat](/docs/developer/openai-compat). Full release notes: [/blog/lmstudio-v0.3.29](/blog/lmstudio-v0.3.29). + +*** + +LM Studio 0.3.27 • 2025‑09‑24 [#lm-studio-0327-20250924] + +CLI: model resource estimates, status, and interrupts [#cli-model-resource-estimates-status-and-interrupts] + +* New: `lms load --estimate-only ` prints estimated GPU and total memory before loading. Honors `--context-length` and `--gpu`, and uses an improved estimator that now accounts for flash attention and vision models. +* `lms chat`: press `Ctrl+C` to interrupt an ongoing prediction. +* `lms ps --json` now reports each model's generation status and the number of queued prediction requests. +* CLI color contrast improved for light mode. +* See docs: [/docs/cli/local-models/load](/docs/cli/local-models/load). Full release notes: [/blog/lmstudio-v0.3.27](/blog/lmstudio-v0.3.27). + +*** + +LM Studio 0.3.26 • 2025‑09‑15 [#lm-studio-0326-20250915] + +CLI log streaming: server + model [#cli-log-streaming-server--model] + +* `lms log stream` now supports multiple sources and filters. + * `--source server` streams HTTP server logs (startup, endpoints, status) + * `--source model --filter input,output` streams formatted user input and model output + * Append `--json` for machine‑readable logs; `--stats` adds tokens/sec and related metrics (model source) +* See usage and examples: [/docs/cli/serve/log-stream](/docs/cli/serve/log-stream). Full release notes: [/blog/lmstudio-v0.3.26](/blog/lmstudio-v0.3.26). + +*** + +LM Studio 0.3.25 • 2025‑09‑04 [#lm-studio-0325-20250904] + +New model support (API) [#new-model-support-api] + +* Added support for NVIDIA Nemotron‑Nano‑v2 with tool‑calling via the OpenAI‑compatible endpoints [‡](/blog/lmstudio-v0.3.25). +* Added support for Google EmbeddingGemma for the `/v1/embeddings` endpoint [‡](/blog/lmstudio-v0.3.25). + +*** + +LM Studio 0.3.24 • 2025‑08‑28 [#lm-studio-0324-20250828] + +Seed‑OSS tool‑calling and template fixes [#seedoss-toolcalling-and-template-fixes] + +* Added support for ByteDance/Seed‑OSS including tool‑calling and prompt‑template compatibility fixes in the OpenAI‑compatible API [‡](/blog/lmstudio-v0.3.24). +* Fixed cases where tool calls were not parsed for certain prompt templates [‡](/blog/lmstudio-v0.3.24). + +*** + +LM Studio 0.3.23 • 2025‑08‑12 [#lm-studio-0323-20250812] + +Reasoning content and tool‑calling reliability [#reasoning-content-and-toolcalling-reliability] + +* For `gpt‑oss` on `POST /v1/chat/completions`, reasoning content moves out of `message.content` and into `choices.message.reasoning` (non‑streaming) and `choices.delta.reasoning` (streaming), aligning with `o3‑mini` [‡](/blog/lmstudio-v0.3.23). +* Tool names are normalized (e.g., snake\_case) before being provided to the model to improve tool‑calling reliability [‡](/blog/lmstudio-v0.3.23). +* Fixed errors for certain tools‑containing requests to `POST /v1/chat/completions` (e.g., "reading 'properties'") and non‑streaming tool‑call failures [‡](/blog/lmstudio-v0.3.23). + +*** + +LM Studio 0.3.19 • 2025‑07‑21 [#lm-studio-0319-20250721] + +Bug fixes for streaming and tool calls [#bug-fixes-for-streaming-and-tool-calls] + +* Corrected usage statistics returned by OpenAI‑compatible streaming responses [‡](https://lmstudio.ai/blog/lmstudio-v0.3.19#:~:text=,OpenAI%20streaming%20responses%20were%20incorrect). +* Improved handling of parallel tool calls via the streaming API [‡](https://lmstudio.ai/blog/lmstudio-v0.3.19#:~:text=,API%20were%20not%20handled%20correctly). +* Fixed parsing of correct tool calls for certain Mistral models [‡](https://lmstudio.ai/blog/lmstudio-v0.3.19#:~:text=,Ryzen%20AI%20PRO%20300%20series). + +*** + +LM Studio 0.3.18 • 2025‑07‑10 [#lm-studio-0318-20250710] + +Streaming options and tool‑calling improvements [#streaming-options-and-toolcalling-improvements] + +* Added support for the `stream_options` object on OpenAI‑compatible endpoints. Setting `stream_options.include_usage` to `true` returns prompt and completion token usage during streaming [‡](https://lmstudio.ai/blog/lmstudio-v0.3.18#:~:text=%2A%20Added%20support%20for%20%60,to%20support%20more%20prompt%20templates). +* Errors returned from streaming endpoints now follow the correct format expected by OpenAI clients [‡](https://lmstudio.ai/blog/lmstudio-v0.3.18#:~:text=,with%20proper%20chat%20templates). +* Tool‑calling support added for Mistral v13 tokenizer models, using proper chat templates [‡](https://lmstudio.ai/blog/lmstudio-v0.3.18#:~:text=,with%20proper%20chat%20templates). +* The `response_format.type` field now accepts `"text"` in chat‑completion requests [‡](https://lmstudio.ai/blog/lmstudio-v0.3.18#:~:text=,that%20are%20split%20across%20multiple). +* Fixed bugs where parallel tool calls split across multiple chunks were dropped and where root‑level `$defs` in tool definitions were stripped [‡](https://lmstudio.ai/blog/lmstudio-v0.3.18#:~:text=,being%20stripped%20in%20tool%20definitions). + +*** + +LM Studio 0.3.17 • 2025‑06‑25 [#lm-studio-0317-20250625] + +Tool‑calling reliability and token‑count updates [#toolcalling-reliability-and-tokencount-updates] + +* Token counts now include the system prompt and tool definitions [‡](https://lmstudio.ai/blog/lmstudio-v0.3.17#:~:text=,have%20a%20URL%20in%20the). This makes usage reporting more accurate for both the UI and the API. +* Tool‑call argument tokens are streamed as they are generated [‡](https://lmstudio.ai/blog/lmstudio-v0.3.17#:~:text=Build%206), improving responsiveness when using streamed function calls. +* Various fixes improve MCP and tool‑calling reliability, including correct handling of tools that omit a `parameters` object and preventing hangs when an MCP server reloads [‡](https://lmstudio.ai/blog/lmstudio-v0.3.17#:~:text=,tool%20calls%20would%20hang%20indefinitely). + +*** + +LM Studio 0.3.16 • 2025‑05‑23 [#lm-studio-0316-20250523] + +Model capabilities in `GET /models` [#model-capabilities-in-getmodels] + +* The OpenAI‑compatible REST API (`/api/v0`) now returns a `capabilities` array in the `GET /models` response. Each model lists its supported capabilities (e.g. `"tool_use"`) [‡](https://lmstudio.ai/blog/lmstudio-v0.3.16#:~:text=,response) so clients can programmatically discover tool‑enabled models. +* Fixed a streaming bug where an empty function name string was appended after the first packet of streamed tool calls [‡](https://lmstudio.ai/blog/lmstudio-v0.3.16#:~:text=%2A%20Bugfix%3A%20%5BOpenAI,packet%20of%20streamed%20function%20calls). + +*** + +👾 LM Studio 0.3.15 • 2025-04-24 [#-lm-studio-0315--2025-04-24] + +Release post: [LM Studio 0.3.15](/blog/lmstudio-v0.3.15) + +Improved Tool Use API Support [#improved-tool-use-api-support] + +OpenAI-like REST API now supports the `tool_choice` parameter: + +```json +{ + "tool_choice": "auto" // or "none", "required" +} +``` + +* `"tool_choice": "none"` — Model will not call tools +* `"tool_choice": "auto"` — Model decides +* `"tool_choice": "required"` — Model must call tools (llama.cpp only) + +Chunked responses now set `"finish_reason": "tool_calls"` when appropriate. + +*** + +👾 LM Studio 0.3.14 • 2025-03-27 [#-lm-studio-0314--2025-03-27] + +Release post: [LM Studio 0.3.14](/blog/lmstudio-v0.3.14) + +\[API/SDK] Preset Support [#apisdk-preset-support] + +RESTful API and SDKs support specifying presets in requests. + +*(example needed)* + +👾 LM Studio 0.3.10 • 2025-02-18 [#-lm-studio-0310--2025-02-18] + +Release post: [LM Studio 0.3.10](/blog/lmstudio-v0.3.10) + +Speculative Decoding API [#speculative-decoding-api] + +Enable speculative decoding in API requests with `"draft_model"`: + +```json +{ + "model": "deepseek-r1-distill-qwen-7b", + "draft_model": "deepseek-r1-distill-qwen-0.5b", + "messages": [ ... ] +} +``` + +Responses now include a `stats` object for speculative decoding: + +```json +"stats": { + "tokens_per_second": ..., + "draft_model": "...", + "total_draft_tokens_count": ..., + "accepted_draft_tokens_count": ..., + "rejected_draft_tokens_count": ..., + "ignored_draft_tokens_count": ... +} +``` + +*** + +👾 LM Studio 0.3.9 • 2025-01-30 [#-lm-studio-039--2025-01-30] + +Release post: [LM Studio 0.3.9](blog/lmstudio-v0.3.9) + +Idle TTL and Auto Evict [#idle-ttl-and-auto-evict] + +Set a TTL (in seconds) for models loaded via API requests (docs article: [Idle TTL and Auto-Evict](/docs/developer/core/ttl-and-auto-evict)) + +```diff +curl http://localhost:1234/api/v0/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "deepseek-r1-distill-qwen-7b", + "messages": [ ... ] ++ "ttl": 300, +}' +``` + +With `lms`: + +``` +lms load --ttl +``` + +Separate `reasoning_content` in Chat Completion responses [#separate-reasoning_content-in-chat-completion-responses] + +For DeepSeek R1 models, get reasoning content in a separate field. See more [here](/blog/lmstudio-v0.3.9#separate-reasoningcontent-in-chat-completion-responses). + +Turn this on in App Settings > Developer. + +*** + +👾 LM Studio 0.3.6 • 2025-01-06 [#-lm-studio-036--2025-01-06] + +Release post: [LM Studio 0.3.6](blog/lmstudio-v0.3.6) + +Tool and Function Calling API [#tool-and-function-calling-api] + +Use any LLM that supports Tool Use and Function Calling through the OpenAI-like API. + +Docs: [Tool Use and Function Calling](/docs/developer/core/tools). + +*** + +👾 LM Studio 0.3.5 • 2024-10-22 [#-lm-studio-035--2024-10-22] + +Release post: [LM Studio 0.3.5](blog/lmstudio-v0.3.5) + +Introducing `lms get`: download models from the terminal [#introducing-lms-get-download-models-from-the-terminal] + +You can now download models directly from the terminal using a keyword + +```bash +lms get deepseek-r1 +``` + +or a full Hugging Face URL + +```bash +lms get +``` + +To filter for MLX models only, add `--mlx` to the command. + +```bash +lms get deepseek-r1 --mlx +``` + + + + + + +Get to know the stack [#get-to-know-the-stack] + + + + + + + + + + + + + + + +What you can build [#what-you-can-build] + + + + + + + + + + + + + +Install `llmster` for headless deployments [#install-llmster-for-headless-deployments] + +`llmster` is LM Studio's core, packaged as a daemon for headless deployment on servers, cloud instances, or CI. The daemon runs standalone, and it is not dependent on the LM Studio GUI. + +**Mac / Linux** + +```bash +curl -fsSL https://lmstudio.ai/install.sh | bash +``` + +**Windows** + +```powershell +irm https://lmstudio.ai/install.ps1 | iex +``` + +**Basic usage** + +```bash +lms daemon up # Start the daemon +lms get # Download a model +lms server start # Start the local server +lms chat # Open an interactive session +``` + +Learn more: [Headless deployments](/blog/0.4.0#deploy-on-servers-deploy-in-ci-deploy-anywhere) + +Super quick start [#super-quick-start] + +TypeScript (`lmstudio-js`) [#typescript-lmstudio-js] + +```bash +npm install @lmstudio/sdk +``` + +```ts +import { LMStudioClient } from "@lmstudio/sdk"; + +const client = new LMStudioClient(); +const model = await client.llm.model("openai/gpt-oss-20b"); +const result = await model.respond("Who are you, and what can you do?"); + +console.info(result.content); +``` + +Full docs: [lmstudio-js](/docs/typescript), Source: [GitHub](https://github.com/lmstudio-ai/lmstudio-js) + +Python (`lmstudio-python`) [#python-lmstudio-python] + +```bash +pip install lmstudio +``` + +```python +import lmstudio as lms + +with lms.Client() as client: + model = client.llm.model("openai/gpt-oss-20b") + result = model.respond("Who are you, and what can you do?") + print(result) +``` + +Full docs: [lmstudio-python](/docs/python), Source: [GitHub](https://github.com/lmstudio-ai/lmstudio-python) + +HTTP (LM Studio REST API) [#http-lm-studio-rest-api] + +```bash +lms server start --port 1234 +``` + +```bash +curl http://localhost:1234/api/v1/chat \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -d '{ + "model": "openai/gpt-oss-20b", + "input": "Who are you, and what can you do?" + }' +``` + +Full docs: [LM Studio REST API](/docs/developer/rest) + +Helpful links [#helpful-links] + +* [API Changelog](/docs/developer/api-changelog) +* [Local server basics](/docs/developer/core/server) +* [CLI reference](/docs/cli) +* [Discord Community](https://discord.gg/lmstudio) + + + + +`lmstudio-python` provides you a set APIs to interact with LLMs, embeddings models, and agentic flows. + +Installing the SDK [#installing-the-sdk] + +`lmstudio-python` is available as a PyPI package. You can install it using pip. + +```bash +pip install lmstudio +``` + +For the source code and open source contribution, visit [lmstudio-python](https://github.com/lmstudio-ai/lmstudio-python) on GitHub. + +Features [#features] + +* Use LLMs to [respond in chats](./python/llm-prediction/chat-completion) or predict [text completions](./python/llm-prediction/completion) +* Define functions as tools, and turn LLMs into [autonomous agents](./python/agent) that run completely locally +* [Load](./python/manage-models/loading), [configure](./python/llm-prediction/parameters), and [unload](./python/manage-models/loading) models from memory +* Generate embeddings for text, and more! + +Quick Example: Chat with a Llama Model [#quick-example-chat-with-a-llama-model] + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + model = lms.llm("qwen/qwen3-4b-2507") + result = model.respond("What is the meaning of life?") + + print(result) + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model("qwen/qwen3-4b-2507") + result = model.respond("What is the meaning of life?") + + print(result) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model("qwen/qwen3-4b-2507") + result = await model.respond("What is the meaning of life?") + + print(result) + ``` + + + +Getting Local Models [#getting-local-models] + +The above code requires the [qwen3-4b-2507](https://lmstudio.ai/models/qwen/qwen3-4b-2507) model. +If you don't have the model, run the following command in the terminal to download it. + +```bash +lms get qwen/qwen3-4b-2507 +``` + +Read more about `lms get` in LM Studio's CLI [here](./cli/get). + +Interactive Convenience, Deterministic Resource Management, or Structured Concurrency? [#interactive-convenience-deterministic-resource-management-or-structured-concurrency] + +As shown in the example above, there are three distinct approaches for working +with the LM Studio Python SDK. + +The first is the interactive convenience API (listed as "Python (convenience API)" +in examples), which focuses on the use of a default LM Studio client instance for +convenient interactions at a synchronous Python prompt, or when using Jupyter notebooks. + +The second is a synchronous scoped resource API (listed as "Python (scoped resource API)" +in examples), which uses context managers to ensure that allocated resources +(such as network connections) are released deterministically, rather than +potentially remaining open until the entire process is terminated. + +The last is an asynchronous structured concurrency API (listed as "Python (asynchronous API)" in +examples), which is designed for use in asynchronous programs that follow the design principles of +["structured concurrency"](https://vorpus.org/blog/notes-on-structured-concurrency-or-go-statement-considered-harmful/) +in order to ensure the background tasks handling the SDK's connections to the API server host +are managed correctly. Asynchronous applications which do not adhere to those design principles +will need to rely on threaded access to the synchronous scoped resource API rather than attempting +to use the SDK's native asynchronous API. Python SDK version 1.5.0 is the first version to fully +support the asynchronous API. + +Some examples are common between the interactive convenience API and the synchronous scoped +resource API. These examples are listed as "Python (synchronous API)". + +Timeouts in the synchronous API [#timeouts-in-the-synchronous-api] + +*Required Python SDK version*: **1.5.0** + +Starting in Python SDK version 1.5.0, the synchronous API defaults to timing out after 60 seconds +with no activity when waiting for a response or streaming event notification from the API server. + +The number of seconds to wait for responses and event notifications can be adjusted using the +`lmstudio.set_sync_api_timeout()` function. Setting the timeout to `None` disables the timeout +entirely (restoring the behaviour of previous SDK versions). + +The current synchronous API timeout can be queried using the `lmstudio.get_sync_api_timeout()` +function. + +Timeouts in the asynchronous API [#timeouts-in-the-asynchronous-api] + +*Required Python SDK version*: **1.5.0** + +As asynchronous coroutines support cancellation, there is no specific timeout support implemented +in the asynchronous API. Instead, general purpose async timeout mechanisms, such as +[`asyncio.wait_for()`](https://docs.python.org/3/library/asyncio-task.html#asyncio.wait_for) or +[`anyio.move_on_after()`](https://anyio.readthedocs.io/en/stable/cancellation.html#timeouts), +should be used. + + + + +The `lms` CLI is open source on GitHub: [https://github.com/lmstudio-ai/lms](https://github.com/lmstudio-ai/lms) + +If you spot a bug, want to request a feature, or plan to contribute: + +* File issues or feature requests in the GitHub repository. +* Open pull requests against the `main` branch with a concise summary and testing notes. +* Review the repository README for setup instructions and coding standards. + + + + +Install `lms` [#install-lms] + +`lms` ships with LM Studio, so you don't need to do any additional installation steps if you have LM Studio installed. + +Just open a terminal window and run `lms`: + +```shell +lms --help +``` + +Open source [#open-source] + +`lms` is **MIT Licensed** and is developed in this repository on GitHub: [https://github.com/lmstudio-ai/lms](https://github.com/lmstudio-ai/lms) + +Command quick links [#command-quick-links] + +| Command | Syntax | Docs | +| ----------------------------- | ------------------ | ------------------------------------- | +| Chat in the terminal | `lms chat` | [Guide](/docs/cli/local-models/chat) | +| Download models | `lms get` | [Guide](/docs/cli/local-models/get) | +| List your models | `lms ls` | [Guide](/docs/cli/local-models/ls) | +| See models loaded into memory | `lms ps` | [Guide](/docs/cli/local-models/ps) | +| Control the server | `lms server start` | [Guide](/docs/cli/serve/server-start) | +| Manage the inference runtime | `lms runtime` | [Guide](/docs/cli/runtime) | +| Manage the headless daemon | `lms daemon` | [Guide](/docs/cli/daemon/daemon-up) | +| Manage LM Link | `lms link` | [Guide](/docs/cli/link/link-enable) | + +Verify the installation [#verify-the-installation] + + + 👉 You need to run LM Studio *at least once* before you can use `lms`. + + +Open a terminal window and run `lms`. + +```bash title="Terminal" +$ lms + +lms is LM Studio's CLI utility for your models, server, and inference runtime. (v0.0.47) + +Usage: lms [options] [command] + +Local models + chat Start an interactive chat with a model + get Search and download models + load Load a model + unload Unload a model + ls List the models available on disk + ps List the models currently loaded in memory + import Import a model file into LM Studio + +Serve + server Commands for managing the local server + log Log incoming and outgoing messages + +Runtime + runtime Manage and update the inference runtime + +Develop & Publish (Beta) + clone Clone an artifact from LM Studio Hub to a local folder + push Uploads the artifact in the current folder to LM Studio Hub + dev Starts a plugin dev server in the current folder + login Authenticate with LM Studio + +Learn more: https://lmstudio.ai/docs/developer +Join our Discord: https://discord.gg/lmstudio +``` + +Use `lms` to automate and debug your workflows [#use-lms-to-automate-and-debug-your-workflows] + +Start and stop the local server [#start-and-stop-the-local-server] + +```bash +lms server start +lms server stop +``` + +Learn more about [`lms server`](/docs/cli/serve/server-start). + +List the local models on the machine [#list-the-local-models-on-the-machine] + +```bash +lms ls +``` + +Learn more about [`lms ls`](/docs/cli/local-models/ls). + +This will reflect the current LM Studio models directory, which you set in **📂 My Models** tab in the app. + +List the currently loaded models [#list-the-currently-loaded-models] + +```bash +lms ps +``` + +Learn more about [`lms ps`](/docs/cli/local-models/ps). + +Load a model (with options) [#load-a-model-with-options] + +```bash +lms load [--gpu=max|auto|0.0-1.0] [--context-length=1-N] +``` + +`--gpu=1.0` means 'attempt to offload 100% of the computation to the GPU'. + +* Optionally, assign an identifier to your local LLM: + +```bash +lms load openai/gpt-oss-20b --identifier="my-model-name" +``` + +This is useful if you want to keep the model identifier consistent. + +Unload a model [#unload-a-model] + +``` +lms unload [--all] +``` + +Learn more about [`lms load and unload`](/docs/cli/local-models/load). + + + + + + +Claude Code can talk to LM Studio via the Anthropic-compatible `POST /v1/messages` endpoint. +See: [Anthropic-compatible Messages endpoint](/docs/developer/anthropic-compat/messages). + + + + + Have a powerful LLM rig? Use [LM Link](/docs/integrations/lmlink) to run Claude Code from your laptop while the model runs on your rig. + + +Setup [#setup] + + + +

+ Start LM Studio's local server +

+ + Make sure LM Studio is running as a server (default port `1234`). + + You can start it from the app, or from the terminal with `lms`: + + ```bash + lms server start --port 1234 + ``` +
+ + +

+ Configure Claude Code +

+ + Set these environment variables so the `claude` CLI points to your local LM Studio: + + ```bash + export ANTHROPIC_BASE_URL=http://localhost:1234 + export ANTHROPIC_AUTH_TOKEN=lmstudio + ``` + + Notes: + + * If Require Authentication is enabled, set `ANTHROPIC_AUTH_TOKEN` to your LM Studio API token. To learn more, see: [Authentication](/docs/developer/core/authentication). +
+ + +

+ Run Claude Code against a local model +

+ + ```bash + claude --model openai/gpt-oss-20b + ``` + + + Use a model (and server/model settings) with more than \~25k context length. Tools like Claude Code can consume a lot of context. + +
+ + +

+ If Require Authentication is enabled, use your LM Studio API token +

+ + If you turned on "Require Authentication" in LM Studio, create an API token and set: + + ```bash + export LM_API_TOKEN= + export ANTHROPIC_AUTH_TOKEN=$LM_API_TOKEN + ``` + + When Require Authentication is enabled, LM Studio accepts both `x-api-key` and `Authorization: Bearer `. +
+
+ +If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) + + + + + + +Codex can talk to LM Studio via the OpenAI-compatible `POST /v1/responses` endpoint. +See: [OpenAI-compatible Responses endpoint](/docs/developer/openai-compat/responses). + + + + + Have a powerful LLM rig? Use [LM Link](/docs/integrations/lmlink) to run Codex from your laptop while the model runs on your rig. + + +Setup [#setup] + + + +

+ Start LM Studio's local server +

+ + Make sure LM Studio is running as a server (default port `1234`). + + You can start it from the app, or from the terminal with `lms`: + + ```bash + lms server start --port 1234 + ``` +
+ + +

+ Run Codex against a local model +

+ + Run Codex as you normally would, but with the `--oss` flag to point it to LM Studio. + + Example: + + ```bash + codex --oss + ``` + + By default, Codex will download and use [openai/gpt-oss-20b](https://lmstudio.ai/models/openai/gpt-oss-20b). + + + Use a model (and server/model settings) with more than \~25k context length. Tools like Codex can consume a lot of context. + + + You can also use any other model you have available in LM Studio. For example: + + ```bash + codex --oss -m ibm/granite-4-micro + ``` +
+
+ +If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) + + + + + + +Hermes Agent now supports LM Studio as a first class model provider. It comes with JIT loading with higher context length (64K) and reasoning effort support. + +See: [Hermes Agent Docs](https://hermes-agent.nousresearch.com/docs/integrations/providers#lm-studio--desktop-app-with-local-models). + + + + + Have a powerful LLM rig? Use [LM Link](/docs/integrations/lmlink) to run Hermes Agent from your laptop while the model runs on your rig. + + +Setup [#setup] + + + +

+ Start LM Studio's local server +

+ + Make sure LM Studio is running as a server (default port `1234`). + + You can start it from the app, or from the terminal with `lms`: + + ```bash + lms server start --port 1234 + ``` +
+ + +

+ Run Hermes Agent with LM Studio as model provider +

+ + Run your hermes setup with the following command: + + ```bash + hermes setup + ``` + + or if you have hermes setup already, run + + ```bash + hermes model + ``` + + and complete the interactive setup with LM Studio as your model provider. + + + + ```bash + hermes config set model.provider lmstudio + hermes config set model.base_url http://localhost:1234/v1 + hermes config set model.default your-model-name + hermes config set LM_API_KEY your-key + ``` + + + + + Use a model with more than \~64k context length. Tools like Hermes Agent can consume a lot of context and have better experience with longer context. + +
+
+ +If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) + + + + +Use LM Studio as a seamless, drop-in local backend for your favorite tools. + +Whether you are using an IDE extension or a custom automation script, simply point your base URL to `http://localhost:1234` to power your workflows with LM Studio and maintain complete control over your data privacy. + +We provide guides below for popular tools and are constantly expanding this list to include new integrations. + +Available Integrations [#available-integrations] + +* [Claude Code](/docs/integrations/claude-code) +* [Codex](/docs/integrations/codex) +* [Hermes Agent](/docs/integrations/hermes) +* [OpenClaw](/docs/integrations/openclaw) + + + + +With [LM Link](/docs/lmlink), your coding tools can run models on a remote device (like a dedicated LLM rig on your network) while you work from your laptop + + + +Use your integration as normal [#use-your-integration-as-normal] + +Start LM Studio's server on your local machine and configure your tool to point to it. Model loads are routed to the device the model is loaded on or the preferred device if set. + +Your local machine handles the API surface at `localhost:1234`, while the model runs on the device the model is present on. + +```bash +lms server start --port 1234 +``` + +Claude Code [#claude-code] + +```bash +export ANTHROPIC_BASE_URL=http://localhost:1234 +export ANTHROPIC_AUTH_TOKEN=lmstudio +claude --model qwen3-8b +``` + +See the full [Claude Code](/docs/integrations/claude-code) guide. + +Codex [#codex] + +```bash +codex --oss -m qwen3-8b +``` + +See the full [Codex](/docs/integrations/codex) guide. + +Set a preferred device [#set-a-preferred-device] + +To use a model on a specific remote device, set the device as the preferred device. + +See [set a preferred device](/docs/lmlink/basics/preferred-device) for more details. + +If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) + + + + + + +OpenClaw now supports LM Studio as a native model provider. +See: [OpenClaw Docs](https://docs.openclaw.ai/providers/lmstudio). + + + + + Have a powerful LLM rig? Use [LM Link](/docs/integrations/lmlink) to run OpenClaw from your laptop while the model runs on your rig. + + +Setup [#setup] + + + +

+ Start LM Studio's local server +

+ + Make sure LM Studio is running as a server (default port `1234`). + + You can start it from the app, or from the terminal with `lms`: + + ```bash + lms server start --port 1234 + ``` +
+ + +

+ Run OpenClaw with LM Studio as model provider +

+ + Install OpenClaw as normal or run the OpenClaw onboard command as follows *(recommended)* + + ```bash + openclaw onboard + ``` + + and complete the interactive setup with LM Studio as your model provider + + You can do the onboarding in non-interactive way by using the following command: + + ```bash + openclaw onboard \ + --non-interactive \ + --accept-risk \ + --auth-choice lmstudio \ + --custom-base-url http://localhost:1234/v1 \ + --lmstudio-api-key "$LM_API_TOKEN" \ + --custom-model-id qwen/qwen3.5-9b + ``` + + + Use a model (and server/model settings) with more than \~50k context length. Tools like OpenClaw can consume a lot of context. + +
+ + +

+ Set up LM Studio as default memory search provider +

+ + To use LM Studio as the embedding model provider for memory search, run the following command and restart openclaw gateway + + ```bash + openclaw config set agents.defaults.memorySearch.provider lmstudio + openclaw gateway restart + ``` +
+
+ +If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) + + + + + + +LM Link is a new feature in LM Studio that provides a way to access local models across devices, wherever you are. Links are custom made, end-to-end encrypted networks intended for loading and serving LLMs across devices you own, made possible in partnership with Tailscale. + +What can I do with LM Link? [#what-can-i-do-with-lm-link] + +LM Link unlocks the full potential of your hardware by sharing compute across connected devices. For example, you might have a powerful desktop in your home office, and a lightweight laptop you carry on the go. With LM Link, you can run large open-weight models on a powerful machine, and use them seamlessly from your laptop as if they were local. All communication and data transfer between devices is always end-to-end encrypted, thanks to Tailscale. + +Use Cases [#use-cases] + +LM Link use cases span individuals as well as teams. + +You can manage a private link to keep your prized gaming GPU busy even when you're on the go. Moreover, LM Link allows you to set up LLM serving in a server and start using it with just few clicks. + +Use LM Link with [#use-lm-link-with] + +* **CLI** — manage LM Link from the terminal with [`lms link`](/docs/cli/link/link-enable) +* **REST API** — use remote models via the REST API with [LM Link](/docs/developer/core/lmlink) +* **Integrations** — use remote models with coding tools like Claude Code and Codex via [LM Link](/docs/integrations/lmlink) + + + + +Requires LM Studio 0.4.0 or newer. [#requires-lm-studio-040-or-newer] + +LM Studio supports API Tokens for authentication, providing a secure and convenient way to access the LM Studio API. + +By default, the LM Studio API runs **without enforcing authentication**. For production or shared environments, enable API Token authentication for secure access. + + + To enable API Token authentication, create tokens and control granular permissions, check [this guide](/docs/developer/core/authentication) for more details. + + +Providing the API Token [#providing-the-api-token] + +There are two ways to provide the API Token when creating an instance of `LMStudioClient`: + +1. **Environment Variable (Recommended)**: Set the `LM_API_TOKEN` environment variable, and the SDK will automatically read it. +2. **Function Argument**: Pass the token directly as the `apiToken` parameter in the constructor. + + + + + Environment Variable + + + + Function Argument + + + + + ```typescript + // Set environment variables in your terminal before running the code: + // export LM_API_TOKEN="your-token-here" + + import { LMStudioClient } from "@lmstudio/sdk"; + // The SDK automatically reads from LM_API_TOKEN environment variable + const client = new LMStudioClient(); + + const model = await client.llm.model("qwen/qwen3-4b-2507"); + const result = await model.respond("What is the meaning of life?"); + + console.info(result.content); + ``` + + + + ```typescript + import { LMStudioClient } from "@lmstudio/sdk"; + const client = new LMStudioClient({ + apiToken: "your-token-here", + }); + + const model = await client.llm.model("qwen/qwen3-4b-2507"); + const result = await model.respond("What is the meaning of life?"); + + console.info(result.content); + ``` + + + + + + +The SDK provides you a set of programmatic tools to interact with LLMs, embeddings models, and agentic flows. + +Installing the SDK [#installing-the-sdk] + +`lmstudio-js` is available as an npm package. You can install it using npm, yarn, or pnpm. + + + + + npm + + + + yarn + + + + pnpm + + + + + ```bash + npm install @lmstudio/sdk --save + ``` + + + + ```bash + yarn add @lmstudio/sdk + ``` + + + + ```bash + pnpm add @lmstudio/sdk + ``` + + + +For the source code and open source contribution, visit [lmstudio-js](https://github.com/lmstudio-ai/lmstudio-js) on GitHub. + +Features [#features] + +* Use LLMs to [respond in chats](./typescript/llm-prediction/chat-completion) or predict [text completions](./typescript/llm-prediction/completion) +* Define functions as tools, and turn LLMs into [autonomous agents](./typescript/agent/act) that run completely locally +* [Load](./typescript/manage-models/loading), [configure](./typescript/llm-prediction/parameters), and [unload](./typescript/manage-models/loading) models from memory +* Supports for both browser and any Node-compatible environments +* Generate embeddings for text, and more! + +Quick Example: Chat with a Llama Model [#quick-example-chat-with-a-llama-model] + +```typescript title="index.ts" +import { LMStudioClient } from "@lmstudio/sdk"; +const client = new LMStudioClient(); + +const model = await client.llm.model("qwen/qwen3-4b-2507"); +const result = await model.respond("What is the meaning of life?"); + +console.info(result.content); +``` + +Getting Local Models [#getting-local-models] + +The above code requires the [qwen3-4b-2507](https://lmstudio.ai/models/qwen/qwen3-4b-2507). If you don't have the model, run the following command in the terminal to download it. + +```bash +lms get qwen/qwen3-4b-2507 +``` + +Read more about `lms get` in LM Studio's CLI [here](./cli/get). + + + + +`@lmstudio/sdk` is a library published on npm that allows you to use `lmstudio-js` in your own projects. It is open source and it's developed on GitHub. You can find the source code [here](https://github.com/lmstudio-ai/lmstudio-js). + +Creating a New `node` Project [#creating-a-new-node-project] + +Use the following command to start an interactive project setup: + + + + + TypeScript (Recommended) + + + + Javascript + + + + + ```bash + lms create node-typescript + ``` + + + + ```bash + lms create node-javascript + ``` + + + +Add `lmstudio-js` to an Exiting Project [#add-lmstudio-js-to-an-exiting-project] + +If you have already created a project and would like to use `lmstudio-js` in it, you can install it using npm, yarn, or pnpm. + + + + + npm + + + + yarn + + + + pnpm + + + + + ```bash + npm install @lmstudio/sdk --save + ``` + + + + ```bash + yarn add @lmstudio/sdk + ``` + + + + ```bash + pnpm add @lmstudio/sdk + ``` + + + + + + + + +Explore the docs [#explore-the-docs] + + + + + + + + + + + + + + + +To get LM Studio, head over to the [Downloads page](/download) and download an installer for your operating system. + +LM Studio is available for macOS, Windows, and Linux. + +What can I do with LM Studio? [#what-can-i-do-with-lm-studio] + +1. Download and run local LLMs like gpt-oss or Llama, Qwen +2. Use a simple and flexible chat interface +3. Connect MCP servers and use them with local models +4. Search & download functionality (via Hugging Face 🤗) +5. Serve local models on OpenAI-like endpoints, locally and on the network +6. Manage your local models, prompts, and configurations + +System requirements [#system-requirements] + +LM Studio generally supports Apple Silicon Macs, x64/ARM64 Windows PCs, and x64 Linux PCs. + +Consult the [System Requirements](app/system-requirements) page for more detailed information. + +Run llama.cpp (GGUF) or MLX models [#run-llamacpp-gguf-or-mlx-models] + +LM Studio supports running LLMs on Mac, Windows, and Linux using [`llama.cpp`](https://github.com/ggerganov/llama.cpp). + +On Apple Silicon Macs, LM Studio also supports running LLMs using Apple's [`MLX`](https://github.com/ml-explore/mlx). + +To install or manage LM Runtimes, press `⌘` `Shift` `R` on Mac or `Ctrl` `Shift` `R` on Windows/Linux. + +LM Studio as an MCP client [#lm-studio-as-an-mcp-client] + +You can install MCP servers in LM Studio and use them with your local models. + +See the docs for more: [Use MCP server](/docs/app/plugins/mcp). + +If you're develping an MCP server, check out [Add to LM Studio Button](/docs/app/plugins/mcp/deeplink). + +Run an LLM like `gpt-oss`, `Llama`, `Qwen`, `Mistral`, or `DeepSeek R1` on your computer [#run-an-llm-like-gpt-oss-llama-qwen-mistral-or-deepseek-r1-on-your-computer] + +To run an LLM on your computer you first need to download the model weights. + +You can do this right within LM Studio! See [Download an LLM](app/basics/download-model) for guidance. + +Chat with documents entirely offline on your computer [#chat-with-documents-entirely-offline-on-your-computer] + +You can attach documents to your chat messages and interact with them entirely offline, also known as "RAG". + +Read more about how to use this feature in the [Chat with Documents](app/basics/rag) guide. + +Run LM Studio without the GUI (llmster) [#run-lm-studio-without-the-gui-llmster] + +llmster is the headless version of LM Studio, no desktop app required. It's ideal for servers, CI environments, or any machine where you don't need a GUI. + +Learn more: [Headless Mode](/docs/developer/core/headless). + +Use LM Studio's API from your own apps and scripts [#use-lm-studios-api-from-your-own-apps-and-scripts] + +LM Studio provides a REST API that you can use to interact with your local models from your own apps and scripts. + +* [OpenAI Compatibility API](api/openai-api) +* [LM Studio REST API (beta)](api/rest-api) + +
+ +Community [#community] + +Join the LM Studio community on [Discord](https://discord.gg/aPQfnNkxGC) to ask questions, share knowledge, and get help from other users and the LM Studio team. + + + + + + In general, LM Studio does not require the internet in order to work. This includes core functions like chatting with models, chatting with documents, or running a local server, none of which require the internet. + + +Operations that do NOT require connectivity [#operations-that-do-not-require-connectivity] + +Using downloaded LLMs [#using-downloaded-llms] + +Once you have an LLM onto your machine, the model will run locally and you should be good to go entirely offline. Nothing you enter into LM Studio when chatting with LLMs leaves your device. + +Chatting with documents (RAG) [#chatting-with-documents-rag] + +When you drag and drop a document into LM Studio to chat with it or perform RAG, that document stays on your machine. All document processing is done locally, and nothing you upload into LM Studio leaves the application. + +Running a local server [#running-a-local-server] + +LM Studio can be used as a server to provide LLM inferencing on localhost or the local network. Requests to LM Studio use OpenAI endpoints and return OpenAI-like response objects, but stay local. + +Operations that require connectivity [#operations-that-require-connectivity] + +Several operations, described below, rely on internet connectivity. Once you get an LLM onto your machine, you should be good to go entirely offline. + +Searching for models [#searching-for-models] + +When you search for models in the Discover tab, LM Studio makes network requests (e.g. to huggingface.co). Search will not work without internet connection. + +Downloading new models [#downloading-new-models] + +In order to download models you need a stable (and decently fast) internet connection. You can also 'sideload' models (use models that were procured outside the app). See instructions for [sideloading models](/docs/advanced/sideload). + +Discover tab's model catalog [#discover-tabs-model-catalog] + +Any given version of LM Studio ships with an initial model catalog built-in. The entries in the catalog are typically the state of the online catalog near the moment we cut the release. However, in order to show stats and download options for each model, we need to make network requests (e.g. to huggingface.co). + +Downloading runtimes [#downloading-runtimes] + +[LM Runtimes](advanced/lm-runtimes) are individually packaged software libraries, or LLM engines, that allow running certain formats of models (e.g. `llama.cpp`). As of LM Studio 0.3.0 (read the [announcement](https://lmstudio.ai/blog/lmstudio-v0.3.0)) it's easy to download and even hot-swap runtimes without a full LM Studio update. To check for available runtimes, and to download them, we need to make network requests. + +Checking for app updates [#checking-for-app-updates] + +On macOS and Windows, LM Studio has a built-in app updater that's capable. The linux in-app updater [is in the works](https://github.com/lmstudio-ai/lmstudio-bug-tracker/issues/89). When you open LM Studio, the app updater will make a network request to check if there are any new updates available. If there's a new version, the app will show you a notification to update now or later. +Without internet connectivity you will not be able to update the app via the in-app updater. + + + + +macOS [#macos] + +* Chip: Apple Silicon (M1/M2/M3/M4). +* macOS 14.0 or newer is required. +* 16GB+ RAM recommended. + * You may still be able to use LM Studio on 8GB Macs, but stick to smaller models and modest context sizes. +* Intel-based Macs are currently not supported. Chime in [here](https://github.com/lmstudio-ai/lmstudio-bug-tracker/issues/9) if you are interested in this. + +Windows [#windows] + +LM Studio is supported on both x64 and ARM (Snapdragon X Elite) based systems. + +* CPU: AVX2 instruction set support is required (for x64) +* RAM: LLMs can consume a lot of RAM. At least 16GB of RAM is recommended. +* GPU: at least 4GB of dedicated VRAM is recommended. + +Linux [#linux] + +LM Studio is supported on both x64 and ARM64 (aarch64) based systems. + +* LM Studio for Linux is distributed as an AppImage. +* Ubuntu 20.04 or newer is required +* Ubuntu versions newer than 22 are not well tested. Let us know if you're running into issues by opening a bug [here](https://github.com/lmstudio-ai/lmstudio-bug-tracker). +* CPU: + * On x64, LM Studio ships with AVX2 support by default + + + + +LM Studio has a ChatGPT-like interface for chatting with local LLMs. You can create many different conversation threads and manage them in folders. + +
+ +Create a new chat [#create-a-new-chat] + +You can create a new chat by clicking the "+" button or by using a keyboard shortcut: `⌘` + `N` on Mac, or `ctrl` + `N` on Windows / Linux. + +Create a folder [#create-a-folder] + +Create a new folder by clicking the new folder button or by pressing: `⌘` + `shift` + `N` on Mac, or `ctrl` + `shift` + `N` on Windows / Linux. + +Drag and drop [#drag-and-drop] + +You can drag and drop chats in and out of folders, and even drag folders into folders! + +Duplicate chats [#duplicate-chats] + +You can duplicate a whole chat conversation by clicking the `•••` menu and selecting "Duplicate". If the chat has any files in it, they will be duplicated too. + +Split view in chat [#split-view-in-chat] + +You can view two chats side by side by dragging and dropping chat tabs to either half of the window. Alternatively, use the split view icon at the top right of a chat window to split left or right. + +Close one side of the split view with the 'x' button in the top right of each pane. + +FAQ [#faq] + +Where are chats stored in the file system? [#where-are-chats-stored-in-the-file-system] + +Right-click on a chat and choose "Reveal in Finder" / "Show in File Explorer". +Conversations are stored in JSON format. It is NOT recommended to edit them manually, nor to rely on their structure. + +Does the model learn from chats? [#does-the-model-learn-from-chats] + +The model doesn't 'learn' from chats. The model only 'knows' the content that is present in the chat or is provided to it via configuration options such as the "system prompt". + +Conversations folder filesystem path [#conversations-folder-filesystem-path] + +Mac / Linux: + +```shell +~/.lmstudio/conversations/ +``` + +Windows: + +```ps +%USERPROFILE%\.lmstudio\conversations +``` + +
+ +Community [#community] + +Chat with other LM Studio users, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). + + + + +LM Studio comes with a built-in model downloader that let's you download any supported model from [Hugging Face](https://huggingface.co). + + + +
+ +Searching for models [#searching-for-models] + +You can search for models by keyword (e.g. `llama`, `gemma`, `lmstudio`), or by providing a specific `user/model` string. You can even insert full Hugging Face URLs into the search bar! + +Pro tip: you can jump to the Discover tab from anywhere by pressing `⌘` + `2` on Mac, or `ctrl` + `2` on Windows / Linux. [#pro-tip-you-can-jump-to-the-discover-tab-from-anywhere-by-pressing---2-on-mac-or-ctrl--2-on-windows--linux] + +Which download option to choose? [#which-download-option-to-choose] + +You will often see several options for any given model named things like `Q3_K_S`, `Q_8` etc. These are all copies of the same model, provided in varying degrees of fidelity. The `Q` represents a technique called "Quantization", which roughly means compressing model files in size, while giving up some degree of quality. + +Choose a 4-bit option or higher if your machine is capable enough for running it. + + + +
+ +`Advanced` + +Changing the models directory [#changing-the-models-directory] + +You can change the models directory by heading to My Models + + + +
+ +Community [#community] + +Chat with other LM Studio users, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). + + + + + + +Double check computer meets the minimum [system requirements](/docs/system-requirements). + + + You might sometimes see terms such as `open-source models` or `open-weights models`. Different models might be released under different licenses and varying degrees of 'openness'. In order to run a model locally, you need to be able to get access to its "weights", often distributed as one or more files that end with `.gguf`, `.safetensors` etc. + + +
+ +Getting up and running [#getting-up-and-running] + +First, **install the latest version of LM Studio**. You can get it from [here](/download). + +Once you're all set up, you need to **download your first LLM**. + + + +

+ Download an LLM to your computer +

+ + Head over to the Discover tab to download models. Pick one of the curated options or search for models by search query (e.g. `"Llama"`). See more in-depth information about downloading models [here](/docs/basics/download-models). + + +
+ + +

+ Load a model to memory +

+ + Head over to the **Chat** tab, and + + 1. Open the model loader + 2. Select one of the models you downloaded (or [sideloaded](/docs/advanced/sideload)). + 3. Optionally, choose load configuration parameters. + + + +

+ What does loading a model mean? +

+ + Loading a model typically means allocating memory to be able to accommodate the model's weights and other parameters in your computer's RAM. +
+ + +

+ Chat! +

+ + Once the model is loaded, you can start a back-and-forth conversation with the model in the Chat tab. + + +
+
+ +
+ +Community [#community] + +Chat with other LM Studio users, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). + + + + +LM Studio app, llmster, and lms [#lm-studio-app-llmster-and-lms] + +The LM Studio app, llmster, and `lms` are three different tools offered by LM Studio to make use of local AI easy and accessible. + +LM Studio (the desktop app) [#lm-studio-the-desktop-app] + +The LM Studio app is a user-friendly graphical interface containing the full capabilities of LM Studio. + +Notable capabilities: [#notable-capabilities] + +* Search and download models from Hugging Face +* Chat with models through a built-in chat interface +* Upload and chat documents (RAG) +* Configure model settings, prompt templates, and presets +* Run a local server with through native REST APIs or OpenAI/Anthropic compatible endpoints +* Connect MCP servers and use them with local models + +The desktop app is the easiest starting point if you're new to running models locally or prefer a graphical interface. + +llmster (the headless daemon) [#llmster-the-headless-daemon] + +llmster is LM Studio’s headless daemon – a standalone background service that can run without a GUI. This means you do not have to download the LM Studio app to use llmster via the terminal. + +llmster becomes useful when you need to run LM Studio: + +* On a Linux server or cloud instance +* On a GPU rig without a screen or display +* In a CI/CD pipeline +* As a background service that starts on machine boot + And more! + +Because llmster runs independently of the desktop app, you can get the full model-serving capabilities of LM Studio in environments where installing or launching a GUI application isn't practical. + +Learn more and install llmster [here](https://lmstudio.ai/docs/developer/core/headless) + +lms (the CLI) [#lms-the-cli] + +`lms` is LM Studio's CLI (command-line interface). It lets you interact with both the LM Studio desktop app and llmster, and manage your models directly from a terminal. + +`lms` is included automatically upon downloading the app or llmster. + +**Common commands:** + +```bash +lms get # Download a model +lms load # Load a model into memory +lms ls # List models available on disk +lms server start # Start the local HTTP server +lms chat # Start an interactive chat session in the terminal +lms log stream # Stream incoming and outgoing request logs +``` + +If LM Studio isn't already running when you run an `lms` command, it will start running automatically. + +**Example commands to download and serve a model:** + +```bash +lms get openai/gpt-oss-20b +lms load openai/gpt-oss-20b +lms server start +``` + +Once the server is running, it listens on [http://localhost:1234](http://localhost:1234). Point any SDK or compatible tool at our OpenAI or Anthropic-compatible endpoints to use your LM Studio models. + +In short, `lms` is the command-line tool to talk to both, the desktop app or llmster. + + + + +You can attach document files (`.docx`, `.pdf`, `.txt`) to chat sessions in LM Studio. + +This will provide additional context to LLMs you chat with through the app. + +
+ +Terminology [#terminology] + +* **Retrieval**: Identifying relevant portion of a long source document +* **Query**: The input to the retrieval operation +* **RAG**: Retrieval-Augmented Generation\* +* **Context**: the 'working memory' of an LLM. Has a maximum size + +\* In this context, 'Generation' means the output of the LLM. [#-in-this-context-generation-means-the-output-of-the-llm] + +Context sizes are measured in "tokens". One token is often about 3/4 of a word. [#context-sizes-are-measured-in-tokens-one-token-is-often-about-34-of-a-word] + +RAG vs. Full document 'in context' [#rag-vs-full-document-in-context] + +If the document is short enough (i.e., if it fits in the model's context), LM Studio will add the file contents to the conversation in full. This is particularly useful for models that support longer context sizes such as Meta's Llama 3.1 and Mistral Nemo. + +If the document is very long, LM Studio will opt into using "Retrieval Augmented Generation", frequently referred to as "RAG". RAG means attempting to fish out relevant bits of a very long document (or several documents) and providing them to the model for reference. This technique sometimes works really well, but sometimes it requires some tuning and experimentation. + +Tip for successful RAG [#tip-for-successful-rag] + +provide as much context in your query as possible. Mention terms, ideas, and words you expect to be in the relevant source material. This will often increase the chance the system will provide useful context to the LLM. As always, experimentation is the best way to find what works best. + + + + +You can install MCP servers in LM Studio with one click using a deeplink. + +Starting with version 0.3.17 (10), LM Studio can act as an MCP host. Learn more about it [here](../mcp). + +*** + +Generate your own MCP install link [#generate-your-own-mcp-install-link] + +Enter your MCP JSON entry to generate a deeplink for the `Add to LM Studio` button. + + + +Try an example [#try-an-example] + +Try to copy and paste the following into the link generator above. + +```json +{ + "hf-mcp-server": { + "url": "https://huggingface.co/mcp", + "headers": { + "Authorization": "Bearer " + } + } +} +``` + +Deeplink format [#deeplink-format] + +```bash +lmstudio://add_mcp?name=hf-mcp-server&config=eyJ1cmwiOiJodHRwczovL2h1Z2dpbmdmYWNlLmNvL21jcCIsImhlYWRlcnMiOnsiQXV0aG9yaXphdGlvbiI6IkJlYXJlciA8WU9VUl9IRl9UT0tFTj4ifX0%3D +``` + +Parameters [#parameters] + + + + + + +Starting LM Studio 0.3.17, LM Studio acts as an **Model Context Protocol (MCP) Host**. This means you can connect MCP servers to the app and make them available to your models. + +Be cautious [#be-cautious] + +Never install MCPs from untrusted sources. + + + Some MCP servers can run arbitrary code, access your local files, and use your network connection. Always be cautious when installing and using MCP servers. If you don't trust the source, don't install it. + + +Use MCP servers in LM Studio [#use-mcp-servers-in-lm-studio] + +Starting 0.3.17 (b10), LM Studio supports both local and remote MCP servers. You can add MCPs by editing the app's `mcp.json` file or via the ["Add to LM Studio" Button](mcp/deeplink), when available. LM Studio currently follows Cursor's `mcp.json` notation. + +Install new servers: `mcp.json` [#install-new-servers-mcpjson] + +Switch to the "Program" tab in the right hand sidebar. Click `Install > Edit mcp.json`. + + + +This will open the `mcp.json` file in the in-app editor. You can add MCP servers by editing this file. + + + +Example MCP to try: Hugging Face MCP Server [#example-mcp-to-try-hugging-face-mcp-server] + +This MCP server provides access to functions like model and dataset search. + + + +```json +{ + "mcpServers": { + "hf-mcp-server": { + "url": "https://huggingface.co/mcp", + "headers": { + "Authorization": "Bearer " + } + } + } +} +``` + +You will need to replace `` with your actual Hugging Face token. Learn more [here](https://huggingface.co/docs/hub/en/security-tokens). + +Use the [deeplink button](mcp/deeplink), or copy the JSON snippet above and paste it into your `mcp.json` file. + +*** + +Gotchas and Troubleshooting [#gotchas-and-troubleshooting] + +* Never install MCP servers from untrusted sources. Some MCPs can have far reaching access to your system. + +* Some MCP servers were designed to be used with Claude, ChatGPT, Gemini and might use excessive amounts of tokens. + * Watch out for this. It may quickly bog down your local model and trigger frequent context overflows. + +* When adding MCP servers manually, copy only the content after `"mcpServers": {` and before the closing `}`. + + + + +`Draft` + +[`model.yaml`](https://modelyaml.org) describes a model and all of its variants in a single portable file. Models in LM Studio's [model catalog](https://lmstudio.ai/models) are all implemented using model.yaml. + +This allows abstracting away the underlying format (GGUF, MLX, etc) and presenting a single entry point for a given model. Furthermore, the model.yaml file supports baking in additional metadata, load and inference options, and even custom logic (e.g. enable/disable thinking). + +**You can clone existing model.yaml files on the LM Studio Hub and even [publish your own](./modelyaml/publish)!** + +Core fields [#core-fields] + +`model` [#model] + +The canonical identifier in the form `publisher/model`. + +```yaml +model: qwen/qwen3-8b +``` + +`base` [#base] + +Points to the "concrete" model files or other virtual models. Each entry uses a unique `key` and one or more `sources` from which the file can be fetched. + +The snippet below demonstrates a case where the model (`qwen/qwen3-8b`) can resolve to one of 3 different concrete models. + +```yaml +model: qwen/qwen3-8b +base: + - key: lmstudio-community/qwen3-8b-gguf + sources: + - type: huggingface + user: lmstudio-community + repo: Qwen3-8B-GGUF + - key: lmstudio-community/qwen3-8b-mlx-4bit + sources: + - type: huggingface + user: lmstudio-community + repo: Qwen3-8B-MLX-4bit + - key: lmstudio-community/qwen3-8b-mlx-8bit + sources: + - type: huggingface + user: lmstudio-community + repo: Qwen3-8B-MLX-8bit +``` + +Concrete model files refer to the actual weights. + +`metadataOverrides` [#metadataoverrides] + +Overrides the base model's metadata. This is useful for presentation purposes, for example in LM Studio's model catalog or in app model search. It is not used for any functional changes to the model. + +```yaml +metadataOverrides: + domain: llm + architectures: + - qwen3 + compatibilityTypes: + - gguf + - safetensors + paramsStrings: + - 8B + minMemoryUsageBytes: 4600000000 + contextLengths: + - 40960 + vision: false + reasoning: true + trainedForToolUse: true +``` + +`config` [#config] + +Use this to "bake in" default runtime settings (such as sampling parameters) and even load time options. +This works similarly to [Per Model Defaults](/docs/app/advanced/per-model). + +* `operation:` inference time parameters +* `load:` load time parameters + +```yaml +config: + operation: + fields: + - key: llm.prediction.topKSampling + value: 20 + - key: llm.prediction.temperature + value: 0.7 + load: + fields: + - key: llm.load.contextLength + value: 42690 +``` + +`customFields` [#customfields] + +Define model-specific custom fields. + +```yaml +customFields: + - key: enableThinking + displayName: Enable Thinking + description: Controls whether the model will think before replying + type: boolean + defaultValue: true + effects: + - type: setJinjaVariable + variable: enable_thinking +``` + +In order for the above example to work, the jinja template needs to have a variable named `enable_thinking`. + +Complete example [#complete-example] + +Taken from [https://lmstudio.ai/models/qwen/qwen3-8b](https://lmstudio.ai/models/qwen/qwen3-8b) + +```yaml +# model.yaml is an open standard for defining cross-platform, composable AI models +# Learn more at https://modelyaml.org +model: qwen/qwen3-8b +base: + - key: lmstudio-community/qwen3-8b-gguf + sources: + - type: huggingface + user: lmstudio-community + repo: Qwen3-8B-GGUF + - key: lmstudio-community/qwen3-8b-mlx-4bit + sources: + - type: huggingface + user: lmstudio-community + repo: Qwen3-8B-MLX-4bit + - key: lmstudio-community/qwen3-8b-mlx-8bit + sources: + - type: huggingface + user: lmstudio-community + repo: Qwen3-8B-MLX-8bit +metadataOverrides: + domain: llm + architectures: + - qwen3 + compatibilityTypes: + - gguf + - safetensors + paramsStrings: + - 8B + minMemoryUsageBytes: 4600000000 + contextLengths: + - 40960 + vision: false + reasoning: true + trainedForToolUse: true +config: + operation: + fields: + - key: llm.prediction.topKSampling + value: 20 + - key: llm.prediction.minPSampling + value: + checked: true + value: 0 +customFields: + - key: enableThinking + displayName: Enable Thinking + description: Controls whether the model will think before replying + type: boolean + defaultValue: true + effects: + - type: setJinjaVariable + variable: enable_thinking +``` + +The [GitHub specification](https://github.com/modelyaml/modelyaml) contains further details and the latest schema. + + + + +Share portable models by uploading a [`model.yaml`](./) to your page on the LM Studio Hub. + +After you publish a model.yaml to the LM Studio Hub, it will be available for other users to download with `lms get`. + +Note: `model.yaml` refers to metadata only. This means it does not include the actual model weights. [#note-modelyaml-refers-to-metadata-only-this-means-it-does-not-include-the-actual-model-weights] + +Quickstart [#quickstart] + +The easiest way to get started is by cloning an existing model, modifying it, and then running `lms push`. + +For example, you can clone the Qwen 3 8B model: + +```shell +lms clone qwen/qwen3-8b +``` + +This will result in a local copy `model.yaml`, `README` and other metadata files. Importantly, this does NOT download the model weights. + +```bash title="Terminal" +$ ls +README.md manifest.json model.yaml thumbnail.png +``` + +Change the publisher to your user [#change-the-publisher-to-your-user] + +The first part in the `model:` field should be the username of the publisher. Change it to a username of a user or organization for which you have write access. + +```diff +- model: qwen/qwen3-8b ++ model: your-user-here/qwen3-8b +base: + - key: lmstudio-community/qwen3-8b-gguf + sources: +# ... the rest of the file +``` + +Sign in [#sign-in] + +Authenticate with the Hub from the command line: + +```shell +lms login +``` + +The CLI will print an authentication URL. After you approve access, the session token is saved locally so you can publish models. + +Publish your model [#publish-your-model] + +Run the push command in the directory containing `model.yaml`: + +```shell +lms push +``` + +The command packages the file, uploads it, and prints a revision number for the new version. + +Override metadata at publish time [#override-metadata-at-publish-time] + +Use `--overrides` to tweak fields without editing the file: + +```shell +lms push --overrides '{"description": "Qwen 3 8B model"}' +``` + +Downloading a model and using it in LM Studio [#downloading-a-model-and-using-it-in-lm-studio] + +After publishing, the model appears under your user or organization profile on the LM Studio Hub. + +It can then be downloaded with: + +```shell +lms get my-user/my-model +``` + + + + +You can import preset by file or URL. This is useful for sharing presets with others, or for importing presets from other users. + +
+ +Import Presets [#import-presets] + +First, click the presets dropdown in the sidebar. You will see a list of your presets along with 2 buttons: `+ New Preset` and `Import`. + +Click the `Import` button to import a preset. + + + +Import Presets from File [#import-presets-from-file] + +Once you click the Import button, you can select the source of the preset you want to import. You can either import from a file or from a URL. + +Import Presets from URL [#import-presets-from-url] + +Presets that are [published](/docs/app/presets/publish) to the LM Studio Hub can be imported by providing their URL. + +Importing public presets does not require logging in within LM Studio. + + + +Using `lms` CLI [#using-lms-cli] + +You can also use the CLI to import presets from URL. This is useful for sharing presets with others. + +``` +lms get {author}/{preset-name} +``` + +Example: + +```bash +lms get neil/qwen3-thinking +``` + +Find your config-presets directory [#find-your-config-presets-directory] + +LM Studio manages config presets on disk. Presets are local and private by default. You or others can choose to share them by sharing the file. + +Click on the `•••` button in the Preset dropdown and select "Reveal in Finder" (or "Show in Explorer" on Windows). + +This will download the preset file and automatically surface it in the preset dropdown in the app. + +Where Hub shared presets are stored [#where-hub-shared-presets-are-stored] + +Presets you share, and ones you download from the LM Studio Hub are saved in `~/.lmstudio/hub` on macOS and Linux, or `%USERPROFILE%\.lmstudio\hub` on Windows. + + + + +Presets are a way to bundle together a system prompt and other parameters into a single configuration that can be easily reused across different chats. + +New in 0.3.15: You can [import](/docs/app/presets/import) Presets from file or URL, and even [publish](/docs/app/presets/publish) your own Presets to share with others on to the LM Studio Hub. + +
+ +Saving, resetting, and deselecting Presets [#saving-resetting-and-deselecting-presets] + +Below is the anatomy of the Preset manager: + + + +Importing, Publishing, and Updating Downloaded Presets [#importing-publishing-and-updating-downloaded-presets] + +Presets are JSON files. You can share them by sending around the JSON, or you can share them by publishing them to the LM Studio Hub. +You can also import Presets from other users by URL. See the [Import](/docs/app/presets/import) and [Publish](/docs/app/presets/publish) sections for more details. + +Example: Build your own Prompt Library [#example-build-your-own-prompt-library] + +You can create your own prompt library by using Presets. + + + +In addition to system prompts, every parameter under the Advanced Configuration sidebar can be recorded in a named Preset. + +For example, you might want to always use a certain Temperature, Top P, or Max Tokens for a particular use case. You can save these settings as a Preset (with or without a system prompt) and easily switch between them. + +The Use Case for Presets [#the-use-case-for-presets] + +* Save your system prompts, inference parameters as a named `Preset`. +* Easily switch between different use cases, such as reasoning, creative writing, multi-turn conversations, or brainstorming. + +Where Presets are stored [#where-presets-are-stored] + +Presets are stored in the following directory: + +macOS or Linux [#macos-or-linux] + +```xml +~/.lmstudio/config-presets +``` + +Windows [#windows] + +```xml +%USERPROFILE%\.lmstudio\config-presets +``` + +Migration from LM Studio 0.2.* Presets [#migration-from-lm-studio-02-presets] + +* Presets you've saved in LM Studio 0.2.\* are automatically readable in 0.3.3 with no migration step needed. +* If you save **new changes** in a **legacy preset**, it'll be **copied** to a new format upon save. + * The old files are NOT deleted. +* Notable difference: Load parameters are not included in the new preset format. + * Favor editing the model's default config in My Models. See [how to do it here](/docs/configuration/per-model). + +
+ +Community [#community] + +Chat with other LM Studio users, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). + + + + +`Feature In Preview` + +Starting LM Studio 0.3.15, you can publish your Presets to the LM Studio community. This allows you to share your Presets with others and import Presets from other users. + +This feature is early and we would love to hear your feedback. Please report bugs and feedback to [bugs@lmstudio.ai](mailto:bugs@lmstudio.ai). + +*** + +Step 1: Click the Publish Button [#step-1-click-the-publish-button] + +Identify the Preset you want to publish in the Preset dropdown. Click the `•••` button and select "Publish" from the menu. + + + +Step 2: Set the Preset Details [#step-2-set-the-preset-details] + +You will be prompted to set the details of your Preset. This includes the name (slug) and optional description. + +Community presets are public and can be used by anyone on the internet! + + + +Privacy and Terms [#privacy-and-terms] + +For good measure, visit the [Privacy Policy](https://lmstudio.ai/hub-privacy) and [Terms of Service](https://lmstudio.ai/hub-terms) to understand what's suitable to share on the Hub, and how data is handled. Community presets are public and visible to everyone. Make sure you agree to what these documents say before publishing your Preset. + + + + +`Feature In Preview` + +You can pull the latest revisions of your Presets, or presets you have imported from others. This is useful for keeping your Presets up to date with the latest changes. + +
+ +How to Pull Updates [#how-to-pull-updates] + +Click the `•••` button in the Preset dropdown and select "Pull" from the menu. + + + +Your Presets vs Others' [#your-presets-vs-others] + +Both your published Presets and other downloaded Presets can be pulled and updated the same way. + + + + + + +`Feature In Preview` + +Starting LM Studio 0.3.15, you can publish your Presets to the LM Studio community. This allows you to share your Presets with others and import Presets from other users. + +This feature is early and we would love to hear your feedback. Please report bugs and feedback to [bugs@lmstudio.ai](mailto:bugs@lmstudio.ai). + +*** + +Published Presets [#published-presets] + +Presets you share on the LM Studio Hub can be updated. + + + + + +

+ Make Changes and Commit +

+ + Make any changes to your Preset, both in parameters that are already included in the Preset, or by adding new parameters. +
+ + +

+ Click the Push Button +

+ + Once changes are committed, you will see a `Push` button. Click it to push your changes to the Hub. + + Pushing changes will result in a new revision of your Preset on the Hub. + + +
+
+ + + + +LM Studio is available in `English`, `Spanish`, `Japanese`, `Chinese`, `German`, `Norwegian`, `Turkish`, `Russian`, `Korean`, `Polish`, `Vietnamese`, `Czech`, `Ukrainian`, `Portuguese (BR,PT)` and many more languages thanks to incredible community localizers. + +
+ +Selecting a Language [#selecting-a-language] + +You can choose a language in the Settings tab. + +Use the dropdown menu under Preferences > Language. + + + You can jump to Settings from anywhere in the app by pressing `cmd` + `,` on macOS or `ctrl` + `,` on Windows/Linux. + + +To get to the Settings page, you need to be on Power User mode or higher. + +
+ +Big thank you to community localizers 🙏 [#big-thank-you-to-community-localizers-] + +* Spanish [@xtianpaiva](https://github.com/xtianpaiva), [@AlexisGross](https://github.com/AlexisGross), [@Tonband](https://github.com/Tonband) +* Norwegian [@Exlo84](https://github.com/Exlo84) +* German [@marcelMaier](https://github.com/marcelMaier), [@Goekdeniz-Guelmez](https://github.com/Goekdeniz-Guelmez) +* Romanian (ro) [@alexandrughinea](https://github.com/alexandrughinea) +* Turkish (tr) [@progesor](https://github.com/progesor), [@nossbar](https://github.com/nossbar) +* Russian [@shelomitsky](https://github.com/shelomitsky), [@mlatysh](https://github.com/mlatysh), [@Adjacentai](https://github.com/Adjacentai), [@HostFly](https://github.com/HostFly), [@MotyaDev](https://github.com/MotyaDev), [@Autumn-Whisper](https://github.com/Autumn-Whisper), [@seropheem](https://github.com/seropheem) +* Korean [@williamjeong2](https://github.com/williamjeong2) +* Polish [@danieltechdev](https://github.com/danieltechdev) +* Czech [@ladislavsulc](https://github.com/ladislavsulc) +* Vietnamese [@trinhvanminh](https://github.com/trinhvanminh), [@godkyo98](https://github.com/godkyo98) +* Portuguese (BR) [@Sm1g00l](https://github.com/Sm1g00l), [@altiereslima](https://github.com/altiereslima) +* Portuguese (PT) [@catarino](https://github.com/catarino) +* Chinese (zh-CN) [@neotan](https://github.com/neotan), [@SweetDream0256](https://github.com/SweetDream0256), [@enKl03B](https://github.com/enKl03B), [@evansrrr](https://github.com/evansrrr), [@xkonglong](https://github.com/xkonglong), [@shadow01a](https://github.com/shadow01a) +* Chinese (zh-HK), (zh-TW) [@neotan](https://github.com/neotan), [ceshizhuanyong895](https://github.com/ceshizhuanyong895), [@BrassaiKao](https://github.com/BrassaiKao) +* Chinese (zh-Hant) [@kywarai](https://github.com/kywarai), [ceshizhuanyong895](https://github.com/ceshizhuanyong895) +* Ukrainian (uk) [@hmelenok](https://github.com/hmelenok) +* Japanese (ja) [@digitalsp](https://github.com/digitalsp) +* Dutch (nl) [@alaaf11](https://github.com/alaaf11) +* Italian (it) [@fralapo](https://github.com/fralapo), [@Bl4ck-D0g](https://github.com/Bl4ck-D0g), [@nikypalma](https://github.com/nikypalma) +* Indonesian (id) [@dwirx](https://github.com/dwirx) +* Greek (gr) [@ilikecatgirls](https://github.com/ilikecatgirls) +* Swedish (sv) [@reinew](https://github.com/reinew) +* Catalan (ca) [@Gopro3010](https://github.com/Gopro3010) +* French [@Plexi09](https://github.com/Plexi09) +* Finnish (fi) [@divergentti](https://github.com/divergentti) +* Bengali (bn) [@AbiruzzamanMolla](https://github.com/AbiruzzamanMolla) +* Malayalam (ml) [@prasanthc41m](https://github.com/prasanthc41m) +* Thai (th) [@gnoparus](https://github.com/gnoparus) +* Bosnian (bs) [@0haris0](https://github.com/0haris0) +* Bulgarian (bg) [@DenisZekiria](https://github.com/DenisZekiria) +* Hindi (hi) [@suhailtajshaik](https://github.com/suhailtajshaik) +* Hungarian (hu) [@Mekemoka](https://github.com/Mekemoka) +* Persian (Farsi) (fa) [@mohammad007kh](https://github.com/mohammad007kh), [@darwindev](https://github.com/darwindev) +* Arabic (ar) [@haqbany](https://github.com/haqbany) + +Still under development (due to lack of RTL support in LM Studio) + +* Hebrew: [@NHLOCAL](https://github.com/NHLOCAL) + +Contributing to LM Studio localization [#contributing-to-lm-studio-localization] + +If you want to improve existing translations or contribute new ones, you're more than welcome to jump in. + +LM Studio strings are maintained in [https://github.com/lmstudio-ai/localization](https://github.com/lmstudio-ai/localization). + +See instructions for contributing [here](https://github.com/lmstudio-ai/localization/blob/main/README.md). + + + + +Enable Developer Mode [#enable-developer-mode] + +Developer Mode combines the previous Developer and Power User modes into a single mode with all advanced features enabled. You can enable Developer mode in Settings > Developer. + + + +Which mode should I choose? [#which-mode-should-i-choose] + +`User` [#user] + +Show only the chat interface, and auto-configure everything. This is the best choice for beginners or anyone who's happy with the default settings. + +`Developer` [#developer] + +Full access to all aspects in LM Studio. This includes keyboard shortcuts and development features. + +Use LM Studio in this mode if you want access to configurable [load](/docs/configuration/load) and [inference](/docs/configuration/inference) parameters as well as advanced chat features such as [insert, edit, & continue](/docs/advanced/context) (for either role, user or assistant). + + + + +Selecting a Theme [#selecting-a-theme] + +Press `Cmd` + `K` then `T` (macOS) or `Ctrl` + `K` then `T` (Windows/Linux) to open the theme selector. + +You can also choose a theme in the Settings tab (`Cmd` + `,` on macOS or `Ctrl` + `,` on Windows/Linux). + +Choosing the "Auto" option will automatically switch between Light and Dark themes based on your system settings. + + + + +You can use compatible models you've downloaded outside of LM Studio by placing them in the expected directory structure. + +
+ +Use `lms import` (experimental) [#use-lms-import-experimental] + +To import a `GGUF` model you've downloaded outside of LM Studio, run the following command in your terminal: + +```bash +lms import +``` + +Follow the interactive prompt to complete the import process. [#follow-the-interactive-prompt-to-complete-the-import-process] + +LM Studio's expected models directory structure [#lm-studios-expected-models-directory-structure] + + + +LM Studio aims to preserves the directory structure of models downloaded from Hugging Face. The expected directory structure is as follows: + +```xml +~/.lmstudio/models/ +└── publisher/ + └── model/ + └── model-file.gguf +``` + +For example, if you have a model named `ocelot-v1` published by `infra-ai`, the structure would look like this: + +```xml +~/.lmstudio/models/ +└── infra-ai/ + └── ocelot-v1/ + └── ocelot-v1-instruct-q4_0.gguf +``` + +
+ +Community [#community] + +Chat with other LM Studio users, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). + + + + +When loading a model, you can now set Max Concurrent Predictions to allow multiple requests to be processed in parallel, instead of queued. This is supported for LM Studio's llama.cpp engine, with MLX coming soon. + +Please make sure your GGUF runtime is upgraded to llama.cpp v2.0.0. + +
+ +Parallel Requests via Continuous Batching [#parallel-requests-via-continuous-batching] + +Parallel requests via continuous batching allows the LM Studio server to dynamically combine multiple requests into a single batch. This enables concurrent workflows and results in higher throughput. + +Setting Max Concurrent Predictions [#setting-max-concurrent-predictions] + +Open the model loader and toggle on Manually choose model load parameters. Select a model to load, and toggle on Show advanced settings to set Max Concurrent Predictions. By default, Max Concurrent Predictions is set to 4. + +Sending parallel requests to chats in Split View [#sending-parallel-requests-to-chats-in-split-view] + +Use the [split view in chat feature](/docs/basics/chat) to send two requests simultaneously to two chats and view them side by side. + + + + + + +`Advanced` + +You can set default load settings for each model in LM Studio. + +When the model is loaded anywhere in the app (including through [`lms load`](/docs/cli#load-a-model-with-options)) these settings will be used. + +
+ +Setting default parameters for a model [#setting-default-parameters-for-a-model] + +Head to the My Models tab and click on the gear ⚙️ icon to edit the model's default parameters. + + + +This will open a dialog where you can set the default parameters for the model. + + + +Next time you load the model, these settings will be used. + + + Reasons to set default load parameters (not required, totally optional) [#reasons-to-set-default-load-parameters-not-required-totally-optional] + + * Set a particular GPU offload settings for a given model + * Set a particular context size for a given model + * Whether or not to utilize Flash Attention for a given model + + +Advanced Topics [#advanced-topics] + +Changing load settings before loading a model [#changing-load-settings-before-loading-a-model] + +When you load a model, you can optionally change the default load settings. + + + +Saving your changes as the default settings for a model [#saving-your-changes-as-the-default-settings-for-a-model] + +If you make changes to load settings when you load a model, you can save them as the default settings for that model. + + + +
+ +Community [#community] + +Chat with other LM Studio power users, discuss configs, models, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). + + + + +`Advanced` + +By default, LM Studio will automatically configure the prompt template based on the model file's metadata. + +However, you can customize the prompt template for any model. + +
+ +Overriding the Prompt Template for a Specific Model [#overriding-the-prompt-template-for-a-specific-model] + +Head over to the My Models tab and click on the gear ⚙️ icon to edit the model's default parameters. + +Pro tip: you can jump to the My Models tab from anywhere by pressing `⌘` + `3` on Mac, or `ctrl` + `3` on Windows / Linux. [#pro-tip-you-can-jump-to-the-my-models-tab-from-anywhere-by-pressing---3-on-mac-or-ctrl--3-on-windows--linux] + +Customize the Prompt Template [#customize-the-prompt-template] + +💡 In most cases you don't need to change the prompt template [#-in-most-cases-you-dont-need-to-change-the-prompt-template] + +When a model doesn't come with a prompt template information, LM Studio will surface the `Prompt Template` config box in the **🧪 Advanced Configuration** sidebar. + + + +You can make this config box always show up by right clicking the sidebar and selecting **Always Show Prompt Template**. + +Prompt template options [#prompt-template-options] + +Jinja Template [#jinja-template] + +You can express the prompt template in Jinja. + +Jinja is a templating engine used to encode the prompt template in several popular LLM model file formats. [#jinja-is-a-templating-engine-used-to-encode-the-prompt-template-in-several-popular-llm-model-file-formats] + +Manual [#manual] + +You can also express the prompt template manually by specifying message role prefixes and suffixes. + +
+ +Reasons you might want to edit the prompt template: [#reasons-you-might-want-to-edit-the-prompt-template] + +1. The model's metadata is incorrect, incomplete, or LM Studio doesn't recognize it +2. The model does not have a prompt template in its metadata (e.g. custom or older models) +3. You want to customize the prompt template for a specific use case + + + + +`Advanced` + +Speculative decoding is a technique that can substantially increase the generation speed of large language models (LLMs) without reducing response quality. + +
+ +What is Speculative Decoding [#what-is-speculative-decoding] + +Speculative decoding relies on the collaboration of two models: + +* A larger, "main" model +* A smaller, faster "draft" model + +During generation, the draft model rapidly proposes potential tokens (subwords), which the main model can verify faster than it would take it to generate them from scratch. To maintain quality, the main model only accepts tokens that match what it would have generated. After the last accepted draft token, the main model always generates one additional token. + +For a model to be used as a draft model, it must have the same "vocabulary" as the main model. + +How to enable Speculative Decoding [#how-to-enable-speculative-decoding] + +On `Power User` mode or higher, load a model, then select a `Draft Model` within the `Speculative Decoding` section of the chat sidebar: + + + +Finding compatible draft models [#finding-compatible-draft-models] + +You might see the following when you open the dropdown: + + + +Try to download a lower parameter variant of the model you have loaded, if it exists. If no smaller versions of your model exist, find a pairing that does. + +For example: + +
+ +| Main Model | Draft Model | +| :--------------------------: | :---------------------------: | +| Llama 3.1 8B Instruct | Llama 3.2 1B Instruct | +| Qwen 2.5 14B Instruct | Qwen 2.5 0.5B Instruct | +| DeepSeek R1 Distill Qwen 32B | DeepSeek R1 Distill Qwen 1.5B | + +
+ +Once you have both a main and draft model loaded, simply begin chatting to enable speculative decoding. + +Key factors affecting performance [#key-factors-affecting-performance] + +Speculative decoding speed-up is generally dependent on two things: + +1. How small and fast the *draft model* is compared with the *main model* +2. How often the draft model is able to make "good" suggestions + +In simple terms, you want to choose a draft model that's much smaller than the main model. And some prompts will work better than others. + +An important trade-off [#an-important-trade-off] + +Running a draft model alongside a main model to enable speculative decoding requires more **computation and resources** than running the main model on its own. + +The key to faster generation of the main model is choosing a draft model that's both small and capable enough. + +Here are general guidelines for the **maximum** draft model size you should select based on main model size (in parameters): + +
+ +| Main Model Size | Max Draft Model Size to Expect Speed-Ups | +| :-------------: | :--------------------------------------: | +| 3B | - | +| 7B | 1B | +| 14B | 3B | +| 32B | 7B | + +
+ +Generally, the larger the size difference is between the main model and the draft model, the greater the speed-up. + +Note: if the draft model is not fast enough or effective enough at making "good" suggestions to the main model, the generation speed will not increase, and could actually decrease. + +Prompt dependent [#prompt-dependent] + +One thing you will likely notice when using speculative decoding is that the generation speed is not consistent across all prompts. + +The reason that the speed-up is not consistent across all prompts is because for some prompts, the draft model is less likely to make "good" suggestions to the main model. + +Here are some extreme examples that illustrate this concept: + +1\. Discrete Example: Mathematical Question [#1-discrete-example-mathematical-question] + +Prompt: "What is the quadratic equation formula?" + +In this case, both a 70B model and a 0.5B model are both very likely to give the standard formula `x = (-b ± √(b² - 4ac))/(2a)`. So if the draft model suggested this formula as the next tokens, the target model would likely accept it, making this an ideal case for speculative decoding to work efficiently. + +2\. Creative Example: Story Generation [#2-creative-example-story-generation] + +Prompt: "Write a story that begins: 'The door creaked open...'" + +In this case, the smaller model's draft tokens are likely be rejected more often by the larger model, as each next word could branch into countless valid possibilities. + +While "4" is the only reasonable answer to "2+2", this story could continue with "revealing a monster", "as the wind howled", "and Sarah froze", or hundreds of other perfectly valid continuations, making the smaller model's specific word predictions much less likely to match the larger +model's choices. + + + + +Requires LM Studio 0.4.0 or newer. [#requires-lm-studio-040-or-newer] + +LM Studio supports API Tokens for authentication, providing a secure and convenient way to access the LM Studio API. + +Require Authentication for each request [#require-authentication-for-each-request] + +By default, LM Studio does not require authentication for API requests. To enable authentication so that only requests with a valid API Token are accepted, toggle the switch in the Developers Page > Server Settings. + + + Once enabled, all requests made through the REST API, Python SDK, or Typescript SDK will need to include a valid API Token. See usage [below](#api-token-usage). + + + + + + +Creating API Tokens [#creating-api-tokens] + +To create API Tokens, click on Manage Tokens in the Server Settings. It will open the API Tokens modal where you can create, view, and delete API Tokens. + + + +Create a token by clicking on the Create Token button. Provide a name for the token and select the desired permissions. + + + +Once created, make sure to copy the token as it will not be shown again. + + + +Configuring API Token Permissions [#configuring-api-token-permissions] + +To edit the permissions of an existing API Token, click on the Edit button next to the token in the API Tokens modal. You can modify the name and permissions of the token. + + + +API Token Usage [#api-token-usage] + +Using API Tokens with REST API: [#using-api-tokens-with-rest-api] + + + The example below requires [allowing calling servers from mcp.json](/docs/developer/core/server/settings) to be enabled and the [Playwright MCP](https://github.com/microsoft/playwright-mcp) in mcp.json. + + +```bash +curl -X POST \ + http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "Open lmstudio.ai", + "integrations": [ + { + "type": "plugin", + "id": "mcp/playwright", + "allowed_tools": ["browser_navigate"] + } + ], + "context_length": 8000 + }' +``` + +Using API Tokens with Python SDK [#using-api-tokens-with-python-sdk] + +To use API tokens with the Python SDK, see the [Python SDK guide](/docs/python/getting-started/authentication). + +Using API Tokens with TypeScript SDK [#using-api-tokens-with-typescript-sdk] + +To use API tokens with the TypeScript SDK, see the [TS SDK guide](/docs/typescript/authentication). + + + + +LM Studio can be run as a background service without the GUI. There are two ways to do this: + +1. **llmster** (recommended) — a standalone daemon, no GUI required +2. **Desktop app in headless mode** — hide the UI and run the desktop app as a service + +Option 1: llmster (recommended) [#option-1-llmster-recommended] + +llmster is the core of the LM Studio desktop app, packaged to be server-native, without reliance on the GUI. It can run on Linux boxes, cloud servers, GPU rigs, or your local machine without the GUI. See the [LM Studio 0.4.0 release post](/blog/0.4.0) for more details. + +llmster + +Install llmster [#install-llmster] + +**Linux / Mac** + +```bash +curl -fsSL https://lmstudio.ai/install.sh | bash +``` + +**Windows** + +```bash +irm https://lmstudio.ai/install.ps1 | iex +``` + +Start llmster [#start-llmster] + +```bash +lms daemon up +``` + +See the [daemon CLI docs](/docs/cli/daemon/daemon-up) for full reference. + +For setting up llmster as a startup task on Linux, see [Linux Startup Task](/docs/developer/core/headless_llmster). + +Option 2: Desktop app in headless mode [#option-2-desktop-app-in-headless-mode] + +This works on Mac, Windows, and Linux machines with a graphical user interface. It's useful if you already have the desktop app installed and want it to run as a background service. + +Run the LLM service on machine login [#run-the-llm-service-on-machine-login] + +Head to app settings (`Cmd` / `Ctrl` + `,`) and check the box to run the LLM server on login. + + + +When this setting is enabled, exiting the app will minimize it to the system tray, and the LLM server will continue to run in the background. + +Auto Server Start [#auto-server-start] + +Your last server state will be saved and restored on app or service launch. + +To achieve this programmatically: + +```bash +lms server start +``` + +Just-In-Time (JIT) model loading for REST endpoints [#just-in-time-jit-model-loading-for-rest-endpoints] + +Applies to both options. Useful when using LM Studio as an LLM service with other frontends or applications. + + + +When JIT loading is ON: [#when-jit-loading-is-on] + +* Calls to OpenAI-compatible `/v1/models` will return all downloaded models, not only the ones loaded into memory +* Calls to inference endpoints will load the model into memory if it's not already loaded + +When JIT loading is OFF: [#when-jit-loading-is-off] + +* Calls to OpenAI-compatible `/v1/models` will return only the models loaded into memory +* You have to first load the model into memory before being able to use it + +What about auto unloading? [#what-about-auto-unloading] + +JIT loaded models will be auto-unloaded from memory by default after a set period of inactivity ([learn more](/docs/developer/core/ttl-and-auto-evict)). + +Community [#community] + +Chat with other LM Studio developers, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). + +Please report bugs and issues in the [lmstudio-bug-tracker](https://github.com/lmstudio-ai/lmstudio-bug-tracker/issues) GitHub repository. + + + + +`llmster`, LM Studio's headless daemon, can be configured to run on startup. This guide covers setting up `llmster` to launch, load a model, and start an HTTP server automatically using `systemctl` on Linux. + + + This guide is for Linux systems without a graphical interface. For machines with a GUI, you can configure LM Studio to [run as a service on login](/docs/developer/core/headless) instead. + + +Install the Daemon [#install-the-daemon] + +Run the following command to install `llmster`: + +```bash +curl -fsSL https://lmstudio.ai/install.sh | bash +``` + +Verify the installation: + +```bash +lms --help +``` + +Download a Model [#download-a-model] + +Download a model to use with the server: + +```bash +lms get openai/gpt-oss-20b +``` + +The output will show the model path. You'll need this for the systemd configuration. + +Manual Test [#manual-test] + +Before configuring systemd, verify everything works manually. + +Load the model: + +```bash +lms load openai/gpt-oss-20b +``` + +Start the server: + +```bash +lms server start +``` + +Verify the API is responding: + +```bash +curl http://localhost:1234/v1/models +``` + +Stop the server when done testing: + +```bash +lms server stop +``` + +Create Systemd Service [#create-systemd-service] + +Create `/etc/systemd/system/lmstudio.service`. Replace `YOUR_USERNAME` with your username. + +```ini +[Unit] +Description=LM Studio Server + +[Service] +Type=oneshot +RemainAfterExit=yes +User=YOUR_USERNAME +Environment="HOME=/home/YOUR_USERNAME" +ExecStartPre=/home/YOUR_USERNAME/.lmstudio/bin/lms daemon up +ExecStartPre=/home/YOUR_USERNAME/.lmstudio/bin/lms load openai/gpt-oss-20b --yes +ExecStart=/home/YOUR_USERNAME/.lmstudio/bin/lms server start +ExecStop=/home/YOUR_USERNAME/.lmstudio/bin/lms daemon down + +[Install] +WantedBy=multi-user.target +``` + +This unit automatically loads the `openai/gpt-oss-20b` model on startup. Alternatively, you can avoid loading a specific model on startup and instead rely on [Just-In-Time (JIT) loading and Eviction](/docs/developer/core/ttl-and-auto-evict) in the server. + +Enable and Start the Service [#enable-and-start-the-service] + +```bash +sudo systemctl daemon-reload +sudo systemctl enable lmstudio.service +sudo systemctl start lmstudio.service +``` + +Verify [#verify] + +Check the service status: + +```bash +systemctl status lmstudio +``` + +Test the API: + +```bash +curl http://localhost:1234/v1/models +``` + +Service Management [#service-management] + +```bash +# Stop the service +sudo systemctl stop lmstudio + +# Restart the service +sudo systemctl restart lmstudio + +# Disable auto-start +sudo systemctl disable lmstudio +``` + +Community [#community] + +Chat with other LM Studio developers, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). + +Please report bugs and issues in the [lmstudio-bug-tracker](https://github.com/lmstudio-ai/lmstudio-bug-tracker/issues) GitHub repository. + + + + +Overview [#overview] + +With [LM Link](/docs/lmlink), you can use a model loaded on a remote device as if it were loaded locally — from any machine on the same link. This naturally extends to the REST API and SDK: your laptop can make requests to `localhost` and have them served by a powerful remote machine on your network. + +Requests to `localhost` still work as normal. LM Studio internally uses the model on the remote device as if it were loaded locally. For models present on multiple devices, the REST API will use the model on the preferred device. + + + +The preferred device setting is per-machine. Each device on the link independently controls which remote machine it prefers. See [how to set a preferred device](/docs/lmlink/basics/preferred-device) for more details. + +Use the REST API as normal [#use-the-rest-api-as-normal] + +Use the REST API exactly as you would locally. See the [REST API docs](/docs/developer/rest) for usage details. + +If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) + + + + +Requires LM Studio 0.4.0 or newer. [#requires-lm-studio-040-or-newer] + +LM Studio supports Model Context Protocol (MCP) usage via API. MCP allows models to interact with external tools and services through standardized servers. + +How it works [#how-it-works] + +MCP servers provide tools that models can call during chat requests. You can enable MCP servers in two ways: as ephemeral servers defined per-request, or as pre-configured servers in your `mcp.json` file. + +Ephemeral vs mcp.json servers [#ephemeral-vs-mcpjson-servers] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Feature + + Ephemeral + + mcp.json +
+ How to specify in request + + integrations + + -> + + "type": "ephemeral_mcp" + + integrations + + -> + + "type": "plugin" +
+ Configuration + + Only defined per-request + + Pre-configured in + + mcp.json +
+ Use case + + One-off requests, remote MCP tool execution + + MCP servers that require + + command + + , frequently used servers +
+ Server ID + + Specified via + + server_label + + in integration + + Specified via + + id + + (e.g., + + mcp/playwright + + ) in integration +
+ Custom headers + + Supported via + + headers + + field + + Configured in + + mcp.json +
+ +Ephemeral MCP servers [#ephemeral-mcp-servers] + +Ephemeral MCP servers are defined on-the-fly in each request. This is useful for testing or when you don't want to pre-configure servers. + + + Ephemeral MCP servers require the "Allow per-request MCPs" setting to be enabled in [Server Settings](/docs/developer/core/server/settings). + + + + + + curl + + + + Python + + + + TypeScript + + + + + ```bash + curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "What is the top trending model on hugging face?", + "integrations": [ + { + "type": "ephemeral_mcp", + "server_label": "huggingface", + "server_url": "https://huggingface.co/mcp", + "allowed_tools": ["model_search"] + } + ], + "context_length": 8000 + }' + ``` + + + + ```python + import os + import requests + import json + + response = requests.post( + "http://localhost:1234/api/v1/chat", + headers={ + "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", + "Content-Type": "application/json" + }, + json={ + "model": "ibm/granite-4-micro", + "input": "What is the top trending model on hugging face?", + "integrations": [ + { + "type": "ephemeral_mcp", + "server_label": "huggingface", + "server_url": "https://huggingface.co/mcp", + "allowed_tools": ["model_search"] + } + ], + "context_length": 8000 + } + ) + print(json.dumps(response.json(), indent=2)) + ``` + + + + ```typescript + const response = await fetch("http://localhost:1234/api/v1/chat", { + method: "POST", + headers: { + "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, + "Content-Type": "application/json" + }, + body: JSON.stringify({ + "model": "ibm/granite-4-micro", + "input": "What is the top trending model on hugging face?", + "integrations": [ + { + "type": "ephemeral_mcp", + "server_label": "huggingface", + "server_url": "https://huggingface.co/mcp", + "allowed_tools": ["model_search"] + } + ], + "context_length": 8000 + }); + const data = await response.json(); + console.log(data); + ``` + + + +The model can now call tools from the specified MCP server: + +```json +{ + "model_instance_id": "ibm/granite-4-micro", + "output": [ + { + "type": "reasoning", + "content": "..." + }, + { + "type": "message", + "content": "..." + }, + { + "type": "tool_call", + "tool": "model_search", + "arguments": { + "sort": "trendingScore", + "limit": 1 + }, + "output": "...", + "provider_info": { + "server_label": "huggingface", + "type": "ephemeral_mcp" + } + }, + { + "type": "reasoning", + "content": "\n" + }, + { + "type": "message", + "content": "The top trending model is ..." + } + ], + "stats": { + "input_tokens": 419, + "total_output_tokens": 362, + "reasoning_output_tokens": 195, + "tokens_per_second": 27.620159487314744, + "time_to_first_token_seconds": 1.437 + }, + "response_id": "resp_7c1a08e3d6e279efcfecb02df9de7cbd316e93422d0bb5cb" +} +``` + +MCP servers from mcp.json [#mcp-servers-from-mcpjson] + +MCP servers can be pre-configured in your `mcp.json` file. This is the recommended approach for using MCP servers that take actions on your computer (like [microsoft/playwright-mcp](https://github.com/microsoft/playwright-mcp)) and servers that you use frequently. + + + MCP servers from mcp.json require the "Allow calling servers from mcp.json" setting to be enabled in [Server Settings](/docs/developer/core/server/settings). + + + + + + + + curl + + + + Python + + + + TypeScript + + + + + ```bash + curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "Open lmstudio.ai", + "integrations": ["mcp/playwright"], + "context_length": 8000, + "temperature": 0 + }' + ``` + + + + ```python + import os + import requests + import json + + response = requests.post( + "http://localhost:1234/api/v1/chat", + headers={ + "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", + "Content-Type": "application/json" + }, + json={ + "model": "ibm/granite-4-micro", + "input": "Open lmstudio.ai", + "integrations": ["mcp/playwright"], + "context_length": 8000, + "temperature": 0 + } + ) + print(json.dumps(response.json(), indent=2)) + ``` + + + + ```typescript + const response = await fetch("http://localhost:1234/api/v1/chat", { + method: "POST", + headers: { + "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, + "Content-Type": "application/json" + }, + body: JSON.stringify({ + model: "ibm/granite-4-micro", + input: "Open lmstudio.ai", + integrations: ["mcp/playwright"], + context_length: 8000, + temperature: 0 + }) + }); + const data = await response.json(); + console.log(data); + ``` + + + +The response includes tool calls from the configured MCP server: + +```json +{ + "model_instance_id": "ibm/granite-4-micro", + "output": [ + { + "type": "reasoning", + "content": "..." + }, + { + "type": "message", + "content": "..." + }, + { + "type": "tool_call", + "tool": "browser_navigate", + "arguments": { + "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" + }, + "output": "...", + "provider_info": { + "plugin_id": "mcp/playwright", + "type": "plugin" + } + }, + { + "type": "reasoning", + "content": "..." + }, + { + "type": "message", + "content": "The YouTube video page for ..." + } + ], + "stats": { + "input_tokens": 2614, + "total_output_tokens": 594, + "reasoning_output_tokens": 389, + "tokens_per_second": 26.293245822877495, + "time_to_first_token_seconds": 0.154 + }, + "response_id": "resp_cdac6a9b5e2a40027112e441ce6189db18c9040f96736407" +} +``` + +Restricting tool access [#restricting-tool-access] + +For both ephemeral and mcp.json servers, you can limit which tools the model can call using the `allowed_tools` field. This is useful if you do not want certain tools from an MCP server to be used, and can speed up prompt processing due to the model receiving fewer tool definitions. + + + + + curl + + + + Python + + + + TypeScript + + + + + ```bash + curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "What is the top trending model on hugging face?", + "integrations": [ + { + "type": "ephemeral_mcp", + "server_label": "huggingface", + "server_url": "https://huggingface.co/mcp", + "allowed_tools": ["model_search"] + } + ], + "context_length": 8000 + }' + ``` + + + + ```python + import os + import requests + import json + + response = requests.post( + "http://localhost:1234/api/v1/chat", + headers={ + "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", + "Content-Type": "application/json" + }, + json={ + "model": "ibm/granite-4-micro", + "input": "What is the top trending model on hugging face?", + "integrations": [ + { + "type": "ephemeral_mcp", + "server_label": "huggingface", + "server_url": "https://huggingface.co/mcp", + "allowed_tools": ["model_search"] + } + ], + "context_length": 8000 + } + ) + print(json.dumps(response.json(), indent=2)) + ``` + + + + ```typescript + const response = await fetch("http://localhost:1234/api/v1/chat", { + method: "POST", + headers: { + "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, + "Content-Type": "application/json" + }, + body: JSON.stringify({ + model: "ibm/granite-4-micro", + input: "What is the top trending model on hugging face?", + integrations: [ + { + type: "ephemeral_mcp", + server_label: "huggingface", + server_url: "https://huggingface.co/mcp", + allowed_tools: ["model_search"] + } + ], + context_length: 8000 + }) + }); + const data = await response.json(); + console.log(data); + ``` + + + +If `allowed_tools` is not provided, all tools from the server are available to the model. + +Custom headers for ephemeral servers [#custom-headers-for-ephemeral-servers] + +When using ephemeral MCP servers that require authentication, you can pass custom headers: + + + + + curl + + + + Python + + + + TypeScript + + + + + ```bash + curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "Give me details about my SUPER-SECRET-PRIVATE Hugging face model", + "integrations": [ + { + "type": "ephemeral_mcp", + "server_label": "huggingface", + "server_url": "https://huggingface.co/mcp", + "allowed_tools": ["model_search"], + "headers": { + "Authorization": "Bearer " + } + } + ], + "context_length": 8000 + }' + ``` + + + + ```python + import os + import requests + import json + + response = requests.post( + "http://localhost:1234/api/v1/chat", + headers={ + "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", + "Content-Type": "application/json" + }, + json={ + "model": "ibm/granite-4-micro", + "input": "Give me details about my SUPER-SECRET-PRIVATE Hugging face model", + "integrations": [ + { + "type": "ephemeral_mcp", + "server_label": "huggingface", + "server_url": "https://huggingface.co/mcp", + "allowed_tools": ["model_search"], + "headers": { + "Authorization": "Bearer " + } + } + ], + "context_length": 8000 + } + ) + print(json.dumps(response.json(), indent=2)) + ``` + + + + ```typescript + const response = await fetch("http://localhost:1234/api/v1/chat", { + method: "POST", + headers: { + "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, + "Content-Type": "application/json" + }, + body: JSON.stringify({ + model: "ibm/granite-4-micro", + input: "Give me details about my SUPER-SECRET-PRIVATE Hugging face model", + integrations: [ + { + type: "ephemeral_mcp", + server_label: "huggingface", + server_url: "https://huggingface.co/mcp", + allowed_tools: ["model_search"], + headers: { + Authorization: "Bearer " + } + } + ], + context_length: 8000 + }) + const data = await response.json(); + console.log(data); + ``` + + + + + + +Background [#background] + +* `JIT loading` makes it easy to use your LM Studio models in other apps: you don't need to manually load the model first before being able to use it. However, this also means that models can stay loaded in memory even when they're not being used. `[Default: enabled]` + +* (New) `Idle TTL` (technically: Time-To-Live) defines how long a model can stay loaded in memory without receiving any requests. When the TTL expires, the model is automatically unloaded from memory. You can set a TTL using the `ttl` field in your request payload. `[Default: 60 minutes]` + +* (New) `Auto-Evict` is a feature that unloads previously JIT loaded models before loading new ones. This enables easy switching between models from client apps without having to manually unload them first. You can enable or disable this feature in Developer tab > Server Settings. `[Default: enabled]` + +Idle TTL [#idle-ttl] + +**Use case**: imagine you're using an app like [Zed](https://github.com/zed-industries/zed/blob/main/crates/lmstudio/src/lmstudio.rs#L340), [Cline](https://github.com/cline/cline/blob/main/src/api/providers/lmstudio.ts), or [Continue.dev](https://docs.continue.dev/customize/model-providers/more/lmstudio) to interact with LLMs served by LM Studio. These apps leverage JIT to load models on-demand the first time you use them. + +**Problem**: When you're not actively using a model, you might don't want it to remain loaded in memory. + +**Solution**: Set a TTL for models loaded via API requests. The idle timer resets every time the model receives a request, so it won't disappear while you use it. A model is considered idle if it's not doing any work. When the idle TTL expires, the model is automatically unloaded from memory. + +Set App-default Idle TTL [#set-app-default-idle-ttl] + +By default, JIT-loaded models have a TTL of 60 minutes. You can configure a default TTL value for any model loaded via JIT like so: + + + +Set per-model TTL-model in API requests [#set-per-model-ttl-model-in-api-requests] + +When JIT loading is enabled, the **first request** to a model will load it into memory. You can specify a TTL for that model in the request payload. + +This works for requests targeting both the [OpenAI compatibility API](/docs/developer/openai-api) and the [LM Studio's REST API](/docs/developer/rest): + +```diff +curl http://localhost:1234/api/v0/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "deepseek-r1-distill-qwen-7b", ++ "ttl": 300, + "messages": [ ... ] +}' +``` + +This will set a TTL of 5 minutes (300 seconds) for this model if it is JIT loaded. [#this-will-set-a-ttl-of-5-minutes-300-seconds-for-this-model-if-it-is-jit-loaded] + +Set TTL for models loaded with `lms` [#set-ttl-for-models-loaded-with-lms] + +By default, models loaded with `lms load` do not have a TTL, and will remain loaded in memory until you manually unload them. + +You can set a TTL for a model loaded with `lms` like so: + +```bash +lms load --ttl 3600 +``` + +Load a `` with a TTL of 1 hour (3600 seconds) [#load-a-model-with-a-ttl-of-1-hour-3600-seconds] + +Specify TTL when loading models in the server tab [#specify-ttl-when-loading-models-in-the-server-tab] + +You can also set a TTL when loading a model in the server tab like so + + + +Configure Auto-Evict for JIT loaded models [#configure-auto-evict-for-jit-loaded-models] + +With this setting, you can ensure new models loaded via JIT automatically unload previously loaded models first. + +This is useful when you want to switch between models from another app without worrying about memory building up with unused models. + + + +**When Auto-Evict is ON** (default): + +* At most `1` model is kept loaded in memory at a time (when loaded via JIT) +* Non-JIT loaded models are not affected + +**When Auto-Evict is OFF**: + +* Switching models from an external app will keep previous models loaded in memory +* Models will remain loaded until either: + * Their TTL expires + * You manually unload them + +This feature works in tandem with TTL to provide better memory management for your workflow. + +Nomenclature [#nomenclature] + +`TTL`: Time-To-Live, is a term borrowed from networking protocols and cache systems. It defines how long a resource can remain allocated before it's considered stale and evicted. + + + + + + + `POST /api/v1/chat` + + **Request body** + + + + + + + + + Request with MCP + + + + Request with Images + + + + + ```bash + curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "Tell me the top trending model on hugging face and navigate to https://lmstudio.ai", + "integrations": [ + { + "type": "ephemeral_mcp", + "server_label": "huggingface", + "server_url": "https://huggingface.co/mcp", + "allowed_tools": [ + "model_search" + ] + }, + { + "type": "plugin", + "id": "mcp/playwright", + "allowed_tools": [ + "browser_navigate" + ] + } + ], + "context_length": 8000, + "temperature": 0 + }' + ``` + + + + ```bash + # Image is a small red square encoded as a base64 data URL + curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "qwen/qwen3-vl-4b", + "input": [ + { + "type": "text", + "content": "Describe this image in two sentences" + }, + { + "type": "image", + "data_url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAFUlEQVR42mP8z8BQz0AEYBxVSF+FABJADveWkH6oAAAAAElFTkSuQmCC" + } + ], + "context_length": 2048, + "temperature": 0 + }' + ``` + + + + + +*** + + + + **Response fields** + + + + + + + + + Request with MCP + + + + Request with Images + + + + + ```json + { + "model_instance_id": "ibm/granite-4-micro", + "output": [ + { + "type": "tool_call", + "tool": "model_search", + "arguments": { + "sort": "trendingScore", + "query": "", + "limit": 1 + }, + "output": "...", + "provider_info": { + "server_label": "huggingface", + "type": "ephemeral_mcp" + } + }, + { + "type": "message", + "content": "..." + }, + { + "type": "tool_call", + "tool": "browser_navigate", + "arguments": { + "url": "https://lmstudio.ai" + }, + "output": "...", + "provider_info": { + "plugin_id": "mcp/playwright", + "type": "plugin" + } + }, + { + "type": "message", + "content": "**Top Trending Model on Hugging Face** ... Below is a quick snapshot of what’s on the landing page ... more details on the model or LM Studio itself!" + } + ], + "stats": { + "input_tokens": 646, + "total_output_tokens": 586, + "reasoning_output_tokens": 0, + "tokens_per_second": 29.753900615398926, + "time_to_first_token_seconds": 1.088, + "model_load_time_seconds": 2.656 + }, + "response_id": "resp_4ef013eba0def1ed23f19dde72b67974c579113f544086de" + } + ``` + + + + ```json + { + "model_instance_id": "qwen/qwen3-vl-4b", + "output": [ + { + "type": "message", + "content": "This image is a solid, vibrant red square that fills the entire frame, with no discernible texture, pattern, or other elements. It presents a minimalist, uniform visual field of pure red, evoking a sense of boldness or urgency." + } + ], + "stats": { + "input_tokens": 17, + "total_output_tokens": 50, + "reasoning_output_tokens": 0, + "tokens_per_second": 51.03762685242662, + "time_to_first_token_seconds": 0.814 + }, + "response_id": "resp_0182bd7c479d7451f9a35471f9c26b34de87a7255856b9a4" + } + ``` + + + + + + + + + + + `GET /api/v1/models/download/status/:job_id` + + **Path parameters** + + + + + + ```bash title="Example Request" + curl -H "Authorization: Bearer $LM_API_TOKEN" \ + http://localhost:1234/api/v1/models/download/status/job_493c7c9ded + ``` + + + + + + **Response fields** + + Returns a single download job status object. The response varies based on the download status. + + + + + + ```json title="Response" + { + "job_id": "job_493c7c9ded", + "status": "completed", + "total_size_bytes": 2279145003, + "downloaded_bytes": 2279145003, + "started_at": "2025-10-03T15:33:23.496Z", + "completed_at": "2025-10-03T15:43:12.102Z" + } + ``` + + + + + + + + + `POST /api/v1/models/download` + + **Request body** + + + + + + ```bash title="Example Request" + curl http://localhost:1234/api/v1/models/download \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro" + }' + ``` + + + + + + **Response fields** + + Returns a download job status object. The response varies based on the download status. + + + + + + ```json title="Response" + { + "job_id": "job_493c7c9ded", + "status": "downloading", + "total_size_bytes": 2279145003, + "started_at": "2025-10-03T15:33:23.496Z" + } + ``` + + + + + + + + LM Studio now has a [v1 REST API](/docs/developer/rest)! We recommend using the v1 API for new projects! + + +Requires LM Studio 0.3.6 or newer. [#requires-lm-studio-036-or-newer] + +LM Studio now has its own REST API, in addition to OpenAI-compatible endpoints ([learn more](/docs/developer/openai-compat)) and Anthropic-compatible endpoints ([learn more](/docs/developer/anthropic-compat)). + +The REST API includes enhanced stats such as Token / Second and Time To First Token (TTFT), as well as rich information about models such as loaded vs unloaded, max context, quantization, and more. + +Supported API Endpoints [#supported-api-endpoints] + +* [`GET /api/v0/models`](#get-apiv0models) - List available models +* [`GET /api/v0/models/{model}`](#get-apiv0modelsmodel) - Get info about a specific model +* [`POST /api/v0/chat/completions`](#post-apiv0chatcompletions) - Chat Completions (messages -> assistant response) +* [`POST /api/v0/completions`](#post-apiv0completions) - Text Completions (prompt -> completion) +* [`POST /api/v0/embeddings`](#post-apiv0embeddings) - Text Embeddings (text -> embedding) + +*** + +Start the REST API server [#start-the-rest-api-server] + +To start the server, run the following command: + +```bash +lms server start +``` + + + You can run LM Studio as a service and get the server to auto-start on boot without launching the GUI. [Learn about Headless Mode](/docs/developer/core/headless). + + +Endpoints [#endpoints] + +`GET /api/v0/models` [#get-apiv0models] + +List all loaded and downloaded models + +**Example request** + +```bash +curl -H "Authorization: Bearer $LM_API_TOKEN" http://localhost:1234/api/v0/models +``` + +**Response format** + +```json +{ + "object": "list", + "data": [ + { + "id": "qwen2-vl-7b-instruct", + "object": "model", + "type": "vlm", + "publisher": "mlx-community", + "arch": "qwen2_vl", + "compatibility_type": "mlx", + "quantization": "4bit", + "state": "not-loaded", + "max_context_length": 32768 + }, + { + "id": "meta-llama-3.1-8b-instruct", + "object": "model", + "type": "llm", + "publisher": "lmstudio-community", + "arch": "llama", + "compatibility_type": "gguf", + "quantization": "Q4_K_M", + "state": "not-loaded", + "max_context_length": 131072 + }, + { + "id": "text-embedding-nomic-embed-text-v1.5", + "object": "model", + "type": "embeddings", + "publisher": "nomic-ai", + "arch": "nomic-bert", + "compatibility_type": "gguf", + "quantization": "Q4_0", + "state": "not-loaded", + "max_context_length": 2048 + } + ] +} +``` + +*** + +`GET /api/v0/models/{model}` [#get-apiv0modelsmodel] + +Get info about one specific model + +**Example request** + +```bash +curl -H "Authorization: Bearer $LM_API_TOKEN" http://localhost:1234/api/v0/models/qwen2-vl-7b-instruct +``` + +**Response format** + +```json +{ + "id": "qwen2-vl-7b-instruct", + "object": "model", + "type": "vlm", + "publisher": "mlx-community", + "arch": "qwen2_vl", + "compatibility_type": "mlx", + "quantization": "4bit", + "state": "not-loaded", + "max_context_length": 32768 +} +``` + +*** + +`POST /api/v0/chat/completions` [#post-apiv0chatcompletions] + +Chat Completions API. You provide a messages array and receive the next assistant response in the chat. + +**Example request** + +```bash +curl http://localhost:1234/api/v0/chat/completions \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "granite-3.0-2b-instruct", + "messages": [ + { "role": "system", "content": "Always answer in rhymes." }, + { "role": "user", "content": "Introduce yourself." } + ], + "temperature": 0.7, + "max_tokens": -1, + "stream": false + }' +``` + +**Response format** + +```json +{ + "id": "chatcmpl-i3gkjwthhw96whukek9tz", + "object": "chat.completion", + "created": 1731990317, + "model": "granite-3.0-2b-instruct", + "choices": [ + { + "index": 0, + "logprobs": null, + "finish_reason": "stop", + "message": { + "role": "assistant", + "content": "Greetings, I'm a helpful AI, here to assist,\nIn providing answers, with no distress.\nI'll keep it short and sweet, in rhyme you'll find,\nA friendly companion, all day long you'll bind." + } + } + ], + "usage": { + "prompt_tokens": 24, + "completion_tokens": 53, + "total_tokens": 77 + }, + "stats": { + "tokens_per_second": 51.43709529007664, + "time_to_first_token": 0.111, + "generation_time": 0.954, + "stop_reason": "eosFound" + }, + "model_info": { + "arch": "granite", + "quant": "Q4_K_M", + "format": "gguf", + "context_length": 4096 + }, + "runtime": { + "name": "llama.cpp-mac-arm64-apple-metal-advsimd", + "version": "1.3.0", + "supported_formats": ["gguf"] + } +} +``` + +*** + +`POST /api/v0/completions` [#post-apiv0completions] + +Text Completions API. You provide a prompt and receive a completion. + +**Example request** + +```bash +curl http://localhost:1234/api/v0/completions \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "granite-3.0-2b-instruct", + "prompt": "the meaning of life is", + "temperature": 0.7, + "max_tokens": 10, + "stream": false, + "stop": "\n" + }' +``` + +**Response format** + +```json +{ + "id": "cmpl-p9rtxv6fky2v9k8jrd8cc", + "object": "text_completion", + "created": 1731990488, + "model": "granite-3.0-2b-instruct", + "choices": [ + { + "index": 0, + "text": " to find your purpose, and once you have", + "logprobs": null, + "finish_reason": "length" + } + ], + "usage": { + "prompt_tokens": 5, + "completion_tokens": 9, + "total_tokens": 14 + }, + "stats": { + "tokens_per_second": 57.69230769230769, + "time_to_first_token": 0.299, + "generation_time": 0.156, + "stop_reason": "maxPredictedTokensReached" + }, + "model_info": { + "arch": "granite", + "quant": "Q4_K_M", + "format": "gguf", + "context_length": 4096 + }, + "runtime": { + "name": "llama.cpp-mac-arm64-apple-metal-advsimd", + "version": "1.3.0", + "supported_formats": ["gguf"] + } +} +``` + +*** + +`POST /api/v0/embeddings` [#post-apiv0embeddings] + +Text Embeddings API. You provide a text and a representation of the text as an embedding vector is returned. + +**Example request** + +```bash +curl http://localhost:1234/api/v0/embeddings \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "text-embedding-nomic-embed-text-v1.5", + "input": "Some text to embed" + } +``` + +**Example response** + +```json +{ + "object": "list", + "data": [ + { + "object": "embedding", + "embedding": [ + -0.016731496900320053, + 0.028460891917347908, + -0.1407836228609085, + ... (truncated for brevity) ..., + 0.02505224384367466, + -0.0037634256295859814, + -0.04341062530875206 + ], + "index": 0 + } + ], + "model": "text-embedding-nomic-embed-text-v1.5@q4_k_m", + "usage": { + "prompt_tokens": 0, + "total_tokens": 0 + } +} +``` + +*** + +Please report bugs by opening an issue on [Github](https://github.com/lmstudio-ai/lmstudio-bug-tracker/issues). + + + + +LM Studio offers a powerful REST API with first-class support for local inference and model management. In addition to our native API, we provide OpenAI-compatible endpoints ([learn more](/docs/developer/openai-compat)) and Anthropic-compatible endpoints ([learn more](/docs/developer/anthropic-compat)). + +What's new [#whats-new] + +Previously, there was a [v0 REST API](/docs/developer/rest/endpoints). With LM Studio 0.4.0, we have officially released our native v1 REST API at `/api/v1/*` endpoints and recommend using it. + +The v1 REST API includes enhanced features such as: + +* [MCP via API](/docs/developer/core/mcp) +* [Stateful chats](/docs/developer/rest/stateful-chats) +* [Authentication](/docs/developer/core/authentication) configuration with API tokens +* Model [download](/docs/developer/rest/download), [load](/docs/developer/rest/load) and [unload](/docs/developer/rest/unload) endpoints + +Supported endpoints [#supported-endpoints] + +The following endpoints are available in LM Studio's v1 REST API. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Endpoint + + Method + + Docs +
+ /api/v1/chat + + + + Chat +
+ /api/v1/models + + + + List Models +
+ /api/v1/models/load + + + + Load +
+ /api/v1/models/unload + + + + Unload +
+ /api/v1/models/download + + + + Download +
+ /api/v1/models/download/status + + + + Download Status +
+ +Inference endpoint comparison [#inference-endpoint-comparison] + +The table below compares the features of LM Studio's `/api/v1/chat` endpoint with OpenAI-compatible and Anthropic-compatible inference endpoints. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Feature + + /api/v1/chat + + /v1/responses + + /v1/chat/completions + + /v1/messages +
+ Streaming + + ✅ + + ✅ + + ✅ + + ✅ +
+ Stateful chat + + ✅ + + ✅ + + ❌ + + ❌ +
+ Remote MCPs + + ✅ + + ✅ + + ❌ + + ❌ +
+ MCPs you have in LM Studio + + ✅ + + ✅ + + ❌ + + ❌ +
+ Custom tools + + ❌ + + ✅ + + ✅ + + ✅ +
+ Include assistant messages in the request + + ❌ + + ✅ + + ✅ + + ✅ +
+ Model load streaming events + + ✅ + + ❌ + + ❌ + + ❌ +
+ Prompt processing streaming events + + ✅ + + ❌ + + ❌ + + ❌ +
+ Specify context length in the request + + ✅ + + ❌ + + ❌ + + ❌ +
+ +*** + +Please report bugs by opening an issue on [Github](https://github.com/lmstudio-ai/lmstudio-bug-tracker/issues). + + + + + + + `GET /api/v1/models` + + This endpoint has no request parameters. + + + + ```bash title="Example Request" + curl http://localhost:1234/api/v1/models \ + -H "Authorization: Bearer $LM_API_TOKEN" + ``` + + + +*** + + + + **Response fields** + + + + + + ```json title="Response" + { + "models": [ + { + "type": "llm", + "publisher": "google", + "key": "google/gemma-4-26b-a4b", + "display_name": "Gemma 4 26B A4B", + "architecture": "gemma4", + "quantization": { + "name": "Q4_K_M", + "bits_per_weight": 4 + }, + "size_bytes": 17990911801, + "params_string": "26B-A4B", + "loaded_instances": [ + { + "id": "google/gemma-4-26b-a4b", + "config": { + "context_length": 4096, + "eval_batch_size": 512, + "parallel": 4, + "flash_attention": true, + "num_experts": 8, + "offload_kv_cache_to_gpu": true + } + } + ], + "max_context_length": 262144, + "format": "gguf", + "capabilities": { + "vision": true, + "trained_for_tool_use": true, + "reasoning": { + "allowed_options": [ + "off", + "on" + ], + "default": "on" + } + }, + "description": null, + "variants": [ + "google/gemma-4-26b-a4b@q4_k_m" + ], + "selected_variant": "google/gemma-4-26b-a4b@q4_k_m" + }, + { + "type": "llm", + "publisher": "deepseek", + "key": "deepseek-r1", + "display_name": "DeepSeek R1", + "architecture": "deepseek", + "quantization": { + "name": "Q4_K_M", + "bits_per_weight": 4 + }, + "size_bytes": 40492610355, + "params_string": "671B", + "loaded_instances": [], + "max_context_length": 131072, + "format": "gguf", + "capabilities": { + "vision": false, + "trained_for_tool_use": true, + "reasoning": { + "allowed_options": ["on"], + "default": "on" + } + }, + "description": null + }, + { + "type": "embedding", + "publisher": "gaianet", + "key": "text-embedding-nomic-embed-text-v1.5-embedding", + "display_name": "Nomic Embed Text v1.5", + "quantization": { + "name": "F16", + "bits_per_weight": 16 + }, + "size_bytes": 274290560, + "params_string": null, + "loaded_instances": [], + "max_context_length": 2048, + "format": "gguf" + } + ] + } + ``` + + + + + + + + + `POST /api/v1/models/load` + + **Request body** + + + + + + ```bash title="Example Request" + curl http://localhost:1234/api/v1/models/load \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "openai/gpt-oss-20b", + "context_length": 16384, + "flash_attention": true, + "echo_load_config": true + }' + ``` + + + +*** + + + + **Response fields** + + + + + + ```json title="Response" + { + "type": "llm", + "instance_id": "openai/gpt-oss-20b", + "load_time_seconds": 9.099, + "status": "loaded", + "load_config": { + "context_length": 16384, + "eval_batch_size": 512, + "flash_attention": true, + "offload_kv_cache_to_gpu": true, + "num_experts": 4 + } + } + ``` + + + + + + +Start the server [#start-the-server] + +[Install](/download) and launch LM Studio. + +Then ensure the server is running through the toggle at the top left of the Developer page, or through [lms](/docs/cli) in the terminal: + +```bash +lms server start +``` + +By default, the server is available at `http://localhost:1234`. + +If you don't have a model downloaded yet, you can download the model: + +```bash +lms get ibm/granite-4-micro +``` + +API Authentication [#api-authentication] + +By default, the LM Studio API server does **not** require authentication. You can configure the server to require authentication by API token in the [server settings](/docs/developer/core/server/settings) for added security. + +To authenticate API requests, generate an API token from the Developer page in LM Studio, and include it in the `Authorization` header of your requests as follows: `Authorization: Bearer $LM_API_TOKEN`. Read more about authentication [here](/docs/developer/core/authentication). + +Chat with a model [#chat-with-a-model] + +Use the chat endpoint to send a message to a model. By default, the model will be automatically loaded if it is not already. + +The `/api/v1/chat` endpoint is stateful, which means you do not need to pass the full history in every request. Read more about it [here](/docs/developer/rest/stateful-chats). + + + + + curl + + + + Python + + + + TypeScript + + + + + ```bash + curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "Write a short haiku about sunrise." + }' + ``` + + + + ```python + import os + import requests + import json + + response = requests.post( + "http://localhost:1234/api/v1/chat", + headers={ + "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", + "Content-Type": "application/json" + }, + json={ + "model": "ibm/granite-4-micro", + "input": "Write a short haiku about sunrise." + } + ) + print(json.dumps(response.json(), indent=2)) + ``` + + + + ```typescript + const response = await fetch("http://localhost:1234/api/v1/chat", { + method: "POST", + headers: { + "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, + "Content-Type": "application/json" + }, + body: JSON.stringify({ + model: "ibm/granite-4-micro", + input: "Write a short haiku about sunrise." + }) + }); + const data = await response.json(); + console.log(data); + ``` + + + +See the full [chat](/docs/developer/rest/chat) docs for more details. + +Use MCP servers via API [#use-mcp-servers-via-api] + +Enable the model interact with ephemeral Model Context Protocol (MCP) servers in `/api/v1/chat` by specifying servers in the `integrations` field. + + + + + curl + + + + Python + + + + TypeScript + + + + + ```bash + curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "What is the top trending model on hugging face?", + "integrations": [ + { + "type": "ephemeral_mcp", + "server_label": "huggingface", + "server_url": "https://huggingface.co/mcp", + "allowed_tools": ["model_search"] + } + ], + "context_length": 8000 + }' + ``` + + + + ```python + import os + import requests + import json + + response = requests.post( + "http://localhost:1234/api/v1/chat", + headers={ + "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", + "Content-Type": "application/json" + }, + json={ + "model": "ibm/granite-4-micro", + "input": "What is the top trending model on hugging face?", + "integrations": [ + { + "type": "ephemeral_mcp", + "server_label": "huggingface", + "server_url": "https://huggingface.co/mcp", + "allowed_tools": ["model_search"] + } + ], + "context_length": 8000 + } + ) + print(json.dumps(response.json(), indent=2)) + ``` + + + + ```typescript + const response = await fetch("http://localhost:1234/api/v1/chat", { + method: "POST", + headers: { + "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, + "Content-Type": "application/json" + }, + body: JSON.stringify({ + model: "ibm/granite-4-micro", + input: "What is the top trending model on hugging face?", + integrations: [ + { + type: "ephemeral_mcp", + server_label: "huggingface", + server_url: "https://huggingface.co/mcp", + allowed_tools: ["model_search"] + } + ], + context_length: 8000 + }) + const data = await response.json(); + console.log(data); + ``` + + + +You can also use locally configured MCP plugins (from your `mcp.json`) via the `integrations` field. Using locally run MCP plugins requires authentication via an API token passed through the `Authorization` header. Read more about authentication [here](/docs/developer/core/authentication). + + + + + curl + + + + Python + + + + TypeScript + + + + + ```bash + curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "Open lmstudio.ai", + "integrations": [ + { + "type": "plugin", + "id": "mcp/playwright", + "allowed_tools": ["browser_navigate"] + } + ], + "context_length": 8000 + }' + ``` + + + + ```python + import os + import requests + import json + + response = requests.post( + "http://localhost:1234/api/v1/chat", + headers={ + "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", + "Content-Type": "application/json" + }, + json={ + "model": "ibm/granite-4-micro", + "input": "Open lmstudio.ai", + "integrations": [ + { + "type": "plugin", + "id": "mcp/playwright", + "allowed_tools": ["browser_navigate"] + } + ], + "context_length": 8000 + } + ) + print(json.dumps(response.json(), indent=2)) + ``` + + + + ```typescript + const response = await fetch("http://localhost:1234/api/v1/chat", { + method: "POST", + headers: { + "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, + "Content-Type": "application/json" + }, + body: JSON.stringify({ + model: "ibm/granite-4-micro", + input: "Open lmstudio.ai", + integrations: [ + { + type: "plugin", + id: "mcp/playwright", + allowed_tools: ["browser_navigate"] + } + ], + context_length: 8000 + }) + }); + const data = await response.json(); + console.log(data); + ``` + + + +See the full [chat](/docs/developer/rest/chat) docs for more details. + +Download a model [#download-a-model] + +Use the download endpoint to download models by identifier from the [LM Studio model catalog](https://lmstudio.ai/models), or by Hugging Face model URL. + + + + + curl + + + + Python + + + + TypeScript + + + + + ```bash + curl http://localhost:1234/api/v1/models/download \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro" + }' + ``` + + + + ```python + import os + import requests + import json + + response = requests.post( + "http://localhost:1234/api/v1/models/download", + headers={ + "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", + "Content-Type": "application/json" + }, + json={"model": "ibm/granite-4-micro"} + ) + print(json.dumps(response.json(), indent=2)) + ``` + + + + ```typescript + const response = await fetch("http://localhost:1234/api/v1/models/download", { + method: "POST", + headers: { + "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, + "Content-Type": "application/json" + }, + body: JSON.stringify({ + model: "ibm/granite-4-micro" + }) + }); + const data = await response.json(); + console.log(data); + ``` + + + +The response will return a `job_id` that you can use to track download progress. + + + + + curl + + + + Python + + + + TypeScript + + + + + ```bash + curl -H "Authorization: Bearer $LM_API_TOKEN" \ + http://localhost:1234/api/v1/models/download/status/{job_id} + ``` + + + + ```python + import os + import requests + import json + + job_id = "your-job-id" + response = requests.get( + f"http://localhost:1234/api/v1/models/download/status/{job_id}", + headers={"Authorization": f"Bearer {os.environ['LM_API_TOKEN']}"} + ) + print(json.dumps(response.json(), indent=2)) + ``` + + + + ```typescript + const jobId = "your-job-id"; + const response = await fetch( + `http://localhost:1234/api/v1/models/download/status/${jobId}`, + { + headers: { + "Authorization": `Bearer ${process.env.LM_API_TOKEN}` + } + } + ); + const data = await response.json(); + console.log(data); + ``` + + + +See the [download](/docs/developer/rest/download) and [download status](/docs/developer/rest/download-status) docs for more details. + + + + +The `/api/v1/chat` endpoint is stateful by default. This means you don't need to pass the full conversation history in every request — LM Studio automatically stores and manages the context for you. + +How it works [#how-it-works] + +When you send a chat request, LM Studio stores the conversation in a chat thread and returns a `response_id` in the response. Use this `response_id` in subsequent requests to continue the conversation. + +```bash title="Start a new conversation" +curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "My favorite color is blue." + }' +``` + +The response includes a `response_id`: + + + Every response includes an unique `response_id` that you can use to reference that specific point in the conversation for future requests. This allows you to branch conversations. + + +```json title="Response" +{ + "model_instance_id": "ibm/granite-4-micro", + "output": [ + { + "type": "message", + "content": "That's great! Blue is a beautiful color..." + } + ], + "response_id": "resp_abc123xyz..." +} +``` + +Continue a conversation [#continue-a-conversation] + +Pass the `previous_response_id` in your next request to continue the conversation. The model will remember the previous context. + +```bash title="Continue the conversation" +curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "What color did I just mention?", + "previous_response_id": "resp_abc123xyz..." + }' +``` + +The model can reference the previous message without you needing to resend it and will return a new `response_id` for further continuation. + +Disable stateful storage [#disable-stateful-storage] + +If you don't want to store the conversation, set `store` to `false`. The response will not include a `response_id`. + +```bash title="Stateless chat" +curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "Tell me a joke.", + "store": false + }' +``` + +This is useful for one-off requests where you don't need to maintain context. + + + + +Streaming events let you render chat responses incrementally over Server‑Sent Events (SSE). When you call `POST /api/v1/chat` with `stream: true`, the server emits a series of named events that you can consume. These events arrive in order and may include multiple deltas (for reasoning and message content), tool call boundaries and payloads, and any errors encountered. The stream always begins with `chat.start` and concludes with `chat.end`, which contains the aggregated result equivalent to a non‑streaming response. + +List of event types that can be sent in an `/api/v1/chat` response stream: + +* `chat.start` +* `model_load.start` +* `model_load.progress` +* `model_load.end` +* `prompt_processing.start` +* `prompt_processing.progress` +* `prompt_processing.end` +* `reasoning.start` +* `reasoning.delta` +* `reasoning.end` +* `tool_call.start` +* `tool_call.arguments` +* `tool_call.success` +* `tool_call.failure` +* `message.start` +* `message.delta` +* `message.end` +* `error` +* `chat.end` + +Events will be streamed out in the following raw format: + +```bash +event: +data: +``` + +`chat.start` [#chatstart] + + + + An event that is emitted at the start of a chat response stream. + + + + + + ```json title="Example Event Data" + { + "type": "chat.start", + "model_instance_id": "openai/gpt-oss-20b" + } + ``` + + + +`model_load.start` [#model_loadstart] + + + + Signals the start of a model being loaded to fulfill the chat request. Will not be emitted if the requested model is already loaded. + + + + + + ```json title="Example Event Data" + { + "type": "model_load.start", + "model_instance_id": "openai/gpt-oss-20b" + } + ``` + + + +`model_load.progress` [#model_loadprogress] + + + + Progress of the model load. + + + + + + ```json title="Example Event Data" + { + "type": "model_load.progress", + "model_instance_id": "openai/gpt-oss-20b", + "progress": 0.65 + } + ``` + + + +`model_load.end` [#model_loadend] + + + + Signals a successfully completed model load. + + + + + + ```json title="Example Event Data" + { + "type": "model_load.end", + "model_instance_id": "openai/gpt-oss-20b", + "load_time_seconds": 12.34 + } + ``` + + + +`prompt_processing.start` [#prompt_processingstart] + + + + Signals the start of the model processing a prompt. + + + + + + ```json title="Example Event Data" + { + "type": "prompt_processing.start" + } + ``` + + + +`prompt_processing.progress` [#prompt_processingprogress] + + + + Progress of the model processing a prompt. + + + + + + ```json title="Example Event Data" + { + "type": "prompt_processing.progress", + "progress": 0.5 + } + ``` + + + +`prompt_processing.end` [#prompt_processingend] + + + + Signals the end of the model processing a prompt. + + + + + + ```json title="Example Event Data" + { + "type": "prompt_processing.end" + } + ``` + + + +`reasoning.start` [#reasoningstart] + + + + Signals the model is starting to stream reasoning content. + + + + + + ```json title="Example Event Data" + { + "type": "reasoning.start" + } + ``` + + + +`reasoning.delta` [#reasoningdelta] + + + + A chunk of reasoning content. Multiple deltas may arrive. + + + + + + ```json title="Example Event Data" + { + "type": "reasoning.delta", + "content": "Need to" + } + ``` + + + +`reasoning.end` [#reasoningend] + + + + Signals the end of the reasoning stream. + + + + + + ```json title="Example Event Data" + { + "type": "reasoning.end" + } + ``` + + + +`tool_call.start` [#tool_callstart] + + + + Emitted when the model starts a tool call. + + + + + + ```json title="Example Event Data" + { + "type": "tool_call.start", + "tool": "model_search", + "provider_info": { + "type": "ephemeral_mcp", + "server_label": "huggingface" + } + } + ``` + + + +`tool_call.arguments` [#tool_callarguments] + + + + Arguments streamed for the current tool call. + + + + + + ```json title="Example Event Data" + { + "type": "tool_call.arguments", + "tool": "model_search", + "arguments": { + "sort": "trendingScore", + "limit": 1 + }, + "provider_info": { + "type": "ephemeral_mcp", + "server_label": "huggingface" + } + } + ``` + + + +`tool_call.success` [#tool_callsuccess] + + + + Result of the tool call, along with the arguments used. + + + + + + ```json title="Example Event Data" + { + "type": "tool_call.success", + "tool": "model_search", + "arguments": { + "sort": "trendingScore", + "limit": 1 + }, + "output": "[{\"type\":\"text\",\"text\":\"Showing first 1 models...\"}]", + "provider_info": { + "type": "ephemeral_mcp", + "server_label": "huggingface" + } + } + ``` + + + +`tool_call.failure` [#tool_callfailure] + + + + Indicates that the tool call failed. + + + + + + ```json title="Example Event Data" + { + "type": "tool_call.failure", + "reason": "Cannot find tool with name open_browser.", + "metadata": { + "type": "invalid_name", + "tool_name": "open_browser" + } + } + ``` + + + +`message.start` [#messagestart] + + + + Signals the model is about to stream a message. + + + + + + ```json title="Example Event Data" + { + "type": "message.start" + } + ``` + + + +`message.delta` [#messagedelta] + + + + A chunk of message content. Multiple deltas may arrive. + + + + + + ```json title="Example Event Data" + { + "type": "message.delta", + "content": "The current" + } + ``` + + + +`message.end` [#messageend] + + + + Signals the end of the message stream. + + + + + + ```json title="Example Event Data" + { + "type": "message.end" + } + ``` + + + +`error` [#error] + + + + An error occurred during streaming. The final payload will still be sent in `chat.end` with whatever was generated. + + + + + + ```json title="Example Event Data" + { + "type": "error", + "error": { + "type": "invalid_request", + "message": "\"model\" is required", + "code": "missing_required_parameter", + "param": "model" + } + } + ``` + + + +`chat.end` [#chatend] + + + + Final event containing the full aggregated response, equivalent to the non-streaming `POST /api/v1/chat` response body. + + + + + + ```json title="Example Event Data" + { + "type": "chat.end", + "result": { + "model_instance_id": "openai/gpt-oss-20b", + "output": [ + { "type": "reasoning", "content": "Need to call function." }, + { + "type": "tool_call", + "tool": "model_search", + "arguments": { "sort": "trendingScore", "limit": 1 }, + "output": "[{\"type\":\"text\",\"text\":\"Showing first 1 models...\"}]", + "provider_info": { "type": "ephemeral_mcp", "server_label": "huggingface" } + }, + { "type": "message", "content": "The current top‑trending model is..." } + ], + "stats": { + "input_tokens": 329, + "total_output_tokens": 268, + "reasoning_output_tokens": 5, + "tokens_per_second": 43.73, + "time_to_first_token_seconds": 0.781 + }, + "response_id": "resp_02b2017dbc06c12bfc353a2ed6c2b802f8cc682884bb5716" + } + } + ``` + + + + + + + + + `POST /api/v1/models/unload` + + **Request body** + + + + + + ```bash title="Example Request" + curl http://localhost:1234/api/v1/models/unload \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "instance_id": "openai/gpt-oss-20b" + }' + ``` + + + +*** + + + + **Response fields** + + + + + + ```json title="Response" + { + "instance_id": "openai/gpt-oss-20b" + } + ``` + + + + + + +* Method: `POST` +* Prompt template is applied automatically for chat‑tuned models +* Provide inference parameters (temperature, top\_p, etc.) in the payload +* See OpenAI docs: [https://platform.openai.com/docs/api-reference/chat](https://platform.openai.com/docs/api-reference/chat) +* Tip: keep a terminal open with [`lms log stream`](/docs/cli/serve/log-stream) to inspect model input + +Python example [#python-example] + +```python +from openai import OpenAI +client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio") + +completion = client.chat.completions.create( + model="model-identifier", + messages=[ + {"role": "system", "content": "Always answer in rhymes."}, + {"role": "user", "content": "Introduce yourself."} + ], + temperature=0.7, +) + +print(completion.choices[0].message) +``` + +Supported payload parameters [#supported-payload-parameters] + +See [https://platform.openai.com/docs/api-reference/chat/create](https://platform.openai.com/docs/api-reference/chat/create) for parameter semantics. + +```py +model +top_p +top_k +messages +temperature +max_tokens +stream +stop +presence_penalty +frequency_penalty +logit_bias +repeat_penalty +seed +``` + + + + + + This endpoint is no longer supported by OpenAI. LM Studio continues to support it. + + Using this endpoint with chat‑tuned models may produce unexpected tokens. Prefer base models. + + +* Method: `POST` +* Prompt template is not applied +* See OpenAI docs: [https://platform.openai.com/docs/api-reference/completions](https://platform.openai.com/docs/api-reference/completions) + + + + +* Method: `POST` +* See OpenAI docs: [https://platform.openai.com/docs/api-reference/embeddings](https://platform.openai.com/docs/api-reference/embeddings) + +Python example [#python-example] + +```python +from openai import OpenAI +client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio") + +def get_embedding(text, model="model-identifier"): + text = text.replace("\n", " ") + return client.embeddings.create(input=[text], model=model).data[0].embedding + +print(get_embedding("Once upon a time, there was a cat.")) +``` + + + + +Supported endpoints [#supported-endpoints] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Endpoint + + Method + + Docs +
+ /v1/models + + + + Models +
+ /v1/responses + + + + Responses +
+ /v1/chat/completions + + + + Chat Completions +
+ /v1/embeddings + + + + Embeddings +
+ /v1/completions + + + + Completions +
+ +
+ +Set the `base url` to point to LM Studio [#set-the-base-url-to-point-to-lm-studio] + +You can reuse existing OpenAI clients (in Python, JS, C#, etc) by switching up the "base URL" property to point to your LM Studio instead of OpenAI's servers. + +Note: The following examples assume the server port is `1234` + +Python Example [#python-example] + +```diff +from openai import OpenAI + +client = OpenAI( ++ base_url="http://localhost:1234/v1" +) + +# ... the rest of your code ... +``` + +Typescript Example [#typescript-example] + +```diff +import OpenAI from 'openai'; + +const client = new OpenAI({ ++ baseUrl: "http://localhost:1234/v1" +}); + +// ... the rest of your code ... +``` + +cURL Example [#curl-example] + +```diff +- curl https://api.openai.com/v1/chat/completions \ ++ curl http://localhost:1234/v1/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ +- "model": "gpt-4o-mini", ++ "model": "use the model identifier from LM Studio here", + "messages": [{"role": "user", "content": "Say this is a test!"}], + "temperature": 0.7 + }' +``` + +Using Codex with LM Studio [#using-codex-with-lm-studio] + +Codex is supported because LM Studio implements the OpenAI-compatible `POST /v1/responses` endpoint. + +See: [Use Codex with LM Studio](/docs/integrations/codex) and [Responses](/docs/developer/openai-compat/responses). + +*** + +Other OpenAI client libraries should have similar options to set the base URL. + +If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) and enter the `#🔨-developers` channel. + + + + +* Method: `GET` +* Returns the models visible to the server. The list may include all downloaded models when Just‑In‑Time loading is enabled. + +cURL [#curl] + +```bash +curl http://localhost:1234/v1/models +``` + + + + +* Method: `POST` +* See OpenAI docs: [https://platform.openai.com/docs/api-reference/responses](https://platform.openai.com/docs/api-reference/responses) + +cURL (non‑streaming) [#curl-nonstreaming] + +```bash +curl http://localhost:1234/v1/responses \ + -H "Content-Type: application/json" \ + -d '{ + "model": "openai/gpt-oss-20b", + "input": "Provide a prime number less than 50", + "reasoning": { "effort": "low" } + }' +``` + +Stateful follow‑up [#stateful-followup] + +Use the `id` from a previous response as `previous_response_id`. + +```bash +curl http://localhost:1234/v1/responses \ + -H "Content-Type: application/json" \ + -d '{ + "model": "openai/gpt-oss-20b", + "input": "Multiply it by 2", + "previous_response_id": "resp_123" + }' +``` + +Streaming [#streaming] + +```bash +curl http://localhost:1234/v1/responses \ + -H "Content-Type: application/json" \ + -d '{ + "model": "openai/gpt-oss-20b", + "input": "Hello", + "stream": true + }' +``` + +You will receive SSE events such as `response.created`, `response.output_text.delta`, and `response.completed`. + +Tools and Remote MCP (opt‑in) [#tools-and-remote-mcp-optin] + +Enable Remote MCP in the app (Developer → Settings). Example payload using an MCP server tool: + +```bash +curl http://localhost:1234/v1/responses \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "What is the top trending model on hugging face?", + "tools": [ + { + "type": "mcp", + "server_label": "huggingface", + "server_url": "https://huggingface.co/mcp", + "allowed_tools": [ + "model_search" + ] + } + ] + }' +``` + + + + +You can enforce a particular response format from an LLM by providing a JSON schema to the `/v1/chat/completions` endpoint, via LM Studio's REST API (or via any OpenAI client). + +
+ +Start LM Studio as a server [#start-lm-studio-as-a-server] + +To use LM Studio programmatically from your own code, run LM Studio as a local server. + +You can turn on the server from the "Developer" tab in LM Studio, or via the `lms` CLI: + +``` +lms server start +``` + +Install `lms` by running `npx lmstudio install-cli` [#install-lms-by-running-npx-lmstudio-install-cli] + +This will allow you to interact with LM Studio via the REST API. For an intro to LM Studio's REST API, see [REST API Overview](/docs/developer/rest). + +Structured Output [#structured-output] + +The API supports structured JSON outputs through the `/v1/chat/completions` endpoint when given a [JSON schema](https://json-schema.org/overview/what-is-jsonschema). Doing this will cause the LLM to respond in valid JSON conforming to the schema provided. + +It follows the same format as OpenAI's recently announced [Structured Output](https://platform.openai.com/docs/guides/structured-outputs) API and is expected to work via the OpenAI client SDKs. + +**Example using `curl`** + +This example demonstrates a structured output request using the `curl` utility. + +To run this example on Mac or Linux, use any terminal. On Windows, use [Git Bash](https://git-scm.com/download/win). + +```bash +curl http://localhost:1234/v1/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "{{model}}", + "messages": [ + { + "role": "system", + "content": "You are a helpful jokester." + }, + { + "role": "user", + "content": "Tell me a joke." + } + ], + "response_format": { + "type": "json_schema", + "json_schema": { + "name": "joke_response", + "strict": "true", + "schema": { + "type": "object", + "properties": { + "joke": { + "type": "string" + } + }, + "required": ["joke"] + } + } + }, + "temperature": 0.7, + "max_tokens": 50, + "stream": false + }' +``` + +All parameters recognized by `/v1/chat/completions` will be honored, and the JSON schema should be provided in the `json_schema` field of `response_format`. + +The JSON object will be provided in `string` form in the typical response field, `choices[0].message.content`, and will need to be parsed into a JSON object. + +**Example using `python`** + +```python +from openai import OpenAI +import json + +# Initialize OpenAI client that points to the local LM Studio server +client = OpenAI( + base_url="http://localhost:1234/v1", + api_key="lm-studio" +) + +# Define the conversation with the AI +messages = [ + {"role": "system", "content": "You are a helpful AI assistant."}, + {"role": "user", "content": "Create 1-3 fictional characters"} +] + +# Define the expected response structure +character_schema = { + "type": "json_schema", + "json_schema": { + "name": "characters", + "schema": { + "type": "object", + "properties": { + "characters": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": {"type": "string"}, + "occupation": {"type": "string"}, + "personality": {"type": "string"}, + "background": {"type": "string"} + }, + "required": ["name", "occupation", "personality", "background"] + }, + "minItems": 1, + } + }, + "required": ["characters"] + }, + } +} + +# Get response from AI +response = client.chat.completions.create( + model="your-model", + messages=messages, + response_format=character_schema, +) + +# Parse and display the results +results = json.loads(response.choices[0].message.content) +print(json.dumps(results, indent=2)) +``` + +**Important**: Not all models are capable of structured output, particularly LLMs below 7B parameters. + +Check the model card README if you are unsure if the model supports structured output. + +Structured output engine [#structured-output-engine] + +* For `GGUF` models: utilize `llama.cpp`'s grammar-based sampling APIs. +* For `MLX` models: using [Outlines](https://github.com/dottxt-ai/outlines). + +The MLX implementation is available on Github: [lmstudio-ai/mlx-engine](https://github.com/lmstudio-ai/mlx-engine). + +
+ +Community [#community] + +Chat with other LM Studio users, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). + + + + + + +Tool use enables LLMs to request calls to external functions and APIs through the `/v1/chat/completions` and `v1/responses` endpoints ([Learn more](/docs/developer/openai-compat)), via LM Studio's REST API (or via any OpenAI client). This expands their functionality far beyond text output. + +
+ +Quick Start [#quick-start] + + + +

+ Start LM Studio as a server +

+ + To use LM Studio programmatically from your own code, run LM Studio as a local server. + + You can turn on the server from the "Developer" tab in LM Studio, or via the `lms` CLI: + + ```bash + lms server start + ``` + + **Install `lms` by running `npx lmstudio install-cli`** + + This will allow you to interact with LM Studio via the REST API. For an intro to LM Studio's REST API, see [REST API Overview](/docs/developer/rest). +
+ + +

+ Load a Model +

+ + You can load a model from the "Chat" or "Developer" tabs in LM Studio, or via the `lms` CLI: + + ```bash + lms load + ``` +
+ + +

+ Copy, Paste, and Run an Example! +

+ + * `Curl` + * [Single Turn Tool Call Request](#example-using-curl) + * `Python` + * [Single Turn Tool Call + Tool Use](#single-turn-example) + * [Multi-Turn Example](#multi-turn-example) + * [Advanced Agent Example](#advanced-agent-example) +
+
+ +Tool Use [#tool-use] + +What really is "Tool Use"? [#what-really-is-tool-use] + +Tool use describes: + +* LLMs output text requesting functions to be called (LLMs cannot directly execute code) +* Your code executes those functions +* Your code feeds the results back to the LLM. + +High-level flow [#high-level-flow] + +```xml +┌──────────────────────────┐ +│ SETUP: LLM + Tool list │ +└──────────┬───────────────┘ + ▼ +┌──────────────────────────┐ +│ Get user input │◄────┐ +└──────────┬───────────────┘ │ + ▼ │ +┌──────────────────────────┐ │ +│ LLM prompted w/messages │ │ +└──────────┬───────────────┘ │ + ▼ │ + Needs tools? │ + │ │ │ + Yes No │ + │ │ │ + ▼ └────────────┐ │ +┌─────────────┐ │ │ +│Tool Response│ │ │ +└──────┬──────┘ │ │ + ▼ │ │ +┌─────────────┐ │ │ +│Execute tools│ │ │ +└──────┬──────┘ │ │ + ▼ ▼ │ +┌─────────────┐ ┌───────────┐ +│Add results │ │ Normal │ +│to messages │ │ response │ +└──────┬──────┘ └─────┬─────┘ + │ ▲ + └───────────────────────┘ +``` + +In-depth flow [#in-depth-flow] + +LM Studio supports tool use through the `/v1/chat/completions` endpoint when given function definitions in the `tools` parameter of the request body. Tools are specified as an array of function definitions that describe their parameters and usage, like: + +It follows the same format as OpenAI's [Function Calling](https://platform.openai.com/docs/guides/function-calling) API and is expected to work via the OpenAI client SDKs. + +We will use [lmstudio-community/Qwen2.5-7B-Instruct-GGUF](https://model.lmstudio.ai/download/lmstudio-community/Qwen2.5-7B-Instruct-GGUF) as the model in this example flow. + +1. You provide a list of tools to an LLM. These are the tools that the model can *request* calls to. + For example: + +```json +// the list of tools is model-agnostic +[ + { + "type": "function", + "function": { + "name": "get_delivery_date", + "description": "Get the delivery date for a customer's order", + "parameters": { + "type": "object", + "properties": { + "order_id": { + "type": "string" + } + }, + "required": ["order_id"] + } + } + } +] +``` + +This list will be injected into the `system` prompt of the model depending on the model's chat template. For `Qwen2.5-Instruct`, this looks like: + +```json +<|im_start|>system +You are Qwen, created by Alibaba Cloud. You are a helpful assistant. + +# Tools + +You may call one or more functions to assist with the user query. + +You are provided with function signatures within XML tags: + +{"type": "function", "function": {"name": "get_delivery_date", "description": "Get the delivery date for a customer's order", "parameters": {"type": "object", "properties": {"order_id": {"type": "string"}}, "required": ["order_id"]}}} + + +For each function call, return a json object with function name and arguments within XML tags: + +{"name": , "arguments": } +<|im_end|> +``` + +**Important**: The model can only *request* calls to these tools because LLMs *cannot* directly call functions, APIs, or any other tools. They can only output text, which can then be parsed to programmatically call the functions. + +2. When prompted, the LLM can then decide to either: + + * (a) Call one or more tools + + ```xml + User: Get me the delivery date for order 123 + Model: + {"name": "get_delivery_date", "arguments": {"order_id": "123"}} + + ``` + + * (b) Respond normally + + ```xml + User: Hi + Model: Hello! How can I assist you today? + ``` + +3. LM Studio parses the text output from the model into an OpenAI-compliant `chat.completion` response object. + + * If the model was given access to `tools`, LM Studio will attempt to parse the tool calls into the `response.choices[0].message.tool_calls` field of the `chat.completion` response object. + * If LM Studio cannot parse any **correctly formatted** tool calls, it will simply return the response to the standard `response.choices[0].message.content` field. + * **Note**: Smaller models and models that were not trained for tool use may output improperly formatted tool calls, resulting in LM Studio being unable to parse them into the `tool_calls` field. This is useful for troubleshooting when you do not receive `tool_calls` as expected. Example of an improperly formatting `Qwen2.5-Instruct` tool call: + + ```xml + + ["name": "get_delivery_date", function: "date"] + + ``` + + > Note that the brackets are incorrect, and the call does not follow the `name, argument` format. + +4. Your code parses the `chat.completion` response to check for tool calls from the model, then calls the appropriate tools with the parameters specified by the model. Your code then adds both: + + 1. The model's tool call message + 2. The result of the tool call + + To the `messages` array to send back to the model + + ```python + # pseudocode, see examples for copy-paste snippets + if response.has_tool_calls: + for each tool_call: + # Extract function name & args + function_to_call = tool_call.name # e.g. "get_delivery_date" + args = tool_call.arguments # e.g. {"order_id": "123"} + + # Execute the function + result = execute_function(function_to_call, args) + + # Add result to conversation + add_to_messages([ + ASSISTANT_TOOL_CALL_MESSAGE, # The request to use the tool + TOOL_RESULT_MESSAGE # The tool's response + ]) + else: + # Normal response without tools + add_to_messages(response.content) + ``` + +5. The LLM is then prompted again with the updated messages array, but without access to tools. This is because: + * The LLM already has the tool results in the conversation history + * We want the LLM to provide a final response to the user, not call more tools + ```python + # Example messages + messages = [ + {"role": "user", "content": "When will order 123 be delivered?"}, + {"role": "assistant", "function_call": { + "name": "get_delivery_date", + "arguments": {"order_id": "123"} + }}, + {"role": "tool", "content": "2024-03-15"}, + ] + response = client.chat.completions.create( + model="lmstudio-community/qwen2.5-7b-instruct", + messages=messages + ) + ``` + The `response.choices[0].message.content` field after this call may be something like: + ```xml + Your order #123 will be delivered on March 15th, 2024 + ``` + +6. The loop continues back at step 2 of the flow + +Note: This is the `pedantic` flow for tool use. However, you can certainly experiment with this flow to best fit your use case. + +Supported Models [#supported-models] + +Through LM Studio, **all** models support at least some degree of tool use. + +However, there are currently two levels of support that may impact the quality of the experience: Native and Default. + +Models with Native tool use support will have a hammer badge in the app, and generally perform better in tool use scenarios. + +Native tool use support [#native-tool-use-support] + +"Native" tool use support means that both: + +1. The model has a chat template that supports tool use (usually means the model has been trained for tool use) + * This is what will be used to format the `tools` array into the system prompt and tell them model how to format tool calls + * Example: [Qwen2.5-Instruct chat template](https://huggingface.co/mlx-community/Qwen2.5-7B-Instruct-4bit?chat_template=default) +2. LM Studio supports that model's tool use format + * Required for LM Studio to properly input the chat history into the chat template, and parse the tool calls the model outputs into the `chat.completion` object + +Models that currently have native tool use support in LM Studio (subject to change): + +* Qwen + * `GGUF` [lmstudio-community/Qwen2.5-7B-Instruct-GGUF](https://model.lmstudio.ai/download/lmstudio-community/Qwen2.5-7B-Instruct-GGUF) (4.68 GB) + * `MLX` [mlx-community/Qwen2.5-7B-Instruct-4bit](https://model.lmstudio.ai/download/mlx-community/Qwen2.5-7B-Instruct-4bit) (4.30 GB) +* Llama-3.1, Llama-3.2 + * `GGUF` [lmstudio-community/Meta-Llama-3.1-8B-Instruct-GGUF](https://model.lmstudio.ai/download/lmstudio-community/Meta-Llama-3.1-8B-Instruct-GGUF) (4.92 GB) + * `MLX` [mlx-community/Meta-Llama-3.1-8B-Instruct-8bit](https://model.lmstudio.ai/download/mlx-community/Meta-Llama-3.1-8B-Instruct-8bit) (8.54 GB) +* Mistral + * `GGUF` [bartowski/Ministral-8B-Instruct-2410-GGUF](https://model.lmstudio.ai/download/bartowski/Ministral-8B-Instruct-2410-GGUF) (4.67 GB) + * `MLX` [mlx-community/Ministral-8B-Instruct-2410-4bit](https://model.lmstudio.ai/download/mlx-community/Ministral-8B-Instruct-2410-4bit) (4.67 GB GB) + +Default tool use support [#default-tool-use-support] + +"Default" tool use support means that **either**: + +1. The model does not have chat template that supports tool use (usually means the model has not been trained for tool use) +2. LM Studio does not currently support that model's tool use format + +Under the hood, default tool use works by: + +* Giving models a custom system prompt and a default tool call format to use +* Converting `tool` role messages to the `user` role so that chat templates without the `tool` role are compatible +* Converting `assistant` role `tool_calls` into the default tool call format + +Results will vary by model. + +You can see the default format by running `lms log stream` in your terminal, then sending a chat completion request with `tools` to a model that doesn't have Native tool use support. The default format is subject to change. + +
+ + Expand to see example of default tool use format + + + ```bash + -> % lms log stream + Streaming logs from LM Studio + + timestamp: 11/13/2024, 9:35:15 AM + type: llm.prediction.input + modelIdentifier: gemma-2-2b-it + modelPath: lmstudio-community/gemma-2-2b-it-GGUF/gemma-2-2b-it-Q4_K_M.gguf + input: "system + You are a tool-calling AI. You can request calls to available tools with this EXACT format: + [TOOL_REQUEST]{\"name\": \"tool_name\", \"arguments\": {\"param1\": \"value1\"}}[END_TOOL_REQUEST] + + AVAILABLE TOOLS: + { + \"type\": \"toolArray\", + \"tools\": [ + { + \"type\": \"function\", + \"function\": { + \"name\": \"get_delivery_date\", + \"description\": \"Get the delivery date for a customer's order\", + \"parameters\": { + \"type\": \"object\", + \"properties\": { + \"order_id\": { + \"type\": \"string\" + } + }, + \"required\": [ + \"order_id\" + ] + } + } + } + ] + } + + RULES: + - Only use tools from AVAILABLE TOOLS + - Include all required arguments + - Use one [TOOL_REQUEST] block per tool + - Never use [TOOL_RESULT] + - If you decide to call one or more tools, there should be no other text in your message + + Examples: + \"Check Paris weather\" + [TOOL_REQUEST]{\"name\": \"get_weather\", \"arguments\": {\"location\": \"Paris\"}}[END_TOOL_REQUEST] + + \"Send email to John about meeting and open browser\" + [TOOL_REQUEST]{\"name\": \"send_email\", \"arguments\": {\"to\": \"John\", \"subject\": \"meeting\"}}[END_TOOL_REQUEST] + [TOOL_REQUEST]{\"name\": \"open_browser\", \"arguments\": {}}[END_TOOL_REQUEST] + + Respond conversationally if no matching tools exist. + user + Get me delivery date for order 123 + model + " + ``` + + If the model follows this format exactly to call tools, i.e: + + ``` + [TOOL_REQUEST]{\"name\": \"get_delivery_date\", \"arguments\": {\"order_id\": \"123\"}}[END_TOOL_REQUEST] + ``` + + Then LM Studio will be able to parse those tool calls into the `chat.completions` object, just like for natively supported models. +
+ +All models that don't have native tool use support will have default tool use support. + +Example using `curl` [#example-using-curl] + +This example demonstrates a model requesting a tool call using the `curl` utility. + +To run this example on Mac or Linux, use any terminal. On Windows, use [Git Bash](https://git-scm.com/download/win). + +```bash +curl http://localhost:1234/v1/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "lmstudio-community/qwen2.5-7b-instruct", + "messages": [{"role": "user", "content": "What dell products do you have under $50 in electronics?"}], + "tools": [ + { + "type": "function", + "function": { + "name": "search_products", + "description": "Search the product catalog by various criteria. Use this whenever a customer asks about product availability, pricing, or specifications.", + "parameters": { + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "Search terms or product name" + }, + "category": { + "type": "string", + "description": "Product category to filter by", + "enum": ["electronics", "clothing", "home", "outdoor"] + }, + "max_price": { + "type": "number", + "description": "Maximum price in dollars" + } + }, + "required": ["query"], + "additionalProperties": false + } + } + } + ] + }' +``` + +All parameters recognized by `/v1/chat/completions` will be honored, and the array of available tools should be provided in the `tools` field. + +If the model decides that the user message would be best fulfilled with a tool call, an array of tool call request objects will be provided in the response field, `choices[0].message.tool_calls`. + +The `finish_reason` field of the top-level response object will also be populated with `"tool_calls"`. + +An example response to the above `curl` request will look like: + +```bash +{ + "id": "chatcmpl-gb1t1uqzefudice8ntxd9i", + "object": "chat.completion", + "created": 1730913210, + "model": "lmstudio-community/qwen2.5-7b-instruct", + "choices": [ + { + "index": 0, + "logprobs": null, + "finish_reason": "tool_calls", + "message": { + "role": "assistant", + "tool_calls": [ + { + "id": "365174485", + "type": "function", + "function": { + "name": "search_products", + "arguments": "{\"query\":\"dell\",\"category\":\"electronics\",\"max_price\":50}" + } + } + ] + } + } + ], + "usage": { + "prompt_tokens": 263, + "completion_tokens": 34, + "total_tokens": 297 + }, + "system_fingerprint": "lmstudio-community/qwen2.5-7b-instruct" +} +``` + +In plain english, the above response can be thought of as the model saying: + +> "Please call the `search_products` function, with arguments: +> +> * 'dell' for the `query` parameter, +> * 'electronics' for the `category` parameter +> * '50' for the `max_price` parameter +> +> and give me back the results" + +The `tool_calls` field will need to be parsed to call actual functions/APIs. The below examples demonstrate how. + +Examples using `python` [#examples-using-python] + +Tool use shines when paired with program languages like python, where you can implement the functions specified in the `tools` field to programmatically call them when the model requests. + +Single-turn example [#single-turn-example] + +Below is a simple single-turn (model is only called once) example of enabling a model to call a function called `say_hello` that prints a hello greeting to the console: + +`single-turn-example.py` + +```python +from openai import OpenAI + +# Connect to LM Studio +client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio") + +# Define a simple function +def say_hello(name: str) -> str: + print(f"Hello, {name}!") + +# Tell the AI about our function +tools = [ + { + "type": "function", + "function": { + "name": "say_hello", + "description": "Says hello to someone", + "parameters": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The person's name" + } + }, + "required": ["name"] + } + } + } +] + +# Ask the AI to use our function +response = client.chat.completions.create( + model="lmstudio-community/qwen2.5-7b-instruct", + messages=[{"role": "user", "content": "Can you say hello to Bob the Builder?"}], + tools=tools +) + +# Get the name the AI wants to use a tool to say hello to +# (Assumes the AI has requested a tool call and that tool call is say_hello) +tool_call = response.choices[0].message.tool_calls[0] +name = eval(tool_call.function.arguments)["name"] + +# Actually call the say_hello function +say_hello(name) # Prints: Hello, Bob the Builder! + +``` + +Running this script from the console should yield results like: + +```xml +-> % python single-turn-example.py +Hello, Bob the Builder! +``` + +Play around with the name in + +```python +messages=[{"role": "user", "content": "Can you say hello to Bob the Builder?"}] +``` + +to see the model call the `say_hello` function with different names. + +Multi-turn example [#multi-turn-example] + +Now for a slightly more complex example. + +In this example, we'll: + +1. Enable the model to call a `get_delivery_date` function +2. Hand the result of calling that function back to the model, so that it can fulfill the user's request in plain text + +
+ + multi-turn-example.py + + (click to expand) + + + ```python + from datetime import datetime, timedelta + import json + import random + from openai import OpenAI + + # Point to the local server + client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio") + model = "lmstudio-community/qwen2.5-7b-instruct" + + + def get_delivery_date(order_id: str) -> datetime: + # Generate a random delivery date between today and 14 days from now + # in a real-world scenario, this function would query a database or API + today = datetime.now() + random_days = random.randint(1, 14) + delivery_date = today + timedelta(days=random_days) + print( + f"\nget_delivery_date function returns delivery date:\n\n{delivery_date}", + flush=True, + ) + return delivery_date + + + tools = [ + { + "type": "function", + "function": { + "name": "get_delivery_date", + "description": "Get the delivery date for a customer's order. Call this whenever you need to know the delivery date, for example when a customer asks 'Where is my package'", + "parameters": { + "type": "object", + "properties": { + "order_id": { + "type": "string", + "description": "The customer's order ID.", + }, + }, + "required": ["order_id"], + "additionalProperties": False, + }, + }, + } + ] + + messages = [ + { + "role": "system", + "content": "You are a helpful customer support assistant. Use the supplied tools to assist the user.", + }, + { + "role": "user", + "content": "Give me the delivery date and time for order number 1017", + }, + ] + + # LM Studio + response = client.chat.completions.create( + model=model, + messages=messages, + tools=tools, + ) + + print("\nModel response requesting tool call:\n", flush=True) + print(response, flush=True) + + # Extract the arguments for get_delivery_date + # Note this code assumes we have already determined that the model generated a function call. + tool_call = response.choices[0].message.tool_calls[0] + arguments = json.loads(tool_call.function.arguments) + + order_id = arguments.get("order_id") + + # Call the get_delivery_date function with the extracted order_id + delivery_date = get_delivery_date(order_id) + + assistant_tool_call_request_message = { + "role": "assistant", + "tool_calls": [ + { + "id": response.choices[0].message.tool_calls[0].id, + "type": response.choices[0].message.tool_calls[0].type, + "function": response.choices[0].message.tool_calls[0].function, + } + ], + } + + # Create a message containing the result of the function call + function_call_result_message = { + "role": "tool", + "content": json.dumps( + { + "order_id": order_id, + "delivery_date": delivery_date.strftime("%Y-%m-%d %H:%M:%S"), + } + ), + "tool_call_id": response.choices[0].message.tool_calls[0].id, + } + + # Prepare the chat completion call payload + completion_messages_payload = [ + messages[0], + messages[1], + assistant_tool_call_request_message, + function_call_result_message, + ] + + # Call the OpenAI API's chat completions endpoint to send the tool call result back to the model + # LM Studio + response = client.chat.completions.create( + model=model, + messages=completion_messages_payload, + ) + + print("\nFinal model response with knowledge of the tool call result:\n", flush=True) + print(response.choices[0].message.content, flush=True) + + ``` +
+ +Running this script from the console should yield results like: + +```xml +-> % python multi-turn-example.py + +Model response requesting tool call: + +ChatCompletion(id='chatcmpl-wwpstqqu94go4hvclqnpwn', choices=[Choice(finish_reason='tool_calls', index=0, logprobs=None, message=ChatCompletionMessage(content=None, refusal=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='377278620', function=Function(arguments='{"order_id":"1017"}', name='get_delivery_date'), type='function')]))], created=1730916196, model='lmstudio-community/qwen2.5-7b-instruct', object='chat.completion', service_tier=None, system_fingerprint='lmstudio-community/qwen2.5-7b-instruct', usage=CompletionUsage(completion_tokens=24, prompt_tokens=223, total_tokens=247, completion_tokens_details=None, prompt_tokens_details=None)) + +get_delivery_date function returns delivery date: + +2024-11-19 13:03:17.773298 + +Final model response with knowledge of the tool call result: + +Your order number 1017 is scheduled for delivery on November 19, 2024, at 13:03 PM. +``` + +Advanced agent example [#advanced-agent-example] + +Building upon the principles above, we can combine LM Studio models with locally defined functions to create an "agent" - a system that pairs a language model with custom functions to understand requests and perform actions beyond basic text generation. + +The agent in the below example can: + +1. Open safe urls in your default browser +2. Check the current time +3. Analyze directories in your file system + +
+ + agent-chat-example.py + + (click to expand) + + + ```python + import json + from urllib.parse import urlparse + import webbrowser + from datetime import datetime + import os + from openai import OpenAI + + # Point to the local server + client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio") + model = "lmstudio-community/qwen2.5-7b-instruct" + + + def is_valid_url(url: str) -> bool: + + try: + result = urlparse(url) + return bool(result.netloc) # Returns True if there's a valid network location + except Exception: + return False + + + def open_safe_url(url: str) -> dict: + # List of allowed domains (expand as needed) + SAFE_DOMAINS = { + "lmstudio.ai", + "huggingface.co", + "github.com", + "google.com", + "wikipedia.org", + "weather.com", + "stackoverflow.com", + "python.org", + "docs.python.org", + } + + try: + # Add http:// if no scheme is present + if not url.startswith(('http://', 'https://')): + url = 'http://' + url + + # Validate URL format + if not is_valid_url(url): + return {"status": "error", "message": f"Invalid URL format: {url}"} + + # Parse the URL and check domain + parsed_url = urlparse(url) + domain = parsed_url.netloc.lower() + base_domain = ".".join(domain.split(".")[-2:]) + + if base_domain in SAFE_DOMAINS: + webbrowser.open(url) + return {"status": "success", "message": f"Opened {url} in browser"} + else: + return { + "status": "error", + "message": f"Domain {domain} not in allowed list", + } + } + except Exception as e: + return {"status": "error", "message": str(e)} + + + def get_current_time() -> dict: + """Get the current system time with timezone information""" + try: + current_time = datetime.now() + timezone = datetime.now().astimezone().tzinfo + formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S %Z") + return { + "status": "success", + "time": formatted_time, + "timezone": str(timezone), + "timestamp": current_time.timestamp(), + } + except Exception as e: + return {"status": "error", "message": str(e)} + + + def analyze_directory(path: str = ".") -> dict: + """Count and categorize files in a directory""" + try: + stats = { + "total_files": 0, + "total_dirs": 0, + "file_types": {}, + "total_size_bytes": 0, + } + + for entry in os.scandir(path): + if entry.is_file(): + stats["total_files"] += 1 + ext = os.path.splitext(entry.name)[1].lower() or "no_extension" + stats["file_types"][ext] = stats["file_types"].get(ext, 0) + 1 + stats["total_size_bytes"] += entry.stat().st_size + elif entry.is_dir(): + stats["total_dirs"] += 1 + # Add size of directory contents + for root, _, files in os.walk(entry.path): + for file in files: + try: + stats["total_size_bytes"] += os.path.getsize(os.path.join(root, file)) + except (OSError, FileNotFoundError): + continue + + return {"status": "success", "stats": stats, "path": os.path.abspath(path)} + except Exception as e: + return {"status": "error", "message": str(e)} + + + tools = [ + { + "type": "function", + "function": { + "name": "open_safe_url", + "description": "Open a URL in the browser if it's deemed safe", + "parameters": { + "type": "object", + "properties": { + "url": { + "type": "string", + "description": "The URL to open", + }, + }, + "required": ["url"], + }, + }, + }, + { + "type": "function", + "function": { + "name": "get_current_time", + "description": "Get the current system time with timezone information", + "parameters": { + "type": "object", + "properties": {}, + "required": [], + }, + }, + }, + { + "type": "function", + "function": { + "name": "analyze_directory", + "description": "Analyze the contents of a directory, counting files and folders", + "parameters": { + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "The directory path to analyze. Defaults to current directory if not specified.", + }, + }, + "required": [], + }, + }, + }, + ] + + + def process_tool_calls(response, messages): + """Process multiple tool calls and return the final response and updated messages""" + # Get all tool calls from the response + tool_calls = response.choices[0].message.tool_calls + + # Create the assistant message with tool calls + assistant_tool_call_message = { + "role": "assistant", + "tool_calls": [ + { + "id": tool_call.id, + "type": tool_call.type, + "function": tool_call.function, + } + for tool_call in tool_calls + ], + } + + # Add the assistant's tool call message to the history + messages.append(assistant_tool_call_message) + + # Process each tool call and collect results + tool_results = [] + for tool_call in tool_calls: + # For functions with no arguments, use empty dict + arguments = ( + json.loads(tool_call.function.arguments) + if tool_call.function.arguments.strip() + else {} + ) + + # Determine which function to call based on the tool call name + if tool_call.function.name == "open_safe_url": + result = open_safe_url(arguments["url"]) + elif tool_call.function.name == "get_current_time": + result = get_current_time() + elif tool_call.function.name == "analyze_directory": + path = arguments.get("path", ".") + result = analyze_directory(path) + else: + # llm tried to call a function that doesn't exist, skip + continue + + # Add the result message + tool_result_message = { + "role": "tool", + "content": json.dumps(result), + "tool_call_id": tool_call.id, + } + tool_results.append(tool_result_message) + messages.append(tool_result_message) + + # Get the final response + final_response = client.chat.completions.create( + model=model, + messages=messages, + ) + + return final_response + + + def chat(): + messages = [ + { + "role": "system", + "content": "You are a helpful assistant that can open safe web links, tell the current time, and analyze directory contents. Use these capabilities whenever they might be helpful.", + } + ] + + print( + "Assistant: Hello! I can help you open safe web links, tell you the current time, and analyze directory contents. What would you like me to do?" + ) + print("(Type 'quit' to exit)") + + while True: + # Get user input + user_input = input("\nYou: ").strip() + + # Check for quit command + if user_input.lower() == "quit": + print("Assistant: Goodbye!") + break + + # Add user message to conversation + messages.append({"role": "user", "content": user_input}) + + try: + # Get initial response + response = client.chat.completions.create( + model=model, + messages=messages, + tools=tools, + ) + + # Check if the response includes tool calls + if response.choices[0].message.tool_calls: + # Process all tool calls and get final response + final_response = process_tool_calls(response, messages) + print("\nAssistant:", final_response.choices[0].message.content) + + # Add assistant's final response to messages + messages.append( + { + "role": "assistant", + "content": final_response.choices[0].message.content, + } + ) + else: + # If no tool call, just print the response + print("\nAssistant:", response.choices[0].message.content) + + # Add assistant's response to messages + messages.append( + { + "role": "assistant", + "content": response.choices[0].message.content, + } + ) + + except Exception as e: + print(f"\nAn error occurred: {str(e)}") + exit(1) + + + if __name__ == "__main__": + chat() + + ``` +
+ +Running this script from the console will allow you to chat with the agent: + +```xml +-> % python agent-example.py +Assistant: Hello! I can help you open safe web links, tell you the current time, and analyze directory contents. What would you like me to do? +(Type 'quit' to exit) + +You: What time is it? + +Assistant: The current time is 14:11:40 (EST) as of November 6, 2024. + +You: What time is it now? + +Assistant: The current time is 14:13:59 (EST) as of November 6, 2024. + +You: Open lmstudio.ai + +Assistant: The link to lmstudio.ai has been opened in your default web browser. + +You: What's in my current directory? + +Assistant: Your current directory at `/Users/matt/project` contains a total of 14 files and 8 directories. Here's the breakdown: + +- Files without an extension: 3 +- `.mjs` files: 2 +- `.ts` (TypeScript) files: 3 +- Markdown (`md`) file: 1 +- JSON files: 4 +- TOML file: 1 + +The total size of these items is 1,566,990,604 bytes. + +You: Thank you! + +Assistant: You're welcome! If you have any other questions or need further assistance, feel free to ask. + +You: +``` + +Streaming [#streaming] + +When streaming through `/v1/chat/completions` (`stream=true`), tool calls are sent in chunks. Function names and arguments are sent in pieces via `chunk.choices[0].delta.tool_calls.function.name` and `chunk.choices[0].delta.tool_calls.function.arguments`. + +For example, to call `get_current_weather(location="San Francisco")`, the streamed `ChoiceDeltaToolCall` in each `chunk.choices[0].delta.tool_calls[0]` object will look like: + +```py +ChoiceDeltaToolCall(index=0, id='814890118', function=ChoiceDeltaToolCallFunction(arguments='', name='get_current_weather'), type='function') +ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='{"', name=None), type=None) +ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='location', name=None), type=None) +ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='":"', name=None), type=None) +ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='San Francisco', name=None), type=None) +ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='"}', name=None), type=None) +``` + +These chunks must be accumulated throughout the stream to form the complete function signature for execution. + +The below example shows how to create a simple tool-enhanced chatbot through the `/v1/chat/completions` streaming endpoint (`stream=true`). + +
+ + tool-streaming-chatbot.py + + (click to expand) + + + ```python + from openai import OpenAI + import time + + client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio") + MODEL = "lmstudio-community/qwen2.5-7b-instruct" + + TIME_TOOL = { + "type": "function", + "function": { + "name": "get_current_time", + "description": "Get the current time, only if asked", + "parameters": {"type": "object", "properties": {}}, + }, + } + + def get_current_time(): + return {"time": time.strftime("%H:%M:%S")} + + def process_stream(stream, add_assistant_label=True): + """Handle streaming responses from the API""" + collected_text = "" + tool_calls = [] + first_chunk = True + + for chunk in stream: + delta = chunk.choices[0].delta + + # Handle regular text output + if delta.content: + if first_chunk: + print() + if add_assistant_label: + print("Assistant:", end=" ", flush=True) + first_chunk = False + print(delta.content, end="", flush=True) + collected_text += delta.content + + # Handle tool calls + elif delta.tool_calls: + for tc in delta.tool_calls: + if len(tool_calls) <= tc.index: + tool_calls.append({ + "id": "", "type": "function", + "function": {"name": "", "arguments": ""} + }) + tool_calls[tc.index] = { + "id": (tool_calls[tc.index]["id"] + (tc.id or "")), + "type": "function", + "function": { + "name": (tool_calls[tc.index]["function"]["name"] + (tc.function.name or "")), + "arguments": (tool_calls[tc.index]["function"]["arguments"] + (tc.function.arguments or "")) + } + } + return collected_text, tool_calls + + def chat_loop(): + messages = [] + print("Assistant: Hi! I am an AI agent empowered with the ability to tell the current time (Type 'quit' to exit)") + + while True: + user_input = input("\nYou: ").strip() + if user_input.lower() == "quit": + break + + messages.append({"role": "user", "content": user_input}) + + # Get initial response + response_text, tool_calls = process_stream( + client.chat.completions.create( + model=MODEL, + messages=messages, + tools=[TIME_TOOL], + stream=True, + temperature=0.2 + ) + ) + + if not tool_calls: + print() + + text_in_first_response = len(response_text) > 0 + if text_in_first_response: + messages.append({"role": "assistant", "content": response_text}) + + # Handle tool calls if any + if tool_calls: + tool_name = tool_calls[0]["function"]["name"] + print() + if not text_in_first_response: + print("Assistant:", end=" ", flush=True) + print(f"**Calling Tool: {tool_name}**") + messages.append({"role": "assistant", "tool_calls": tool_calls}) + + # Execute tool calls + for tool_call in tool_calls: + if tool_call["function"]["name"] == "get_current_time": + result = get_current_time() + messages.append({ + "role": "tool", + "content": str(result), + "tool_call_id": tool_call["id"] + }) + + # Get final response after tool execution + final_response, _ = process_stream( + client.chat.completions.create( + model=MODEL, + messages=messages, + stream=True + ), + add_assistant_label=False + ) + + if final_response: + print() + messages.append({"role": "assistant", "content": final_response}) + + if __name__ == "__main__": + chat_loop() + ``` +
+ +You can chat with the bot by running this script from the console: + +```xml +-> % python tool-streaming-chatbot.py +Assistant: Hi! I am an AI agent empowered with the ability to tell the current time (Type 'quit' to exit) + +You: Tell me a joke, then tell me the current time + +Assistant: Sure! Here's a light joke for you: Why don't scientists trust atoms? Because they make up everything. + +Now, let me get the current time for you. + +**Calling Tool: get_current_time** + +The current time is 18:49:31. Enjoy your day! + +You: +``` + +Community [#community] + +Chat with other LM Studio users, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). + + + + +Supported endpoints [#supported-endpoints] + + + + + + + + + + + + + + + + + + + + + +
+ Endpoint + + Method + + Docs +
+ /v1/messages + + + + Messages +
+ +Using Claude Code with LM Studio [#using-claude-code-with-lm-studio] + +For a full walkthrough, see: [Use Claude Code with LM Studio](/docs/integrations/claude-code). + +```bash +export ANTHROPIC_BASE_URL=http://localhost:1234 +export ANTHROPIC_AUTH_TOKEN=lmstudio +claude --model openai/gpt-oss-20b +``` + +Authentication headers [#authentication-headers] + +When Require Authentication is enabled, LM Studio accepts both `x-api-key` and the standard `Authorization: Bearer ` header. To learn more about enabling auth in LM Studio, see [Authentication](/docs/developer/core/authentication). + +Set the base URL to point to LM Studio [#set-the-base-url-to-point-to-lm-studio] + +Point your Anthropic client, or any HTTP request, at your local LM Studio server. + +Note: The following examples assume the server port is `1234`. + +cURL example [#curl-example] + +```diff +- curl https://api.anthropic.com/v1/messages \ ++ curl http://localhost:1234/v1/messages \ + -H "Content-Type: application/json" \ ++ -H "x-api-key: $LM_API_TOKEN" \ + -d '{ +- "model": "claude-4-5-sonnet", ++ "model": "ibm/granite-4-micro", + "max_tokens": 256, + "messages": [ + {"role": "user", "content": "Write a haiku about local LLMs."} + ] + }' +``` + +Python example [#python-example] + +```python +from anthropic import Anthropic + +client = Anthropic( + base_url="http://localhost:1234", + api_key="lmstudio", +) + +message = client.messages.create( + max_tokens=1024, + messages=[ + { + "role": "user", + "content": "Hello from LM Studio", + } + ], + model="ibm/granite-4-micro", +) + +print(message.content) +``` + +If you have not enabled Require Authentication, the `x-api-key` header is optional. For the Python example, you can also omit `api_key` when authentication is disabled. + +If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) and enter the developers channel. + + + + +* Method: `POST` +* Endpoint: `/v1/messages` +* See Anthropic docs: [https://platform.claude.com/docs/en/api/messages/create](https://platform.claude.com/docs/en/api/messages/create) + +cURL example [#curl-example] + +```bash +curl http://localhost:1234/v1/messages \ + -H "Content-Type: application/json" \ + -H "x-api-key: $LM_API_TOKEN" \ + -d '{ + "model": "ibm/granite-4-micro", + "max_tokens": 256, + "messages": [ + {"role": "user", "content": "Say hello from LM Studio."} + ] + }' +``` + +If you have not enabled Require Authentication, the `x-api-key` header is optional. + +cURL (streaming) [#curl-streaming] + +```bash +curl http://localhost:1234/v1/messages \ + -H "Content-Type: application/json" \ + -H "x-api-key: $LM_API_TOKEN" \ + -d '{ + "model": "ibm/granite-4-micro", + "messages": [{"role": "user", "content": "Hello"}], + "max_tokens": 256, + "stream": true + }' +``` + +You will receive SSE events such as `message_start`, `content_block_start`, `content_block_delta`, `content_block_stop`, `message_delta`, and `message_stop`. + +cURL (tools) [#curl-tools] + +```bash +curl http://localhost:1234/v1/messages \ + -H "Content-Type: application/json" \ + -H "x-api-key: $LM_API_TOKEN" \ + -d '{ + "model": "ibm/granite-4-micro", + "max_tokens": 1024, + "tools": [ + { + "name": "get_weather", + "description": "Get the current weather in a given location", + "input_schema": { + "type": "object", + "properties": { + "location": { + "type": "string", + "description": "The city and state, e.g. San Francisco, CA" + } + }, + "required": ["location"] + } + } + ], + "tool_choice": {"type": "any"}, + "messages": [ + { + "role": "user", + "content": "What is the weather like in San Francisco?" + } + ] + }' +``` + + + + +Requires LM Studio 0.4.0 or newer. [#requires-lm-studio-040-or-newer] + +LM Studio supports API Tokens for authentication, providing a secure and convenient way to access the LM Studio API. + +By default, the LM Studio API runs **without enforcing authentication**. For production or shared environments, enable API Token authentication for secure access. + + + To enable API Token authentication, create tokens and control granular permissions, check [this guide](/docs/developer/core/authentication) for more details. + + +Providing the API Token [#providing-the-api-token] + +The API Token can be provided in two ways: + +1. **Environment Variable (Recommended)**: Set the `LM_API_TOKEN` environment variable, and the SDK will automatically read it. +2. **Function Argument**: Pass the token directly as the `api_token` parameter. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + # Configure the default client with an API token + lms.configure_default_client(api_token="your-token-here") + + model = lms.llm() + result = model.respond("What is the meaning of life?") + print(result) + ``` + + + + ```python + import lmstudio as lms + + # Pass api_token to the Client constructor + with lms.Client(api_token="your-token-here") as client: + model = client.llm.model() + result = model.respond("What is the meaning of life?") + print(result) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + # Pass api_token to the AsyncClient constructor + async with lms.AsyncClient(api_token="your-token-here") as client: + model = await client.llm.model() + result = await model.respond("What is the meaning of life?") + print(result) + ``` + + + + + + +`lmstudio` is a library published on PyPI that allows you to use `lmstudio-python` in your own projects. +It is open source and developed on GitHub. +You can find the source code [here](https://github.com/lmstudio-ai/lmstudio-python). + +Installing `lmstudio-python` [#installing-lmstudio-python] + +As it is published to PyPI, `lmstudio-python` may be installed using `pip` +or your preferred project dependency manager (`pdm` and `uv` are shown, but other +Python project management tools offer similar dependency addition commands). + + + + + pip + + + + pdm + + + + uv + + + + + ```bash + pip install lmstudio + ``` + + + + ```bash + pdm add lmstudio + ``` + + + + ```bash + uv add lmstudio + ``` + + + +Customizing the server API host and TCP port [#customizing-the-server-api-host-and-tcp-port] + +All of the examples in the documentation assume that the server API is running locally +on one of the default application ports (Note: in Python SDK versions prior to 1.5.0, the +SDK also required that the optional HTTP REST server be enabled). + +The network location of the server API can be overridden by +passing a `"host:port"` string when creating the client instance. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + SERVER_API_HOST = "localhost:1234" + + # This must be the *first* convenience API interaction (otherwise the SDK + # implicitly creates a client that accesses the default server API host) + lms.configure_default_client(SERVER_API_HOST) + + # Note: the dedicated configuration API was added in lmstudio-python 1.3.0 + # For compatibility with earlier SDK versions, it is still possible to use + # lms.get_default_client(SERVER_API_HOST) to configure the default client + ``` + + + + ```python + import lmstudio as lms + SERVER_API_HOST = "localhost:1234" + + # When using the scoped resource API, each client instance + # can be configured to use a specific server API host + with lms.Client(SERVER_API_HOST) as client: + model = client.llm.model() + + for fragment in model.respond_stream("What is the meaning of life?"): + print(fragment.content, end="", flush=True) + print() # Advance to a new line at the end of the response + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + SERVER_API_HOST = "localhost:1234" + + # When using the asynchronous API, each client instance + # can be configured to use a specific server API host + async with lms.AsyncClient(SERVER_API_HOST) as client: + model = await client.llm.model() + + for fragment in await model.respond_stream("What is the meaning of life?"): + print(fragment.content, end="", flush=True) + print() # Advance to a new line at the end of the response + ``` + + + +Checking a specified API server host is running [#checking-a-specified-api-server-host-is-running] + +*Required Python SDK version*: **1.5.0** + +While the most common connection pattern is to let the SDK raise an exception if it can't +connect to the specified API server host, the SDK also supports running the API check directly +without creating an SDK client instance first: + + + + + Python (synchronous API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + SERVER_API_HOST = "localhost:1234" + + if lms.Client.is_valid_api_host(SERVER_API_HOST): + print(f"An LM Studio API server instance is available at {SERVER_API_HOST}") + else: + print("No LM Studio API server instance found at {SERVER_API_HOST}") + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + SERVER_API_HOST = "localhost:1234" + + if await lms.AsyncClient.is_valid_api_host(SERVER_API_HOST): + print(f"An LM Studio API server instance is available at {SERVER_API_HOST}") + else: + print("No LM Studio API server instance found at {SERVER_API_HOST}") + ``` + + + +Determining the default local API server port [#determining-the-default-local-api-server-port] + +*Required Python SDK version*: **1.5.0** + +When no API server host is specified, the SDK queries a number of ports on the local loopback +interface for a running API server instance. This scan is repeated for each new client instance +created. Rather than letting the SDK perform this scan implicitly, the SDK also supports running +the scan explicitly, and passing in the reported API server details when creating clients: + + + + + Python (synchronous API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + api_host = lms.Client.find_default_local_api_host() + if api_host is not None: + print(f"An LM Studio API server instance is available at {api_host}") + else: + print("No LM Studio API server instance found on any of the default local ports") + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + api_host = await lms.AsyncClient.find_default_local_api_host() + if api_host is not None: + print(f"An LM Studio API server instance is available at {api_host}") + else: + print("No LM Studio API server instance found on any of the default local ports") + ``` + + + + + + +To simplify interactive use, `lmstudio-python` offers a convenience API which manages +its resources via `atexit` hooks, allowing a default synchronous client session +to be used across multiple interactive commands. + +This convenience API is shown in the examples throughout the documentation as the +`Python (convenience API)` tab (alongside the `Python (scoped resource API)` examples, +which use `with` statements to ensure deterministic cleanup of network communication +resources). + +The convenience API allows the standard Python REPL, or more flexible alternatives like +Juypter Notebooks, to be used to interact with AI models loaded into LM Studio. For +example: + +```python title="Python REPL" +>>> import lmstudio as lms +>>> loaded_models = lms.list_loaded_models() +>>> for idx, model in enumerate(loaded_models): +... print(f"{idx:>3} {model}") +... + 0 LLM(identifier='qwen2.5-7b-instruct') +>>> model = loaded_models[0] +>>> chat = lms.Chat("You answer questions concisely") +>>> chat = lms.Chat("You answer questions concisely") +>>> chat.add_user_message("Tell me three fruits") +UserMessage(content=[TextData(text='Tell me three fruits')]) +>>> print(model.respond(chat, on_message=chat.append)) +Banana, apple, orange. +>>> chat.add_user_message("Tell me three more fruits") +UserMessage(content=[TextData(text='Tell me three more fruits')]) +>>> print(model.respond(chat, on_message=chat.append)) +Mango, strawberry, avocado. +>>> chat.add_user_message("How many fruits have you told me?") +UserMessage(content=[TextData(text='How many fruits have you told me?')]) +>>> print(model.respond(chat, on_message=chat.append)) +You asked for three initial fruits and three more, so I've listed a total of six fruits. +``` + +While not primarily intended for use this way, the SDK's asynchronous structured concurrency API +is compatible with the asynchronous Python REPL that is launched by `python -m asyncio`. +For example: + +```python title="Python REPL" +# Note: assumes use of the "python -m asyncio" asynchronous REPL (or equivalent) +# Requires Python SDK version 1.5.0 or later +>>> from contextlib import AsyncExitStack +>>> import lmstudio as lms +>>> resources = AsyncExitStack() +>>> client = await resources.enter_async_context(lms.AsyncClient()) +>>> loaded_models = await client.llm.list_loaded() +>>> for idx, model in enumerate(loaded_models): +... print(f"{idx:>3} {model}") +... + 0 AsyncLLM(identifier='qwen2.5-7b-instruct-1m') +>>> model = loaded_models[0] +>>> chat = lms.Chat("You answer questions concisely") +>>> chat.add_user_message("Tell me three fruits") +UserMessage(content=[TextData(text='Tell me three fruits')]) +>>> print(await model.respond(chat, on_message=chat.append)) +Apple, banana, and orange. +>>> chat.add_user_message("Tell me three more fruits") +UserMessage(content=[TextData(text='Tell me three more fruits')]) +>>> print(await model.respond(chat, on_message=chat.append)) +Mango, strawberry, and pineapple. +>>> chat.add_user_message("How many fruits have you told me?") +UserMessage(content=[TextData(text='How many fruits have you told me?')]) +>>> print(await model.respond(chat, on_message=chat.append)) +You asked for three fruits initially, then three more, so I've listed six fruits in total. +``` + + + + +One benefit of using the streaming API is the ability to cancel the +prediction request based on criteria that can't be represented using +the `stopStrings` or `maxPredictedTokens` configuration settings. + +The following snippet illustrates cancelling the request in response +to an application specification cancellation condition (such as polling +an event set by another thread). + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + model = lms.llm() + + prediction_stream = model.respond_stream("What is the meaning of life?") + cancelled = False + for fragment in prediction_stream: + if ...: # Cancellation condition will be app specific + cancelled = True + prediction_stream.cancel() + # Note: it is recommended to let the iteration complete, + # as doing so allows the partial result to be recorded. + # Breaking the loop *is* permitted, but means the partial result + # and final prediction stats won't be available to the client + # The stream allows the prediction result to be retrieved after iteration + if not cancelled: + print(prediction_stream.result()) + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model() + + prediction_stream = model.respond_stream("What is the meaning of life?") + cancelled = False + for fragment in prediction_stream: + if ...: # Cancellation condition will be app specific + cancelled = True + prediction_stream.cancel() + # Note: it is recommended to let the iteration complete, + # as doing so allows the partial result to be recorded. + # Breaking the loop *is* permitted, but means the partial result + # and final prediction stats won't be available to the client + # The stream allows the prediction result to be retrieved after iteration + if not cancelled: + print(prediction_stream.result()) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model() + + prediction_stream = await model.respond_stream("What is the meaning of life?") + cancelled = False + async for fragment in prediction_stream: + if ...: # Cancellation condition will be app specific + cancelled = True + await prediction_stream.cancel() + # Note: it is recommended to let the iteration complete, + # as doing so allows the partial result to be recorded. + # Breaking the loop *is* permitted, but means the partial result + # and final prediction stats won't be available to the client + # The stream allows the prediction result to be retrieved after iteration + if not cancelled: + print(prediction_stream.result()) + ``` + + + + + + +Use `llm.respond(...)` to generate completions for a chat conversation. + +Quick Example: Generate a Chat Response [#quick-example-generate-a-chat-response] + +The following snippet shows how to obtain the AI's response to a quick chat prompt. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + model = lms.llm() + print(model.respond("What is the meaning of life?")) + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model() + print(model.respond("What is the meaning of life?")) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model() + print(await model.respond("What is the meaning of life?")) + ``` + + + +Streaming a Chat Response [#streaming-a-chat-response] + +The following snippet shows how to stream the AI's response to a chat prompt, +displaying text fragments as they are received (rather than waiting for the +entire response to be generated before displaying anything). + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + model = lms.llm() + + for fragment in model.respond_stream("What is the meaning of life?"): + print(fragment.content, end="", flush=True) + print() # Advance to a new line at the end of the response + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model() + + for fragment in model.respond_stream("What is the meaning of life?"): + print(fragment.content, end="", flush=True) + print() # Advance to a new line at the end of the response + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model() + + async for fragment in model.respond_stream("What is the meaning of life?"): + print(fragment.content, end="", flush=True) + print() # Advance to a new line at the end of the response + ``` + + + +Cancelling a Chat Response [#cancelling-a-chat-response] + +See the [Cancelling a Prediction](./cancelling-predictions) section for how to cancel a prediction in progress. + +Obtain a Model [#obtain-a-model] + +First, you need to get a model handle. +This can be done using the top-level `llm` convenience API, +or the `model` method in the `llm` namespace when using the scoped resource API. +For example, here is how to use Qwen2.5 7B Instruct. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + model = lms.llm("qwen2.5-7b-instruct") + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model("qwen2.5-7b-instruct") + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model("qwen2.5-7b-instruct") + ``` + + + +There are other ways to get a model handle. See [Managing Models in Memory](./../manage-models/loading) for more info. + +Manage Chat Context [#manage-chat-context] + +The input to the model is referred to as the "context". +Conceptually, the model receives a multi-turn conversation as input, +and it is asked to predict the assistant's response in that conversation. + +```python +import lmstudio as lms + +# Create a chat with an initial system prompt. +chat = lms.Chat("You are a resident AI philosopher.") + +# Build the chat context by adding messages of relevant types. +chat.add_user_message("What is the meaning of life?") +# ... continued in next example +``` + +See [Working with Chats](./working-with-chats) for more information on managing chat context. + + + +Generate a response [#generate-a-response] + +You can ask the LLM to predict the next response in the chat context using the `respond()` method. + + + + + Non-streaming (synchronous API) + + + + Streaming (synchronous API) + + + + Non-streaming (asynchronous API) + + + + Streaming (asynchronous API) + + + + + ```python + # The `chat` object is created in the previous step. + result = model.respond(chat) + + print(result) + ``` + + + + ```python + # The `chat` object is created in the previous step. + prediction_stream = model.respond_stream(chat) + + for fragment in prediction_stream: + print(fragment.content, end="", flush=True) + print() # Advance to a new line at the end of the response + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + # The `chat` object is created in the previous step. + result = await model.respond(chat) + + print(result) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + # The `chat` object is created in the previous step. + prediction_stream = await model.respond_stream(chat) + + async for fragment in prediction_stream: + print(fragment.content, end="", flush=True) + print() # Advance to a new line at the end of the response + ``` + + + +Customize Inferencing Parameters [#customize-inferencing-parameters] + +You can pass in inferencing parameters via the `config` keyword parameter on `.respond()`. + + + + + Non-streaming (synchronous API) + + + + Streaming (synchronous API) + + + + Non-streaming (asynchronous API) + + + + Streaming (asynchronous API) + + + + + ```python + result = model.respond(chat, config={ + "temperature": 0.6, + "maxTokens": 50, + }) + ``` + + + + ```python + prediction_stream = model.respond_stream(chat, config={ + "temperature": 0.6, + "maxTokens": 50, + }) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + result = await model.respond(chat, config={ + "temperature": 0.6, + "maxTokens": 50, + }) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + prediction_stream = await model.respond_stream(chat, config={ + "temperature": 0.6, + "maxTokens": 50, + }) + ``` + + + +See [Configuring the Model](./parameters) for more information on what can be configured. + +Print prediction stats [#print-prediction-stats] + +You can also print prediction metadata, such as the model used for generation, number of generated +tokens, time to first token, and stop reason. + + + + + Non-streaming + + + + Streaming + + + + + ```python + # `result` is the response from the model. + print("Model used:", result.model_info.display_name) + print("Predicted tokens:", result.stats.predicted_tokens_count) + print("Time to first token (seconds):", result.stats.time_to_first_token_sec) + print("Stop reason:", result.stats.stop_reason) + ``` + + + + ```python + # After iterating through the prediction fragments, + # the overall prediction result may be obtained from the stream + result = prediction_stream.result() + + print("Model used:", result.model_info.display_name) + print("Predicted tokens:", result.stats.predicted_tokens_count) + print("Time to first token (seconds):", result.stats.time_to_first_token_sec) + print("Stop reason:", result.stats.stop_reason) + ``` + + + +Both the non-streaming and streaming result access is consistent across the synchronous and +asynchronous APIs, as `prediction_stream.result()` is a non-blocking API that raises an exception +if no result is available (either because the prediction is still running, or because the +prediction request failed). Prediction streams also offer a blocking (synchronous API) or +awaitable (asynchronous API) `prediction_stream.wait_for_result()` method that internally handles +iterating the stream to completion before returning the result. + +Example: Multi-turn Chat [#example-multi-turn-chat] + +```python title="chatbot.py" +import lmstudio as lms + +model = lms.llm() +chat = lms.Chat("You are a task focused AI assistant") + +while True: + try: + user_input = input("You (leave blank to exit): ") + except EOFError: + print() + break + if not user_input: + break + chat.add_user_message(user_input) + prediction_stream = model.respond_stream( + chat, + on_message=chat.append, + ) + print("Bot: ", end="", flush=True) + for fragment in prediction_stream: + print(fragment.content, end="", flush=True) + print() +``` + +Progress Callbacks [#progress-callbacks] + +Long prompts will often take a long time to first token, i.e. it takes the model a long time to process your prompt. +If you want to get updates on the progress of this process, you can provide a float callback to `respond` +that receives a float from 0.0-1.0 representing prompt processing progress. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + llm = lms.llm() + + response = llm.respond( + "What is LM Studio?", + on_prompt_processing_progress = (lambda progress: print(f"{progress*100}% complete")), + ) + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + llm = client.llm.model() + + response = llm.respond( + "What is LM Studio?", + on_prompt_processing_progress = (lambda progress: print(f"{progress*100}% complete")), + ) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + llm = await client.llm.model() + + response = await llm.respond( + "What is LM Studio?", + on_prompt_processing_progress = (lambda progress: print(f"{progress*100}% complete")), + ) + ``` + + + +In addition to `on_prompt_processing_progress`, the other available progress callbacks are: + +* `on_first_token`: called after prompt processing is complete and the first token is being emitted. + Does not receive any arguments (use the streaming iteration API or `on_prediction_fragment` + to process tokens as they are emitted). +* `on_prediction_fragment`: called for each prediction fragment received by the client. + Receives the same prediction fragments as iterating over the stream iteration API. +* `on_message`: called with an assistant response message when the prediction is complete. + Intended for appending received messages to a chat history instance. + + + + + + +Use `llm.complete(...)` to generate text completions from a loaded language model. +Text completions mean sending a non-formatted string to the model with the expectation that the model will complete the text. + +This is different from multi-turn chat conversations. For more information on chat completions, see [Chat Completions](./chat-completion). + +Quickstart [#quickstart] + + + +

+ Instantiate a Model +

+ + First, you need to load a model to generate completions from. + This can be done using the top-level `llm` convenience API, + or the `model` method in the `llm` namespace when using the scoped resource API. + For example, here is how to use Qwen2.5 7B Instruct. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + model = lms.llm("qwen2.5-7b-instruct") + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model("qwen2.5-7b-instruct") + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model("qwen2.5-7b-instruct") + ``` + + +
+ + +

+ Generate a Completion +

+ + Once you have a loaded model, you can generate completions by passing a string to the `complete` method on the `llm` handle. + + + + + Non-streaming (synchronous API) + + + + Streaming (synchronous API) + + + + Non-streaming (asynchronous API) + + + + Streaming (asynchronous API) + + + + + ```python + # The `model` object is created in the previous step. + result = model.complete("My name is", config={"maxTokens": 100}) + + print(result) + ``` + + + + ```python + # The `model` object is created in the previous step. + prediction_stream = model.complete_stream("My name is", config={"maxTokens": 100}) + + for fragment in prediction_stream: + print(fragment.content, end="", flush=True) + print() # Advance to a new line at the end of the response + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + # The `model` object is created in the previous step. + result = await model.complete("My name is", config={"maxTokens": 100}) + + print(result) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + # The `model` object is created in the previous step. + prediction_stream = await model.complete_stream("My name is", config={"maxTokens": 100}) + + async for fragment in prediction_stream: + print(fragment.content, end="", flush=True) + print() # Advance to a new line at the end of the response + ``` + + +
+ + +

+ Print Prediction Stats +

+ + You can also print prediction metadata, such as the model used for generation, number of generated tokens, time to first token, and stop reason. + + + + + Non-streaming + + + + Streaming + + + + + ```python + # `result` is the response from the model. + print("Model used:", result.model_info.display_name) + print("Predicted tokens:", result.stats.predicted_tokens_count) + print("Time to first token (seconds):", result.stats.time_to_first_token_sec) + print("Stop reason:", result.stats.stop_reason) + ``` + + + + ```python + # After iterating through the prediction fragments, + # the overall prediction result may be obtained from the stream + result = prediction_stream.result() + + print("Model used:", result.model_info.display_name) + print("Predicted tokens:", result.stats.predicted_tokens_count) + print("Time to first token (seconds):", result.stats.time_to_first_token_sec) + print("Stop reason:", result.stats.stop_reason) + ``` + + + + Both the non-streaming and streaming result access is consistent across the synchronous and + asynchronous APIs, as `prediction_stream.result()` is a non-blocking API that raises an exception + if no result is available (either because the prediction is still running, or because the + prediction request failed). Prediction streams also offer a blocking (synchronous API) or + awaitable (asynchronous API) `prediction_stream.wait_for_result()` method that internally handles + iterating the stream to completion before returning the result. +
+
+ +Example: Get an LLM to Simulate a Terminal [#example-get-an-llm-to-simulate-a-terminal] + +Here's an example of how you might use the `complete` method to simulate a terminal. + +```python title="terminal-sim.py" +import lmstudio as lms + +model = lms.llm() +console_history = [] + +while True: + try: + user_command = input("$ ") + except EOFError: + print() + break + if user_command.strip() == "exit": + break + console_history.append(f"$ {user_command}") + history_prompt = "\n".join(console_history) + prediction_stream = model.complete_stream( + history_prompt, + config={ "stopStrings": ["$"] }, + ) + for fragment in prediction_stream: + print(fragment.content, end="", flush=True) + print() + console_history.append(prediction_stream.result().content) +``` + +Customize Inferencing Parameters [#customize-inferencing-parameters] + +You can pass in inferencing parameters via the `config` keyword parameter on `.complete()`. + + + + + Non-streaming (synchronous API) + + + + Streaming (synchronous API) + + + + Non-streaming (asynchronous API) + + + + Streaming (asynchronous API) + + + + + ```python + result = model.complete(initial_text, config={ + "temperature": 0.6, + "maxTokens": 50, + }) + ``` + + + + ```python + prediction_stream = model.complete_stream(initial_text, config={ + "temperature": 0.6, + "maxTokens": 50, + }) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + result = await model.complete(initial_text, config={ + "temperature": 0.6, + "maxTokens": 50, + }) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + prediction_stream = await model.complete_stream(initial_text, config={ + "temperature": 0.6, + "maxTokens": 50, + }) + ``` + + + +See [Configuring the Model](./parameters) for more information on what can be configured. + +Progress Callbacks [#progress-callbacks] + +Long prompts will often take a long time to first token, i.e. it takes the model a long time to process your prompt. +If you want to get updates on the progress of this process, you can provide a float callback to `complete` +that receives a float from 0.0-1.0 representing prompt processing progress. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + llm = lms.llm() + + completion = llm.complete( + "My name is", + on_prompt_processing_progress = (lambda progress: print(f"{progress*100}% complete")), + ) + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + llm = client.llm.model() + + completion = llm.complete( + "My name is", + on_prompt_processing_progress = (lambda progress: print(f"{progress*100}% processed")), + ) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + llm = await client.llm.model() + + completion = await llm.complete( + "My name is", + on_prompt_processing_progress = (lambda progress: print(f"{progress*100}% processed")), + ) + ``` + + + +In addition to `on_prompt_processing_progress`, the other available progress callbacks are: + +* `on_first_token`: called after prompt processing is complete and the first token is being emitted. + Does not receive any arguments (use the streaming iteration API or `on_prediction_fragment` + to process tokens as they are emitted). +* `on_prediction_fragment`: called for each prediction fragment received by the client. + Receives the same prediction fragments as iterating over the stream iteration API. +* `on_message`: called with an assistant response message when the prediction is complete. + Intended for appending received messages to a chat history instance. + + + + + + +*Required Python SDK version*: **1.1.0** + +Some models, known as VLMs (Vision-Language Models), can accept images as input. You can pass images to the model using the `.respond()` method. + +Prerequisite: Get a VLM (Vision-Language Model) [#prerequisite-get-a-vlm-vision-language-model] + +If you don't yet have a VLM, you can download a model like `qwen2-vl-2b-instruct` using the following command: + +```bash +lms get qwen2-vl-2b-instruct +``` + + + +

+ Instantiate the Model +

+ + Connect to LM Studio and obtain a handle to the VLM (Vision-Language Model) you want to use. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + model = lms.llm("qwen2-vl-2b-instruct") + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model("qwen2-vl-2b-instruct") + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model("qwen2-vl-2b-instruct") + ``` + + +
+ + +

+ Prepare the Image +

+ + Use the `prepare_image()` function or `files` namespace method to + get a handle to the image that can subsequently be passed to the model. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + image_path = "/path/to/image.jpg" # Replace with the path to your image + image_handle = lms.prepare_image(image_path) + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + image_path = "/path/to/image.jpg" # Replace with the path to your image + image_handle = client.files.prepare_image(image_path) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + image_path = "/path/to/image.jpg" # Replace with the path to your image + image_handle = await client.files.prepare_image(image_path) + ``` + + + + If you only have the raw data of the image, you can supply the raw data directly as a bytes + object without having to write it to disk first. Due to this feature, binary filesystem + paths are *not* supported (as they will be handled as malformed image data rather than as + filesystem paths). + + Binary IO objects are also accepted as local file inputs. + + The LM Studio server supports JPEG, PNG, and WebP image formats. +
+ + +

+ Pass the Image to the Model in + + `.respond()` +

+ + Generate a prediction by passing the image to the model in the `.respond()` method. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + image_path = "/path/to/image.jpg" # Replace with the path to your image + image_handle = lms.prepare_image(image_path) + model = lms.llm("qwen2-vl-2b-instruct") + chat = lms.Chat() + chat.add_user_message("Describe this image please", images=[image_handle]) + prediction = model.respond(chat) + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + image_path = "/path/to/image.jpg" # Replace with the path to your image + image_handle = client.files.prepare_image(image_path) + model = client.llm.model("qwen2-vl-2b-instruct") + chat = lms.Chat() + chat.add_user_message("Describe this image please", images=[image_handle]) + prediction = model.respond(chat) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + image_path = "/path/to/image.jpg" # Replace with the path to your image + image_handle = client.files.prepare_image(image_path) + model = await client.llm.model("qwen2-vl-2b-instruct") + chat = lms.Chat() + chat.add_user_message("Describe this image please", images=[image_handle]) + prediction = await model.respond(chat) + ``` + + +
+
+ + + + +You can customize both inference-time and load-time parameters for your model. Inference parameters can be set on a per-request basis, while load parameters are set when loading the model. + +Inference Parameters [#inference-parameters] + +Set inference-time parameters such as `temperature`, `maxTokens`, `topP` and more. + + + + + .respond() + + + + .complete() + + + + + ```python + result = model.respond(chat, config={ + "temperature": 0.6, + "maxTokens": 50, + }) + ``` + + + + ```python + result = model.complete(chat, config={ + "temperature": 0.6, + "maxTokens": 50, + "stopStrings": ["\n\n"], + }) + ``` + + + +See [`LLMPredictionConfigInput`](./../../typescript/api-reference/llm-prediction-config-input) in the +Typescript SDK documentation for all configurable fields. + +Note that while `structured` can be set to a JSON schema definition as an inference-time configuration parameter +(Zod schemas are not supported in the Python SDK), the preferred approach is to instead set the +[dedicated `response_format` parameter](\(./structured-responses\)), which allows you to more rigorously +enforce the structure of the output using a JSON or class based schema definition. + +Load Parameters [#load-parameters] + +Set load-time parameters such as the context length, GPU offload ratio, and more. + +Set Load Parameters with `.model()` [#set-load-parameters-with-model] + +The `.model()` retrieves a handle to a model that has already been loaded, or loads a new one on demand (JIT loading). + +**Note**: if the model is already loaded, the given configuration will be **ignored**. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + model = lms.llm("qwen2.5-7b-instruct", config={ + "contextLength": 8192, + "gpu": { + "ratio": 0.5, + } + }) + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model( + "qwen2.5-7b-instruct", + config={ + "contextLength": 8192, + "gpu": { + "ratio": 0.5, + } + } + ) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model( + "qwen2.5-7b-instruct", + config={ + "contextLength": 8192, + "gpu": { + "ratio": 0.5, + } + } + ) + ``` + + + +See [`LLMLoadModelConfig`](./../../typescript/api-reference/llm-load-model-config) in the +Typescript SDK documentation for all configurable fields. + +Set Load Parameters with `.load_new_instance()` [#set-load-parameters-with-load_new_instance] + +The `.load_new_instance()` method creates a new model instance and loads it with the specified configuration. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + client = lms.get_default_client() + model = client.llm.load_new_instance("qwen2.5-7b-instruct", config={ + "contextLength": 8192, + "gpu": { + "ratio": 0.5, + } + }) + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.load_new_instance( + "qwen2.5-7b-instruct", + config={ + "contextLength": 8192, + "gpu": { + "ratio": 0.5, + } + } + ) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.load_new_instance( + "qwen2.5-7b-instruct", + config={ + "contextLength": 8192, + "gpu": { + "ratio": 0.5, + } + } + ) + ``` + + + +See [`LLMLoadModelConfig`](./../../typescript/api-reference/llm-load-model-config) in the +Typescript SDK documentation for all configurable fields. + + + + +*Required Python SDK version*: **1.2.0** + +Speculative decoding is a technique that can substantially increase the generation speed of large language models (LLMs) without reducing response quality. See [Speculative Decoding](./../../app/advanced/speculative-decoding) for more info. + +To use speculative decoding in `lmstudio-python`, simply provide a `draftModel` parameter when performing the prediction. You do not need to load the draft model separately. + + + + + Non-streaming + + + + Streaming + + + + + ```python + import lmstudio as lms + + main_model_key = "qwen2.5-7b-instruct" + draft_model_key = "qwen2.5-0.5b-instruct" + + model = lms.llm(main_model_key) + result = model.respond( + "What are the prime numbers between 0 and 100?", + config={ + "draftModel": draft_model_key, + } + ) + + print(result) + stats = result.stats + print(f"Accepted {stats.accepted_draft_tokens_count}/{stats.predicted_tokens_count} tokens") + ``` + + + + ```python + import lmstudio as lms + + main_model_key = "qwen2.5-7b-instruct" + draft_model_key = "qwen2.5-0.5b-instruct" + + model = lms.llm(main_model_key) + prediction_stream = model.respond_stream( + "What are the prime numbers between 0 and 100?", + config={ + "draftModel": draft_model_key, + } + ) + for fragment in prediction_stream: + print(fragment.content, end="", flush=True) + print() # Advance to a new line at the end of the response + + stats = prediction_stream.result().stats + print(f"Accepted {stats.accepted_draft_tokens_count}/{stats.predicted_tokens_count} tokens") + ``` + + + + + + +You can enforce a particular response format from an LLM by providing a JSON schema to the `.respond()` method. +This guarantees that the model's output conforms to the schema you provide. + +The JSON schema can either be provided directly, +or by providing an object that implements the `lmstudio.ModelSchema` protocol, +such as `pydantic.BaseModel` or `lmstudio.BaseModel`. + +The `lmstudio.ModelSchema` protocol is defined as follows: + +```python +@runtime_checkable +class ModelSchema(Protocol): + """Protocol for classes that provide a JSON schema for their model.""" + + @classmethod + def model_json_schema(cls) -> DictSchema: + """Return a JSON schema dict describing this model.""" + ... + +``` + +When a schema is provided, the prediction result's `parsed` field will contain a string-keyed dictionary that conforms +to the given schema (for unstructured results, this field is a string field containing the same value as `content`). + +Enforce Using a Class Based Schema Definition [#enforce-using-a-class-based-schema-definition] + +If you wish the model to generate JSON that satisfies a given schema, +it is recommended to provide a class based schema definition using a library +such as [`pydantic`](https://docs.pydantic.dev/) or [`msgspec`](https://jcristharif.com/msgspec/). + +Pydantic models natively implement the `lmstudio.ModelSchema` protocol, +while `lmstudio.BaseModel` is a `msgspec.Struct` subclass that implements `.model_json_schema()` appropriately. + +Define a Class Based Schema [#define-a-class-based-schema] + + + + + pydantic.BaseModel + + + + lmstudio.BaseModel + + + + + ```python + from pydantic import BaseModel + + # A class based schema for a book + class BookSchema(BaseModel): + title: str + author: str + year: int + ``` + + + + ```python + from lmstudio import BaseModel + + # A class based schema for a book + class BookSchema(BaseModel): + title: str + author: str + year: int + ``` + + + +Generate a Structured Response [#generate-a-structured-response] + + + + + Non-streaming + + + + Streaming + + + + + ```python + result = model.respond("Tell me about The Hobbit", response_format=BookSchema) + book = result.parsed + + print(book) + # ^ + # Note that `book` is correctly typed as { title: string, author: string, year: number } + ``` + + + + ```python + prediction_stream = model.respond_stream("Tell me about The Hobbit", response_format=BookSchema) + + # Optionally stream the response + # for fragment in prediction: + # print(fragment.content, end="", flush=True) + # print() + # Note that even for structured responses, the *fragment* contents are still only text + + # Get the final structured result + result = prediction_stream.result() + book = result.parsed + + print(book) + # ^ + # Note that `book` is correctly typed as { title: string, author: string, year: number } + ``` + + + +Enforce Using a JSON Schema [#enforce-using-a-json-schema] + +You can also enforce a structured response using a JSON schema. + +Define a JSON Schema [#define-a-json-schema] + +```python +# A JSON schema for a book +schema = { + "type": "object", + "properties": { + "title": { "type": "string" }, + "author": { "type": "string" }, + "year": { "type": "integer" }, + }, + "required": ["title", "author", "year"], +} +``` + +Generate a Structured Response [#generate-a-structured-response-1] + + + + + Non-streaming + + + + Streaming + + + + + ```python + result = model.respond("Tell me about The Hobbit", response_format=schema) + book = result.parsed + + print(book) + # ^ + # Note that `book` is correctly typed as { title: string, author: string, year: number } + ``` + + + + ```python + prediction_stream = model.respond_stream("Tell me about The Hobbit", response_format=schema) + + # Stream the response + for fragment in prediction: + print(fragment.content, end="", flush=True) + print() + # Note that even for structured responses, the *fragment* contents are still only text + + # Get the final structured result + result = prediction_stream.result() + book = result.parsed + + print(book) + # ^ + # Note that `book` is correctly typed as { title: string, author: string, year: number } + ``` + + + + + + + + +SDK methods such as `llm.respond()`, `llm.applyPromptTemplate()`, or `llm.act()` +take in a chat parameter as an input. +There are a few ways to represent a chat when using the SDK. + +Option 1: Input a Single String [#option-1-input-a-single-string] + +If your chat only has one single user message, you can use a single string to represent the chat. +Here is an example with the `.respond` method. + +```python +prediction = llm.respond("What is the meaning of life?") +``` + +Option 2: Using the `Chat` Helper Class [#option-2-using-the-chat-helper-class] + +For more complex tasks, it is recommended to use the `Chat` helper class. +It provides various commonly used methods to manage the chat. +Here is an example with the `Chat` class, where the initial system prompt +is supplied when initializing the chat instance, and then the initial user +message is added via the corresponding method call. + +```python +chat = Chat("You are a resident AI philosopher.") +chat.add_user_message("What is the meaning of life?") + +prediction = llm.respond(chat) +``` + +You can also quickly construct a `Chat` object using the `Chat.from_history` method. + + + + + Chat history data + + + + Single string + + + + + ```python + chat = Chat.from_history({"messages": [ + { "role": "system", "content": "You are a resident AI philosopher." }, + { "role": "user", "content": "What is the meaning of life?" }, + ]}) + ``` + + + + ```python + # This constructs a chat with a single user message + chat = Chat.from_history("What is the meaning of life?") + ``` + + + +Option 3: Providing Chat History Data Directly [#option-3-providing-chat-history-data-directly] + +As the APIs that accept chat histories use `Chat.from_history` internally, +they also accept the chat history data format as a regular dictionary: + +```python +prediction = llm.respond({"messages": [ + { "role": "system", "content": "You are a resident AI philosopher." }, + { "role": "user", "content": "What is the meaning of life?" }, +]}) +``` + + + + +Automatic tool calling [#automatic-tool-calling] + +We introduce the concept of execution "rounds" to describe the combined process of running a tool, providing its output to the LLM, and then waiting for the LLM to decide what to do next. + +**Execution Round** + +``` + • run a tool -> + ↑ • provide the result to the LLM -> + │ • wait for the LLM to generate a response + │ + └────────────────────────────────────────┘ └➔ (return) +``` + +A model might choose to run tools multiple times before returning a final result. For example, if the LLM is writing code, it might choose to compile or run the program, fix errors, and then run it again, rinse and repeat until it gets the desired result. + +With this in mind, we say that the `.act()` API is an automatic "multi-round" tool calling API. + +Quick Example [#quick-example] + +```python +import lmstudio as lms + +def multiply(a: float, b: float) -> float: + """Given two numbers a and b. Returns the product of them.""" + return a * b + +model = lms.llm("qwen2.5-7b-instruct") +model.act( + "What is the result of 12345 multiplied by 54321?", + [multiply], + on_message=print, +) +``` + +What does it mean for an LLM to "use a tool"? [#what-does-it-mean-for-an-llm-to-use-a-tool] + +LLMs are largely text-in, text-out programs. So, you may ask "how can an LLM use a tool?". The answer is that some LLMs are trained to ask the human to call the tool for them, and expect the tool output to to be provided back in some format. + +Imagine you're giving computer support to someone over the phone. You might say things like "run this command for me ... OK what did it output? ... OK now click there and tell me what it says ...". In this case you're the LLM! And you're "calling tools" vicariously through the person on the other side of the line. + +Running multiple tool calls in parallel [#running-multiple-tool-calls-in-parallel] + +By default, version 1.4.0 and later of the Python SDK will only run a single tool call request at a time, +even if the model requests multiple tool calls in a single response message. This ensures the requests will +be processed correctly even if the tool implementations do not support multiple concurrent calls. + +When the tool implementations are known to be thread-safe, and are both slow and frequent enough to be worth +running in parallel, the `max_parallel_tool_calls` option specifies the maximum number of tool call requests +that will be processed in parallel from a single model response. This value defaults to 1 (waiting for each +tool call to complete before starting the next one). Setting this value to `None` will automatically scale +the maximum number of parallel tool calls to a multiple of the number of CPU cores available to the process. + +Important: Model Selection [#important-model-selection] + +The model selected for tool use will greatly impact performance. + +Some general guidance when selecting a model: + +* Not all models are capable of intelligent tool use +* Bigger is better (i.e., a 7B parameter model will generally perform better than a 3B parameter model) +* We've observed [Qwen2.5-7B-Instruct](https://model.lmstudio.ai/download/lmstudio-community/Qwen2.5-7B-Instruct-GGUF) to perform well in a wide variety of cases +* This guidance may change + +Example: Multiple Tools [#example-multiple-tools] + +The following code demonstrates how to provide multiple tools in a single `.act()` call. + +```python +import math +import lmstudio as lms + +def add(a: int, b: int) -> int: + """Given two numbers a and b, returns the sum of them.""" + return a + b + +def is_prime(n: int) -> bool: + """Given a number n, returns True if n is a prime number.""" + if n < 2: + return False + sqrt = int(math.sqrt(n)) + for i in range(2, sqrt): + if n % i == 0: + return False + return True + +model = lms.llm("qwen2.5-7b-instruct") +model.act( + "Is the result of 12345 + 45668 a prime? Think step by step.", + [add, is_prime], + on_message=print, +) +``` + +Example: Chat Loop with Create File Tool [#example-chat-loop-with-create-file-tool] + +The following code creates a conversation loop with an LLM agent that can create files. + +```python +import readline # Enables input line editing +from pathlib import Path + +import lmstudio as lms + +def create_file(name: str, content: str): + """Create a file with the given name and content.""" + dest_path = Path(name) + if dest_path.exists(): + return "Error: File already exists." + try: + dest_path.write_text(content, encoding="utf-8") + except Exception as exc: + return "Error: {exc!r}" + return "File created." + +def print_fragment(fragment, round_index=0): + # .act() supplies the round index as the second parameter + # Setting a default value means the callback is also + # compatible with .complete() and .respond(). + print(fragment.content, end="", flush=True) + +model = lms.llm() +chat = lms.Chat("You are a task focused AI assistant") + +while True: + try: + user_input = input("You (leave blank to exit): ") + except EOFError: + print() + break + if not user_input: + break + chat.add_user_message(user_input) + print("Bot: ", end="", flush=True) + model.act( + chat, + [create_file], + on_message=chat.append, + on_prediction_fragment=print_fragment, + ) + print() +``` + +Progress Callbacks [#progress-callbacks] + +Complex interactions with a tool using agent may take some time to process. + +The regular progress callbacks for any prediction request are available, +but the expected capabilities differ from those for single round predictions. + +* `on_prompt_processing_progress`: called during prompt processing for each + prediction round. Receives the progress ratio (as a float) and the round + index as positional arguments. +* `on_first_token`: called after prompt processing is complete for each prediction round. + Receives the round index as its sole argument. +* `on_prediction_fragment`: called for each prediction fragment received by the client. + Receives the prediction fragment and the round index as positional arguments. +* `on_message`: called with an assistant response message when each prediction round is + complete, and with tool result messages as each tool call request is completed. + Intended for appending received messages to a chat history instance, and hence + does *not* receive the round index as an argument. + +The following additional callbacks are available to monitor the prediction rounds: + +* `on_round_start`: called before submitting the prediction request for each round. + Receives the round index as its sole argument. +* `on_prediction_completed`: called after the prediction for the round has been completed, + but before any requested tool calls have been initiated. Receives the round's prediction + result as its sole argument. A round prediction result is a regular prediction result + with an additional `round_index` attribute. +* `on_round_end`: called after any tool call requests for the round have been resolved. + +Finally, applications may request notifications when agents emit invalid tool requests: + +* `handle_invalid_tool_request`: called when a tool request was unable to be processed. + Receives the exception that is about to be reported, as well as the original tool + request that resulted in the problem. When no tool request is given, this is + purely a notification of an unrecoverable error before the agent interaction raises + the given exception (allowing the application to raise its own exception instead). + When a tool request is given, it indicates that rather than being raised locally, + the text description of the exception is going to be passed back to the agent + as the result of that failed tool request. In these cases, the callback may either + return `None` to indicate that the error description should be sent to the agent, + raise the given exception (or a different exception) locally, or return a text + string that should be sent to the agent instead of the error description. + +For additional details on defining tools, and an example of overriding the invalid +tool request handling to raise all exceptions locally instead of passing them to +back the agent, refer to [Tool Definition](./tools.md). + + + + +You can define tools as regular Python functions and pass them to the model in the `act()` call. +Alternatively, tools can be defined with `lmstudio.ToolFunctionDef` in order to control the +name and description passed to the language model. + +Anatomy of a Tool [#anatomy-of-a-tool] + +Follow one of the following examples to define functions as tools (the first approach +is typically going to be the most convenient): + + + + + Python function + + + + ToolFunctionDef.from_callable + + + + ToolFunctionDef + + + + + ```python + # Type hinted functions with clear names and docstrings + # may be used directly as tool definitions + def add(a: int, b: int) -> int: + """Given two numbers a and b, returns the sum of them.""" + # The SDK ensures arguments are coerced to their specified types + return a + b + + # Pass `add` directly to `act()` as a tool definition + ``` + + + + ```python + from lmstudio import ToolFunctionDef + + def cryptic_name(a: int, b: int) -> int: + return a + b + + # Type hinted functions with cryptic names and missing or poor docstrings + # can be turned into clear tool definitions with `from_callable` + tool_def = ToolFunctionDef.from_callable( + cryptic_name, + name="add", + description="Given two numbers a and b, returns the sum of them." + ) + # Pass `tool_def` to `act()` as a tool definition + ``` + + + + ```python + from lmstudio import ToolFunctionDef + + def cryptic_name(a, b): + return a + b + + # Functions without type hints can be used without wrapping them + # at runtime by defining a tool function directly. + tool_def = ToolFunctionDef( + name="add", + description="Given two numbers a and b, returns the sum of them.", + parameters={ + "a": int, + "b": int, + }, + implementation=cryptic_name, + ) + # Pass `tool_def` to `act()` as a tool definition + ``` + + + +**Important**: The tool name, description, and the parameter definitions are all passed to the model! + +This means that your wording will affect the quality of the generation. Make sure to always provide a clear description of the tool so the model knows how to use it. + +Tools with External Effects (like Computer Use or API Calls) [#tools-with-external-effects-like-computer-use-or-api-calls] + +Tools can also have external effects, such as creating files or calling programs and even APIs. By implementing tools with external effects, you +can essentially turn your LLMs into autonomous agents that can perform tasks on your local machine. + +Example: `create_file_tool` [#example-create_file_tool] + +Tool Definition [#tool-definition] + +```python title="create_file_tool.py" +from pathlib import Path + +def create_file(name: str, content: str): + """Create a file with the given name and content.""" + dest_path = Path(name) + if dest_path.exists(): + return "Error: File already exists." + try: + dest_path.write_text(content, encoding="utf-8") + except Exception as exc: + return "Error: {exc!r}" + return "File created." +``` + +Example code using the `create_file` tool: [#example-code-using-the-create_file-tool] + +```python title="example.py" +import lmstudio as lms +from create_file_tool import create_file + +model = lms.llm("qwen2.5-7b-instruct") +model.act( + "Please create a file named output.txt with your understanding of the meaning of life.", + [create_file], +) +``` + +Handling tool calling errors [#handling-tool-calling-errors] + +By default, version 1.3.0 and later of the Python SDK will automatically convert +exceptions raised by tool calls to text and report them back to the language model. +In many cases, when notified of an error in this way, a language model is able +to either adjust its request to avoid the failure, or else accept the failure as +a valid response to its request (consider a prompt like `Attempt to divide 1 by 0 +using the provided tool. Explain the result.`, where the expected +response is an explanation of the `ZeroDivisionError` exception the Python +interpreter raises when instructed to divide by zero). + +This error handling behaviour can be overridden using the `handle_invalid_tool_request` +callback. For example, the following code reverts the error handling back to raising +exceptions locally in the client: + +```python title="example.py" +import lmstudio as lms + +def divide(numerator: float, denominator: float) -> float: + """Divide the given numerator by the given denominator. Return the result.""" + return numerator / denominator + +model = lms.llm("qwen2.5-7b-instruct") +chat = Chat() +chat.add_user_message( + "Attempt to divide 1 by 0 using the tool. Explain the result." +) + +def _raise_exc_in_client( + exc: LMStudioPredictionError, request: ToolCallRequest | None +) -> None: + raise exc + +act_result = llm.act( + chat, + [divide], + handle_invalid_tool_request=_raise_exc_in_client, +) +``` + +When a tool request is passed in, the callback results are processed as follows: + +* `None`: the original exception text is passed to the LLM unmodified +* a string: the returned string is passed to the LLM instead of the original + exception text +* raising an exception (whether the passed in exception or a new exception): + the raised exception is propagated locally in the client, terminating the + prediction process + +If no tool request is passed in, the callback invocation is a notification only, +and the exception cannot be converted to text for passing pack to the LLM +(although it can still be replaced with a different exception). These cases +indicate failures in the expected communication with the server API that mean +the prediction process cannot reasonably continue, so if the callback doesn't +raise an exception, the calling code will raise the original exception directly. + + + + +Generate embeddings for input text. Embeddings are vector representations of text that capture semantic meaning. Embeddings are a building block for RAG (Retrieval-Augmented Generation) and other similarity-based tasks. + +Prerequisite: Get an Embedding Model [#prerequisite-get-an-embedding-model] + +If you don't yet have an embedding model, you can download a model like `nomic-ai/nomic-embed-text-v1.5` using the following command: + +```bash +lms get nomic-ai/nomic-embed-text-v1.5 +``` + +Create Embeddings [#create-embeddings] + +To convert a string to a vector representation, pass it to the `embed` method on the corresponding embedding model handle. + +```python title="example.py" +import lmstudio as lms + +model = lms.embedding_model("nomic-embed-text-v1.5") + +embedding = model.embed("Hello, world!") +``` + + + + +Models use a tokenizer to internally convert text into "tokens" they can deal with more easily. LM Studio exposes this tokenizer for utility. + +Tokenize [#tokenize] + +You can tokenize a string with a loaded LLM or embedding model using the SDK. +In the below examples, the LLM reference can be replaced with an +embedding model reference without requiring any other changes. + +```python +import lmstudio as lms + +model = lms.llm() + +tokens = model.tokenize("Hello, world!") + +print(tokens) # Array of token IDs. +``` + +Count tokens [#count-tokens] + +If you only care about the number of tokens, simply check the length of the resulting array. + +```python +token_count = len(model.tokenize("Hello, world!")) +print("Token count:", token_count) +``` + +Example: count context [#example-count-context] + +You can determine if a given conversation fits into a model's context by doing the following: + +1. Convert the conversation to a string using the prompt template. +2. Count the number of tokens in the string. +3. Compare the token count to the model's context length. + +```python +import lmstudio as lms + +def does_chat_fit_in_context(model: lms.LLM, chat: lms.Chat) -> bool: + # Convert the conversation to a string using the prompt template. + formatted = model.apply_prompt_template(chat) + # Count the number of tokens in the string. + token_count = len(model.tokenize(formatted)) + # Get the current loaded context length of the model + context_length = model.get_context_length() + return token_count < context_length + +model = lms.llm() + +chat = lms.Chat.from_history({ + "messages": [ + { "role": "user", "content": "What is the meaning of life." }, + { "role": "assistant", "content": "The meaning of life is..." }, + # ... More messages + ] +}) + +print("Fits in context:", does_chat_fit_in_context(model, chat)) +``` + + + + +You can iterate through locally available models using the downloaded model listing methods. + +The listing results offer `.model()` and `.load_new_instance()` methods, which allow the +downloaded model reference to be converted in the full SDK handle for a loaded model. + +Available Models on the LM Studio Server [#available-models-on-the-lm-studio-server] + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + downloaded = lms.list_downloaded_models() + llm_only = lms.list_downloaded_models("llm") + embedding_only = lms.list_downloaded_models("embedding") + + for model in downloaded: + print(model) + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + downloaded = client.list_downloaded_models() + llm_only = client.llm.list_downloaded() + embedding_only = client.embedding.list_downloaded() + + for model in downloaded: + print(model) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + downloaded = await client.list_downloaded_models() + llm_only = await client.llm.list_downloaded() + embedding_only = await client.embedding.list_downloaded() + + for model in downloaded: + print(model) + ``` + + + +This will give you results equivalent to using [`lms ls`](../../cli/ls) in the CLI. + +Example output: [#example-output] + +```python +DownloadedLlm(model_key='qwen2.5-7b-instruct-1m', display_name='Qwen2.5 7B Instruct 1M', architecture='qwen2', vision=False) +DownloadedEmbeddingModel(model_key='text-embedding-nomic-embed-text-v1.5', display_name='Nomic Embed Text v1.5', architecture='nomic-bert') +``` + + + + +You can iterate through models loaded into memory using the functions and methods shown below. + +The results are full SDK model handles, allowing access to all model functionality. + +List Models Currently Loaded in Memory [#list-models-currently-loaded-in-memory] + +This will give you results equivalent to using [`lms ps`](../../cli/ps) in the CLI. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + all_loaded_models = lms.list_loaded_models() + llm_only = lms.list_loaded_models("llm") + embedding_only = lms.list_loaded_models("embedding") + + print(all_loaded_models) + ``` + + + + ```python + import lms + + with lms.Client() as client: + all_loaded_models = client.list_loaded_models() + llm_only = client.llm.list_loaded() + embedding_only = client.embedding.list_loaded() + + print(all_loaded_models) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + all_loaded_models = await client.list_loaded_models() + llm_only = await client.llm.list_loaded() + embedding_only = await client.embedding.list_loaded() + + print(all_loaded_models) + ``` + + + + + + +AI models are huge. It can take a while to load them into memory. LM Studio's SDK allows you to precisely control this process. + +**Model namespaces:** + +* LLMs are accessed through the `client.llm` namespace +* Embedding models are accessed through the `client.embedding` namespace +* `lmstudio.llm` is equivalent to `client.llm.model` on the default client +* `lmstudio.embedding_model` is equivalent to `client.embedding.model` on the default client + +**Most commonly:** + +* Use `.model()` to get any currently loaded model +* Use `.model("model-key")` to use a specific model + +**Advanced (manual model management):** + +* Use `.load_new_instance("model-key")` to load a new instance of a model +* Use `.unload("model-key")` or `model_handle.unload()` to unload a model from memory + +Get the Current Model with `.model()` [#get-the-current-model-with-model] + +If you already have a model loaded in LM Studio (either via the GUI or `lms load`), +you can use it by calling `.model()` without any arguments. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + model = lms.llm() + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model() + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model() + ``` + + + +Get a Specific Model with `.model("model-key")` [#get-a-specific-model-with-modelmodel-key] + +If you want to use a specific model, you can provide the model key as an argument to `.model()`. + +Get if Loaded, or Load if not [#get-if-loaded-or-load-if-not] + +Calling `.model("model-key")` will load the model if it's not already loaded, or return the existing instance if it is. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + model = lms.llm("qwen/qwen3-4b-2507") + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model("qwen/qwen3-4b-2507") + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model("qwen/qwen3-4b-2507") + ``` + + + +Load a New Instance of a Model with `.load_new_instance()` [#load-a-new-instance-of-a-model-with-load_new_instance] + +Use `load_new_instance()` to load a new instance of a model, even if one already exists. +This allows you to have multiple instances of the same or different models loaded at the same time. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + client = lms.get_default_client() + model = client.llm.load_new_instance("qwen/qwen3-4b-2507") + another_model = client.llm.load_new_instance("qwen/qwen3-4b-2507", "my-second-model") + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.load_new_instance("qwen/qwen3-4b-2507") + another_model = client.llm.load_new_instance("qwen/qwen3-4b-2507", "my-second-model") + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.load_new_instance("qwen/qwen3-4b-2507") + another_model = await client.llm.load_new_instance("qwen/qwen3-4b-2507", "my-second-model") + ``` + + + +Note about Instance Identifiers [#note-about-instance-identifiers] + +If you provide an instance identifier that already exists, the server will throw an error. +So if you don't really care, it's safer to not provide an identifier, in which case +the server will generate one for you. You can always check in the server tab in LM Studio, too! + +Unload a Model from Memory with `.unload()` [#unload-a-model-from-memory-with-unload] + +Once you no longer need a model, you can unload it by simply calling `unload()` on its handle. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + model = lms.llm() + model.unload() + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model() + model.unload() + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model() + await model.unload() + ``` + + + +Set Custom Load Config Parameters [#set-custom-load-config-parameters] + +You can also specify the same load-time configuration options when loading a model, such as Context Length and GPU offload. + +See [load-time configuration](../llm-prediction/parameters) for more. + +Set an Auto Unload Timer (TTL) [#set-an-auto-unload-timer-ttl] + +You can specify a *time to live* for a model you load, which is the idle time (in seconds) +after the last request until the model unloads. See [Idle TTL](/docs/app/api/ttl-and-auto-evict) for more on this. + + + If you specify a TTL to `model()`, it will only apply if `model()` loads + a new instance, and will *not* retroactively change the TTL of an existing instance. + + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + model = lms.llm("qwen/qwen3-4b-2507", ttl=3600) + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model("qwen/qwen3-4b-2507", ttl=3600) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model("qwen/qwen3-4b-2507", ttl=3600) + ``` + + + + + + +LLMs and embedding models, due to their fundamental architecture, have a property called `context length`, and more specifically a **maximum** context length. Loosely speaking, this is how many tokens the models can "keep in memory" when generating text or embeddings. Exceeding this limit will result in the model behaving erratically. + +Use the `get_context_length()` function on the model object [#use-the-get_context_length-function-on-the-model-object] + +It's useful to be able to check the context length of a model, especially as an extra check before providing potentially long input to the model. + +```python title="example.py" +context_length = model.get_context_length() +``` + +The `model` in the above code snippet is an instance of a loaded model you get from the `llm.model` method. See [Manage Models in Memory](../manage-models/loading) for more information. + +Example: Check if the input will fit in the model's context window [#example-check-if-the-input-will-fit-in-the-models-context-window] + +You can determine if a given conversation fits into a model's context by doing the following: + +1. Convert the conversation to a string using the prompt template. +2. Count the number of tokens in the string. +3. Compare the token count to the model's context length. + +```python +import lmstudio as lms + +def does_chat_fit_in_context(model: lms.LLM, chat: lms.Chat) -> bool: + # Convert the conversation to a string using the prompt template. + formatted = model.apply_prompt_template(chat) + # Count the number of tokens in the string. + token_count = len(model.tokenize(formatted)) + # Get the current loaded context length of the model + context_length = model.get_context_length() + return token_count < context_length + +model = lms.llm() + +chat = lms.Chat.from_history({ + "messages": [ + { "role": "user", "content": "What is the meaning of life." }, + { "role": "assistant", "content": "The meaning of life is..." }, + # ... More messages + ] +}) + +print("Fits in context:", does_chat_fit_in_context(model, chat)) +``` + + + + +*Required Python SDK version*: **1.2.0** + +LM Studio allows you to configure certain parameters when loading a model +[through the server UI](/docs/advanced/per-model) or [through the API](/docs/api/sdk/load-model). + +You can retrieve the config with which a given model was loaded using the SDK. + +In the below examples, the LLM reference can be replaced with an +embedding model reference without requiring any other changes. + + + Context length is a special case that [has its own method](/docs/api/sdk/get-context-length). + + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + model = lms.llm() + + print(model.get_load_config()) + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model() + + print(model.get_load_config()) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.Client() as client: + model = await client.llm.model() + + print(await model.get_load_config()) + ``` + + + + + + +You can access general information and metadata about a model itself from a loaded +instance of that model. + +In the below examples, the LLM reference can be replaced with an +embedding model reference without requiring any other changes. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + model = lms.llm() + + print(model.get_info()) + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model() + + print(model.get_info()) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model() + + print(await model.get_info()) + ``` + + + +Example output [#example-output] + +```python +LlmInstanceInfo.from_dict({ + "architecture": "qwen2", + "contextLength": 4096, + "displayName": "Qwen2.5 7B Instruct 1M", + "format": "gguf", + "identifier": "qwen2.5-7b-instruct", + "instanceReference": "lpFZPBQjhSZPrFevGyY6Leq8", + "maxContextLength": 1010000, + "modelKey": "qwen2.5-7b-instruct-1m", + "paramsString": "7B", + "path": "lmstudio-community/Qwen2.5-7B-Instruct-1M-GGUF/Qwen2.5-7B-Instruct-1M-Q4_K_M.gguf", + "sizeBytes": 4683073888, + "trainedForToolUse": true, + "type": "llm", + "vision": false +}) +``` + + + + +The `lms daemon down` command stops the running llmster. + +```shell +lms daemon down +``` + + + `lms daemon down` only works if llmster is running. It will not stop LM Studio if it is running as a GUI app. + + +Learn more [#learn-more] + +To find out more about llmster, see [Headless Mode](/docs/developer/core/headless). + + + + +The `lms daemon status` command reports whether llmster is currently running. + +Flags [#flags] + + + +Check daemon status [#check-daemon-status] + +```shell +lms daemon status +``` + +JSON output [#json-output] + +For scripting or automation: + +```shell +lms daemon status --json +``` + +Example output when running: + +```json +{ "status": "running", "pid": 12345, "isDaemon": true } +``` + +Example output when not running: + +```json +{ "status": "not-running" } +``` + +Start or stop the daemon [#start-or-stop-the-daemon] + +* [`lms daemon up`](/docs/cli/daemon/daemon-up) — start the daemon. +* [`lms daemon down`](/docs/cli/daemon/daemon-down) — stop the daemon. + +To find out more about llmster, see [Headless Mode](/docs/developer/core/headless). + + + + +The `lms daemon up` command starts llmster + +Flags [#flags] + + + +Start the daemon [#start-the-daemon] + +```shell +lms daemon up +``` + +If the daemon is not already running, this starts it and prints the PID. If it is already running, it reports the current status. + +JSON output [#json-output] + +For scripting or automation: + +```shell +lms daemon up --json +``` + +Example output: + +```json +{ "status": "running", "pid": 26754, "isDaemon": true, "version": "0.4.4+1" } +``` + +Check the daemon status [#check-the-daemon-status] + +See [`lms daemon status`](/docs/cli/daemon/daemon-status) to check whether the daemon is running. + +Learn more [#learn-more] + +To find out more about llmster, see [Headless Mode](/docs/developer/core/headless). + + + + +The `lms daemon update` command fetches and installs the latest version of llmster. + +Flags [#flags] + + + +Update the daemon [#update-the-daemon] + +Stop the daemon first: + +```shell +lms daemon down +``` + +Then run the update: + +```shell +lms daemon update +``` + +Fetches the latest stable release and installs it. + +Update to the beta channel [#update-to-the-beta-channel] + +```shell +lms daemon update --beta +``` + +After updating [#after-updating] + +Start the daemon again to use the new version: + +```shell +lms daemon up +``` + +To find out more about llmster, see [Headless Mode](/docs/developer/core/headless). + + + + +Use `lms chat` to talk to a local model directly in the terminal. This is handy for quick experiments or scripting. + +Flags [#flags] + + + +Start an interactive chat [#start-an-interactive-chat] + +```shell +lms chat +``` + +You will be prompted to pick a model if one is not provided. + +Chat with a specific model [#chat-with-a-specific-model] + +```shell +lms chat my-model +``` + +Send a single prompt and exit [#send-a-single-prompt-and-exit] + +Use `-p` to print the response to stdout and exit instead of staying interactive: + +```shell +lms chat my-model -p "Summarize this release note" +``` + +Set a system prompt [#set-a-system-prompt] + +```shell +lms chat my-model -s "You are a terse assistant. Reply in two sentences." +``` + +Keep the model loaded after chatting [#keep-the-model-loaded-after-chatting] + +```shell +lms chat my-model --ttl 600 +``` + +Pipe input from another command [#pipe-input-from-another-command] + +`lms chat` reads from stdin, so you can pipe content directly into a prompt: + +```shell +cat my_file.txt | lms chat -p "Summarize this, please" +``` + + + + +The `lms get` command allows you to search and download models from online repositories. If no model is specified, it shows staff-picked recommendations. + +Models you download via `lms get` will be stored in your LM Studio model directory. + +Flags [#flags] + + + +Download a model [#download-a-model] + +Download a model by name: + +```shell +lms get llama-3.1-8b +``` + +Specify quantization [#specify-quantization] + +Download a specific model quantization: + +```shell +lms get llama-3.1-8b@q4_k_m +``` + +Filter by format [#filter-by-format] + +Show only MLX or GGUF models: + +```shell +lms get --mlx +lms get --gguf +``` + +Control search results [#control-search-results] + +Limit the number of results: + +```shell +lms get --limit 5 +``` + +Always show all options: + +```shell +lms get --always-show-all-results +lms get --always-show-download-options +``` + + + + +Use `lms import` to bring an existing model file into LM Studio without downloading it. + +Flags [#flags] + + + +Only one of `--copy`, `--hard-link`, or `--symbolic-link` can be used at a time. If none is provided, `lms import` moves the file by default. + +Import a model file [#import-a-model-file] + +```shell +lms import ~/Downloads/model.gguf +``` + +Keep the original file [#keep-the-original-file] + +```shell +lms import ~/Downloads/model.gguf --copy +``` + +Pick the target folder yourself [#pick-the-target-folder-yourself] + +Use `--user-repo` to skip prompts and place the model in the chosen namespace: + +```shell +lms import ~/Downloads/model.gguf --user-repo my-user/custom-models +``` + +Dry run before importing [#dry-run-before-importing] + +```shell +lms import ~/Downloads/model.gguf --dry-run +``` + + + + +The `lms load` command loads a model into memory. You can optionally set parameters such as context length, GPU offload, and TTL. This guide also covers unloading models with `lms unload`. + +Flags [#flags] + + + +Load a model [#load-a-model] + +Load a model into memory by running the following command: + +```shell +lms load +``` + +You can find the `model_key` by first running [`lms ls`](/docs/cli/local-models/ls) to list your locally downloaded models. + +Set a custom identifier [#set-a-custom-identifier] + +Optionally, you can assign a custom identifier to the loaded model for API reference: + +```shell +lms load --identifier "my-custom-identifier" +``` + +You will then be able to refer to this model by the identifier `my_model` in subsequent commands and API calls (`model` parameter). + +Set context length [#set-context-length] + +You can set the context length when loading a model using the `--context-length` flag: + +```shell +lms load --context-length 4096 +``` + +This determines how many tokens the model will consider as context when generating text. + +Set GPU offload [#set-gpu-offload] + +Control GPU memory usage with the `--gpu` flag: + +```shell +lms load --gpu 0.5 # Offload 50% of layers to GPU +lms load --gpu max # Offload all layers to GPU +lms load --gpu off # Disable GPU offloading +``` + +If not specified, LM Studio will automatically determine optimal GPU usage. + +Set TTL [#set-ttl] + +Set an auto-unload timer with the `--ttl` flag (in seconds): + +```shell +lms load --ttl 3600 # Unload after 1 hour of inactivity +``` + +Estimate resources without loading [#estimate-resources-without-loading] + +Preview memory requirements before loading a model using `--estimate-only`: + +```shell +lms load --estimate-only +``` + +Optional flags such as `--context-length` and `--gpu` are honored and reflected in the estimate. The estimator accounts for factors like context length, flash attention, and whether the model is vision‑enabled. + +Example: + +```bash +$ lms load --estimate-only gpt-oss-120b +Model: openai/gpt-oss-120b +Estimated GPU Memory: 65.68 GB +Estimated Total Memory: 65.68 GB + +Estimate: This model may be loaded based on your resource guardrails settings. +``` + +Unload models [#unload-models] + +Use `lms unload` to remove models from memory. + +Flags [#flags-1] + + + +Unload a specific model [#unload-a-specific-model] + +```shell +lms unload +``` + +If no model key is provided, you will be prompted to select from currently loaded models. + +Unload all models [#unload-all-models] + +```shell +lms unload --all +``` + +Unload from a remote LM Studio instance [#unload-from-a-remote-lm-studio-instance] + +```shell +lms unload --host +``` + +Operate on a remote LM Studio instance [#operate-on-a-remote-lm-studio-instance] + +`lms load` supports the `--host` flag to connect to a remote LM Studio instance. + +```shell +lms load --host +``` + +For this to work, the remote LM Studio instance must be running and accessible from your local machine, e.g. be accessible on the same subnet. + + + + +The `lms ls` command displays a list of all models downloaded to your machine, including their size, architecture, and parameters. + +Flags [#flags] + + + +List all models [#list-all-models] + +Show all downloaded models: + +```shell +lms ls +``` + +Example output: + +``` +You have 47 models, taking up 160.78 GB of disk space. + +LLMs (Large Language Models) PARAMS ARCHITECTURE SIZE +lmstudio-community/meta-llama-3.1-8b-instruct 8B Llama 4.92 GB +hugging-quants/llama-3.2-1b-instruct 1B Llama 1.32 GB +mistral-7b-instruct-v0.3 Mistral 4.08 GB +zeta 7B Qwen2 4.09 GB + +... (abbreviated in this example) ... + +Embedding Models PARAMS ARCHITECTURE SIZE +text-embedding-nomic-embed-text-v1.5@q4_k_m Nomic BERT 84.11 MB +text-embedding-bge-small-en-v1.5 33M BERT 24.81 MB +``` + +Filter by model type [#filter-by-model-type] + +List only LLM models: + +```shell +lms ls --llm +``` + +List only embedding models: + +```shell +lms ls --embedding +``` + +Additional output formats [#additional-output-formats] + +Get detailed information about models: + +```shell +lms ls --detailed +``` + +Output in JSON format: + +```shell +lms ls --json +``` + +Operate on a remote LM Studio instance [#operate-on-a-remote-lm-studio-instance] + +`lms ls` supports the `--host` flag to connect to a remote LM Studio instance: + +```shell +lms ls --host +``` + +For this to work, the remote LM Studio instance must be running and accessible from your local machine, e.g. be accessible on the same subnet. + + + + +The `lms ps` command displays information about all models currently loaded in memory. + +List loaded models [#list-loaded-models] + +Show all currently loaded models: + +```shell +lms ps +``` + +Example output: + +``` + LOADED MODELS + +Identifier: unsloth/deepseek-r1-distill-qwen-1.5b + • Type: LLM + • Path: unsloth/DeepSeek-R1-Distill-Qwen-1.5B-GGUF/DeepSeek-R1-Distill-Qwen-1.5B-Q4_K_M.gguf + • Size: 1.12 GB + • Architecture: Qwen2 +``` + +JSON output [#json-output] + +Get the list in machine-readable format: + +```shell +lms ps --json +``` + +Operate on a remote LM Studio instance [#operate-on-a-remote-lm-studio-instance] + +`lms ps` supports the `--host` flag to connect to a remote LM Studio instance: + +```shell +lms ps --host +``` + +For this to work, the remote LM Studio instance must be running and accessible from your local machine, e.g. be accessible on the same subnet. + + + + +The `lms link disable` command disables LM Link on this device. The device will no longer connect to or be visible to other devices on the link. + +Disable LM Link [#disable-lm-link] + +```shell +lms link disable +``` + +You can re-enable LM Link at any time with [`lms link enable`](/docs/cli/link/link-enable). + +Learn more [#learn-more] + +See the [LM Link documentation](/docs/lmlink) for a full overview of LM Link. + + + + +The `lms link enable` command enables LM Link on this device, allowing it to connect with other devices on the same link. + + + LM Link requires an LM Studio account. Run `lms login` first if you haven't already. + + +Enable LM Link [#enable-lm-link] + +```shell +lms link enable +``` + +After enabling, the CLI waits for a connection to be established. If there are issues, the relevant next step is printed. + +Check the connection status [#check-the-connection-status] + +See [`lms link status`](/docs/cli/link/link-status) to verify the connection and see connected peers. + +Disable LM Link [#disable-lm-link] + +See [`lms link disable`](/docs/cli/link/link-disable) to turn LM Link off. + +Learn more [#learn-more] + +See the [LM Link documentation](/docs/lmlink) for a full overview of LM Link. + + + + +The `lms link set-device-name` command sets a display name for this device, visible to other devices on the link. + +Rename this device [#rename-this-device] + +```shell +lms link set-device-name "My Mac Studio" +``` + +The new name takes effect immediately and is visible to connected peers via [`lms link status`](/docs/cli/link/link-status). + +Learn more [#learn-more] + +See the [LM Link documentation](/docs/lmlink) for a full overview of LM Link. + + + + +The `lms link set-preferred-device` command sets which device on the link is used when a model is available on multiple connected devices. + +Set a preferred device [#set-a-preferred-device] + +Run the command without arguments to pick from an interactive list of connected devices: + +```shell +lms link set-preferred-device +``` + +Or pass the device identifier directly to skip the prompt: + +```shell +lms link set-preferred-device +``` + +Device identifiers are listed in the output of [`lms link status`](/docs/cli/link/link-status). + +See [Using LM Link with the REST API](/docs/developer/core/lmlink) for more on how preferred devices affect model routing. + +Learn more [#learn-more] + +See the [LM Link documentation](/docs/lmlink) for a full overview of LM Link. + + + + +The `lms link status` command shows whether LM Link is enabled on this device, and lists connected peers and their loaded models. + +Flags [#flags] + + + +Check status [#check-status] + +```shell +lms link status +``` + +Displays this device's name, connection state, and a list of connected peers with their currently loaded models. + +JSON output [#json-output] + +For scripting or automation: + +```shell +lms link status --json +``` + +Enable or disable LM Link [#enable-or-disable-lm-link] + +* [`lms link enable`](/docs/cli/link/link-enable) — enable LM Link on this device. +* [`lms link disable`](/docs/cli/link/link-disable) — disable LM Link on this device. + +Learn more [#learn-more] + +See the [LM Link documentation](/docs/lmlink) for a full overview of LM Link. + + + + +Use `lms runtime` to list, download, switch, or remove inference runtimes without opening the app. + +Commands [#commands] + +* `lms runtime ls` — list installed runtimes. +* `lms runtime get` — download a runtime. +* `lms runtime select` — set the active runtime. +* `lms runtime remove` — uninstall a runtime. +* `lms runtime update` — update an installed runtime. + +List installed runtimes [#list-installed-runtimes] + +```shell +lms runtime ls +``` + +Download a runtime [#download-a-runtime] + +```shell +lms runtime get +``` + +Switch to a runtime [#switch-to-a-runtime] + +```shell +lms runtime select +``` + +Follow the interactive prompts to choose the version you want. + + + + +`lms log stream` lets you inspect the exact strings LM Studio sends to and receives from models, and (new in 0.3.26) stream server logs. This is useful for debugging prompt templates, model IO, and server operations. + +Flags [#flags] + + + +Quick start [#quick-start] + +Stream model IO (default): + +```shell +lms log stream +``` + +Stream server logs: + +```shell +lms log stream --source server +``` + +Filter model logs [#filter-model-logs] + +```bash +# Only the formatted user input +lms log stream --source model --filter input + +# Only the model output (emitted once the message completes) +lms log stream --source model --filter output + +# Both directions +lms log stream --source model --filter input,output +``` + +JSON output and stats [#json-output-and-stats] + +Emit JSON: + +```shell +lms log stream --source model --filter input,output --json +``` + +Include prediction stats: + +```shell +lms log stream --source model --filter output --stats +``` + + + + +The `lms server start` command launches the LM Studio local server, allowing you to interact with loaded models via HTTP API calls. + +Flags [#flags] + + + +Start the server [#start-the-server] + +Start the server with default settings: + +```shell +lms server start +``` + +Specify a custom port [#specify-a-custom-port] + +Run the server on a specific port: + +```shell +lms server start --port 3000 +``` + +Enable CORS support [#enable-cors-support] + +For usage with web applications or some VS Code extensions, you may need to enable CORS support: + +```shell +lms server start --cors +``` + +Note that enabling CORS may expose your server to security risks, so use it only when necessary. + +Check the server status [#check-the-server-status] + +See [`lms server status`](/docs/cli/serve/server-status) for more information on checking the status of the server. + + + + +The `lms server status` command displays the current status of the LM Studio local server, including whether it's running and its configuration. + +Flags [#flags] + + + +Check server status [#check-server-status] + +Get the basic status of the server: + +```shell +lms server status +``` + +Example output: + +``` +The server is running on port 1234. +``` + +Example usage [#example-usage] + +```console +➜ ~ lms server start +Starting server... +Waking up LM Studio service... +Success! Server is now running on port 1234 + +➜ ~ lms server status +The server is running on port 1234. +``` + +JSON output [#json-output] + +Get the status in machine-readable JSON format: + +```shell +lms server status --json --quiet +``` + +Example output: + +```json +{ "running": true, "port": 1234 } +``` + +Control logging output [#control-logging-output] + +Adjust logging verbosity: + +```shell +lms server status --verbose +lms server status --quiet +lms server status --log-level debug +``` + +You can only use one logging control flag at a time (`--verbose`, `--quiet`, or `--log-level`). + + + + +The `lms server stop` command gracefully stops the running LM Studio server. + +```shell +lms server stop +``` + +Example output: + +``` +Stopped the server on port 1234. +``` + +Any active request will be terminated when the server is stopped. You can restart the server using [`lms server start`](/docs/cli/serve/server-start). + + + + +Use `lms clone` to copy an artifact from LM Studio Hub onto your machine. + +Flags [#flags] + + + +If no path is provided, `lms clone owner/name` creates a folder called `name` in the current directory. The command exits if the target path already exists. + +Clone the latest revision [#clone-the-latest-revision] + +```shell +lms clone alice/sample-plugin +``` + +Clone into a specific directory [#clone-into-a-specific-directory] + +```shell +lms clone alice/sample-plugin ./my-folder +``` + + + + +Use `lms dev` inside a plugin project to run a local dev server that rebuilds and reloads on file changes. + +This feature is a part of LM Studio [Plugins](/docs/typescript/plugins), currently in private beta. + +Run the dev plugin server [#run-the-dev-plugin-server] + +```shell +lms dev +``` + +This verifies `manifest.json`, installs dependencies if needed, and starts a watcher that rebuilds the plugin on changes. Supported runners: Node/ECMAScript and Deno. + +Install the plugin instead of running dev [#install-the-plugin-instead-of-running-dev] + +```shell +lms dev --install +``` + +Flags [#flags] + + + + + + +Use `lms login` to authenticate the CLI with LM Studio Hub. + +Sign in with the browser [#sign-in-with-the-browser] + +```shell +lms login +``` + +The CLI opens a browser window for authentication. If a browser cannot be opened automatically, copy the printed URL into your browser. + +"CI style" login with pre-authenticated keys [#ci-style-login-with-pre-authenticated-keys] + +```bash +lms login --with-pre-authenticated-keys \ + --key-id \ + --public-key \ + --private-key +``` + +Advanced Flags [#advanced-flags] + + + + + + +Run `lms push` from inside a [plugin](/docs/typescript/plugins), [preset](/docs/app/presets), or [`model.yaml`](/docs/app/modelyaml) project to publish a new revision. If a `model.yaml` exists, the CLI will generate a `manifest.json` for you before pushing. + +For plugins, the CLI will ask for confirmation unless you pass `-y`. + +Publish the current folder [#publish-the-current-folder] + +```shell +lms push +``` + +Flags [#flags] + + + +Advanced [#advanced] + +Publish quietly and keep the revision in manifest.json [#publish-quietly-and-keep-the-revision-in-manifestjson] + +```shell +lms push -y --write-revision +``` + +Override metadata for this upload [#override-metadata-for-this-upload] + +```shell +lms push --description "New beta build" --overrides '{"tags": ["beta"]}' +``` + + + + +LM Studio now supports MCP with OAuth. Seamlessly connect integrations that require authentication without copying tokens or configuring headers. Simply add your integration, log in via browser, and its tools are instantly available to your models in LM Studio. + + + +How it works [#how-it-works] + +When you add an OAuth-backed MCP integration, LM Studio: + +1. Opens a browser window to the service's authorization page +2. Stores the token securely after you approve access +3. Makes the server's tools available in chat + +From that point on, your model can call tools from that service just like any other MCP server. + +*** + +Connecting with your own OAuth credentials [#connecting-with-your-own-oauth-credentials] + +Some services require you to bring your own OAuth app, either because they don't support dynamic client registration, or because they need a specific redirect URL whitelisted in their developer portal. + +In these cases, add an `auth` object to the server entry in `mcp.json`. When configuring your OAuth app, use the following callback URL: + +``` +http://127.0.0.1:33389/mcp-oauth-callback +``` + +```json +{ + "mcpServers": { + "oauth-server": { + "url": "https://api.example.com/mcp", + "auth": { + "CLIENT_ID": "TEST_CLIENT_ID", + "CLIENT_SECRET": "TEST_CLIENT_SECRET" + } + } + } +} +``` + + + + +Linear [#linear] + +Create issues, search projects, update statuses, and more in Linear, directly from LM Studio. + + + +```json +{ + "mcpServers": { + "linear": { + "url": "https://mcp.linear.app/mcp" + } + } +} +``` + +*** + +Notion [#notion] + +Search pages, create documents, and read from your Notion workspace. + + + +```json +{ + "mcpServers": { + "notion": { + "url": "https://mcp.notion.com/mcp" + } + } +} +``` + +*** + +Atlassian [#atlassian] + +Work with Jira issues and Confluence pages from within LM Studio. + + + +```json +{ + "mcpServers": { + "atlassian": { + "url": "https://mcp.atlassian.com/v1/mcp" + } + } +} +``` + +*** + +Sentry [#sentry] + +Query issues, inspect stack traces, and analyze errors from your Sentry projects. + + + +```json +{ + "mcpServers": { + "sentry": { + "url": "https://mcp.sentry.dev/mcp" + } + } +} +``` + +*** + +Many more integrations are supported. Any MCP server that uses OAuth or standard HTTP transport can be connected to LM Studio. See [Use MCP Servers](/docs/app/mcp) for how to add custom servers manually via `mcp.json`. + + + + +Add a new device [#add-a-new-device] + + + +Machines with GUI [#machines-with-gui] + +To begin using LM Link, add an additional device to the link: + +1. Download and install LM Studio on the device, at [https://lmstudio.ai/download](https://lmstudio.ai/download) +2. Click on LM Link in the sidebar and follow the steps to enable LM Link. + +Once LM Link is enabled, your devices will connect to each other automatically. + +Machines without GUI [#machines-without-gui] + +To add a headless machine, connect remotely by using llmster in the terminal: + +1. Install `llmster` on the headless machine + +```bash +curl -fsSL https://lmstudio.ai/install.sh | bash +``` + +2. Log in from the terminal + +```bash +lms login +``` + +3. Follow the instructions in your terminal output to complete login. +4. Once logged in, run the following command: + +```bash +lms link enable +``` + +Your devices will automatically discover each other over the link, and your headless machine will immediately appear on the LM Link page for your other device. Once connected, models from remote machines will appear locally for loading and inference. + +Load models on remote machines [#load-models-on-remote-machines] + + + +When using LM Link, the model loader shows both local models and remote models on linked devices. + +You can filter the model loader to display only local or remote models, or to display all available models at once. Remote models can be loaded and configured with the same familiar controls, either in the GUI or by using lms in the terminal. + +If you have the same model on multiple devices, they will show up as separate entries, with the associated device name identified. If you are loading models via API/SDK, you can [set a preferred device](/docs/lmlink/basics/preferred-device) to specify which device to load the model from when multiple options are available. + +Using LM Studio’s parallel requests, you can also serve multiple clients simultaneously across your LM Link network. + + + + +Q&A [#qa] + +Got questions about LM Link? We cover some of the most common questions below. + +Q: Does LM Link open up my computer to the public internet? [#q-does-lm-link-open-up-my-computer-to-the-public-internet] + +A: No! All your devices in the LM Link network communicate with each other using Tailscale’s internal end-to-end encrypted connections. None of your devices are ever exposed to the public Internet. + +Q: Can I use remote models with LM Studio's local server? [#q-can-i-use-remote-models-with-lm-studios-local-server] + +A: Yes. Any model in your LM Link network can be used as if they are local. This means that any tool that already connects to your local LM Studio will be able to use remote models as well, just by pointing to localhost:1234 as usual. + +Q: Can I use remote models through the LM Studio API/SDKs? [#q-can-i-use-remote-models-through-the-lm-studio-apisdks] + +A: Yes. Any model in your LM Link network can be used as if they are local. Just specify the model key as usual. If the model can be found on a remote device, it can be used through LM Link. + +Q: Will LM Link interfere with my existing Tailscale VPN? [#q-will-lm-link-interfere-with-my-existing-tailscale-vpn] + +A: No. LM Link is an entirely separate and self-contained utilization of Tailscale VPN primitives. LM Link will coexist with other Tailscale utilization on your machine or network, with no interference or interplay. + +Q: Can the LM Studio Hub see my chats? [#q-can-the-lm-studio-hub-see-my-chats] + +A: No. The LM Studio Hub is only used to facilitate discovery between LM Studio/llmster instances. All communication afterwards, including chats and model listing, happens within Tailscale’s end-to-end encrypted connection. + +Q: How can I disable LM Link? [#q-how-can-i-disable-lm-link] + +A: In the LM Studio app, go to Settings -> LM Link -> Enable LM Link - OFF. If you are using llmster (our headless daemon), run `lms link disable`. + +Q: Why does a device show up as “disconnected”? [#q-why-does-a-device-show-up-as-disconnected] + +A: LM Link uses end-to-end encrypted tunnels to connect to each other. If a device shows up as “disconnected”, it is possible that device has crashed but has not reported to the discovery server. Please make sure LM Studio/llmster is indeed running on that device. If the error persists, please report a bug at [bugs@lmstudio.ai](mailto:bugs@lmstudio.ai). + +Q: If I have the same model on multiple devices, how do I choose which one to use? [#q-if-i-have-the-same-model-on-multiple-devices-how-do-i-choose-which-one-to-use] + +A: If you are loading the model via LM Studio or `lms load`, the same model on different devices will show up as separate entries, with the device name identified. If you are loading models via API/SDK, you can set a preferred device from the in-app LM Link page, or use command `lms link set-preferred-device`. Once set, the model will always load on your preferred device. + +Q: Can linked devices do anything besides LM Studio tasks on my computer? [#q-can-linked-devices-do-anything-besides-lm-studio-tasks-on-my-computer] + +A: No. LM Link only lets LM Studio/llmster talk to each other for model and API access. It does not expose your operating system, files, or other services to linked devices. + +Q: Can I use my existing Tailscale network? [#q-can-i-use-my-existing-tailscale-network] + +A: Not at the moment. When you enable LM Link we create a dedicated network programmatically and take full control over the ACL. This will not work well with any existing Tailscale networks. If you wish, you can DIY several aspects of the LM Link feature set yourself. + + + + +Requesting Access [#requesting-access] + + + +To get started, find the LM Link icon in the LM Studio app, just above the Settings gear icon. LM Link is a network between your devices, so log-in is required to associate devices to users in order to facilitate discovery. + +A custom link is **automatically provisioned** for you the first time you access the feature. + +Once your first device has joined the link, [add another device](/docs/lmlink/basics/add-device) to experience the power of LM Link! + + + + +Choosing a preferred device [#choosing-a-preferred-device] + +When the same model is available on multiple devices in the link, LM Link uses the preferred device to load and use the model. This setting is per-machine: each device on the link independently controls which remote machine it prefers. + +This is especially relevant when accessing remote models via the SDK or [REST API](/docs/developer/core/lmlink). + +Machines with GUI [#machines-with-gui] + +In the app, head to the LM Link page, select the device and toggle the "Set as preferred device" option. + + + +Machines without GUI [#machines-without-gui] + +To set a preferred device from the terminal, use the following command: + +```bash +lms link set-preferred-device +``` + + + + + + +Sometimes you may want to halt a prediction before it finishes. For example, the user might change their mind or your UI may navigate away. `lmstudio-js` provides two simple ways to cancel a running prediction. + + + +

+ Call + + `.cancel()` + + on the prediction +

+ + Every prediction method returns an `OngoingPrediction` instance. Calling `.cancel()` stops generation and causes the final `stopReason` to be `"userStopped"`. In the example below we schedule the cancel call on a timer: + + ```typescript + import { LMStudioClient } from "@lmstudio/sdk"; + + const client = new LMStudioClient(); + const model = await client.llm.model("qwen2.5-7b-instruct"); + + const prediction = model.respond("What is the meaning of life?", { + maxTokens: 50, + }); + setTimeout(() => prediction.cancel(), 1000); // cancel after 1 second + + const result = await prediction.result(); + console.info(result.stats.stopReason); // "userStopped" + ``` +
+ + +

+ Use an + + `AbortController` +

+ + If your application already uses an `AbortController` to propagate cancellation, you can pass its `signal` to the prediction method. Aborting the controller stops the prediction with the same `stopReason`: + + ```typescript + import { LMStudioClient } from "@lmstudio/sdk"; + + const client = new LMStudioClient(); + const model = await client.llm.model("qwen2.5-7b-instruct"); + + const controller = new AbortController(); + const prediction = model.respond("What is the meaning of life?", { + maxTokens: 50, + signal: controller.signal, + }); + setTimeout(() => controller.abort(), 1000); // cancel after 1 second + + const result = await prediction.result(); + console.info(result.stats.stopReason); // "userStopped" + ``` +
+
+ +Both approaches halt generation immediately, and the returned stats indicate that the prediction ended because you stopped it. + + + + +Use `llm.respond(...)` to generate completions for a chat conversation. + +Quick Example: Generate a Chat Response [#quick-example-generate-a-chat-response] + +The following snippet shows how to stream the AI's response to quick chat prompt. + +```typescript title="index.ts" +import { LMStudioClient } from "@lmstudio/sdk"; +const client = new LMStudioClient(); + +const model = await client.llm.model(); + +for await (const fragment of model.respond("What is the meaning of life?")) { + process.stdout.write(fragment.content); +} +``` + +Obtain a Model [#obtain-a-model] + +First, you need to get a model handle. This can be done using the `model` method in the `llm` namespace. For example, here is how to use Qwen2.5 7B Instruct. + +```typescript title="index.ts" +import { LMStudioClient } from "@lmstudio/sdk"; +const client = new LMStudioClient(); + +const model = await client.llm.model("qwen2.5-7b-instruct"); +``` + +There are other ways to get a model handle. See [Managing Models in Memory](./../manage-models/loading) for more info. + +Manage Chat Context [#manage-chat-context] + +The input to the model is referred to as the "context". Conceptually, the model receives a multi-turn conversation as input, and it is asked to predict the assistant's response in that conversation. + + + + + Using an array of messages + + + + Constructing a Chat object + + + + + ```typescript + import { Chat } from "@lmstudio/sdk"; + + // Create a chat object from an array of messages. + const chat = Chat.from([ + { role: "system", content: "You are a resident AI philosopher." }, + { role: "user", content: "What is the meaning of life?" }, + ]); + ``` + + + + ```typescript + import { Chat } from "@lmstudio/sdk"; + + // Create an empty chat object. + const chat = Chat.empty(); + + // Build the chat context by appending messages. + chat.append("system", "You are a resident AI philosopher."); + chat.append("user", "What is the meaning of life?"); + ``` + + + +See [Working with Chats](./working-with-chats) for more information on managing chat context. + + + +Generate a response [#generate-a-response] + +You can ask the LLM to predict the next response in the chat context using the `respond()` method. + + + + + Streaming + + + + Non-streaming + + + + + ```typescript + // The `chat` object is created in the previous step. + const prediction = model.respond(chat); + + for await (const { content } of prediction) { + process.stdout.write(content); + } + + console.info(); // Write a new line to prevent text from being overwritten by your shell. + ``` + + + + ```typescript + // The `chat` object is created in the previous step. + const result = await model.respond(chat); + + console.info(result.content); + ``` + + + +Customize Inferencing Parameters [#customize-inferencing-parameters] + +You can pass in inferencing parameters as the second parameter to `.respond()`. + + + + + Streaming + + + + Non-streaming + + + + + ```typescript + const prediction = model.respond(chat, { + temperature: 0.6, + maxTokens: 50, + }); + ``` + + + + ```typescript + const result = await model.respond(chat, { + temperature: 0.6, + maxTokens: 50, + }); + ``` + + + +See [Configuring the Model](./parameters) for more information on what can be configured. + +Print prediction stats [#print-prediction-stats] + +You can also print prediction metadata, such as the model used for generation, number of generated +tokens, time to first token, and stop reason. + + + + + Streaming + + + + Non-streaming + + + + + ```typescript + // If you have already iterated through the prediction fragments, + // doing this will not result in extra waiting. + const result = await prediction.result(); + + console.info("Model used:", result.modelInfo.displayName); + console.info("Predicted tokens:", result.stats.predictedTokensCount); + console.info("Time to first token (seconds):", result.stats.timeToFirstTokenSec); + console.info("Stop reason:", result.stats.stopReason); + ``` + + + + ```typescript + // `result` is the response from the model. + console.info("Model used:", result.modelInfo.displayName); + console.info("Predicted tokens:", result.stats.predictedTokensCount); + console.info("Time to first token (seconds):", result.stats.timeToFirstTokenSec); + console.info("Stop reason:", result.stats.stopReason); + ``` + + + +Example: Multi-turn Chat [#example-multi-turn-chat] + + + +```typescript +import { Chat, LMStudioClient } from "@lmstudio/sdk"; +import { createInterface } from "readline/promises"; + +const rl = createInterface({ input: process.stdin, output: process.stdout }); +const client = new LMStudioClient(); +const model = await client.llm.model(); +const chat = Chat.empty(); + +while (true) { + const input = await rl.question("You: "); + // Append the user input to the chat + chat.append("user", input); + + const prediction = model.respond(chat, { + // When the model finish the entire message, push it to the chat + onMessage: (message) => chat.append(message), + }); + process.stdout.write("Bot: "); + for await (const { content } of prediction) { + process.stdout.write(content); + } + process.stdout.write("\n"); +} +``` + + + + + + + + +Use `llm.complete(...)` to generate text completions from a loaded language model. Text completions mean sending an non-formatted string to the model with the expectation that the model will complete the text. + +This is different from multi-turn chat conversations. For more information on chat completions, see [Chat Completions](./chat-completion). + +Quickstart [#quickstart] + + + +

+ Instantiate a Model +

+ + First, you need to load a model to generate completions from. This can be done using the `model` method on the `llm` handle. + + ```typescript title="index.ts" + import { LMStudioClient } from "@lmstudio/sdk"; + + const client = new LMStudioClient(); + const model = await client.llm.model("qwen2.5-7b-instruct"); + ``` +
+ + +

+ Generate a Completion +

+ + Once you have a loaded model, you can generate completions by passing a string to the `complete` method on the `llm` handle. + + + + + Streaming + + + + Non-streaming + + + + + ```typescript + const completion = model.complete("My name is", { + maxTokens: 100, + }); + + for await (const { content } of completion) { + process.stdout.write(content); + } + + console.info(); // Write a new line for cosmetic purposes + ``` + + + + ```typescript + const completion = await model.complete("My name is", { + maxTokens: 100, + }); + + console.info(completion.content); + ``` + + +
+ + +

+ Print Prediction Stats +

+ + You can also print prediction metadata, such as the model used for generation, number of generated tokens, time to first token, and stop reason. + + ```typescript title="index.ts" + console.info("Model used:", completion.modelInfo.displayName); + console.info("Predicted tokens:", completion.stats.predictedTokensCount); + console.info("Time to first token (seconds):", completion.stats.timeToFirstTokenSec); + console.info("Stop reason:", completion.stats.stopReason); + ``` +
+
+ +Example: Get an LLM to Simulate a Terminal [#example-get-an-llm-to-simulate-a-terminal] + +Here's an example of how you might use the `complete` method to simulate a terminal. + +```typescript title="terminal-sim.ts" +import { LMStudioClient } from "@lmstudio/sdk"; +import { createInterface } from "node:readline/promises"; + +const rl = createInterface({ input: process.stdin, output: process.stdout }); +const client = new LMStudioClient(); +const model = await client.llm.model(); +let history = ""; + +while (true) { + const command = await rl.question("$ "); + history += "$ " + command + "\n"; + + const prediction = model.complete(history, { stopStrings: ["$"] }); + for await (const { content } of prediction) { + process.stdout.write(content); + } + process.stdout.write("\n"); + + const { content } = await prediction.result(); + history += content; +} +``` + +{/* ## Advanced Usage + + ### Prediction metadata + + Prediction responses are really returned as `PredictionResult` objects that contain additional dot-accessible metadata about the inference request. + This entails info about the model used, the configuration with which it was loaded, and the configuration for this particular prediction. It also provides + inference statistics like stop reason, time to first token, tokens per second, and number of generated tokens. + + Please consult your specific SDK to see exact syntax. + + ### Progress callbacks + + TODO: TS has onFirstToken callback which Python does not + + Long prompts will often take a long time to first token, i.e. it takes the model a long time to process your prompt. + If you want to get updates on the progress of this process, you can provide a float callback to `complete` + that receives a float from 0.0-1.0 representing prompt processing progress. + + ```python tab="Python" + import lmstudio as lm + + llm = lm.llm() + + completion = llm.complete( + "My name is", + on_progress: lambda progress: print(f"{progress*100}% complete") + ) + ``` + + ```python tab="Python (with scoped resources)" + import lmstudio + + with lmstudio.Client() as client: + llm = client.llm.model() + + completion = llm.complete( + "My name is", + on_progress: lambda progress: print(f"{progress*100}% processed") + ) + ``` + + ```typescript tab="TypeScript" + import { LMStudioClient } from "@lmstudio/sdk"; + + const client = new LMStudioClient(); + const llm = await client.llm.model(); + + const prediction = llm.complete( + "My name is", + {onPromptProcessingProgress: (progress) => process.stdout.write(`${progress*100}% processed`)}); + ``` + + ### Prediction configuration + + You can also specify the same prediction configuration options as you could in the + in-app chat window sidebar. Please consult your specific SDK to see exact syntax. */} + + + + + + +Some models, known as VLMs (Vision-Language Models), can accept images as input. You can pass images to the model using the `.respond()` method. + +Prerequisite: Get a VLM (Vision-Language Model) [#prerequisite-get-a-vlm-vision-language-model] + +If you don't yet have a VLM, you can download a model like `qwen2-vl-2b-instruct` using the following command: + +```bash +lms get qwen2-vl-2b-instruct +``` + + + +

+ Instantiate the Model +

+ + Connect to LM Studio and obtain a handle to the VLM (Vision-Language Model) you want to use. + + ```typescript + import { LMStudioClient } from "@lmstudio/sdk"; + const client = new LMStudioClient(); + + const model = await client.llm.model("qwen2-vl-2b-instruct"); + ``` +
+ + +

+ Prepare the Image +

+ + Use the `client.files.prepareImage()` method to get a handle to the image that can be subsequently passed to the model. + + ```typescript + const imagePath = "/path/to/image.jpg"; // Replace with the path to your image + const image = await client.files.prepareImage(imagePath); + ``` + + If you only have the image in the form of a base64 string, you can use the `client.files.prepareImageBase64()` method instead. + + ```typescript + const imageBase64 = "Your base64 string here"; + const image = await client.files.prepareImageBase64(imageBase64); + ``` + + The LM Studio server supports JPEG, PNG, and WebP image formats. +
+ + +

+ Pass the Image to the Model in + + `.respond()` +

+ + Generate a prediction by passing the image to the model in the `.respond()` method. + + ```typescript + const prediction = model.respond([ + { role: "user", content: "Describe this image please", images: [image] }, + ]); + ``` +
+
+ + + + +You can customize both inference-time and load-time parameters for your model. Inference parameters can be set on a per-request basis, while load parameters are set when loading the model. + +Inference Parameters [#inference-parameters] + +Set inference-time parameters such as `temperature`, `maxTokens`, `topP` and more. + + + + + .respond() + + + + .complete() + + + + + ```typescript + const prediction = model.respond(chat, { + temperature: 0.6, + maxTokens: 50, + }); + ``` + + + + ```typescript + const prediction = model.complete(prompt, { + temperature: 0.6, + maxTokens: 50, + stop: ["\n\n"], + }); + ``` + + + +See [`LLMPredictionConfigInput`](./../api-reference/llm-prediction-config-input) for all configurable fields. + +Another useful inference-time configuration parameter is [`structured`](\(./structured-responses\)), which allows you to rigorously enforce the structure of the output using a JSON or zod schema. + +Load Parameters [#load-parameters] + +Set load-time parameters such as the context length, GPU offload ratio, and more. + +Set Load Parameters with `.model()` [#set-load-parameters-with-model] + +The `.model()` retrieves a handle to a model that has already been loaded, or loads a new one on demand (JIT loading). + +**Note**: if the model is already loaded, the configuration will be **ignored**. + +```typescript +const model = await client.llm.model("qwen2.5-7b-instruct", { + config: { + contextLength: 8192, + gpu: { + ratio: 0.5, + }, + }, +}); +``` + +See [`LLMLoadModelConfig`](./../api-reference/llm-load-model-config) for all configurable fields. + +Set Load Parameters with `.load()` [#set-load-parameters-with-load] + +The `.load()` method creates a new model instance and loads it with the specified configuration. + +```typescript +const model = await client.llm.load("qwen2.5-7b-instruct", { + config: { + contextLength: 8192, + gpu: { + ratio: 0.5, + }, + }, +}); +``` + +See [`LLMLoadModelConfig`](./../api-reference/llm-load-model-config) for all configurable fields. + + + + +Speculative decoding is a technique that can substantially increase the generation speed of large language models (LLMs) without reducing response quality. See [Speculative Decoding](./../../app/advanced/speculative-decoding) for more info. + +To use speculative decoding in `lmstudio-js`, simply provide a `draftModel` parameter when performing the prediction. You do not need to load the draft model separately. + + + + + Non-streaming + + + + Streaming + + + + + ```typescript + import { LMStudioClient } from "@lmstudio/sdk"; + + const client = new LMStudioClient(); + + const mainModelKey = "qwen2.5-7b-instruct"; + const draftModelKey = "qwen2.5-0.5b-instruct"; + + const model = await client.llm.model(mainModelKey); + const result = await model.respond("What are the prime numbers between 0 and 100?", { + draftModel: draftModelKey, + }); + + const { content, stats } = result; + console.info(content); + console.info(`Accepted ${stats.acceptedDraftTokensCount}/${stats.predictedTokensCount} tokens`); + ``` + + + + ```typescript + import { LMStudioClient } from "@lmstudio/sdk"; + + const client = new LMStudioClient(); + + const mainModelKey = "qwen2.5-7b-instruct"; + const draftModelKey = "qwen2.5-0.5b-instruct"; + + const model = await client.llm.model(mainModelKey); + const prediction = model.respond("What are the prime numbers between 0 and 100?", { + draftModel: draftModelKey, + }); + + for await (const { content } of prediction) { + process.stdout.write(content); + } + process.stdout.write("\n"); + + const { stats } = await prediction.result(); + console.info(`Accepted ${stats.acceptedDraftTokensCount}/${stats.predictedTokensCount} tokens`); + ``` + + + + + + +You can enforce a particular response format from an LLM by providing a schema (JSON or `zod`) to the `.respond()` method. This guarantees that the model's output conforms to the schema you provide. + +Enforce Using a `zod` Schema [#enforce-using-a-zod-schema] + +If you wish the model to generate JSON that satisfies a given schema, it is recommended to provide +the schema using [`zod`](https://zod.dev/). When a `zod` schema is provided, the prediction result will contain an extra field `parsed`, which contains parsed, validated, and typed result. + +Define a `zod` Schema [#define-a-zod-schema] + +```ts +import { z } from "zod"; + +// A zod schema for a book +const bookSchema = z.object({ + title: z.string(), + author: z.string(), + year: z.number().int(), +}); +``` + +Generate a Structured Response [#generate-a-structured-response] + + + + + Non-streaming + + + + Streaming + + + + + ```typescript + const result = await model.respond("Tell me about The Hobbit.", + { structured: bookSchema }, + maxTokens: 100, // Recommended to avoid getting stuck + ); + + const book = result.parsed; + console.info(book); + // ^ + // Note that `book` is now correctly typed as { title: string, author: string, year: number } + ``` + + + + ```typescript + const prediction = model.respond("Tell me about The Hobbit.", + { structured: bookSchema }, + maxTokens: 100, // Recommended to avoid getting stuck + ); + + for await (const { content } of prediction) { + process.stdout.write(content); + } + process.stdout.write("\n"); + + // Get the final structured result + const result = await prediction.result(); + const book = result.parsed; + + console.info(book); + // ^ + // Note that `book` is now correctly typed as { title: string, author: string, year: number } + ``` + + + +Enforce Using a JSON Schema [#enforce-using-a-json-schema] + +You can also enforce a structured response using a JSON schema. + +Define a JSON Schema [#define-a-json-schema] + +```ts +// A JSON schema for a book +const schema = { + type: "object", + properties: { + title: { type: "string" }, + author: { type: "string" }, + year: { type: "integer" }, + }, + required: ["title", "author", "year"], +}; +``` + +Generate a Structured Response [#generate-a-structured-response-1] + + + + + Non-streaming + + + + Streaming + + + + + ```typescript + const result = await model.respond("Tell me about The Hobbit.", { + structured: { + type: "json", + jsonSchema: schema, + }, + maxTokens: 100, // Recommended to avoid getting stuck + }); + + const book = JSON.parse(result.content); + console.info(book); + ``` + + + + ```typescript + const prediction = model.respond("Tell me about The Hobbit.", { + structured: { + type: "json", + jsonSchema: schema, + }, + maxTokens: 100, // Recommended to avoid getting stuck + }); + + for await (const { content } of prediction) { + process.stdout.write(content); + } + process.stdout.write("\n"); + + const result = await prediction.result(); + const book = JSON.parse(result.content); + + console.info("Parsed", book); + ``` + + + + + Structured generation works by constraining the model to only generate tokens that conform to the provided schema. This ensures valid output in normal cases, but comes with two important limitations: + + 1. Models (especially smaller ones) may occasionally get stuck in an unclosed structure (like an open bracket), when they "forget" they are in such structure and cannot stop due to schema requirements. Thus, it is recommended to always include a `maxTokens` parameter to prevent infinite generation. + + 2. Schema compliance is only guaranteed for complete, successful generations. If generation is interrupted (by cancellation, reaching the `maxTokens` limit, or other reasons), the output will likely violate the schema. With `zod` schema input, this will raise an error; with JSON schema, you'll receive an invalid string that doesn't satisfy schema. + + + + + +SDK methods such as `model.respond()`, `model.applyPromptTemplate()`, or `model.act()` +takes in a chat parameter as an input. There are a few ways to represent a chat in the SDK. + +Option 1: Array of Messages [#option-1-array-of-messages] + +You can use an array of messages to represent a chat. Here is an example with the `.respond()` method. + + + + + Text-only + + + + With Images + + + + + ```typescript + const prediction = model.respond([ + { role: "system", content: "You are a resident AI philosopher." }, + { role: "user", content: "What is the meaning of life?" }, + ]); + ``` + + + + ```typescript + const image = await client.files.prepareImage("/path/to/image.jpg"); + + const prediction = model.respond([ + { role: "system", content: "You are a state-of-art object recognition system." }, + { role: "user", content: "What is this object?", images: [image] }, + ]); + ``` + + + +Option 2: Input a Single String [#option-2-input-a-single-string] + +If your chat only has one single user message, you can use a single string to represent the chat. Here is an example with the `.respond` method. + +```typescript +const prediction = model.respond("What is the meaning of life?"); +``` + +Option 3: Using the `Chat` Helper Class [#option-3-using-the-chat-helper-class] + +For more complex tasks, it is recommended to use the `Chat` helper classes. It provides various commonly used methods to manage the chat. Here is an example with the `Chat` class. + + + + + Text-only + + + + With Images + + + + + ```typescript + const chat = Chat.empty(); + chat.append("system", "You are a resident AI philosopher."); + chat.append("user", "What is the meaning of life?"); + + const prediction = model.respond(chat); + ``` + + + + ```typescript + const image = await client.files.prepareImage("/path/to/image.jpg"); + + const chat = Chat.empty(); + chat.append("system", "You are a state-of-art object recognition system."); + chat.append("user", "What is this object?", { images: [image] }); + + const prediction = model.respond(chat); + ``` + + + +You can also quickly construct a `Chat` object using the `Chat.from` method. + + + + + Array of messages + + + + Single string + + + + + ```typescript + const chat = Chat.from([ + { role: "system", content: "You are a resident AI philosopher." }, + { role: "user", content: "What is the meaning of life?" }, + ]); + ``` + + + + ```typescript + // This constructs a chat with a single user message + const chat = Chat.from("What is the meaning of life?"); + ``` + + + + + + +Automatic tool calling [#automatic-tool-calling] + +We introduce the concept of execution "rounds" to describe the combined process of running a tool, providing its output to the LLM, and then waiting for the LLM to decide what to do next. + +**Execution Round** + +``` + • run a tool -> + ↑ • provide the result to the LLM -> + │ • wait for the LLM to generate a response + │ + └────────────────────────────────────────┘ └➔ (return) +``` + +A model might choose to run tools multiple times before returning a final result. For example, if the LLM is writing code, it might choose to compile or run the program, fix errors, and then run it again, rinse and repeat until it gets the desired result. + +With this in mind, we say that the `.act()` API is an automatic "multi-round" tool calling API. + +Quick Example [#quick-example] + +```typescript +import { LMStudioClient, tool } from "@lmstudio/sdk"; +import { z } from "zod"; + +const client = new LMStudioClient(); + +const multiplyTool = tool({ + name: "multiply", + description: "Given two numbers a and b. Returns the product of them.", + parameters: { a: z.number(), b: z.number() }, + implementation: ({ a, b }) => a * b, +}); + +const model = await client.llm.model("qwen2.5-7b-instruct"); +await model.act("What is the result of 12345 multiplied by 54321?", [multiplyTool], { + onMessage: (message) => console.info(message.toString()), +}); +``` + +> ***NOTE:*** at this time, this code expects zod v3 + +What does it mean for an LLM to "use a tool"? [#what-does-it-mean-for-an-llm-to-use-a-tool] + +LLMs are largely text-in, text-out programs. So, you may ask "how can an LLM use a tool?". The answer is that some LLMs are trained to ask the human to call the tool for them, and expect the tool output to to be provided back in some format. + +Imagine you're giving computer support to someone over the phone. You might say things like "run this command for me ... OK what did it output? ... OK now click there and tell me what it says ...". In this case you're the LLM! And you're "calling tools" vicariously through the person on the other side of the line. + +Important: Model Selection [#important-model-selection] + +The model selected for tool use will greatly impact performance. + +Some general guidance when selecting a model: + +* Not all models are capable of intelligent tool use +* Bigger is better (i.e., a 7B parameter model will generally perform better than a 3B parameter model) +* We've observed [Qwen2.5-7B-Instruct](https://model.lmstudio.ai/download/lmstudio-community/Qwen2.5-7B-Instruct-GGUF) to perform well in a wide variety of cases +* This guidance may change + +Example: Multiple Tools [#example-multiple-tools] + +The following code demonstrates how to provide multiple tools in a single `.act()` call. + +```typescript +import { LMStudioClient, tool } from "@lmstudio/sdk"; +import { z } from "zod"; + +const client = new LMStudioClient(); + +const additionTool = tool({ + name: "add", + description: "Given two numbers a and b. Returns the sum of them.", + parameters: { a: z.number(), b: z.number() }, + implementation: ({ a, b }) => a + b, +}); + +const isPrimeTool = tool({ + name: "isPrime", + description: "Given a number n. Returns true if n is a prime number.", + parameters: { n: z.number() }, + implementation: ({ n }) => { + if (n < 2) return false; + const sqrt = Math.sqrt(n); + for (let i = 2; i <= sqrt; i++) { + if (n % i === 0) return false; + } + return true; + }, +}); + +const model = await client.llm.model("qwen2.5-7b-instruct"); +await model.act( + "Is the result of 12345 + 45668 a prime? Think step by step.", + [additionTool, isPrimeTool], + { onMessage: (message) => console.info(message.toString()) }, +); +``` + +Example: Chat Loop with Create File Tool [#example-chat-loop-with-create-file-tool] + +The following code creates a conversation loop with an LLM agent that can create files. + +```typescript +import { Chat, LMStudioClient, tool } from "@lmstudio/sdk"; +import { existsSync } from "fs"; +import { writeFile } from "fs/promises"; +import { createInterface } from "readline/promises"; +import { z } from "zod"; + +const rl = createInterface({ input: process.stdin, output: process.stdout }); +const client = new LMStudioClient(); +const model = await client.llm.model(); +const chat = Chat.empty(); + +const createFileTool = tool({ + name: "createFile", + description: "Create a file with the given name and content.", + parameters: { name: z.string(), content: z.string() }, + implementation: async ({ name, content }) => { + if (existsSync(name)) { + return "Error: File already exists."; + } + await writeFile(name, content, "utf-8"); + return "File created."; + }, +}); + +while (true) { + const input = await rl.question("You: "); + // Append the user input to the chat + chat.append("user", input); + + process.stdout.write("Bot: "); + await model.act(chat, [createFileTool], { + // When the model finish the entire message, push it to the chat + onMessage: (message) => chat.append(message), + onPredictionFragment: ({ content }) => { + process.stdout.write(content); + }, + }); + process.stdout.write("\n"); +} +``` + + + + +You can define tools with the `tool()` function and pass them to the model in the `act()` call. + +Anatomy of a Tool [#anatomy-of-a-tool] + +Follow this standard format to define functions as tools: + +```typescript title="index.ts" +import { tool } from "@lmstudio/sdk"; +import { z } from "zod"; + +const exampleTool = tool({ + // The name of the tool + name: "add", + + // A description of the tool + description: "Given two numbers a and b. Returns the sum of them.", + + // zod schema of the parameters + parameters: { a: z.number(), b: z.number() }, + + // The implementation of the tool. Just a regular function. + implementation: ({ a, b }) => a + b, +}); +``` + +**Important**: The tool name, description, and the parameter definitions are all passed to the model! + +This means that your wording will affect the quality of the generation. Make sure to always provide a clear description of the tool so the model knows how to use it. + +Tools with External Effects (like Computer Use or API Calls) [#tools-with-external-effects-like-computer-use-or-api-calls] + +Tools can also have external effects, such as creating files or calling programs and even APIs. By implementing tools with external effects, you +can essentially turn your LLMs into autonomous agents that can perform tasks on your local machine. + +Example: `createFileTool` [#example-createfiletool] + +Tool Definition [#tool-definition] + +```typescript title="createFileTool.ts" +import { tool } from "@lmstudio/sdk"; +import { existsSync } from "fs"; +import { writeFile } from "fs/promises"; +import { z } from "zod"; + +const createFileTool = tool({ + name: "createFile", + description: "Create a file with the given name and content.", + parameters: { name: z.string(), content: z.string() }, + implementation: async ({ name, content }) => { + if (existsSync(name)) { + return "Error: File already exists."; + } + await writeFile(name, content, "utf-8"); + return "File created."; + }, +}); +``` + +Example code using the `createFile` tool: [#example-code-using-the-createfile-tool] + +```typescript title="index.ts" +import { LMStudioClient } from "@lmstudio/sdk"; +import { createFileTool } from "./createFileTool"; + +const client = new LMStudioClient(); + +const model = await client.llm.model("qwen2.5-7b-instruct"); +await model.act( + "Please create a file named output.txt with your understanding of the meaning of life.", + [createFileTool], +); +``` + + + + +Add dependencies to your plugin with `npm` [#add-dependencies-to-your-plugin-with-npm] + +LM Studio plugins supports `npm` packages. You can just install them using `npm install`. + +When the plugin is installed, LM Studio will automatically download all the required dependencies that are declared in `package.json` and `package-lock.json`. (The user does not need to have Node.js/npm installed.) + +`postinstall` scripts [#postinstall-scripts] + +For safety reasons, we do **not** run `postinstall` scripts. Thus please make sure you are not using any npm packages that require postinstall scripts to work. + +Using Other Package Managers [#using-other-package-managers] + +Since we rely on `package-lock.json`, lock files produced by other package managers will not work. Thus we recommend only using `npm` when developing LM Studio plugins. + + + + +Plugins extend LM Studio's functionality by providing "hook functions" that execute at specific points during operation. + +Plugins are currently written in JavaScript/TypeScript and run on Node.js v22.21.1. Python support is in development. + +Getting Started [#getting-started] + +LM Studio includes Node.js, so no separate installation is required. + +Create a new plugin [#create-a-new-plugin] + +To create a new plugin, navigate to LM Studio... \[TO BE CONTINUED] + +Run a plugin in development mode [#run-a-plugin-in-development-mode] + +Once you've created a plugin, run this command in the plugin directory to start development mode: + +```bash +lms dev +``` + +Your plugin will appear in LM Studio's plugin list. Development mode automatically rebuilds and reloads your plugin when you make code changes. + +You only need `lms dev` during development. When the plugin is installed, LM Studio automatically runs them as needed. Learn more about distributing and installing plugins in the [Sharing Plugins](./plugins/publish-plugins) section. + +Next Steps [#next-steps] + +* [Tools Providers](./plugins/tools-provider) + + Give models extra capabilities by creating tools they can use during generation, like accessing external APIs or performing calculations. + +* [Prompt Preprocessors](./plugins/prompt-preprocessor) + + Modify user input before it reaches the model - handle file uploads, inject context, or transform queries. + +* [Generators](./plugins/generator) + + Create custom text generation sources that replace the local model, perfect for online model adapters. + +* [Custom Configurations](./plugins/custom-configuration) + + Add configuration UIs so users can customize your plugin's behavior. + +* [Third-Party Dependencies](./plugins/dependencies) + + Use npm packages to leverage existing libraries in your plugins. + +* [Sharing Plugins](./plugins/publish-plugins) + + Package and share your plugins with the community. + + + + +Generate embeddings for input text. Embeddings are vector representations of text that capture semantic meaning. Embeddings are a building block for RAG (Retrieval-Augmented Generation) and other similarity-based tasks. + +Prerequisite: Get an Embedding Model [#prerequisite-get-an-embedding-model] + +If you don't yet have an embedding model, you can download a model like `nomic-ai/nomic-embed-text-v1.5` using the following command: + +```bash +lms get nomic-ai/nomic-embed-text-v1.5 +``` + +Create Embeddings [#create-embeddings] + +To convert a string to a vector representation, pass it to the `embed` method on the corresponding embedding model handle. + +```typescript title="index.ts" +import { LMStudioClient } from "@lmstudio/sdk"; +const client = new LMStudioClient(); + +const model = await client.embedding.model("nomic-embed-text-v1.5"); + +const { embedding } = await model.embed("Hello, world!"); +``` + + + + +Models use a tokenizer to internally convert text into "tokens" they can deal with more easily. LM Studio exposes this tokenizer for utility. + +Tokenize [#tokenize] + +You can tokenize a string with a loaded LLM or embedding model using the SDK. In the below examples, `llm` can be replaced with an embedding model `emb`. + +```typescript +import { LMStudioClient } from "@lmstudio/sdk"; + +const client = new LMStudioClient(); +const model = await client.llm.model(); + +const tokens = await model.tokenize("Hello, world!"); + +console.info(tokens); // Array of token IDs. +``` + +Count tokens [#count-tokens] + +If you only care about the number of tokens, you can use the `.countTokens` method instead. + +```typescript +const tokenCount = await model.countTokens("Hello, world!"); +console.info("Token count:", tokenCount); +``` + +Example: Count Context [#example-count-context] + +You can determine if a given conversation fits into a model's context by doing the following: + +1. Convert the conversation to a string using the prompt template. +2. Count the number of tokens in the string. +3. Compare the token count to the model's context length. + +```typescript +import { Chat, type LLM, LMStudioClient } from "@lmstudio/sdk"; + +async function doesChatFitInContext(model: LLM, chat: Chat) { + // Convert the conversation to a string using the prompt template. + const formatted = await model.applyPromptTemplate(chat); + // Count the number of tokens in the string. + const tokenCount = await model.countTokens(formatted); + // Get the current loaded context length of the model + const contextLength = await model.getContextLength(); + return tokenCount < contextLength; +} + +const client = new LMStudioClient(); +const model = await client.llm.model(); + +const chat = Chat.from([ + { role: "user", content: "What is the meaning of life." }, + { role: "assistant", content: "The meaning of life is..." }, + // ... More messages +]); + +console.info("Fits in context:", await doesChatFitInContext(model, chat)); +``` + + + + + + +You can iterate through locally available models using the `listLocalModels` method. + +Available Model on the Local Machine [#available-model-on-the-local-machine] + +`listLocalModels` lives under the `system` namespace of the `LMStudioClient` object. + +```typescript +import { LMStudioClient } from "@lmstudio/sdk"; +const client = new LMStudioClient(); + +console.info(await client.system.listDownloadedModels()); +``` + +This will give you results equivalent to using [`lms ls`](../../cli/ls) in the CLI. + +Example output: [#example-output] + +```json +[ + { + "type": "llm", + "modelKey": "qwen2.5-7b-instruct", + "format": "gguf", + "displayName": "Qwen2.5 7B Instruct", + "path": "lmstudio-community/Qwen2.5-7B-Instruct-GGUF/Qwen2.5-7B-Instruct-Q4_K_M.gguf", + "sizeBytes": 4683073952, + "paramsString": "7B", + "architecture": "qwen2", + "vision": false, + "trainedForToolUse": true, + "maxContextLength": 32768 + }, + { + "type": "embedding", + "modelKey": "text-embedding-nomic-embed-text-v1.5@q4_k_m", + "format": "gguf", + "displayName": "Nomic Embed Text v1.5", + "path": "nomic-ai/nomic-embed-text-v1.5-GGUF/nomic-embed-text-v1.5.Q4_K_M.gguf", + "sizeBytes": 84106624, + "architecture": "nomic-bert", + "maxContextLength": 2048 + } +] +``` + + + + + + +You can iterate through models loaded into memory using the `listLoaded` method. This method lives under the `llm` and `embedding` namespaces of the `LMStudioClient` object. + +List Models Currently Loaded in Memory [#list-models-currently-loaded-in-memory] + +This will give you results equivalent to using [`lms ps`](../../cli/ps) in the CLI. + +```typescript +import { LMStudioClient } from "@lmstudio/sdk"; + +const client = new LMStudioClient(); + +const llmOnly = await client.llm.listLoaded(); +const embeddingOnly = await client.embedding.listLoaded(); +``` + + + + + + +AI models are huge. It can take a while to load them into memory. LM Studio's SDK allows you to precisely control this process. + +**Most commonly:** + +* Use `.model()` to get any currently loaded model +* Use `.model("model-key")` to use a specific model + +**Advanced (manual model management):** + +* Use `.load("model-key")` to load a new instance of a model +* Use `model.unload()` to unload a model from memory + +Get the Current Model with `.model()` [#get-the-current-model-with-model] + +If you already have a model loaded in LM Studio (either via the GUI or `lms load`), you can use it by calling `.model()` without any arguments. + +```typescript +import { LMStudioClient } from "@lmstudio/sdk"; +const client = new LMStudioClient(); + +const model = await client.llm.model(); +``` + +Get a Specific Model with `.model("model-key")` [#get-a-specific-model-with-modelmodel-key] + +If you want to use a specific model, you can provide the model key as an argument to `.model()`. + +Get if Loaded, or Load if not [#get-if-loaded-or-load-if-not] + +Calling `.model("model-key")` will load the model if it's not already loaded, or return the existing instance if it is. + +```typescript +import { LMStudioClient } from "@lmstudio/sdk"; +const client = new LMStudioClient(); + +const model = await client.llm.model("qwen/qwen3-4b-2507"); +``` + + + +Load a New Instance of a Model with `.load()` [#load-a-new-instance-of-a-model-with-load] + +Use `load()` to load a new instance of a model, even if one already exists. This allows you to have multiple instances of the same or different models loaded at the same time. + +```typescript +import { LMStudioClient } from "@lmstudio/sdk"; +const client = new LMStudioClient(); + +const llama = await client.llm.load("qwen/qwen3-4b-2507"); +const another_llama = await client.llm.load("qwen/qwen3-4b-2507", { + identifier: "second-llama" +}); +``` + + + +Note about Instance Identifiers [#note-about-instance-identifiers] + +If you provide an instance identifier that already exists, the server will throw an error. +So if you don't really care, it's safer to not provide an identifier, in which case +the server will generate one for you. You can always check in the server tab in LM Studio, too! + +Unload a Model from Memory with `.unload()` [#unload-a-model-from-memory-with-unload] + +Once you no longer need a model, you can unload it by simply calling `unload()` on its handle. + +```typescript +import { LMStudioClient } from "@lmstudio/sdk"; + +const client = new LMStudioClient(); + +const model = await client.llm.model(); +await model.unload(); +``` + +Set Custom Load Config Parameters [#set-custom-load-config-parameters] + +You can also specify the same load-time configuration options when loading a model, such as Context Length and GPU offload. + +See [load-time configuration](../llm-prediction/parameters) for more. + +Set an Auto Unload Timer (TTL) [#set-an-auto-unload-timer-ttl] + +You can specify a *time to live* for a model you load, which is the idle time (in seconds) +after the last request until the model unloads. See [Idle TTL](/docs/api/ttl-and-auto-evict) for more on this. + + + + + Using .load + + + + Using .model + + + + + ```typescript + import { LMStudioClient } from "@lmstudio/sdk"; + + const client = new LMStudioClient(); + + const model = await client.llm.load("qwen/qwen3-4b-2507", { + ttl: 300, // 300 seconds + }); + ``` + + + + ```typescript + import { LMStudioClient } from "@lmstudio/sdk"; + + const client = new LMStudioClient(); + + const model = await client.llm.model("qwen/qwen3-4b-2507", { + // Note: specifying ttl in `.model` will only set the TTL for the model if the model is + // loaded from this call. If the model was already loaded, the TTL will not be updated. + ttl: 300, // 300 seconds + }); + ``` + + + + + + +Parameters [#parameters] + + + + + + +Fields [#fields] + + + + + + +LLMs and embedding models, due to their fundamental architecture, have a property called `context length`, and more specifically a **maximum** context length. Loosely speaking, this is how many tokens the models can "keep in memory" when generating text or embeddings. Exceeding this limit will result in the model behaving erratically. + +Use the `getContextLength()` Function on the Model Object [#use-the-getcontextlength-function-on-the-model-object] + +It's useful to be able to check the context length of a model, especially as an extra check before providing potentially long input to the model. + +```typescript title="index.ts" +const contextLength = await model.getContextLength(); +``` + +The `model` in the above code snippet is an instance of a loaded model you get from the `llm.model` method. See [Manage Models in Memory](../manage-models/loading) for more information. + +Example: Check if the input will fit in the model's context window [#example-check-if-the-input-will-fit-in-the-models-context-window] + +You can determine if a given conversation fits into a model's context by doing the following: + +1. Convert the conversation to a string using the prompt template. +2. Count the number of tokens in the string. +3. Compare the token count to the model's context length. + +```typescript +import { Chat, type LLM, LMStudioClient } from "@lmstudio/sdk"; + +async function doesChatFitInContext(model: LLM, chat: Chat) { + // Convert the conversation to a string using the prompt template. + const formatted = await model.applyPromptTemplate(chat); + // Count the number of tokens in the string. + const tokenCount = await model.countTokens(formatted); + // Get the current loaded context length of the model + const contextLength = await model.getContextLength(); + return tokenCount < contextLength; +} + +const client = new LMStudioClient(); +const model = await client.llm.model(); + +const chat = Chat.from([ + { role: "user", content: "What is the meaning of life." }, + { role: "assistant", content: "The meaning of life is..." }, + // ... More messages +]); + +console.info("Fits in context:", await doesChatFitInContext(model, chat)); +``` + + + + +You can access information about a loaded model using the `getInfo` method. + + + + + LLM + + + + Embedding Model + + + + + ```typescript + import { LMStudioClient } from "@lmstudio/sdk"; + + const client = new LMStudioClient(); + const model = await client.llm.model(); + + const modelInfo = await model.getInfo(); + + console.info("Model Key", modelInfo.modelKey); + console.info("Current Context Length", model.contextLength); + console.info("Model Trained for Tool Use", modelInfo.trainedForToolUse); + // etc. + ``` + + + + ```typescript + import { LMStudioClient } from "@lmstudio/sdk"; + + const client = new LMStudioClient(); + const model = await client.embedding.model(); + + const modelInfo = await model.getInfo(); + + console.info("Model Key", modelInfo.modelKey); + console.info("Current Context Length", modelInfo.contextLength); + // etc. + ``` + + + + + + +You can serve local LLMs from LM Studio's Developer tab, either on `localhost` or on the network. + +LM Studio's APIs can be used through [REST API](/docs/developer/rest), client libraries like [lmstudio-js](/docs/typescript) and [lmstudio-python](/docs/python), and compatibility endpoints like [OpenAI-compatible](/docs/developer/openai-compat) and [Anthropic-compatible](/docs/developer/anthropic-compat). + + + +Running the server [#running-the-server] + +To run the server, go to the Developer tab in LM Studio, and toggle the "Start server" switch to start the API server. + + + +Alternatively, you can use `lms` ([LM Studio's CLI](/docs/cli)) to start the server from your terminal: + +```bash +lms server start +``` + +API options [#api-options] + +* [LM Studio REST API](/docs/developer/rest) +* [TypeScript SDK](/docs/typescript) - `lmstudio-js` +* [Python SDK](/docs/python) - `lmstudio-python` +* [OpenAI-compatible endpoints](/docs/developer/openai-compat) +* [Anthropic-compatible endpoints](/docs/developer/anthropic-compat) + + + + +Enabling the "Serve on Local Network" option allows the LM Studio API server running on your machine to be accessible by other devices connected to the same local network. + +This is useful for scenarios where you want to: + +* Use a local LLM on your other less powerful devices by connecting them to a more powerful machine running LM Studio. +* Let multiple people use a single LM Studio instance on the network. +* Use the API from IoT devices, edge computing units, or other services in your local setup. + +Once enabled, the server will bind to your local network IP address instead of localhost. The API access URL will be updated accordingly which you can use in your applications. + + + + + + +You can configure server settings, such as the port number, whether to allow other API clients to access the server and MCP features. + + + +Settings information [#settings-information] + + + + + + +You can access custom configurations via `ctl.getPluginConfig` and `ctl.getGlobalPluginConfig`. See [Custom Configurations](./configurations) for more details. + +The following is an example of how you can make the `specialInstructions` and `triggerWord` configurable: + +First, add the config field to `config.ts`: + +```typescript title="src/config.ts" +import { createConfigSchematics } from "@lmstudio/sdk"; +export const configSchematics = createConfigSchematics() + .field( + "specialInstructions", + "string", + { + displayName: "Special Instructions", + subtitle: "Special instructions to be injected when the trigger word is found.", + }, + "Here is some default special instructions.", + ) + .field( + "triggerWord", + "string", + { + displayName: "Trigger Word", + subtitle: "The word that will trigger the special instructions.", + }, + "@init", + ) + .build(); +``` + + + In this example, we added the field to `configSchematics`, which is the "per-chat" configuration. If you want to add a global configuration field that is shared across different chats, you should add it under the section `globalConfigSchematics` in the same file. + + Learn more about configurations in [Custom Configurations](../plugins/configurations). + + +Then, modify the prompt preprocessor to use the configuration: + +```typescript title="src/promptPreprocessor.ts" +import { type PromptPreprocessorController, type ChatMessage } from "@lmstudio/sdk"; +import { configSchematics } from "./config"; + +export async function preprocess(ctl: PromptPreprocessorController, userMessage: ChatMessage) { + const textContent = userMessage.getText(); + const pluginConfig = ctl.getPluginConfig(configSchematics); + + const triggerWord = pluginConfig.get("triggerWord"); + const specialInstructions = pluginConfig.get("specialInstructions"); + + const transformed = textContent.replaceAll(triggerWord, specialInstructions); + return transformed; +} +``` + + + + +Depending on the task, the prompt preprocessor may take some time to complete, for example, it may need to fetch some data from the internet or perform some heavy computation. In such cases, you can report the status of the preprocessing using `ctl.setStatus`. + +```typescript title="src/promptPreprocessor.ts" +const status = ctl.createStatus({ + status: "loading", + text: "Preprocessing.", +}); +``` + +You can update the status at any time by calling `status.setState`. + +```typescript title="src/promptPreprocessor.ts" +status.setState({ + status: "done", + text: "Preprocessing done.", +}) +``` + +You can even add sub status to the status: + +```typescript title="src/promptPreprocessor.ts" +const subStatus = status.addSubStatus({ + status: "loading", + text: "I am a sub status." +}); +``` + + + + +Example: Inject Current Time [#example-inject-current-time] + +The following is an example preprocessor that injects the current time before each user message. + +```typescript title="src/promptPreprocessor.ts" +import { type PromptPreprocessorController, type ChatMessage } from "@lmstudio/sdk"; +export async function preprocess(ctl: PromptPreprocessorController, userMessage: ChatMessage) { + const textContent = userMessage.getText(); + const transformed = `Current time: ${new Date().toString()}\n\n${textContent}`; + return transformed; +} +``` + +Example: Replace Trigger Words [#example-replace-trigger-words] + +Another example you can do it with simple text only processing is by replacing certain trigger words. For example, you can replace a `@init` trigger with a special initialization message. + +```typescript title="src/promptPreprocessor.ts" +import { type PromptPreprocessorController, type ChatMessage, text } from "@lmstudio/sdk"; + +const mySpecialInstructions = text` + Here are some special instructions... +`; + +export async function preprocess(ctl: PromptPreprocessorController, userMessage: ChatMessage) { + const textContent = userMessage.getText(); + const transformed = textContent.replaceAll("@init", mySpecialInstructions); + return transformed; +} +``` + + + + +A prediction may be aborted by the user while your generator is still running. In such cases, you should handle the abort gracefully by handling the `ctl.abortSignal`. + +You can learn more about `AbortSignal` in the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal). + + + + +Prompt Preprocessor is a function that is called upon the user hitting the "Send" button. It receives the user input and can modify it before it reaches the model. If multiple prompt preprocessors are registered, they will be chained together, with each one receiving the output of the previous one. + +The modified result will be saved in the chat history, meaning that even if your plugin is disabled afterwards, the modified input will still be used. + +Prompt preprocessors will only be triggered for the current user input. It will not be triggered for previous messages in the chat history even if they were not preprocessed. + +Prompt preprocessors takes in a `ctl` object for controlling the preprocessing and a `userMessage` it needs to preprocess. It returns either a string or a message object which will replace the user message. + +Examples [#examples] + +The following are some plugins that make use of prompt preprocessors: + +* [lmstudio/rag-v1](https://lmstudio.ai/lmstudio/rag-v1) + + Retrieval Augmented Generation (RAG) for LM Studio. This is the plugin that gives document handling capabilities to LM Studio. + + + + +You can add custom configuration options to your tools provider, so the user of plugin can customize the behavior without modifying the code. + +In the example below, we will ask the user to specify a folder name, and we will create files inside that folder within the working directory. + +First, add the config field to `config.ts`: + +```typescript title="src/config.ts" +export const configSchematics = createConfigSchematics() + .field( + "folderName", // Key of the configuration field + "string", // Type of the configuration field + { + displayName: "Folder Name", + subtitle: "The name of the folder where files will be created.", + }, + "default_folder", // Default value + ) + .build(); +``` + + + In this example, we added the field to `configSchematics`, which is the "per-chat" configuration. If you want to add a global configuration field that is shared across different chats, you should add it under the section `globalConfigSchematics` in the same file. + + Learn more about configurations in [Custom Configurations](../plugins/configurations). + + +Then, modify the tools provider to use the configuration value: + +```typescript title="src/toolsProvider.ts" +import { tool, Tool, ToolsProviderController } from "@lmstudio/sdk"; +import { existsSync } from "fs"; +import { mkdir, writeFile } from "fs/promises"; +import { join } from "path"; +import { z } from "zod"; +import { configSchematics } from "./config"; + +export async function toolsProvider(ctl: ToolsProviderController) { + const tools: Tool[] = []; + + const createFileTool = tool({ + name: `create_file`, + description: "Create a file with the given name and content.", + parameters: { file_name: z.string(), content: z.string() }, + implementation: async ({ file_name, content }) => { + // Read the config field + const folderName = ctl.getPluginConfig(configSchematics).get("folderName"); + const folderPath = join(ctl.getWorkingDirectory(), folderName); + + // Ensure the folder exists + await mkdir(folderPath, { recursive: true }); + + // Create the file + const filePath = join(folderPath, file_name); + if (existsSync(filePath)) { + return "Error: File already exists."; + } + await writeFile(filePath, content, "utf-8"); + return "File created."; + }, + }); + tools.push(createFileTool); // First tool + + return tools; // Return the tools array +} +``` + + + + +A prediction may be aborted by the user while your tool is still running. In such cases, you should handle the abort gracefully by handling the `AbortSignal` object passed as the second parameter to the tool's implementation function. + +```typescript title="src/toolsProvider.ts" +import { tool, Tool, ToolsProviderController } from "@lmstudio/sdk"; +import { z } from "zod"; + +export async function toolsProvider(ctl: ToolsProviderController) { + const tools: Tool[] = []; + + const fetchTool = tool({ + name: `fetch`, + description: "Fetch a URL using GET method.", + parameters: { url: z.string() }, + implementation: async ({ url }, { signal }) => { + const response = await fetch(url, { + method: "GET", + signal, // <-- Here, we pass the signal to fetch to allow cancellation + }); + if (!response.ok) { + return `Error: Failed to fetch ${url}: ${response.statusText}`; + } + const data = await response.text(); + return { + status: response.status, + headers: Object.fromEntries(response.headers.entries()), + data: data.substring(0, 1000), // Limit to 1000 characters + }; + }, + }); + tools.push(fetchTool); + + return tools; +} +``` + +You can learn more about `AbortSignal` in the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal). + + + + +Tools provider is a function that returns an array of tools that the model can use during generation. + +Examples [#examples] + +The following are some plugins that make use of tools providers: + +* [lmstudio/wikipedia](https://lmstudio.ai/lmstudio/wikipedia) + + Gives the LLM tools to search and read Wikipedia articles. + +* [lmstudio/js-code-sandbox](https://lmstudio.ai/lmstudio/js-code-sandbox) + + Gives the LLM tools to run JavaScript/TypeScript code in a sandbox environment using [deno](https://deno.com/). + +* [lmstudio/dice](https://lmstudio.ai/lmstudio/dice) + + Allows the LLM to generate random numbers using "dice". + + + + +A tools provider can define multiple tools for the model to use. Simply create additional tool instances and add them to the tools array. + +In the example below, we add a second tool to read the content of a file: + +```typescript title="src/toolsProvider.ts" +import { tool, Tool, ToolsProviderController } from "@lmstudio/sdk"; +import { z } from "zod"; +import { existsSync } from "fs"; +import { readFile, writeFile } from "fs/promises"; +import { join } from "path"; + +export async function toolsProvider(ctl: ToolsProviderController) { + const tools: Tool[] = []; + + const createFileTool = tool({ + name: `create_file`, + description: "Create a file with the given name and content.", + parameters: { file_name: z.string(), content: z.string() }, + implementation: async ({ file_name, content }) => { + const filePath = join(ctl.getWorkingDirectory(), file_name); + if (existsSync(filePath)) { + return "Error: File already exists."; + } + await writeFile(filePath, content, "utf-8"); + return "File created."; + }, + }); + tools.push(createFileTool); // First tool + + const readFileTool = tool({ + name: `read_file`, + description: "Read the content of a file with the given name.", + parameters: { file_name: z.string() }, + implementation: async ({ file_name }) => { + const filePath = join(ctl.getWorkingDirectory(), file_name); + if (!existsSync(filePath)) { + return "Error: File does not exist."; + } + const content = await readFile(filePath, "utf-8"); + return content; + }, + }); + tools.push(readFileTool); // Second tool + + return tools; // Return the tools array +} +``` + + + + +To setup a tools provider, first create the a file `toolsProvider.ts` in your plugin's `src` directory: + +```typescript title="src/toolsProvider.ts" +import { tool, Tool, ToolsProviderController } from "@lmstudio/sdk"; +import { z } from "zod"; +import { existsSync } from "fs"; +import { writeFile } from "fs/promises"; +import { join } from "path"; + +export async function toolsProvider(ctl: ToolsProviderController) { + const tools: Tool[] = []; + + const createFileTool = tool({ + // Name of the tool, this will be passed to the model. Aim for concise, descriptive names + name: `create_file`, + // Your description here, more details will help the model to understand when to use the tool + description: "Create a file with the given name and content.", + parameters: { file_name: z.string(), content: z.string() }, + implementation: async ({ file_name, content }) => { + const filePath = join(ctl.getWorkingDirectory(), file_name); + if (existsSync(filePath)) { + return "Error: File already exists."; + } + await writeFile(filePath, content, "utf-8"); + return "File created."; + }, + }); + tools.push(createFileTool); + + return tools; +} +``` + +The above tools provider defines a single tool called `create_file` that allows the model to create a file with a specified name and content inside the working directory. You can learn more about defining tools in [Tool Definition](../agent/tools). + +Then register the tools provider in your plugin's `index.ts`: + +```typescript title="src/index.ts" +// ... other imports ... +import { toolsProvider } from "./toolsProvider"; + +export async function main(context: PluginContext) { + // ... other plugin setup code ... + + // Register the tools provider. + context.withToolsProvider(toolsProvider); // <-- Register the tools provider + + // ... other plugin setup code ... +} +``` + +Now, you can try to ask the LLM to create a file, and it should be able to do so using the tool you just created. + +Tips [#tips] + +* **Use Descriptive Names and Descriptions**: When defining tools, use descriptive names and detailed descriptions. This helps the model understand when and how to use each tool effectively. +* **Return Errors as Strings**: Sometimes, the model may make a mistake when calling a tool. In such cases, you can return an error message as a string. In most cases, the model will try to correct itself and call the tool again with the correct parameters. + + + + +Sometimes, a tool may take a long time to execute. In such cases, it will be helpful to provide status updates, so the user knows what is happening. In order times, you may want to warn the user about potential issues. + +You can use `status` and `warn` methods on the second parameter of the tool's implementation function to send status updates and warnings. + +The following example shows how to implement a tool that waits for a specified number of seconds, providing status updates and warnings if the wait time exceeds 10 seconds: + +```typescript title="src/toolsProvider.ts" +import { tool, Tool, ToolsProviderController } from "@lmstudio/sdk"; +import { z } from "zod"; + +export async function toolsProvider(ctl: ToolsProviderController) { + const tools: Tool[] = []; + + const waitTool = tool({ + name: `wait`, + description: "Wait for a specified number of seconds.", + parameters: { seconds: z.number().min(1) }, + implementation: async ({ seconds }, { status, warn }) => { + if (seconds > 10) { + warn("The model asks to wait for more than 10 seconds."); + } + for (let i = 0; i < seconds; i++) { + status(`Waiting... ${i + 1}/${seconds} seconds`); + await new Promise((resolve) => setTimeout(resolve, 1000)); + } + }, + }); + tools.push(waitTool); + + return tools; // Return the tools array +} +``` + +Note status updates and warnings are only visible to the user. If you want the model to also see those messages, you should return them as part of the tool's return value. + +Handling Aborts [#handling-aborts] + +A prediction may be aborted by the user while your tool is still running. In such cases, you should handle the abort gracefully by handling the `AbortSignal` object passed as the second parameter to the tool's implementation function. + +```typescript title="src/toolsProvider.ts" +import { tool, Tool, ToolsProviderController } from "@lmstudio/sdk"; +import { z } from "zod"; + +export async function toolsProvider(ctl: ToolsProviderController) { + const tools: Tool[] = []; + + const fetchTool = tool({ + name: `fetch`, + description: "Fetch a URL using GET method.", + parameters: { url: z.string() }, + implementation: async ({ url }, { signal }) => { + const response = await fetch(url, { + method: "GET", + signal, // <-- Here, we pass the signal to fetch to allow cancellation + }); + if (!response.ok) { + return `Error: Failed to fetch ${url}: ${response.statusText}`; + } + const data = await response.text(); + return { + status: response.status, + headers: Object.fromEntries(response.headers.entries()), + data: data.substring(0, 1000), // Limit to 1000 characters + }; + }, + }); + tools.push(fetchTool); + + return tools; +} +``` + +You can learn more about `AbortSignal` in the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal). + + + + +Generators are replacement for local LLMs. They act like a token source. When a plugin with a generator is used, LM Studio will no longer use the local model to generate text. The generator will be used instead. + +Generators are useful for implementing adapters for external models, such as using a remote LM Studio instance or other online models. + +If a plugin contains a generator, it will no longer show up in the plugins list. Instead, it will show up in the model dropdown and act as a model. If your plugins contains [Tools Provider](./tools-providers.md) or [Prompt Preprocessor](./prompt-preprocessors.md), they will be used when your generator is being selected. + +Examples [#examples] + +The following are some plugins that make use of generators: + +* [lmstudio/remote-lmstudio](https://lmstudio.ai/lmstudio/remote-lmstudio) + + Basic support for using a remote LM Studio instance to generate text. + +* [lmstudio/openai-compat-endpoint](https://lmstudio.ai/lmstudio/openai-compat-endpoint) + + Use any OpenAI-compatible API in LM Studio. + + + + +Generators take in the the generator controller and the current conversation state, start the generation, and then report the generated text using the `ctl.fragmentGenerated` method. + +The following is an example of a simple generator that echos back the last user message with 200 ms delay between each word: + +```typescript title="src/toolsProvider.ts" +import { Chat, GeneratorController } from "@lmstudio/sdk"; + +export async function generate(ctl: GeneratorController, chat: Chat) { + // Just echo back the last message + const lastMessage = chat.at(-1).getText(); + // Split the last message into words + const words = lastMessage.split(/(?= )/); + for (const word of words) { + ctl.fragmentGenerated(word); // Send each word as a fragment + ctl.abortSignal.throwIfAborted(); // Allow for cancellation + await new Promise((resolve) => setTimeout(resolve, 200)); // Simulate some processing time + } +} +``` + +Custom Configurations [#custom-configurations] + +You can access custom configurations via `ctl.getPluginConfig` and `ctl.getGlobalPluginConfig`. See [Custom Configurations](./configurations) for more details. + +Handling Aborts [#handling-aborts] + +A prediction may be aborted by the user while your generator is still running. In such cases, you should handle the abort gracefully by handling the `ctl.abortSignal`. + +You can learn more about `AbortSignal` in the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal). + + + + +To enable tool use, it is slightly more involved. To see a comprehensive example that adapts OpenAI API, see the [openai-compat-endpoint plugin](https://lmstudio.ai/lmstudio/openai-compat-endpoint). + +You can read the definition of tools available using `ctl.getToolDefinitions()`. For example, if you are making an online model adapter, you need to pass the tool definition to the model. + +Once the model starts to make tool calls, you need to tell LM Studio about those calls. + +Use `ctl.toolCallGenerationStarted` to report the start of a tool call generation (i.e. the model starts to generate a tool call). + +Use `ctl.toolCallGenerationEnded` to report a successful generation of a tool call or use `ctl.toolCallGenerationFailed` to report a failed generation of a tool call. + +Optionally, you can also `ctl.toolCallGenerationNameReceived` to eagerly report the name of the tool being called once that is available. You can also use `ctl.toolCallGenerationArgumentFragmentGenerated` to report fragments of the tool call arguments as they are generated. These two methods are useful for providing better user experience, but are not strictly necessary. + +Overall, your generator must call these ctl methods in the following order: + +1. 0 - N calls to `ctl.fragmentGenerated` to report the generated non-tool-call text fragments. +2. For each tool call: + 1. Call `ctl.toolCallGenerationStarted` to indicate the start of a tool call generation. + 2. (Optionally) Call `ctl.toolCallGenerationNameReceived` to report the name of the tool being called. + 3. (Optionally) Call any times of `ctl.toolCallGenerationArgumentFragmentGenerated` to report the generated fragments of the tool call arguments. + 4. Call either `ctl.toolCallGenerationEnded` to report a successful generation of the tool call or `ctl.toolCallGenerationFailed` to report a failed generation of the tool call. + 5. If the model generates more text between/after the tool call, 0 - N calls to `ctl.fragmentGenerated` to report the generated non-tool-call text fragments. (This should not happen normally, but it is technically possible for some smaller models to do this. **Critically: this is not the same as model receiving the tool results and continuing the conversation. This is just model refusing to stop talking after made a tool request - the tool result is not available to the model yet.** When multi-round prediction happens, i.e. the model actually receives the tool call, your generator function will be called again with the updated conversation state.) + +Some API formats may report the tool name together with the beginning of the tool call generation, in which case you can call `ctl.toolCallGenerationNameReceived` immediately after `ctl.toolCallGenerationStarted`. + +Some API formats may not have incremental tool call updates (i.e. the entire tool call request is given at once), in which case you can just call `ctl.toolCallGenerationStarted` then immediately `ctl.toolCallGenerationEnded`. + + + + +To share publish your LM Studio plugin, open the plugin directory in a terminal and run: + +```bash +lms push +``` + +This command will package your plugin and upload it to the LM Studio Hub. You can use this command to create new plugins or update existing ones. + +Changing Plugin Names [#changing-plugin-names] + +If you wish to change the name of the plugin, you can do so by editing the `manifest.json` file in the root of your plugin directory. Look for the `name` field and update it to your desired plugin name. Note the `name` must be kebab-case. + +When you `lms push` the plugin, it will be treated as a new plugin if the name has changed. You can delete the old plugin from the LM Studio Hub if you no longer need it. + +Publishing Plugins to an Organization [#publishing-plugins-to-an-organization] + +If you are in an organization and wish to publish the plugin to the organization, you can do so by editing the `manifest.json` file in the root of your plugin directory. Look for the `owner` field and set it to the name of your organization. When you run `lms push`, the plugin will be published to the organization instead of your personal account. + +Private Plugins [#private-plugins] + +If your account supports private plugins, you can publish your plugins privately by using the `--private` flag when running `lms push`: + +```bash +lms push --private +``` + +Private artifact is in test. Get in touch if you are interested. + + + + +You can access the configuration using the method `ctl.getPluginConfig(configSchematics)` and `ctl.getGlobalConfig(globalConfigSchematics)` respectively. + +For example, here is how to access the config within the promptPreprocessor: + +```typescript title="src/promptPreprocessor.ts" +import { type PreprocessorController, type ChatMessage } from "@lmstudio/sdk"; +import { configSchematics } from "./config"; + +export async function preprocess(ctl: PreprocessorController, userMessage: ChatMessage) { + const pluginConfig = ctl.getPluginConfig(configSchematics); + const myCustomField = pluginConfig.get("myCustomField"); + + const globalPluginConfig = ctl.getGlobalPluginConfig(configSchematics); + const globalMyCustomField = globalPluginConfig.get("myCustomField"); + + return ( + `${userMessage.getText()},` + + `myCustomField: ${myCustomField}, ` + + `globalMyCustomField: ${globalMyCustomField}` + ); +} +``` + + + + +By default, the plugin scaffold will create a `config.ts` file in the `src/` directory which will contain the schematics of the configurations. If the files does not exist, you can create it manually: + +```typescript title="src/toolsProvider.ts" +import { createConfigSchematics } from "@lmstudio/sdk"; + +export const configSchematics = createConfigSchematics() + .field( + "myCustomField", // The key of the field. + "numeric", // Type of the field. + // Options for the field. Different field types will have different options. + { + displayName: "My Custom Field", + hint: "This is my custom field. Doesn't do anything special.", + slider: { min: 0, max: 100, step: 1 }, // Add a slider to the field. + }, + 80, // Default Value + ) + // You can add more fields by chaining the field method. + // For example: + // .field("anotherField", ...) + .build(); + +export const globalConfigSchematics = createConfigSchematics() + .field( + "myGlobalCustomField", // The key of the field. + "string", + { + displayName: "My Global Custom Field", + hint: "This is my global custom field. Doesn't do anything special.", + }, + "default value", // Default Value + ) + // You can add more fields by chaining the field method. + // For example: + // .field("anotherGlobalField", ...) + .build(); +``` + +If you've added your config schematics manual, you will also need to register the configurations in your plugin's `index.ts` file. + +This is done by calling `context.withConfigSchematics(configSchematics)` and `context.withGlobalConfigSchematics(globalConfigSchematics)` in the `main` function of your plugin. + +```typescript title="src/index.ts" +// ... other imports ... +import { toolsProvider } from "./toolsProvider"; + +export async function main(context: PluginContext) { + // ... other plugin setup code ... + + // Register the configuration schematics. + context.withConfigSchematics(configSchematics); + // Register the global configuration schematics. + context.withGlobalConfigSchematics(globalConfigSchematics); + + // ... other plugin setup code ... +} +``` + + + + +We support the following field types: + +* `string`: A text input field. + + ```typescript + // ... other fields ... + .field( + "stringField", // The key of the field. + "string", // Type of the field. + { + displayName: "A string field", + subtitle: "Subtitle", // Optional subtitle for the field. (Show below the field) + hint: "Hint", // Optional hint for the field. (Show on hover) + isParagraph: false, // Whether to show a large text input area for this field. + isProtected: false, // Whether the value should be obscured in the UI (e.g., for passwords). + placeholder: "Placeholder text", // Optional placeholder text for the field. + }, + "default value", // Default Value + ) + // ... other fields ... + ``` + +* `numeric`: A number input field with optional validation and slider UI. + + ```typescript + // ... other fields ... + .field( + "numberField", // The key of the field. + "numeric", // Type of the field. + { + displayName: "A number field", + subtitle: "Subtitle for", // Optional subtitle for the field. (Show below the field) + hint: "Hint for number field", // Optional hint for the field. (Show on hover) + int: false, // Whether the field should accept only integer values. + min: 0, // Minimum value for the field. + max: 100, // Maximum value for the field. + slider: { + // If present, configurations for the slider UI + min: 0, // Minimum value for the slider. + max: 100, // Maximum value for the slider. + step: 1, // Step value for the slider. + }, + }, + 42, // Default Value + ) + // ... other fields ... + ``` + +* `boolean`: A checkbox or toggle input field. + + ```typescript + // ... other fields ... + .field( + "booleanField", // The key of the field. + "boolean", // Type of the field. + { + displayName: "A boolean field", + subtitle: "Subtitle", // Optional subtitle for the field. (Show below the field) + hint: "Hint", // Optional hint for the field. (Show on hover) + }, + true, // Default Value + ) + // ... other fields ... + ``` + +* `stringArray`: An array of string values with configurable constraints. + + ```typescript + // ... other fields ... + .field( + "stringArrayField", + "stringArray", + { + displayName: "A string array field", + subtitle: "Subtitle", // Optional subtitle for the field. (Show below the field) + hint: "Hint", // Optional hint for the field. (Show on hover) + allowEmptyStrings: true, // Whether to allow empty strings in the array. + maxNumItems: 5, // Maximum number of items in the array. + }, + ["default", "values"], // Default Value + ) + // ... other fields ... + ``` + +* `select`: A dropdown selection field with predefined options. + + ```typescript + // ... other fields ... + .field( + "selectField", + "select", + { + displayName: "A select field", + options: [ + { value: "option1", displayName: "Option 1" }, + { value: "option2", displayName: "Option 2" }, + { value: "option3", displayName: "Option 3" }, + ], + subtitle: "Subtitle", // Optional subtitle for the field. (Show below the field) + hint: "Hint", // Optional hint for the field. (Show on hover) + }, + "option1", // Default Value + ) + // ... other fields ... + ``` + + + + +LM Studio plugins support custom configurations. That is, you can define a configuration schema and LM Studio will present a UI to the user so they can configure your plugin without having to edit any code. + +There are two types of configurations: + +* **Per-chat configuration**: tied to a specific chat. Different chats can have different configurations. Most configurations that affects the behavior of the plugin should be of this type. +* **Global configuration**: apply to *all* chats and are shared across the application. This is useful for global settings such as API keys. + +Types of Configurations [#types-of-configurations] + +You can define configurations in TypeScript using the `createConfigSchematics` function from the `@lmstudio/sdk` package. This function allows you to define fields with various types and options. + +Supported types include: + +* `string`: A text input field. +* `numeric`: A number input field with optional validation and slider UI. +* `boolean`: A checkbox or toggle input field. +* `stringArray`: An array of string values with configurable constraints. +* `select`: A dropdown selection field with predefined options. + +See the [Defining New Fields](./custom-configuration/defining-new-fields) section for more details on how to define these fields. + +Examples [#examples] + +The following are some plugins that make use of custom configurations + +* [lmstudio/wikipedia](https://lmstudio.ai/lmstudio/wikipedia) + + Gives the LLM tools to search and read Wikipedia articles. + +* [lmstudio/openai-compat-endpoint](https://lmstudio.ai/lmstudio/openai-compat-endpoint) + + Use any OpenAI-compatible API in LM Studio. From d01796b4aae6690d20166ff6911f4d0728f05c07 Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 10 May 2026 18:41:41 +0100 Subject: [PATCH 27/30] Update and rename lmstudio.ai/llms-full (6).txt to webllms/docs/cli/local-models/load.rst --- .../llms-full (6).txt => webllms/docs/cli/local-models/load.rst | 1 - 1 file changed, 1 deletion(-) rename lmstudio.ai/llms-full (6).txt => webllms/docs/cli/local-models/load.rst (99%) diff --git a/lmstudio.ai/llms-full (6).txt b/webllms/docs/cli/local-models/load.rst similarity index 99% rename from lmstudio.ai/llms-full (6).txt rename to webllms/docs/cli/local-models/load.rst index 986ddab..c985b21 100644 --- a/lmstudio.ai/llms-full (6).txt +++ b/webllms/docs/cli/local-models/load.rst @@ -1,5 +1,4 @@ - *** LM Studio 0.4.1 [#lm-studio-041] From 59f8ea361a8e06a4ba4e151343410fa077ade9d0 Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 10 May 2026 18:43:57 +0100 Subject: [PATCH 28/30] Update and rename webllms/docs/cli/local-models/load.rst to webllms/docs/cli/local-models/load/Model.gguf --- webllms/docs/cli/local-models/load.rst | 14492 ---------------- webllms/docs/cli/local-models/load/Model.gguf | 1 + 2 files changed, 1 insertion(+), 14492 deletions(-) delete mode 100644 webllms/docs/cli/local-models/load.rst create mode 100644 webllms/docs/cli/local-models/load/Model.gguf diff --git a/webllms/docs/cli/local-models/load.rst b/webllms/docs/cli/local-models/load.rst deleted file mode 100644 index c985b21..0000000 --- a/webllms/docs/cli/local-models/load.rst +++ /dev/null @@ -1,14492 +0,0 @@ - -*** - -LM Studio 0.4.1 [#lm-studio-041] - -Anthropic-compatible API [#anthropic-compatible-api] - -* New Anthropic-compatible endpoint: `POST /v1/messages`. - * Use Claude code models with LM Studio - * See docs for more details: [/docs/developer/anthropic-compat](/docs/developer/anthropic-compat). - -*** - -LM Studio 0.4.0 [#lm-studio-040] - -LM Studio native v1 REST API [#lm-studio-native-v1-rest-api] - -* Official release of LM Studio's native v1 REST API at `/api/v1/*` endpoints. - * [MCP via API](/docs/developer/core/mcp) - * [Stateful chats](/docs/developer/rest/stateful-chats) - * [Authentication](/docs/developer/core/authentication) configuration with API tokens - * Model [download](/docs/developer/rest/download), [load](/docs/developer/rest/load) and [unload](/docs/developer/rest/unload) endpoints - * See [overview](/docs/developer/rest) page for more details and [comparison](/docs/developer/rest#inference-endpoint-comparison) with OpenAI-compatible endpoints. - -*** - -LM Studio 0.3.29 • 2025‑10‑06 [#lm-studio-0329-20251006] - -OpenAI `/v1/responses` and variant listing [#openai-v1responses-and-variant-listing] - -* New OpenAI‑compatible endpoint: `POST /v1/responses`. - * Stateful interactions via `previous_response_id`. - * Custom tool calling and Remote MCP support (opt‑in). - * Reasoning support with `reasoning.effort` for `openai/gpt‑oss‑20b`. - * Streaming via SSE when `stream: true`. -* CLI: `lms ls --variants` lists all variants for multi‑variant models. -* Docs: [/docs/developer/openai-compat](/docs/developer/openai-compat). Full release notes: [/blog/lmstudio-v0.3.29](/blog/lmstudio-v0.3.29). - -*** - -LM Studio 0.3.27 • 2025‑09‑24 [#lm-studio-0327-20250924] - -CLI: model resource estimates, status, and interrupts [#cli-model-resource-estimates-status-and-interrupts] - -* New: `lms load --estimate-only ` prints estimated GPU and total memory before loading. Honors `--context-length` and `--gpu`, and uses an improved estimator that now accounts for flash attention and vision models. -* `lms chat`: press `Ctrl+C` to interrupt an ongoing prediction. -* `lms ps --json` now reports each model's generation status and the number of queued prediction requests. -* CLI color contrast improved for light mode. -* See docs: [/docs/cli/local-models/load](/docs/cli/local-models/load). Full release notes: [/blog/lmstudio-v0.3.27](/blog/lmstudio-v0.3.27). - -*** - -LM Studio 0.3.26 • 2025‑09‑15 [#lm-studio-0326-20250915] - -CLI log streaming: server + model [#cli-log-streaming-server--model] - -* `lms log stream` now supports multiple sources and filters. - * `--source server` streams HTTP server logs (startup, endpoints, status) - * `--source model --filter input,output` streams formatted user input and model output - * Append `--json` for machine‑readable logs; `--stats` adds tokens/sec and related metrics (model source) -* See usage and examples: [/docs/cli/serve/log-stream](/docs/cli/serve/log-stream). Full release notes: [/blog/lmstudio-v0.3.26](/blog/lmstudio-v0.3.26). - -*** - -LM Studio 0.3.25 • 2025‑09‑04 [#lm-studio-0325-20250904] - -New model support (API) [#new-model-support-api] - -* Added support for NVIDIA Nemotron‑Nano‑v2 with tool‑calling via the OpenAI‑compatible endpoints [‡](/blog/lmstudio-v0.3.25). -* Added support for Google EmbeddingGemma for the `/v1/embeddings` endpoint [‡](/blog/lmstudio-v0.3.25). - -*** - -LM Studio 0.3.24 • 2025‑08‑28 [#lm-studio-0324-20250828] - -Seed‑OSS tool‑calling and template fixes [#seedoss-toolcalling-and-template-fixes] - -* Added support for ByteDance/Seed‑OSS including tool‑calling and prompt‑template compatibility fixes in the OpenAI‑compatible API [‡](/blog/lmstudio-v0.3.24). -* Fixed cases where tool calls were not parsed for certain prompt templates [‡](/blog/lmstudio-v0.3.24). - -*** - -LM Studio 0.3.23 • 2025‑08‑12 [#lm-studio-0323-20250812] - -Reasoning content and tool‑calling reliability [#reasoning-content-and-toolcalling-reliability] - -* For `gpt‑oss` on `POST /v1/chat/completions`, reasoning content moves out of `message.content` and into `choices.message.reasoning` (non‑streaming) and `choices.delta.reasoning` (streaming), aligning with `o3‑mini` [‡](/blog/lmstudio-v0.3.23). -* Tool names are normalized (e.g., snake\_case) before being provided to the model to improve tool‑calling reliability [‡](/blog/lmstudio-v0.3.23). -* Fixed errors for certain tools‑containing requests to `POST /v1/chat/completions` (e.g., "reading 'properties'") and non‑streaming tool‑call failures [‡](/blog/lmstudio-v0.3.23). - -*** - -LM Studio 0.3.19 • 2025‑07‑21 [#lm-studio-0319-20250721] - -Bug fixes for streaming and tool calls [#bug-fixes-for-streaming-and-tool-calls] - -* Corrected usage statistics returned by OpenAI‑compatible streaming responses [‡](https://lmstudio.ai/blog/lmstudio-v0.3.19#:~:text=,OpenAI%20streaming%20responses%20were%20incorrect). -* Improved handling of parallel tool calls via the streaming API [‡](https://lmstudio.ai/blog/lmstudio-v0.3.19#:~:text=,API%20were%20not%20handled%20correctly). -* Fixed parsing of correct tool calls for certain Mistral models [‡](https://lmstudio.ai/blog/lmstudio-v0.3.19#:~:text=,Ryzen%20AI%20PRO%20300%20series). - -*** - -LM Studio 0.3.18 • 2025‑07‑10 [#lm-studio-0318-20250710] - -Streaming options and tool‑calling improvements [#streaming-options-and-toolcalling-improvements] - -* Added support for the `stream_options` object on OpenAI‑compatible endpoints. Setting `stream_options.include_usage` to `true` returns prompt and completion token usage during streaming [‡](https://lmstudio.ai/blog/lmstudio-v0.3.18#:~:text=%2A%20Added%20support%20for%20%60,to%20support%20more%20prompt%20templates). -* Errors returned from streaming endpoints now follow the correct format expected by OpenAI clients [‡](https://lmstudio.ai/blog/lmstudio-v0.3.18#:~:text=,with%20proper%20chat%20templates). -* Tool‑calling support added for Mistral v13 tokenizer models, using proper chat templates [‡](https://lmstudio.ai/blog/lmstudio-v0.3.18#:~:text=,with%20proper%20chat%20templates). -* The `response_format.type` field now accepts `"text"` in chat‑completion requests [‡](https://lmstudio.ai/blog/lmstudio-v0.3.18#:~:text=,that%20are%20split%20across%20multiple). -* Fixed bugs where parallel tool calls split across multiple chunks were dropped and where root‑level `$defs` in tool definitions were stripped [‡](https://lmstudio.ai/blog/lmstudio-v0.3.18#:~:text=,being%20stripped%20in%20tool%20definitions). - -*** - -LM Studio 0.3.17 • 2025‑06‑25 [#lm-studio-0317-20250625] - -Tool‑calling reliability and token‑count updates [#toolcalling-reliability-and-tokencount-updates] - -* Token counts now include the system prompt and tool definitions [‡](https://lmstudio.ai/blog/lmstudio-v0.3.17#:~:text=,have%20a%20URL%20in%20the). This makes usage reporting more accurate for both the UI and the API. -* Tool‑call argument tokens are streamed as they are generated [‡](https://lmstudio.ai/blog/lmstudio-v0.3.17#:~:text=Build%206), improving responsiveness when using streamed function calls. -* Various fixes improve MCP and tool‑calling reliability, including correct handling of tools that omit a `parameters` object and preventing hangs when an MCP server reloads [‡](https://lmstudio.ai/blog/lmstudio-v0.3.17#:~:text=,tool%20calls%20would%20hang%20indefinitely). - -*** - -LM Studio 0.3.16 • 2025‑05‑23 [#lm-studio-0316-20250523] - -Model capabilities in `GET /models` [#model-capabilities-in-getmodels] - -* The OpenAI‑compatible REST API (`/api/v0`) now returns a `capabilities` array in the `GET /models` response. Each model lists its supported capabilities (e.g. `"tool_use"`) [‡](https://lmstudio.ai/blog/lmstudio-v0.3.16#:~:text=,response) so clients can programmatically discover tool‑enabled models. -* Fixed a streaming bug where an empty function name string was appended after the first packet of streamed tool calls [‡](https://lmstudio.ai/blog/lmstudio-v0.3.16#:~:text=%2A%20Bugfix%3A%20%5BOpenAI,packet%20of%20streamed%20function%20calls). - -*** - -👾 LM Studio 0.3.15 • 2025-04-24 [#-lm-studio-0315--2025-04-24] - -Release post: [LM Studio 0.3.15](/blog/lmstudio-v0.3.15) - -Improved Tool Use API Support [#improved-tool-use-api-support] - -OpenAI-like REST API now supports the `tool_choice` parameter: - -```json -{ - "tool_choice": "auto" // or "none", "required" -} -``` - -* `"tool_choice": "none"` — Model will not call tools -* `"tool_choice": "auto"` — Model decides -* `"tool_choice": "required"` — Model must call tools (llama.cpp only) - -Chunked responses now set `"finish_reason": "tool_calls"` when appropriate. - -*** - -👾 LM Studio 0.3.14 • 2025-03-27 [#-lm-studio-0314--2025-03-27] - -Release post: [LM Studio 0.3.14](/blog/lmstudio-v0.3.14) - -\[API/SDK] Preset Support [#apisdk-preset-support] - -RESTful API and SDKs support specifying presets in requests. - -*(example needed)* - -👾 LM Studio 0.3.10 • 2025-02-18 [#-lm-studio-0310--2025-02-18] - -Release post: [LM Studio 0.3.10](/blog/lmstudio-v0.3.10) - -Speculative Decoding API [#speculative-decoding-api] - -Enable speculative decoding in API requests with `"draft_model"`: - -```json -{ - "model": "deepseek-r1-distill-qwen-7b", - "draft_model": "deepseek-r1-distill-qwen-0.5b", - "messages": [ ... ] -} -``` - -Responses now include a `stats` object for speculative decoding: - -```json -"stats": { - "tokens_per_second": ..., - "draft_model": "...", - "total_draft_tokens_count": ..., - "accepted_draft_tokens_count": ..., - "rejected_draft_tokens_count": ..., - "ignored_draft_tokens_count": ... -} -``` - -*** - -👾 LM Studio 0.3.9 • 2025-01-30 [#-lm-studio-039--2025-01-30] - -Release post: [LM Studio 0.3.9](blog/lmstudio-v0.3.9) - -Idle TTL and Auto Evict [#idle-ttl-and-auto-evict] - -Set a TTL (in seconds) for models loaded via API requests (docs article: [Idle TTL and Auto-Evict](/docs/developer/core/ttl-and-auto-evict)) - -```diff -curl http://localhost:1234/api/v0/chat/completions \ - -H "Content-Type: application/json" \ - -d '{ - "model": "deepseek-r1-distill-qwen-7b", - "messages": [ ... ] -+ "ttl": 300, -}' -``` - -With `lms`: - -``` -lms load --ttl -``` - -Separate `reasoning_content` in Chat Completion responses [#separate-reasoning_content-in-chat-completion-responses] - -For DeepSeek R1 models, get reasoning content in a separate field. See more [here](/blog/lmstudio-v0.3.9#separate-reasoningcontent-in-chat-completion-responses). - -Turn this on in App Settings > Developer. - -*** - -👾 LM Studio 0.3.6 • 2025-01-06 [#-lm-studio-036--2025-01-06] - -Release post: [LM Studio 0.3.6](blog/lmstudio-v0.3.6) - -Tool and Function Calling API [#tool-and-function-calling-api] - -Use any LLM that supports Tool Use and Function Calling through the OpenAI-like API. - -Docs: [Tool Use and Function Calling](/docs/developer/core/tools). - -*** - -👾 LM Studio 0.3.5 • 2024-10-22 [#-lm-studio-035--2024-10-22] - -Release post: [LM Studio 0.3.5](blog/lmstudio-v0.3.5) - -Introducing `lms get`: download models from the terminal [#introducing-lms-get-download-models-from-the-terminal] - -You can now download models directly from the terminal using a keyword - -```bash -lms get deepseek-r1 -``` - -or a full Hugging Face URL - -```bash -lms get -``` - -To filter for MLX models only, add `--mlx` to the command. - -```bash -lms get deepseek-r1 --mlx -``` - - - - - - -Get to know the stack [#get-to-know-the-stack] - - - - - - - - - - - - - - - -What you can build [#what-you-can-build] - - - - - - - - - - - - - -Install `llmster` for headless deployments [#install-llmster-for-headless-deployments] - -`llmster` is LM Studio's core, packaged as a daemon for headless deployment on servers, cloud instances, or CI. The daemon runs standalone, and it is not dependent on the LM Studio GUI. - -**Mac / Linux** - -```bash -curl -fsSL https://lmstudio.ai/install.sh | bash -``` - -**Windows** - -```powershell -irm https://lmstudio.ai/install.ps1 | iex -``` - -**Basic usage** - -```bash -lms daemon up # Start the daemon -lms get # Download a model -lms server start # Start the local server -lms chat # Open an interactive session -``` - -Learn more: [Headless deployments](/blog/0.4.0#deploy-on-servers-deploy-in-ci-deploy-anywhere) - -Super quick start [#super-quick-start] - -TypeScript (`lmstudio-js`) [#typescript-lmstudio-js] - -```bash -npm install @lmstudio/sdk -``` - -```ts -import { LMStudioClient } from "@lmstudio/sdk"; - -const client = new LMStudioClient(); -const model = await client.llm.model("openai/gpt-oss-20b"); -const result = await model.respond("Who are you, and what can you do?"); - -console.info(result.content); -``` - -Full docs: [lmstudio-js](/docs/typescript), Source: [GitHub](https://github.com/lmstudio-ai/lmstudio-js) - -Python (`lmstudio-python`) [#python-lmstudio-python] - -```bash -pip install lmstudio -``` - -```python -import lmstudio as lms - -with lms.Client() as client: - model = client.llm.model("openai/gpt-oss-20b") - result = model.respond("Who are you, and what can you do?") - print(result) -``` - -Full docs: [lmstudio-python](/docs/python), Source: [GitHub](https://github.com/lmstudio-ai/lmstudio-python) - -HTTP (LM Studio REST API) [#http-lm-studio-rest-api] - -```bash -lms server start --port 1234 -``` - -```bash -curl http://localhost:1234/api/v1/chat \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $LM_API_TOKEN" \ - -d '{ - "model": "openai/gpt-oss-20b", - "input": "Who are you, and what can you do?" - }' -``` - -Full docs: [LM Studio REST API](/docs/developer/rest) - -Helpful links [#helpful-links] - -* [API Changelog](/docs/developer/api-changelog) -* [Local server basics](/docs/developer/core/server) -* [CLI reference](/docs/cli) -* [Discord Community](https://discord.gg/lmstudio) - - - - -`lmstudio-python` provides you a set APIs to interact with LLMs, embeddings models, and agentic flows. - -Installing the SDK [#installing-the-sdk] - -`lmstudio-python` is available as a PyPI package. You can install it using pip. - -```bash -pip install lmstudio -``` - -For the source code and open source contribution, visit [lmstudio-python](https://github.com/lmstudio-ai/lmstudio-python) on GitHub. - -Features [#features] - -* Use LLMs to [respond in chats](./python/llm-prediction/chat-completion) or predict [text completions](./python/llm-prediction/completion) -* Define functions as tools, and turn LLMs into [autonomous agents](./python/agent) that run completely locally -* [Load](./python/manage-models/loading), [configure](./python/llm-prediction/parameters), and [unload](./python/manage-models/loading) models from memory -* Generate embeddings for text, and more! - -Quick Example: Chat with a Llama Model [#quick-example-chat-with-a-llama-model] - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - - model = lms.llm("qwen/qwen3-4b-2507") - result = model.respond("What is the meaning of life?") - - print(result) - ``` - - - - ```python - import lmstudio as lms - - with lms.Client() as client: - model = client.llm.model("qwen/qwen3-4b-2507") - result = model.respond("What is the meaning of life?") - - print(result) - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - async with lms.AsyncClient() as client: - model = await client.llm.model("qwen/qwen3-4b-2507") - result = await model.respond("What is the meaning of life?") - - print(result) - ``` - - - -Getting Local Models [#getting-local-models] - -The above code requires the [qwen3-4b-2507](https://lmstudio.ai/models/qwen/qwen3-4b-2507) model. -If you don't have the model, run the following command in the terminal to download it. - -```bash -lms get qwen/qwen3-4b-2507 -``` - -Read more about `lms get` in LM Studio's CLI [here](./cli/get). - -Interactive Convenience, Deterministic Resource Management, or Structured Concurrency? [#interactive-convenience-deterministic-resource-management-or-structured-concurrency] - -As shown in the example above, there are three distinct approaches for working -with the LM Studio Python SDK. - -The first is the interactive convenience API (listed as "Python (convenience API)" -in examples), which focuses on the use of a default LM Studio client instance for -convenient interactions at a synchronous Python prompt, or when using Jupyter notebooks. - -The second is a synchronous scoped resource API (listed as "Python (scoped resource API)" -in examples), which uses context managers to ensure that allocated resources -(such as network connections) are released deterministically, rather than -potentially remaining open until the entire process is terminated. - -The last is an asynchronous structured concurrency API (listed as "Python (asynchronous API)" in -examples), which is designed for use in asynchronous programs that follow the design principles of -["structured concurrency"](https://vorpus.org/blog/notes-on-structured-concurrency-or-go-statement-considered-harmful/) -in order to ensure the background tasks handling the SDK's connections to the API server host -are managed correctly. Asynchronous applications which do not adhere to those design principles -will need to rely on threaded access to the synchronous scoped resource API rather than attempting -to use the SDK's native asynchronous API. Python SDK version 1.5.0 is the first version to fully -support the asynchronous API. - -Some examples are common between the interactive convenience API and the synchronous scoped -resource API. These examples are listed as "Python (synchronous API)". - -Timeouts in the synchronous API [#timeouts-in-the-synchronous-api] - -*Required Python SDK version*: **1.5.0** - -Starting in Python SDK version 1.5.0, the synchronous API defaults to timing out after 60 seconds -with no activity when waiting for a response or streaming event notification from the API server. - -The number of seconds to wait for responses and event notifications can be adjusted using the -`lmstudio.set_sync_api_timeout()` function. Setting the timeout to `None` disables the timeout -entirely (restoring the behaviour of previous SDK versions). - -The current synchronous API timeout can be queried using the `lmstudio.get_sync_api_timeout()` -function. - -Timeouts in the asynchronous API [#timeouts-in-the-asynchronous-api] - -*Required Python SDK version*: **1.5.0** - -As asynchronous coroutines support cancellation, there is no specific timeout support implemented -in the asynchronous API. Instead, general purpose async timeout mechanisms, such as -[`asyncio.wait_for()`](https://docs.python.org/3/library/asyncio-task.html#asyncio.wait_for) or -[`anyio.move_on_after()`](https://anyio.readthedocs.io/en/stable/cancellation.html#timeouts), -should be used. - - - - -The `lms` CLI is open source on GitHub: [https://github.com/lmstudio-ai/lms](https://github.com/lmstudio-ai/lms) - -If you spot a bug, want to request a feature, or plan to contribute: - -* File issues or feature requests in the GitHub repository. -* Open pull requests against the `main` branch with a concise summary and testing notes. -* Review the repository README for setup instructions and coding standards. - - - - -Install `lms` [#install-lms] - -`lms` ships with LM Studio, so you don't need to do any additional installation steps if you have LM Studio installed. - -Just open a terminal window and run `lms`: - -```shell -lms --help -``` - -Open source [#open-source] - -`lms` is **MIT Licensed** and is developed in this repository on GitHub: [https://github.com/lmstudio-ai/lms](https://github.com/lmstudio-ai/lms) - -Command quick links [#command-quick-links] - -| Command | Syntax | Docs | -| ----------------------------- | ------------------ | ------------------------------------- | -| Chat in the terminal | `lms chat` | [Guide](/docs/cli/local-models/chat) | -| Download models | `lms get` | [Guide](/docs/cli/local-models/get) | -| List your models | `lms ls` | [Guide](/docs/cli/local-models/ls) | -| See models loaded into memory | `lms ps` | [Guide](/docs/cli/local-models/ps) | -| Control the server | `lms server start` | [Guide](/docs/cli/serve/server-start) | -| Manage the inference runtime | `lms runtime` | [Guide](/docs/cli/runtime) | -| Manage the headless daemon | `lms daemon` | [Guide](/docs/cli/daemon/daemon-up) | -| Manage LM Link | `lms link` | [Guide](/docs/cli/link/link-enable) | - -Verify the installation [#verify-the-installation] - - - 👉 You need to run LM Studio *at least once* before you can use `lms`. - - -Open a terminal window and run `lms`. - -```bash title="Terminal" -$ lms - -lms is LM Studio's CLI utility for your models, server, and inference runtime. (v0.0.47) - -Usage: lms [options] [command] - -Local models - chat Start an interactive chat with a model - get Search and download models - load Load a model - unload Unload a model - ls List the models available on disk - ps List the models currently loaded in memory - import Import a model file into LM Studio - -Serve - server Commands for managing the local server - log Log incoming and outgoing messages - -Runtime - runtime Manage and update the inference runtime - -Develop & Publish (Beta) - clone Clone an artifact from LM Studio Hub to a local folder - push Uploads the artifact in the current folder to LM Studio Hub - dev Starts a plugin dev server in the current folder - login Authenticate with LM Studio - -Learn more: https://lmstudio.ai/docs/developer -Join our Discord: https://discord.gg/lmstudio -``` - -Use `lms` to automate and debug your workflows [#use-lms-to-automate-and-debug-your-workflows] - -Start and stop the local server [#start-and-stop-the-local-server] - -```bash -lms server start -lms server stop -``` - -Learn more about [`lms server`](/docs/cli/serve/server-start). - -List the local models on the machine [#list-the-local-models-on-the-machine] - -```bash -lms ls -``` - -Learn more about [`lms ls`](/docs/cli/local-models/ls). - -This will reflect the current LM Studio models directory, which you set in **📂 My Models** tab in the app. - -List the currently loaded models [#list-the-currently-loaded-models] - -```bash -lms ps -``` - -Learn more about [`lms ps`](/docs/cli/local-models/ps). - -Load a model (with options) [#load-a-model-with-options] - -```bash -lms load [--gpu=max|auto|0.0-1.0] [--context-length=1-N] -``` - -`--gpu=1.0` means 'attempt to offload 100% of the computation to the GPU'. - -* Optionally, assign an identifier to your local LLM: - -```bash -lms load openai/gpt-oss-20b --identifier="my-model-name" -``` - -This is useful if you want to keep the model identifier consistent. - -Unload a model [#unload-a-model] - -``` -lms unload [--all] -``` - -Learn more about [`lms load and unload`](/docs/cli/local-models/load). - - - - - - -Claude Code can talk to LM Studio via the Anthropic-compatible `POST /v1/messages` endpoint. -See: [Anthropic-compatible Messages endpoint](/docs/developer/anthropic-compat/messages). - - - - - Have a powerful LLM rig? Use [LM Link](/docs/integrations/lmlink) to run Claude Code from your laptop while the model runs on your rig. - - -Setup [#setup] - - - -

- Start LM Studio's local server -

- - Make sure LM Studio is running as a server (default port `1234`). - - You can start it from the app, or from the terminal with `lms`: - - ```bash - lms server start --port 1234 - ``` -
- - -

- Configure Claude Code -

- - Set these environment variables so the `claude` CLI points to your local LM Studio: - - ```bash - export ANTHROPIC_BASE_URL=http://localhost:1234 - export ANTHROPIC_AUTH_TOKEN=lmstudio - ``` - - Notes: - - * If Require Authentication is enabled, set `ANTHROPIC_AUTH_TOKEN` to your LM Studio API token. To learn more, see: [Authentication](/docs/developer/core/authentication). -
- - -

- Run Claude Code against a local model -

- - ```bash - claude --model openai/gpt-oss-20b - ``` - - - Use a model (and server/model settings) with more than \~25k context length. Tools like Claude Code can consume a lot of context. - -
- - -

- If Require Authentication is enabled, use your LM Studio API token -

- - If you turned on "Require Authentication" in LM Studio, create an API token and set: - - ```bash - export LM_API_TOKEN= - export ANTHROPIC_AUTH_TOKEN=$LM_API_TOKEN - ``` - - When Require Authentication is enabled, LM Studio accepts both `x-api-key` and `Authorization: Bearer `. -
-
- -If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) - - - - - - -Codex can talk to LM Studio via the OpenAI-compatible `POST /v1/responses` endpoint. -See: [OpenAI-compatible Responses endpoint](/docs/developer/openai-compat/responses). - - - - - Have a powerful LLM rig? Use [LM Link](/docs/integrations/lmlink) to run Codex from your laptop while the model runs on your rig. - - -Setup [#setup] - - - -

- Start LM Studio's local server -

- - Make sure LM Studio is running as a server (default port `1234`). - - You can start it from the app, or from the terminal with `lms`: - - ```bash - lms server start --port 1234 - ``` -
- - -

- Run Codex against a local model -

- - Run Codex as you normally would, but with the `--oss` flag to point it to LM Studio. - - Example: - - ```bash - codex --oss - ``` - - By default, Codex will download and use [openai/gpt-oss-20b](https://lmstudio.ai/models/openai/gpt-oss-20b). - - - Use a model (and server/model settings) with more than \~25k context length. Tools like Codex can consume a lot of context. - - - You can also use any other model you have available in LM Studio. For example: - - ```bash - codex --oss -m ibm/granite-4-micro - ``` -
-
- -If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) - - - - - - -Hermes Agent now supports LM Studio as a first class model provider. It comes with JIT loading with higher context length (64K) and reasoning effort support. - -See: [Hermes Agent Docs](https://hermes-agent.nousresearch.com/docs/integrations/providers#lm-studio--desktop-app-with-local-models). - - - - - Have a powerful LLM rig? Use [LM Link](/docs/integrations/lmlink) to run Hermes Agent from your laptop while the model runs on your rig. - - -Setup [#setup] - - - -

- Start LM Studio's local server -

- - Make sure LM Studio is running as a server (default port `1234`). - - You can start it from the app, or from the terminal with `lms`: - - ```bash - lms server start --port 1234 - ``` -
- - -

- Run Hermes Agent with LM Studio as model provider -

- - Run your hermes setup with the following command: - - ```bash - hermes setup - ``` - - or if you have hermes setup already, run - - ```bash - hermes model - ``` - - and complete the interactive setup with LM Studio as your model provider. - - - - ```bash - hermes config set model.provider lmstudio - hermes config set model.base_url http://localhost:1234/v1 - hermes config set model.default your-model-name - hermes config set LM_API_KEY your-key - ``` - - - - - Use a model with more than \~64k context length. Tools like Hermes Agent can consume a lot of context and have better experience with longer context. - -
-
- -If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) - - - - -Use LM Studio as a seamless, drop-in local backend for your favorite tools. - -Whether you are using an IDE extension or a custom automation script, simply point your base URL to `http://localhost:1234` to power your workflows with LM Studio and maintain complete control over your data privacy. - -We provide guides below for popular tools and are constantly expanding this list to include new integrations. - -Available Integrations [#available-integrations] - -* [Claude Code](/docs/integrations/claude-code) -* [Codex](/docs/integrations/codex) -* [Hermes Agent](/docs/integrations/hermes) -* [OpenClaw](/docs/integrations/openclaw) - - - - -With [LM Link](/docs/lmlink), your coding tools can run models on a remote device (like a dedicated LLM rig on your network) while you work from your laptop - - - -Use your integration as normal [#use-your-integration-as-normal] - -Start LM Studio's server on your local machine and configure your tool to point to it. Model loads are routed to the device the model is loaded on or the preferred device if set. - -Your local machine handles the API surface at `localhost:1234`, while the model runs on the device the model is present on. - -```bash -lms server start --port 1234 -``` - -Claude Code [#claude-code] - -```bash -export ANTHROPIC_BASE_URL=http://localhost:1234 -export ANTHROPIC_AUTH_TOKEN=lmstudio -claude --model qwen3-8b -``` - -See the full [Claude Code](/docs/integrations/claude-code) guide. - -Codex [#codex] - -```bash -codex --oss -m qwen3-8b -``` - -See the full [Codex](/docs/integrations/codex) guide. - -Set a preferred device [#set-a-preferred-device] - -To use a model on a specific remote device, set the device as the preferred device. - -See [set a preferred device](/docs/lmlink/basics/preferred-device) for more details. - -If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) - - - - - - -OpenClaw now supports LM Studio as a native model provider. -See: [OpenClaw Docs](https://docs.openclaw.ai/providers/lmstudio). - - - - - Have a powerful LLM rig? Use [LM Link](/docs/integrations/lmlink) to run OpenClaw from your laptop while the model runs on your rig. - - -Setup [#setup] - - - -

- Start LM Studio's local server -

- - Make sure LM Studio is running as a server (default port `1234`). - - You can start it from the app, or from the terminal with `lms`: - - ```bash - lms server start --port 1234 - ``` -
- - -

- Run OpenClaw with LM Studio as model provider -

- - Install OpenClaw as normal or run the OpenClaw onboard command as follows *(recommended)* - - ```bash - openclaw onboard - ``` - - and complete the interactive setup with LM Studio as your model provider - - You can do the onboarding in non-interactive way by using the following command: - - ```bash - openclaw onboard \ - --non-interactive \ - --accept-risk \ - --auth-choice lmstudio \ - --custom-base-url http://localhost:1234/v1 \ - --lmstudio-api-key "$LM_API_TOKEN" \ - --custom-model-id qwen/qwen3.5-9b - ``` - - - Use a model (and server/model settings) with more than \~50k context length. Tools like OpenClaw can consume a lot of context. - -
- - -

- Set up LM Studio as default memory search provider -

- - To use LM Studio as the embedding model provider for memory search, run the following command and restart openclaw gateway - - ```bash - openclaw config set agents.defaults.memorySearch.provider lmstudio - openclaw gateway restart - ``` -
-
- -If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) - - - - - - -LM Link is a new feature in LM Studio that provides a way to access local models across devices, wherever you are. Links are custom made, end-to-end encrypted networks intended for loading and serving LLMs across devices you own, made possible in partnership with Tailscale. - -What can I do with LM Link? [#what-can-i-do-with-lm-link] - -LM Link unlocks the full potential of your hardware by sharing compute across connected devices. For example, you might have a powerful desktop in your home office, and a lightweight laptop you carry on the go. With LM Link, you can run large open-weight models on a powerful machine, and use them seamlessly from your laptop as if they were local. All communication and data transfer between devices is always end-to-end encrypted, thanks to Tailscale. - -Use Cases [#use-cases] - -LM Link use cases span individuals as well as teams. - -You can manage a private link to keep your prized gaming GPU busy even when you're on the go. Moreover, LM Link allows you to set up LLM serving in a server and start using it with just few clicks. - -Use LM Link with [#use-lm-link-with] - -* **CLI** — manage LM Link from the terminal with [`lms link`](/docs/cli/link/link-enable) -* **REST API** — use remote models via the REST API with [LM Link](/docs/developer/core/lmlink) -* **Integrations** — use remote models with coding tools like Claude Code and Codex via [LM Link](/docs/integrations/lmlink) - - - - -Requires LM Studio 0.4.0 or newer. [#requires-lm-studio-040-or-newer] - -LM Studio supports API Tokens for authentication, providing a secure and convenient way to access the LM Studio API. - -By default, the LM Studio API runs **without enforcing authentication**. For production or shared environments, enable API Token authentication for secure access. - - - To enable API Token authentication, create tokens and control granular permissions, check [this guide](/docs/developer/core/authentication) for more details. - - -Providing the API Token [#providing-the-api-token] - -There are two ways to provide the API Token when creating an instance of `LMStudioClient`: - -1. **Environment Variable (Recommended)**: Set the `LM_API_TOKEN` environment variable, and the SDK will automatically read it. -2. **Function Argument**: Pass the token directly as the `apiToken` parameter in the constructor. - - - - - Environment Variable - - - - Function Argument - - - - - ```typescript - // Set environment variables in your terminal before running the code: - // export LM_API_TOKEN="your-token-here" - - import { LMStudioClient } from "@lmstudio/sdk"; - // The SDK automatically reads from LM_API_TOKEN environment variable - const client = new LMStudioClient(); - - const model = await client.llm.model("qwen/qwen3-4b-2507"); - const result = await model.respond("What is the meaning of life?"); - - console.info(result.content); - ``` - - - - ```typescript - import { LMStudioClient } from "@lmstudio/sdk"; - const client = new LMStudioClient({ - apiToken: "your-token-here", - }); - - const model = await client.llm.model("qwen/qwen3-4b-2507"); - const result = await model.respond("What is the meaning of life?"); - - console.info(result.content); - ``` - - - - - - -The SDK provides you a set of programmatic tools to interact with LLMs, embeddings models, and agentic flows. - -Installing the SDK [#installing-the-sdk] - -`lmstudio-js` is available as an npm package. You can install it using npm, yarn, or pnpm. - - - - - npm - - - - yarn - - - - pnpm - - - - - ```bash - npm install @lmstudio/sdk --save - ``` - - - - ```bash - yarn add @lmstudio/sdk - ``` - - - - ```bash - pnpm add @lmstudio/sdk - ``` - - - -For the source code and open source contribution, visit [lmstudio-js](https://github.com/lmstudio-ai/lmstudio-js) on GitHub. - -Features [#features] - -* Use LLMs to [respond in chats](./typescript/llm-prediction/chat-completion) or predict [text completions](./typescript/llm-prediction/completion) -* Define functions as tools, and turn LLMs into [autonomous agents](./typescript/agent/act) that run completely locally -* [Load](./typescript/manage-models/loading), [configure](./typescript/llm-prediction/parameters), and [unload](./typescript/manage-models/loading) models from memory -* Supports for both browser and any Node-compatible environments -* Generate embeddings for text, and more! - -Quick Example: Chat with a Llama Model [#quick-example-chat-with-a-llama-model] - -```typescript title="index.ts" -import { LMStudioClient } from "@lmstudio/sdk"; -const client = new LMStudioClient(); - -const model = await client.llm.model("qwen/qwen3-4b-2507"); -const result = await model.respond("What is the meaning of life?"); - -console.info(result.content); -``` - -Getting Local Models [#getting-local-models] - -The above code requires the [qwen3-4b-2507](https://lmstudio.ai/models/qwen/qwen3-4b-2507). If you don't have the model, run the following command in the terminal to download it. - -```bash -lms get qwen/qwen3-4b-2507 -``` - -Read more about `lms get` in LM Studio's CLI [here](./cli/get). - - - - -`@lmstudio/sdk` is a library published on npm that allows you to use `lmstudio-js` in your own projects. It is open source and it's developed on GitHub. You can find the source code [here](https://github.com/lmstudio-ai/lmstudio-js). - -Creating a New `node` Project [#creating-a-new-node-project] - -Use the following command to start an interactive project setup: - - - - - TypeScript (Recommended) - - - - Javascript - - - - - ```bash - lms create node-typescript - ``` - - - - ```bash - lms create node-javascript - ``` - - - -Add `lmstudio-js` to an Exiting Project [#add-lmstudio-js-to-an-exiting-project] - -If you have already created a project and would like to use `lmstudio-js` in it, you can install it using npm, yarn, or pnpm. - - - - - npm - - - - yarn - - - - pnpm - - - - - ```bash - npm install @lmstudio/sdk --save - ``` - - - - ```bash - yarn add @lmstudio/sdk - ``` - - - - ```bash - pnpm add @lmstudio/sdk - ``` - - - - - - - - -Explore the docs [#explore-the-docs] - - - - - - - - - - - - - - - -To get LM Studio, head over to the [Downloads page](/download) and download an installer for your operating system. - -LM Studio is available for macOS, Windows, and Linux. - -What can I do with LM Studio? [#what-can-i-do-with-lm-studio] - -1. Download and run local LLMs like gpt-oss or Llama, Qwen -2. Use a simple and flexible chat interface -3. Connect MCP servers and use them with local models -4. Search & download functionality (via Hugging Face 🤗) -5. Serve local models on OpenAI-like endpoints, locally and on the network -6. Manage your local models, prompts, and configurations - -System requirements [#system-requirements] - -LM Studio generally supports Apple Silicon Macs, x64/ARM64 Windows PCs, and x64 Linux PCs. - -Consult the [System Requirements](app/system-requirements) page for more detailed information. - -Run llama.cpp (GGUF) or MLX models [#run-llamacpp-gguf-or-mlx-models] - -LM Studio supports running LLMs on Mac, Windows, and Linux using [`llama.cpp`](https://github.com/ggerganov/llama.cpp). - -On Apple Silicon Macs, LM Studio also supports running LLMs using Apple's [`MLX`](https://github.com/ml-explore/mlx). - -To install or manage LM Runtimes, press `⌘` `Shift` `R` on Mac or `Ctrl` `Shift` `R` on Windows/Linux. - -LM Studio as an MCP client [#lm-studio-as-an-mcp-client] - -You can install MCP servers in LM Studio and use them with your local models. - -See the docs for more: [Use MCP server](/docs/app/plugins/mcp). - -If you're develping an MCP server, check out [Add to LM Studio Button](/docs/app/plugins/mcp/deeplink). - -Run an LLM like `gpt-oss`, `Llama`, `Qwen`, `Mistral`, or `DeepSeek R1` on your computer [#run-an-llm-like-gpt-oss-llama-qwen-mistral-or-deepseek-r1-on-your-computer] - -To run an LLM on your computer you first need to download the model weights. - -You can do this right within LM Studio! See [Download an LLM](app/basics/download-model) for guidance. - -Chat with documents entirely offline on your computer [#chat-with-documents-entirely-offline-on-your-computer] - -You can attach documents to your chat messages and interact with them entirely offline, also known as "RAG". - -Read more about how to use this feature in the [Chat with Documents](app/basics/rag) guide. - -Run LM Studio without the GUI (llmster) [#run-lm-studio-without-the-gui-llmster] - -llmster is the headless version of LM Studio, no desktop app required. It's ideal for servers, CI environments, or any machine where you don't need a GUI. - -Learn more: [Headless Mode](/docs/developer/core/headless). - -Use LM Studio's API from your own apps and scripts [#use-lm-studios-api-from-your-own-apps-and-scripts] - -LM Studio provides a REST API that you can use to interact with your local models from your own apps and scripts. - -* [OpenAI Compatibility API](api/openai-api) -* [LM Studio REST API (beta)](api/rest-api) - -
- -Community [#community] - -Join the LM Studio community on [Discord](https://discord.gg/aPQfnNkxGC) to ask questions, share knowledge, and get help from other users and the LM Studio team. - - - - - - In general, LM Studio does not require the internet in order to work. This includes core functions like chatting with models, chatting with documents, or running a local server, none of which require the internet. - - -Operations that do NOT require connectivity [#operations-that-do-not-require-connectivity] - -Using downloaded LLMs [#using-downloaded-llms] - -Once you have an LLM onto your machine, the model will run locally and you should be good to go entirely offline. Nothing you enter into LM Studio when chatting with LLMs leaves your device. - -Chatting with documents (RAG) [#chatting-with-documents-rag] - -When you drag and drop a document into LM Studio to chat with it or perform RAG, that document stays on your machine. All document processing is done locally, and nothing you upload into LM Studio leaves the application. - -Running a local server [#running-a-local-server] - -LM Studio can be used as a server to provide LLM inferencing on localhost or the local network. Requests to LM Studio use OpenAI endpoints and return OpenAI-like response objects, but stay local. - -Operations that require connectivity [#operations-that-require-connectivity] - -Several operations, described below, rely on internet connectivity. Once you get an LLM onto your machine, you should be good to go entirely offline. - -Searching for models [#searching-for-models] - -When you search for models in the Discover tab, LM Studio makes network requests (e.g. to huggingface.co). Search will not work without internet connection. - -Downloading new models [#downloading-new-models] - -In order to download models you need a stable (and decently fast) internet connection. You can also 'sideload' models (use models that were procured outside the app). See instructions for [sideloading models](/docs/advanced/sideload). - -Discover tab's model catalog [#discover-tabs-model-catalog] - -Any given version of LM Studio ships with an initial model catalog built-in. The entries in the catalog are typically the state of the online catalog near the moment we cut the release. However, in order to show stats and download options for each model, we need to make network requests (e.g. to huggingface.co). - -Downloading runtimes [#downloading-runtimes] - -[LM Runtimes](advanced/lm-runtimes) are individually packaged software libraries, or LLM engines, that allow running certain formats of models (e.g. `llama.cpp`). As of LM Studio 0.3.0 (read the [announcement](https://lmstudio.ai/blog/lmstudio-v0.3.0)) it's easy to download and even hot-swap runtimes without a full LM Studio update. To check for available runtimes, and to download them, we need to make network requests. - -Checking for app updates [#checking-for-app-updates] - -On macOS and Windows, LM Studio has a built-in app updater that's capable. The linux in-app updater [is in the works](https://github.com/lmstudio-ai/lmstudio-bug-tracker/issues/89). When you open LM Studio, the app updater will make a network request to check if there are any new updates available. If there's a new version, the app will show you a notification to update now or later. -Without internet connectivity you will not be able to update the app via the in-app updater. - - - - -macOS [#macos] - -* Chip: Apple Silicon (M1/M2/M3/M4). -* macOS 14.0 or newer is required. -* 16GB+ RAM recommended. - * You may still be able to use LM Studio on 8GB Macs, but stick to smaller models and modest context sizes. -* Intel-based Macs are currently not supported. Chime in [here](https://github.com/lmstudio-ai/lmstudio-bug-tracker/issues/9) if you are interested in this. - -Windows [#windows] - -LM Studio is supported on both x64 and ARM (Snapdragon X Elite) based systems. - -* CPU: AVX2 instruction set support is required (for x64) -* RAM: LLMs can consume a lot of RAM. At least 16GB of RAM is recommended. -* GPU: at least 4GB of dedicated VRAM is recommended. - -Linux [#linux] - -LM Studio is supported on both x64 and ARM64 (aarch64) based systems. - -* LM Studio for Linux is distributed as an AppImage. -* Ubuntu 20.04 or newer is required -* Ubuntu versions newer than 22 are not well tested. Let us know if you're running into issues by opening a bug [here](https://github.com/lmstudio-ai/lmstudio-bug-tracker). -* CPU: - * On x64, LM Studio ships with AVX2 support by default - - - - -LM Studio has a ChatGPT-like interface for chatting with local LLMs. You can create many different conversation threads and manage them in folders. - -
- -Create a new chat [#create-a-new-chat] - -You can create a new chat by clicking the "+" button or by using a keyboard shortcut: `⌘` + `N` on Mac, or `ctrl` + `N` on Windows / Linux. - -Create a folder [#create-a-folder] - -Create a new folder by clicking the new folder button or by pressing: `⌘` + `shift` + `N` on Mac, or `ctrl` + `shift` + `N` on Windows / Linux. - -Drag and drop [#drag-and-drop] - -You can drag and drop chats in and out of folders, and even drag folders into folders! - -Duplicate chats [#duplicate-chats] - -You can duplicate a whole chat conversation by clicking the `•••` menu and selecting "Duplicate". If the chat has any files in it, they will be duplicated too. - -Split view in chat [#split-view-in-chat] - -You can view two chats side by side by dragging and dropping chat tabs to either half of the window. Alternatively, use the split view icon at the top right of a chat window to split left or right. - -Close one side of the split view with the 'x' button in the top right of each pane. - -FAQ [#faq] - -Where are chats stored in the file system? [#where-are-chats-stored-in-the-file-system] - -Right-click on a chat and choose "Reveal in Finder" / "Show in File Explorer". -Conversations are stored in JSON format. It is NOT recommended to edit them manually, nor to rely on their structure. - -Does the model learn from chats? [#does-the-model-learn-from-chats] - -The model doesn't 'learn' from chats. The model only 'knows' the content that is present in the chat or is provided to it via configuration options such as the "system prompt". - -Conversations folder filesystem path [#conversations-folder-filesystem-path] - -Mac / Linux: - -```shell -~/.lmstudio/conversations/ -``` - -Windows: - -```ps -%USERPROFILE%\.lmstudio\conversations -``` - -
- -Community [#community] - -Chat with other LM Studio users, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). - - - - -LM Studio comes with a built-in model downloader that let's you download any supported model from [Hugging Face](https://huggingface.co). - - - -
- -Searching for models [#searching-for-models] - -You can search for models by keyword (e.g. `llama`, `gemma`, `lmstudio`), or by providing a specific `user/model` string. You can even insert full Hugging Face URLs into the search bar! - -Pro tip: you can jump to the Discover tab from anywhere by pressing `⌘` + `2` on Mac, or `ctrl` + `2` on Windows / Linux. [#pro-tip-you-can-jump-to-the-discover-tab-from-anywhere-by-pressing---2-on-mac-or-ctrl--2-on-windows--linux] - -Which download option to choose? [#which-download-option-to-choose] - -You will often see several options for any given model named things like `Q3_K_S`, `Q_8` etc. These are all copies of the same model, provided in varying degrees of fidelity. The `Q` represents a technique called "Quantization", which roughly means compressing model files in size, while giving up some degree of quality. - -Choose a 4-bit option or higher if your machine is capable enough for running it. - - - -
- -`Advanced` - -Changing the models directory [#changing-the-models-directory] - -You can change the models directory by heading to My Models - - - -
- -Community [#community] - -Chat with other LM Studio users, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). - - - - - - -Double check computer meets the minimum [system requirements](/docs/system-requirements). - - - You might sometimes see terms such as `open-source models` or `open-weights models`. Different models might be released under different licenses and varying degrees of 'openness'. In order to run a model locally, you need to be able to get access to its "weights", often distributed as one or more files that end with `.gguf`, `.safetensors` etc. - - -
- -Getting up and running [#getting-up-and-running] - -First, **install the latest version of LM Studio**. You can get it from [here](/download). - -Once you're all set up, you need to **download your first LLM**. - - - -

- Download an LLM to your computer -

- - Head over to the Discover tab to download models. Pick one of the curated options or search for models by search query (e.g. `"Llama"`). See more in-depth information about downloading models [here](/docs/basics/download-models). - - -
- - -

- Load a model to memory -

- - Head over to the **Chat** tab, and - - 1. Open the model loader - 2. Select one of the models you downloaded (or [sideloaded](/docs/advanced/sideload)). - 3. Optionally, choose load configuration parameters. - - - -

- What does loading a model mean? -

- - Loading a model typically means allocating memory to be able to accommodate the model's weights and other parameters in your computer's RAM. -
- - -

- Chat! -

- - Once the model is loaded, you can start a back-and-forth conversation with the model in the Chat tab. - - -
-
- -
- -Community [#community] - -Chat with other LM Studio users, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). - - - - -LM Studio app, llmster, and lms [#lm-studio-app-llmster-and-lms] - -The LM Studio app, llmster, and `lms` are three different tools offered by LM Studio to make use of local AI easy and accessible. - -LM Studio (the desktop app) [#lm-studio-the-desktop-app] - -The LM Studio app is a user-friendly graphical interface containing the full capabilities of LM Studio. - -Notable capabilities: [#notable-capabilities] - -* Search and download models from Hugging Face -* Chat with models through a built-in chat interface -* Upload and chat documents (RAG) -* Configure model settings, prompt templates, and presets -* Run a local server with through native REST APIs or OpenAI/Anthropic compatible endpoints -* Connect MCP servers and use them with local models - -The desktop app is the easiest starting point if you're new to running models locally or prefer a graphical interface. - -llmster (the headless daemon) [#llmster-the-headless-daemon] - -llmster is LM Studio’s headless daemon – a standalone background service that can run without a GUI. This means you do not have to download the LM Studio app to use llmster via the terminal. - -llmster becomes useful when you need to run LM Studio: - -* On a Linux server or cloud instance -* On a GPU rig without a screen or display -* In a CI/CD pipeline -* As a background service that starts on machine boot - And more! - -Because llmster runs independently of the desktop app, you can get the full model-serving capabilities of LM Studio in environments where installing or launching a GUI application isn't practical. - -Learn more and install llmster [here](https://lmstudio.ai/docs/developer/core/headless) - -lms (the CLI) [#lms-the-cli] - -`lms` is LM Studio's CLI (command-line interface). It lets you interact with both the LM Studio desktop app and llmster, and manage your models directly from a terminal. - -`lms` is included automatically upon downloading the app or llmster. - -**Common commands:** - -```bash -lms get # Download a model -lms load # Load a model into memory -lms ls # List models available on disk -lms server start # Start the local HTTP server -lms chat # Start an interactive chat session in the terminal -lms log stream # Stream incoming and outgoing request logs -``` - -If LM Studio isn't already running when you run an `lms` command, it will start running automatically. - -**Example commands to download and serve a model:** - -```bash -lms get openai/gpt-oss-20b -lms load openai/gpt-oss-20b -lms server start -``` - -Once the server is running, it listens on [http://localhost:1234](http://localhost:1234). Point any SDK or compatible tool at our OpenAI or Anthropic-compatible endpoints to use your LM Studio models. - -In short, `lms` is the command-line tool to talk to both, the desktop app or llmster. - - - - -You can attach document files (`.docx`, `.pdf`, `.txt`) to chat sessions in LM Studio. - -This will provide additional context to LLMs you chat with through the app. - -
- -Terminology [#terminology] - -* **Retrieval**: Identifying relevant portion of a long source document -* **Query**: The input to the retrieval operation -* **RAG**: Retrieval-Augmented Generation\* -* **Context**: the 'working memory' of an LLM. Has a maximum size - -\* In this context, 'Generation' means the output of the LLM. [#-in-this-context-generation-means-the-output-of-the-llm] - -Context sizes are measured in "tokens". One token is often about 3/4 of a word. [#context-sizes-are-measured-in-tokens-one-token-is-often-about-34-of-a-word] - -RAG vs. Full document 'in context' [#rag-vs-full-document-in-context] - -If the document is short enough (i.e., if it fits in the model's context), LM Studio will add the file contents to the conversation in full. This is particularly useful for models that support longer context sizes such as Meta's Llama 3.1 and Mistral Nemo. - -If the document is very long, LM Studio will opt into using "Retrieval Augmented Generation", frequently referred to as "RAG". RAG means attempting to fish out relevant bits of a very long document (or several documents) and providing them to the model for reference. This technique sometimes works really well, but sometimes it requires some tuning and experimentation. - -Tip for successful RAG [#tip-for-successful-rag] - -provide as much context in your query as possible. Mention terms, ideas, and words you expect to be in the relevant source material. This will often increase the chance the system will provide useful context to the LLM. As always, experimentation is the best way to find what works best. - - - - -You can install MCP servers in LM Studio with one click using a deeplink. - -Starting with version 0.3.17 (10), LM Studio can act as an MCP host. Learn more about it [here](../mcp). - -*** - -Generate your own MCP install link [#generate-your-own-mcp-install-link] - -Enter your MCP JSON entry to generate a deeplink for the `Add to LM Studio` button. - - - -Try an example [#try-an-example] - -Try to copy and paste the following into the link generator above. - -```json -{ - "hf-mcp-server": { - "url": "https://huggingface.co/mcp", - "headers": { - "Authorization": "Bearer " - } - } -} -``` - -Deeplink format [#deeplink-format] - -```bash -lmstudio://add_mcp?name=hf-mcp-server&config=eyJ1cmwiOiJodHRwczovL2h1Z2dpbmdmYWNlLmNvL21jcCIsImhlYWRlcnMiOnsiQXV0aG9yaXphdGlvbiI6IkJlYXJlciA8WU9VUl9IRl9UT0tFTj4ifX0%3D -``` - -Parameters [#parameters] - - - - - - -Starting LM Studio 0.3.17, LM Studio acts as an **Model Context Protocol (MCP) Host**. This means you can connect MCP servers to the app and make them available to your models. - -Be cautious [#be-cautious] - -Never install MCPs from untrusted sources. - - - Some MCP servers can run arbitrary code, access your local files, and use your network connection. Always be cautious when installing and using MCP servers. If you don't trust the source, don't install it. - - -Use MCP servers in LM Studio [#use-mcp-servers-in-lm-studio] - -Starting 0.3.17 (b10), LM Studio supports both local and remote MCP servers. You can add MCPs by editing the app's `mcp.json` file or via the ["Add to LM Studio" Button](mcp/deeplink), when available. LM Studio currently follows Cursor's `mcp.json` notation. - -Install new servers: `mcp.json` [#install-new-servers-mcpjson] - -Switch to the "Program" tab in the right hand sidebar. Click `Install > Edit mcp.json`. - - - -This will open the `mcp.json` file in the in-app editor. You can add MCP servers by editing this file. - - - -Example MCP to try: Hugging Face MCP Server [#example-mcp-to-try-hugging-face-mcp-server] - -This MCP server provides access to functions like model and dataset search. - - - -```json -{ - "mcpServers": { - "hf-mcp-server": { - "url": "https://huggingface.co/mcp", - "headers": { - "Authorization": "Bearer " - } - } - } -} -``` - -You will need to replace `` with your actual Hugging Face token. Learn more [here](https://huggingface.co/docs/hub/en/security-tokens). - -Use the [deeplink button](mcp/deeplink), or copy the JSON snippet above and paste it into your `mcp.json` file. - -*** - -Gotchas and Troubleshooting [#gotchas-and-troubleshooting] - -* Never install MCP servers from untrusted sources. Some MCPs can have far reaching access to your system. - -* Some MCP servers were designed to be used with Claude, ChatGPT, Gemini and might use excessive amounts of tokens. - * Watch out for this. It may quickly bog down your local model and trigger frequent context overflows. - -* When adding MCP servers manually, copy only the content after `"mcpServers": {` and before the closing `}`. - - - - -`Draft` - -[`model.yaml`](https://modelyaml.org) describes a model and all of its variants in a single portable file. Models in LM Studio's [model catalog](https://lmstudio.ai/models) are all implemented using model.yaml. - -This allows abstracting away the underlying format (GGUF, MLX, etc) and presenting a single entry point for a given model. Furthermore, the model.yaml file supports baking in additional metadata, load and inference options, and even custom logic (e.g. enable/disable thinking). - -**You can clone existing model.yaml files on the LM Studio Hub and even [publish your own](./modelyaml/publish)!** - -Core fields [#core-fields] - -`model` [#model] - -The canonical identifier in the form `publisher/model`. - -```yaml -model: qwen/qwen3-8b -``` - -`base` [#base] - -Points to the "concrete" model files or other virtual models. Each entry uses a unique `key` and one or more `sources` from which the file can be fetched. - -The snippet below demonstrates a case where the model (`qwen/qwen3-8b`) can resolve to one of 3 different concrete models. - -```yaml -model: qwen/qwen3-8b -base: - - key: lmstudio-community/qwen3-8b-gguf - sources: - - type: huggingface - user: lmstudio-community - repo: Qwen3-8B-GGUF - - key: lmstudio-community/qwen3-8b-mlx-4bit - sources: - - type: huggingface - user: lmstudio-community - repo: Qwen3-8B-MLX-4bit - - key: lmstudio-community/qwen3-8b-mlx-8bit - sources: - - type: huggingface - user: lmstudio-community - repo: Qwen3-8B-MLX-8bit -``` - -Concrete model files refer to the actual weights. - -`metadataOverrides` [#metadataoverrides] - -Overrides the base model's metadata. This is useful for presentation purposes, for example in LM Studio's model catalog or in app model search. It is not used for any functional changes to the model. - -```yaml -metadataOverrides: - domain: llm - architectures: - - qwen3 - compatibilityTypes: - - gguf - - safetensors - paramsStrings: - - 8B - minMemoryUsageBytes: 4600000000 - contextLengths: - - 40960 - vision: false - reasoning: true - trainedForToolUse: true -``` - -`config` [#config] - -Use this to "bake in" default runtime settings (such as sampling parameters) and even load time options. -This works similarly to [Per Model Defaults](/docs/app/advanced/per-model). - -* `operation:` inference time parameters -* `load:` load time parameters - -```yaml -config: - operation: - fields: - - key: llm.prediction.topKSampling - value: 20 - - key: llm.prediction.temperature - value: 0.7 - load: - fields: - - key: llm.load.contextLength - value: 42690 -``` - -`customFields` [#customfields] - -Define model-specific custom fields. - -```yaml -customFields: - - key: enableThinking - displayName: Enable Thinking - description: Controls whether the model will think before replying - type: boolean - defaultValue: true - effects: - - type: setJinjaVariable - variable: enable_thinking -``` - -In order for the above example to work, the jinja template needs to have a variable named `enable_thinking`. - -Complete example [#complete-example] - -Taken from [https://lmstudio.ai/models/qwen/qwen3-8b](https://lmstudio.ai/models/qwen/qwen3-8b) - -```yaml -# model.yaml is an open standard for defining cross-platform, composable AI models -# Learn more at https://modelyaml.org -model: qwen/qwen3-8b -base: - - key: lmstudio-community/qwen3-8b-gguf - sources: - - type: huggingface - user: lmstudio-community - repo: Qwen3-8B-GGUF - - key: lmstudio-community/qwen3-8b-mlx-4bit - sources: - - type: huggingface - user: lmstudio-community - repo: Qwen3-8B-MLX-4bit - - key: lmstudio-community/qwen3-8b-mlx-8bit - sources: - - type: huggingface - user: lmstudio-community - repo: Qwen3-8B-MLX-8bit -metadataOverrides: - domain: llm - architectures: - - qwen3 - compatibilityTypes: - - gguf - - safetensors - paramsStrings: - - 8B - minMemoryUsageBytes: 4600000000 - contextLengths: - - 40960 - vision: false - reasoning: true - trainedForToolUse: true -config: - operation: - fields: - - key: llm.prediction.topKSampling - value: 20 - - key: llm.prediction.minPSampling - value: - checked: true - value: 0 -customFields: - - key: enableThinking - displayName: Enable Thinking - description: Controls whether the model will think before replying - type: boolean - defaultValue: true - effects: - - type: setJinjaVariable - variable: enable_thinking -``` - -The [GitHub specification](https://github.com/modelyaml/modelyaml) contains further details and the latest schema. - - - - -Share portable models by uploading a [`model.yaml`](./) to your page on the LM Studio Hub. - -After you publish a model.yaml to the LM Studio Hub, it will be available for other users to download with `lms get`. - -Note: `model.yaml` refers to metadata only. This means it does not include the actual model weights. [#note-modelyaml-refers-to-metadata-only-this-means-it-does-not-include-the-actual-model-weights] - -Quickstart [#quickstart] - -The easiest way to get started is by cloning an existing model, modifying it, and then running `lms push`. - -For example, you can clone the Qwen 3 8B model: - -```shell -lms clone qwen/qwen3-8b -``` - -This will result in a local copy `model.yaml`, `README` and other metadata files. Importantly, this does NOT download the model weights. - -```bash title="Terminal" -$ ls -README.md manifest.json model.yaml thumbnail.png -``` - -Change the publisher to your user [#change-the-publisher-to-your-user] - -The first part in the `model:` field should be the username of the publisher. Change it to a username of a user or organization for which you have write access. - -```diff -- model: qwen/qwen3-8b -+ model: your-user-here/qwen3-8b -base: - - key: lmstudio-community/qwen3-8b-gguf - sources: -# ... the rest of the file -``` - -Sign in [#sign-in] - -Authenticate with the Hub from the command line: - -```shell -lms login -``` - -The CLI will print an authentication URL. After you approve access, the session token is saved locally so you can publish models. - -Publish your model [#publish-your-model] - -Run the push command in the directory containing `model.yaml`: - -```shell -lms push -``` - -The command packages the file, uploads it, and prints a revision number for the new version. - -Override metadata at publish time [#override-metadata-at-publish-time] - -Use `--overrides` to tweak fields without editing the file: - -```shell -lms push --overrides '{"description": "Qwen 3 8B model"}' -``` - -Downloading a model and using it in LM Studio [#downloading-a-model-and-using-it-in-lm-studio] - -After publishing, the model appears under your user or organization profile on the LM Studio Hub. - -It can then be downloaded with: - -```shell -lms get my-user/my-model -``` - - - - -You can import preset by file or URL. This is useful for sharing presets with others, or for importing presets from other users. - -
- -Import Presets [#import-presets] - -First, click the presets dropdown in the sidebar. You will see a list of your presets along with 2 buttons: `+ New Preset` and `Import`. - -Click the `Import` button to import a preset. - - - -Import Presets from File [#import-presets-from-file] - -Once you click the Import button, you can select the source of the preset you want to import. You can either import from a file or from a URL. - -Import Presets from URL [#import-presets-from-url] - -Presets that are [published](/docs/app/presets/publish) to the LM Studio Hub can be imported by providing their URL. - -Importing public presets does not require logging in within LM Studio. - - - -Using `lms` CLI [#using-lms-cli] - -You can also use the CLI to import presets from URL. This is useful for sharing presets with others. - -``` -lms get {author}/{preset-name} -``` - -Example: - -```bash -lms get neil/qwen3-thinking -``` - -Find your config-presets directory [#find-your-config-presets-directory] - -LM Studio manages config presets on disk. Presets are local and private by default. You or others can choose to share them by sharing the file. - -Click on the `•••` button in the Preset dropdown and select "Reveal in Finder" (or "Show in Explorer" on Windows). - -This will download the preset file and automatically surface it in the preset dropdown in the app. - -Where Hub shared presets are stored [#where-hub-shared-presets-are-stored] - -Presets you share, and ones you download from the LM Studio Hub are saved in `~/.lmstudio/hub` on macOS and Linux, or `%USERPROFILE%\.lmstudio\hub` on Windows. - - - - -Presets are a way to bundle together a system prompt and other parameters into a single configuration that can be easily reused across different chats. - -New in 0.3.15: You can [import](/docs/app/presets/import) Presets from file or URL, and even [publish](/docs/app/presets/publish) your own Presets to share with others on to the LM Studio Hub. - -
- -Saving, resetting, and deselecting Presets [#saving-resetting-and-deselecting-presets] - -Below is the anatomy of the Preset manager: - - - -Importing, Publishing, and Updating Downloaded Presets [#importing-publishing-and-updating-downloaded-presets] - -Presets are JSON files. You can share them by sending around the JSON, or you can share them by publishing them to the LM Studio Hub. -You can also import Presets from other users by URL. See the [Import](/docs/app/presets/import) and [Publish](/docs/app/presets/publish) sections for more details. - -Example: Build your own Prompt Library [#example-build-your-own-prompt-library] - -You can create your own prompt library by using Presets. - - - -In addition to system prompts, every parameter under the Advanced Configuration sidebar can be recorded in a named Preset. - -For example, you might want to always use a certain Temperature, Top P, or Max Tokens for a particular use case. You can save these settings as a Preset (with or without a system prompt) and easily switch between them. - -The Use Case for Presets [#the-use-case-for-presets] - -* Save your system prompts, inference parameters as a named `Preset`. -* Easily switch between different use cases, such as reasoning, creative writing, multi-turn conversations, or brainstorming. - -Where Presets are stored [#where-presets-are-stored] - -Presets are stored in the following directory: - -macOS or Linux [#macos-or-linux] - -```xml -~/.lmstudio/config-presets -``` - -Windows [#windows] - -```xml -%USERPROFILE%\.lmstudio\config-presets -``` - -Migration from LM Studio 0.2.* Presets [#migration-from-lm-studio-02-presets] - -* Presets you've saved in LM Studio 0.2.\* are automatically readable in 0.3.3 with no migration step needed. -* If you save **new changes** in a **legacy preset**, it'll be **copied** to a new format upon save. - * The old files are NOT deleted. -* Notable difference: Load parameters are not included in the new preset format. - * Favor editing the model's default config in My Models. See [how to do it here](/docs/configuration/per-model). - -
- -Community [#community] - -Chat with other LM Studio users, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). - - - - -`Feature In Preview` - -Starting LM Studio 0.3.15, you can publish your Presets to the LM Studio community. This allows you to share your Presets with others and import Presets from other users. - -This feature is early and we would love to hear your feedback. Please report bugs and feedback to [bugs@lmstudio.ai](mailto:bugs@lmstudio.ai). - -*** - -Step 1: Click the Publish Button [#step-1-click-the-publish-button] - -Identify the Preset you want to publish in the Preset dropdown. Click the `•••` button and select "Publish" from the menu. - - - -Step 2: Set the Preset Details [#step-2-set-the-preset-details] - -You will be prompted to set the details of your Preset. This includes the name (slug) and optional description. - -Community presets are public and can be used by anyone on the internet! - - - -Privacy and Terms [#privacy-and-terms] - -For good measure, visit the [Privacy Policy](https://lmstudio.ai/hub-privacy) and [Terms of Service](https://lmstudio.ai/hub-terms) to understand what's suitable to share on the Hub, and how data is handled. Community presets are public and visible to everyone. Make sure you agree to what these documents say before publishing your Preset. - - - - -`Feature In Preview` - -You can pull the latest revisions of your Presets, or presets you have imported from others. This is useful for keeping your Presets up to date with the latest changes. - -
- -How to Pull Updates [#how-to-pull-updates] - -Click the `•••` button in the Preset dropdown and select "Pull" from the menu. - - - -Your Presets vs Others' [#your-presets-vs-others] - -Both your published Presets and other downloaded Presets can be pulled and updated the same way. - - - - - - -`Feature In Preview` - -Starting LM Studio 0.3.15, you can publish your Presets to the LM Studio community. This allows you to share your Presets with others and import Presets from other users. - -This feature is early and we would love to hear your feedback. Please report bugs and feedback to [bugs@lmstudio.ai](mailto:bugs@lmstudio.ai). - -*** - -Published Presets [#published-presets] - -Presets you share on the LM Studio Hub can be updated. - - - - - -

- Make Changes and Commit -

- - Make any changes to your Preset, both in parameters that are already included in the Preset, or by adding new parameters. -
- - -

- Click the Push Button -

- - Once changes are committed, you will see a `Push` button. Click it to push your changes to the Hub. - - Pushing changes will result in a new revision of your Preset on the Hub. - - -
-
- - - - -LM Studio is available in `English`, `Spanish`, `Japanese`, `Chinese`, `German`, `Norwegian`, `Turkish`, `Russian`, `Korean`, `Polish`, `Vietnamese`, `Czech`, `Ukrainian`, `Portuguese (BR,PT)` and many more languages thanks to incredible community localizers. - -
- -Selecting a Language [#selecting-a-language] - -You can choose a language in the Settings tab. - -Use the dropdown menu under Preferences > Language. - - - You can jump to Settings from anywhere in the app by pressing `cmd` + `,` on macOS or `ctrl` + `,` on Windows/Linux. - - -To get to the Settings page, you need to be on Power User mode or higher. - -
- -Big thank you to community localizers 🙏 [#big-thank-you-to-community-localizers-] - -* Spanish [@xtianpaiva](https://github.com/xtianpaiva), [@AlexisGross](https://github.com/AlexisGross), [@Tonband](https://github.com/Tonband) -* Norwegian [@Exlo84](https://github.com/Exlo84) -* German [@marcelMaier](https://github.com/marcelMaier), [@Goekdeniz-Guelmez](https://github.com/Goekdeniz-Guelmez) -* Romanian (ro) [@alexandrughinea](https://github.com/alexandrughinea) -* Turkish (tr) [@progesor](https://github.com/progesor), [@nossbar](https://github.com/nossbar) -* Russian [@shelomitsky](https://github.com/shelomitsky), [@mlatysh](https://github.com/mlatysh), [@Adjacentai](https://github.com/Adjacentai), [@HostFly](https://github.com/HostFly), [@MotyaDev](https://github.com/MotyaDev), [@Autumn-Whisper](https://github.com/Autumn-Whisper), [@seropheem](https://github.com/seropheem) -* Korean [@williamjeong2](https://github.com/williamjeong2) -* Polish [@danieltechdev](https://github.com/danieltechdev) -* Czech [@ladislavsulc](https://github.com/ladislavsulc) -* Vietnamese [@trinhvanminh](https://github.com/trinhvanminh), [@godkyo98](https://github.com/godkyo98) -* Portuguese (BR) [@Sm1g00l](https://github.com/Sm1g00l), [@altiereslima](https://github.com/altiereslima) -* Portuguese (PT) [@catarino](https://github.com/catarino) -* Chinese (zh-CN) [@neotan](https://github.com/neotan), [@SweetDream0256](https://github.com/SweetDream0256), [@enKl03B](https://github.com/enKl03B), [@evansrrr](https://github.com/evansrrr), [@xkonglong](https://github.com/xkonglong), [@shadow01a](https://github.com/shadow01a) -* Chinese (zh-HK), (zh-TW) [@neotan](https://github.com/neotan), [ceshizhuanyong895](https://github.com/ceshizhuanyong895), [@BrassaiKao](https://github.com/BrassaiKao) -* Chinese (zh-Hant) [@kywarai](https://github.com/kywarai), [ceshizhuanyong895](https://github.com/ceshizhuanyong895) -* Ukrainian (uk) [@hmelenok](https://github.com/hmelenok) -* Japanese (ja) [@digitalsp](https://github.com/digitalsp) -* Dutch (nl) [@alaaf11](https://github.com/alaaf11) -* Italian (it) [@fralapo](https://github.com/fralapo), [@Bl4ck-D0g](https://github.com/Bl4ck-D0g), [@nikypalma](https://github.com/nikypalma) -* Indonesian (id) [@dwirx](https://github.com/dwirx) -* Greek (gr) [@ilikecatgirls](https://github.com/ilikecatgirls) -* Swedish (sv) [@reinew](https://github.com/reinew) -* Catalan (ca) [@Gopro3010](https://github.com/Gopro3010) -* French [@Plexi09](https://github.com/Plexi09) -* Finnish (fi) [@divergentti](https://github.com/divergentti) -* Bengali (bn) [@AbiruzzamanMolla](https://github.com/AbiruzzamanMolla) -* Malayalam (ml) [@prasanthc41m](https://github.com/prasanthc41m) -* Thai (th) [@gnoparus](https://github.com/gnoparus) -* Bosnian (bs) [@0haris0](https://github.com/0haris0) -* Bulgarian (bg) [@DenisZekiria](https://github.com/DenisZekiria) -* Hindi (hi) [@suhailtajshaik](https://github.com/suhailtajshaik) -* Hungarian (hu) [@Mekemoka](https://github.com/Mekemoka) -* Persian (Farsi) (fa) [@mohammad007kh](https://github.com/mohammad007kh), [@darwindev](https://github.com/darwindev) -* Arabic (ar) [@haqbany](https://github.com/haqbany) - -Still under development (due to lack of RTL support in LM Studio) - -* Hebrew: [@NHLOCAL](https://github.com/NHLOCAL) - -Contributing to LM Studio localization [#contributing-to-lm-studio-localization] - -If you want to improve existing translations or contribute new ones, you're more than welcome to jump in. - -LM Studio strings are maintained in [https://github.com/lmstudio-ai/localization](https://github.com/lmstudio-ai/localization). - -See instructions for contributing [here](https://github.com/lmstudio-ai/localization/blob/main/README.md). - - - - -Enable Developer Mode [#enable-developer-mode] - -Developer Mode combines the previous Developer and Power User modes into a single mode with all advanced features enabled. You can enable Developer mode in Settings > Developer. - - - -Which mode should I choose? [#which-mode-should-i-choose] - -`User` [#user] - -Show only the chat interface, and auto-configure everything. This is the best choice for beginners or anyone who's happy with the default settings. - -`Developer` [#developer] - -Full access to all aspects in LM Studio. This includes keyboard shortcuts and development features. - -Use LM Studio in this mode if you want access to configurable [load](/docs/configuration/load) and [inference](/docs/configuration/inference) parameters as well as advanced chat features such as [insert, edit, & continue](/docs/advanced/context) (for either role, user or assistant). - - - - -Selecting a Theme [#selecting-a-theme] - -Press `Cmd` + `K` then `T` (macOS) or `Ctrl` + `K` then `T` (Windows/Linux) to open the theme selector. - -You can also choose a theme in the Settings tab (`Cmd` + `,` on macOS or `Ctrl` + `,` on Windows/Linux). - -Choosing the "Auto" option will automatically switch between Light and Dark themes based on your system settings. - - - - -You can use compatible models you've downloaded outside of LM Studio by placing them in the expected directory structure. - -
- -Use `lms import` (experimental) [#use-lms-import-experimental] - -To import a `GGUF` model you've downloaded outside of LM Studio, run the following command in your terminal: - -```bash -lms import -``` - -Follow the interactive prompt to complete the import process. [#follow-the-interactive-prompt-to-complete-the-import-process] - -LM Studio's expected models directory structure [#lm-studios-expected-models-directory-structure] - - - -LM Studio aims to preserves the directory structure of models downloaded from Hugging Face. The expected directory structure is as follows: - -```xml -~/.lmstudio/models/ -└── publisher/ - └── model/ - └── model-file.gguf -``` - -For example, if you have a model named `ocelot-v1` published by `infra-ai`, the structure would look like this: - -```xml -~/.lmstudio/models/ -└── infra-ai/ - └── ocelot-v1/ - └── ocelot-v1-instruct-q4_0.gguf -``` - -
- -Community [#community] - -Chat with other LM Studio users, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). - - - - -When loading a model, you can now set Max Concurrent Predictions to allow multiple requests to be processed in parallel, instead of queued. This is supported for LM Studio's llama.cpp engine, with MLX coming soon. - -Please make sure your GGUF runtime is upgraded to llama.cpp v2.0.0. - -
- -Parallel Requests via Continuous Batching [#parallel-requests-via-continuous-batching] - -Parallel requests via continuous batching allows the LM Studio server to dynamically combine multiple requests into a single batch. This enables concurrent workflows and results in higher throughput. - -Setting Max Concurrent Predictions [#setting-max-concurrent-predictions] - -Open the model loader and toggle on Manually choose model load parameters. Select a model to load, and toggle on Show advanced settings to set Max Concurrent Predictions. By default, Max Concurrent Predictions is set to 4. - -Sending parallel requests to chats in Split View [#sending-parallel-requests-to-chats-in-split-view] - -Use the [split view in chat feature](/docs/basics/chat) to send two requests simultaneously to two chats and view them side by side. - - - - - - -`Advanced` - -You can set default load settings for each model in LM Studio. - -When the model is loaded anywhere in the app (including through [`lms load`](/docs/cli#load-a-model-with-options)) these settings will be used. - -
- -Setting default parameters for a model [#setting-default-parameters-for-a-model] - -Head to the My Models tab and click on the gear ⚙️ icon to edit the model's default parameters. - - - -This will open a dialog where you can set the default parameters for the model. - - - -Next time you load the model, these settings will be used. - - - Reasons to set default load parameters (not required, totally optional) [#reasons-to-set-default-load-parameters-not-required-totally-optional] - - * Set a particular GPU offload settings for a given model - * Set a particular context size for a given model - * Whether or not to utilize Flash Attention for a given model - - -Advanced Topics [#advanced-topics] - -Changing load settings before loading a model [#changing-load-settings-before-loading-a-model] - -When you load a model, you can optionally change the default load settings. - - - -Saving your changes as the default settings for a model [#saving-your-changes-as-the-default-settings-for-a-model] - -If you make changes to load settings when you load a model, you can save them as the default settings for that model. - - - -
- -Community [#community] - -Chat with other LM Studio power users, discuss configs, models, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). - - - - -`Advanced` - -By default, LM Studio will automatically configure the prompt template based on the model file's metadata. - -However, you can customize the prompt template for any model. - -
- -Overriding the Prompt Template for a Specific Model [#overriding-the-prompt-template-for-a-specific-model] - -Head over to the My Models tab and click on the gear ⚙️ icon to edit the model's default parameters. - -Pro tip: you can jump to the My Models tab from anywhere by pressing `⌘` + `3` on Mac, or `ctrl` + `3` on Windows / Linux. [#pro-tip-you-can-jump-to-the-my-models-tab-from-anywhere-by-pressing---3-on-mac-or-ctrl--3-on-windows--linux] - -Customize the Prompt Template [#customize-the-prompt-template] - -💡 In most cases you don't need to change the prompt template [#-in-most-cases-you-dont-need-to-change-the-prompt-template] - -When a model doesn't come with a prompt template information, LM Studio will surface the `Prompt Template` config box in the **🧪 Advanced Configuration** sidebar. - - - -You can make this config box always show up by right clicking the sidebar and selecting **Always Show Prompt Template**. - -Prompt template options [#prompt-template-options] - -Jinja Template [#jinja-template] - -You can express the prompt template in Jinja. - -Jinja is a templating engine used to encode the prompt template in several popular LLM model file formats. [#jinja-is-a-templating-engine-used-to-encode-the-prompt-template-in-several-popular-llm-model-file-formats] - -Manual [#manual] - -You can also express the prompt template manually by specifying message role prefixes and suffixes. - -
- -Reasons you might want to edit the prompt template: [#reasons-you-might-want-to-edit-the-prompt-template] - -1. The model's metadata is incorrect, incomplete, or LM Studio doesn't recognize it -2. The model does not have a prompt template in its metadata (e.g. custom or older models) -3. You want to customize the prompt template for a specific use case - - - - -`Advanced` - -Speculative decoding is a technique that can substantially increase the generation speed of large language models (LLMs) without reducing response quality. - -
- -What is Speculative Decoding [#what-is-speculative-decoding] - -Speculative decoding relies on the collaboration of two models: - -* A larger, "main" model -* A smaller, faster "draft" model - -During generation, the draft model rapidly proposes potential tokens (subwords), which the main model can verify faster than it would take it to generate them from scratch. To maintain quality, the main model only accepts tokens that match what it would have generated. After the last accepted draft token, the main model always generates one additional token. - -For a model to be used as a draft model, it must have the same "vocabulary" as the main model. - -How to enable Speculative Decoding [#how-to-enable-speculative-decoding] - -On `Power User` mode or higher, load a model, then select a `Draft Model` within the `Speculative Decoding` section of the chat sidebar: - - - -Finding compatible draft models [#finding-compatible-draft-models] - -You might see the following when you open the dropdown: - - - -Try to download a lower parameter variant of the model you have loaded, if it exists. If no smaller versions of your model exist, find a pairing that does. - -For example: - -
- -| Main Model | Draft Model | -| :--------------------------: | :---------------------------: | -| Llama 3.1 8B Instruct | Llama 3.2 1B Instruct | -| Qwen 2.5 14B Instruct | Qwen 2.5 0.5B Instruct | -| DeepSeek R1 Distill Qwen 32B | DeepSeek R1 Distill Qwen 1.5B | - -
- -Once you have both a main and draft model loaded, simply begin chatting to enable speculative decoding. - -Key factors affecting performance [#key-factors-affecting-performance] - -Speculative decoding speed-up is generally dependent on two things: - -1. How small and fast the *draft model* is compared with the *main model* -2. How often the draft model is able to make "good" suggestions - -In simple terms, you want to choose a draft model that's much smaller than the main model. And some prompts will work better than others. - -An important trade-off [#an-important-trade-off] - -Running a draft model alongside a main model to enable speculative decoding requires more **computation and resources** than running the main model on its own. - -The key to faster generation of the main model is choosing a draft model that's both small and capable enough. - -Here are general guidelines for the **maximum** draft model size you should select based on main model size (in parameters): - -
- -| Main Model Size | Max Draft Model Size to Expect Speed-Ups | -| :-------------: | :--------------------------------------: | -| 3B | - | -| 7B | 1B | -| 14B | 3B | -| 32B | 7B | - -
- -Generally, the larger the size difference is between the main model and the draft model, the greater the speed-up. - -Note: if the draft model is not fast enough or effective enough at making "good" suggestions to the main model, the generation speed will not increase, and could actually decrease. - -Prompt dependent [#prompt-dependent] - -One thing you will likely notice when using speculative decoding is that the generation speed is not consistent across all prompts. - -The reason that the speed-up is not consistent across all prompts is because for some prompts, the draft model is less likely to make "good" suggestions to the main model. - -Here are some extreme examples that illustrate this concept: - -1\. Discrete Example: Mathematical Question [#1-discrete-example-mathematical-question] - -Prompt: "What is the quadratic equation formula?" - -In this case, both a 70B model and a 0.5B model are both very likely to give the standard formula `x = (-b ± √(b² - 4ac))/(2a)`. So if the draft model suggested this formula as the next tokens, the target model would likely accept it, making this an ideal case for speculative decoding to work efficiently. - -2\. Creative Example: Story Generation [#2-creative-example-story-generation] - -Prompt: "Write a story that begins: 'The door creaked open...'" - -In this case, the smaller model's draft tokens are likely be rejected more often by the larger model, as each next word could branch into countless valid possibilities. - -While "4" is the only reasonable answer to "2+2", this story could continue with "revealing a monster", "as the wind howled", "and Sarah froze", or hundreds of other perfectly valid continuations, making the smaller model's specific word predictions much less likely to match the larger -model's choices. - - - - -Requires LM Studio 0.4.0 or newer. [#requires-lm-studio-040-or-newer] - -LM Studio supports API Tokens for authentication, providing a secure and convenient way to access the LM Studio API. - -Require Authentication for each request [#require-authentication-for-each-request] - -By default, LM Studio does not require authentication for API requests. To enable authentication so that only requests with a valid API Token are accepted, toggle the switch in the Developers Page > Server Settings. - - - Once enabled, all requests made through the REST API, Python SDK, or Typescript SDK will need to include a valid API Token. See usage [below](#api-token-usage). - - - - - - -Creating API Tokens [#creating-api-tokens] - -To create API Tokens, click on Manage Tokens in the Server Settings. It will open the API Tokens modal where you can create, view, and delete API Tokens. - - - -Create a token by clicking on the Create Token button. Provide a name for the token and select the desired permissions. - - - -Once created, make sure to copy the token as it will not be shown again. - - - -Configuring API Token Permissions [#configuring-api-token-permissions] - -To edit the permissions of an existing API Token, click on the Edit button next to the token in the API Tokens modal. You can modify the name and permissions of the token. - - - -API Token Usage [#api-token-usage] - -Using API Tokens with REST API: [#using-api-tokens-with-rest-api] - - - The example below requires [allowing calling servers from mcp.json](/docs/developer/core/server/settings) to be enabled and the [Playwright MCP](https://github.com/microsoft/playwright-mcp) in mcp.json. - - -```bash -curl -X POST \ - http://localhost:1234/api/v1/chat \ - -H "Authorization: Bearer $LM_API_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "model": "ibm/granite-4-micro", - "input": "Open lmstudio.ai", - "integrations": [ - { - "type": "plugin", - "id": "mcp/playwright", - "allowed_tools": ["browser_navigate"] - } - ], - "context_length": 8000 - }' -``` - -Using API Tokens with Python SDK [#using-api-tokens-with-python-sdk] - -To use API tokens with the Python SDK, see the [Python SDK guide](/docs/python/getting-started/authentication). - -Using API Tokens with TypeScript SDK [#using-api-tokens-with-typescript-sdk] - -To use API tokens with the TypeScript SDK, see the [TS SDK guide](/docs/typescript/authentication). - - - - -LM Studio can be run as a background service without the GUI. There are two ways to do this: - -1. **llmster** (recommended) — a standalone daemon, no GUI required -2. **Desktop app in headless mode** — hide the UI and run the desktop app as a service - -Option 1: llmster (recommended) [#option-1-llmster-recommended] - -llmster is the core of the LM Studio desktop app, packaged to be server-native, without reliance on the GUI. It can run on Linux boxes, cloud servers, GPU rigs, or your local machine without the GUI. See the [LM Studio 0.4.0 release post](/blog/0.4.0) for more details. - -llmster - -Install llmster [#install-llmster] - -**Linux / Mac** - -```bash -curl -fsSL https://lmstudio.ai/install.sh | bash -``` - -**Windows** - -```bash -irm https://lmstudio.ai/install.ps1 | iex -``` - -Start llmster [#start-llmster] - -```bash -lms daemon up -``` - -See the [daemon CLI docs](/docs/cli/daemon/daemon-up) for full reference. - -For setting up llmster as a startup task on Linux, see [Linux Startup Task](/docs/developer/core/headless_llmster). - -Option 2: Desktop app in headless mode [#option-2-desktop-app-in-headless-mode] - -This works on Mac, Windows, and Linux machines with a graphical user interface. It's useful if you already have the desktop app installed and want it to run as a background service. - -Run the LLM service on machine login [#run-the-llm-service-on-machine-login] - -Head to app settings (`Cmd` / `Ctrl` + `,`) and check the box to run the LLM server on login. - - - -When this setting is enabled, exiting the app will minimize it to the system tray, and the LLM server will continue to run in the background. - -Auto Server Start [#auto-server-start] - -Your last server state will be saved and restored on app or service launch. - -To achieve this programmatically: - -```bash -lms server start -``` - -Just-In-Time (JIT) model loading for REST endpoints [#just-in-time-jit-model-loading-for-rest-endpoints] - -Applies to both options. Useful when using LM Studio as an LLM service with other frontends or applications. - - - -When JIT loading is ON: [#when-jit-loading-is-on] - -* Calls to OpenAI-compatible `/v1/models` will return all downloaded models, not only the ones loaded into memory -* Calls to inference endpoints will load the model into memory if it's not already loaded - -When JIT loading is OFF: [#when-jit-loading-is-off] - -* Calls to OpenAI-compatible `/v1/models` will return only the models loaded into memory -* You have to first load the model into memory before being able to use it - -What about auto unloading? [#what-about-auto-unloading] - -JIT loaded models will be auto-unloaded from memory by default after a set period of inactivity ([learn more](/docs/developer/core/ttl-and-auto-evict)). - -Community [#community] - -Chat with other LM Studio developers, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). - -Please report bugs and issues in the [lmstudio-bug-tracker](https://github.com/lmstudio-ai/lmstudio-bug-tracker/issues) GitHub repository. - - - - -`llmster`, LM Studio's headless daemon, can be configured to run on startup. This guide covers setting up `llmster` to launch, load a model, and start an HTTP server automatically using `systemctl` on Linux. - - - This guide is for Linux systems without a graphical interface. For machines with a GUI, you can configure LM Studio to [run as a service on login](/docs/developer/core/headless) instead. - - -Install the Daemon [#install-the-daemon] - -Run the following command to install `llmster`: - -```bash -curl -fsSL https://lmstudio.ai/install.sh | bash -``` - -Verify the installation: - -```bash -lms --help -``` - -Download a Model [#download-a-model] - -Download a model to use with the server: - -```bash -lms get openai/gpt-oss-20b -``` - -The output will show the model path. You'll need this for the systemd configuration. - -Manual Test [#manual-test] - -Before configuring systemd, verify everything works manually. - -Load the model: - -```bash -lms load openai/gpt-oss-20b -``` - -Start the server: - -```bash -lms server start -``` - -Verify the API is responding: - -```bash -curl http://localhost:1234/v1/models -``` - -Stop the server when done testing: - -```bash -lms server stop -``` - -Create Systemd Service [#create-systemd-service] - -Create `/etc/systemd/system/lmstudio.service`. Replace `YOUR_USERNAME` with your username. - -```ini -[Unit] -Description=LM Studio Server - -[Service] -Type=oneshot -RemainAfterExit=yes -User=YOUR_USERNAME -Environment="HOME=/home/YOUR_USERNAME" -ExecStartPre=/home/YOUR_USERNAME/.lmstudio/bin/lms daemon up -ExecStartPre=/home/YOUR_USERNAME/.lmstudio/bin/lms load openai/gpt-oss-20b --yes -ExecStart=/home/YOUR_USERNAME/.lmstudio/bin/lms server start -ExecStop=/home/YOUR_USERNAME/.lmstudio/bin/lms daemon down - -[Install] -WantedBy=multi-user.target -``` - -This unit automatically loads the `openai/gpt-oss-20b` model on startup. Alternatively, you can avoid loading a specific model on startup and instead rely on [Just-In-Time (JIT) loading and Eviction](/docs/developer/core/ttl-and-auto-evict) in the server. - -Enable and Start the Service [#enable-and-start-the-service] - -```bash -sudo systemctl daemon-reload -sudo systemctl enable lmstudio.service -sudo systemctl start lmstudio.service -``` - -Verify [#verify] - -Check the service status: - -```bash -systemctl status lmstudio -``` - -Test the API: - -```bash -curl http://localhost:1234/v1/models -``` - -Service Management [#service-management] - -```bash -# Stop the service -sudo systemctl stop lmstudio - -# Restart the service -sudo systemctl restart lmstudio - -# Disable auto-start -sudo systemctl disable lmstudio -``` - -Community [#community] - -Chat with other LM Studio developers, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). - -Please report bugs and issues in the [lmstudio-bug-tracker](https://github.com/lmstudio-ai/lmstudio-bug-tracker/issues) GitHub repository. - - - - -Overview [#overview] - -With [LM Link](/docs/lmlink), you can use a model loaded on a remote device as if it were loaded locally — from any machine on the same link. This naturally extends to the REST API and SDK: your laptop can make requests to `localhost` and have them served by a powerful remote machine on your network. - -Requests to `localhost` still work as normal. LM Studio internally uses the model on the remote device as if it were loaded locally. For models present on multiple devices, the REST API will use the model on the preferred device. - - - -The preferred device setting is per-machine. Each device on the link independently controls which remote machine it prefers. See [how to set a preferred device](/docs/lmlink/basics/preferred-device) for more details. - -Use the REST API as normal [#use-the-rest-api-as-normal] - -Use the REST API exactly as you would locally. See the [REST API docs](/docs/developer/rest) for usage details. - -If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) - - - - -Requires LM Studio 0.4.0 or newer. [#requires-lm-studio-040-or-newer] - -LM Studio supports Model Context Protocol (MCP) usage via API. MCP allows models to interact with external tools and services through standardized servers. - -How it works [#how-it-works] - -MCP servers provide tools that models can call during chat requests. You can enable MCP servers in two ways: as ephemeral servers defined per-request, or as pre-configured servers in your `mcp.json` file. - -Ephemeral vs mcp.json servers [#ephemeral-vs-mcpjson-servers] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Feature - - Ephemeral - - mcp.json -
- How to specify in request - - integrations - - -> - - "type": "ephemeral_mcp" - - integrations - - -> - - "type": "plugin" -
- Configuration - - Only defined per-request - - Pre-configured in - - mcp.json -
- Use case - - One-off requests, remote MCP tool execution - - MCP servers that require - - command - - , frequently used servers -
- Server ID - - Specified via - - server_label - - in integration - - Specified via - - id - - (e.g., - - mcp/playwright - - ) in integration -
- Custom headers - - Supported via - - headers - - field - - Configured in - - mcp.json -
- -Ephemeral MCP servers [#ephemeral-mcp-servers] - -Ephemeral MCP servers are defined on-the-fly in each request. This is useful for testing or when you don't want to pre-configure servers. - - - Ephemeral MCP servers require the "Allow per-request MCPs" setting to be enabled in [Server Settings](/docs/developer/core/server/settings). - - - - - - curl - - - - Python - - - - TypeScript - - - - - ```bash - curl http://localhost:1234/api/v1/chat \ - -H "Authorization: Bearer $LM_API_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "model": "ibm/granite-4-micro", - "input": "What is the top trending model on hugging face?", - "integrations": [ - { - "type": "ephemeral_mcp", - "server_label": "huggingface", - "server_url": "https://huggingface.co/mcp", - "allowed_tools": ["model_search"] - } - ], - "context_length": 8000 - }' - ``` - - - - ```python - import os - import requests - import json - - response = requests.post( - "http://localhost:1234/api/v1/chat", - headers={ - "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", - "Content-Type": "application/json" - }, - json={ - "model": "ibm/granite-4-micro", - "input": "What is the top trending model on hugging face?", - "integrations": [ - { - "type": "ephemeral_mcp", - "server_label": "huggingface", - "server_url": "https://huggingface.co/mcp", - "allowed_tools": ["model_search"] - } - ], - "context_length": 8000 - } - ) - print(json.dumps(response.json(), indent=2)) - ``` - - - - ```typescript - const response = await fetch("http://localhost:1234/api/v1/chat", { - method: "POST", - headers: { - "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, - "Content-Type": "application/json" - }, - body: JSON.stringify({ - "model": "ibm/granite-4-micro", - "input": "What is the top trending model on hugging face?", - "integrations": [ - { - "type": "ephemeral_mcp", - "server_label": "huggingface", - "server_url": "https://huggingface.co/mcp", - "allowed_tools": ["model_search"] - } - ], - "context_length": 8000 - }); - const data = await response.json(); - console.log(data); - ``` - - - -The model can now call tools from the specified MCP server: - -```json -{ - "model_instance_id": "ibm/granite-4-micro", - "output": [ - { - "type": "reasoning", - "content": "..." - }, - { - "type": "message", - "content": "..." - }, - { - "type": "tool_call", - "tool": "model_search", - "arguments": { - "sort": "trendingScore", - "limit": 1 - }, - "output": "...", - "provider_info": { - "server_label": "huggingface", - "type": "ephemeral_mcp" - } - }, - { - "type": "reasoning", - "content": "\n" - }, - { - "type": "message", - "content": "The top trending model is ..." - } - ], - "stats": { - "input_tokens": 419, - "total_output_tokens": 362, - "reasoning_output_tokens": 195, - "tokens_per_second": 27.620159487314744, - "time_to_first_token_seconds": 1.437 - }, - "response_id": "resp_7c1a08e3d6e279efcfecb02df9de7cbd316e93422d0bb5cb" -} -``` - -MCP servers from mcp.json [#mcp-servers-from-mcpjson] - -MCP servers can be pre-configured in your `mcp.json` file. This is the recommended approach for using MCP servers that take actions on your computer (like [microsoft/playwright-mcp](https://github.com/microsoft/playwright-mcp)) and servers that you use frequently. - - - MCP servers from mcp.json require the "Allow calling servers from mcp.json" setting to be enabled in [Server Settings](/docs/developer/core/server/settings). - - - - - - - - curl - - - - Python - - - - TypeScript - - - - - ```bash - curl http://localhost:1234/api/v1/chat \ - -H "Authorization: Bearer $LM_API_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "model": "ibm/granite-4-micro", - "input": "Open lmstudio.ai", - "integrations": ["mcp/playwright"], - "context_length": 8000, - "temperature": 0 - }' - ``` - - - - ```python - import os - import requests - import json - - response = requests.post( - "http://localhost:1234/api/v1/chat", - headers={ - "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", - "Content-Type": "application/json" - }, - json={ - "model": "ibm/granite-4-micro", - "input": "Open lmstudio.ai", - "integrations": ["mcp/playwright"], - "context_length": 8000, - "temperature": 0 - } - ) - print(json.dumps(response.json(), indent=2)) - ``` - - - - ```typescript - const response = await fetch("http://localhost:1234/api/v1/chat", { - method: "POST", - headers: { - "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, - "Content-Type": "application/json" - }, - body: JSON.stringify({ - model: "ibm/granite-4-micro", - input: "Open lmstudio.ai", - integrations: ["mcp/playwright"], - context_length: 8000, - temperature: 0 - }) - }); - const data = await response.json(); - console.log(data); - ``` - - - -The response includes tool calls from the configured MCP server: - -```json -{ - "model_instance_id": "ibm/granite-4-micro", - "output": [ - { - "type": "reasoning", - "content": "..." - }, - { - "type": "message", - "content": "..." - }, - { - "type": "tool_call", - "tool": "browser_navigate", - "arguments": { - "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" - }, - "output": "...", - "provider_info": { - "plugin_id": "mcp/playwright", - "type": "plugin" - } - }, - { - "type": "reasoning", - "content": "..." - }, - { - "type": "message", - "content": "The YouTube video page for ..." - } - ], - "stats": { - "input_tokens": 2614, - "total_output_tokens": 594, - "reasoning_output_tokens": 389, - "tokens_per_second": 26.293245822877495, - "time_to_first_token_seconds": 0.154 - }, - "response_id": "resp_cdac6a9b5e2a40027112e441ce6189db18c9040f96736407" -} -``` - -Restricting tool access [#restricting-tool-access] - -For both ephemeral and mcp.json servers, you can limit which tools the model can call using the `allowed_tools` field. This is useful if you do not want certain tools from an MCP server to be used, and can speed up prompt processing due to the model receiving fewer tool definitions. - - - - - curl - - - - Python - - - - TypeScript - - - - - ```bash - curl http://localhost:1234/api/v1/chat \ - -H "Authorization: Bearer $LM_API_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "model": "ibm/granite-4-micro", - "input": "What is the top trending model on hugging face?", - "integrations": [ - { - "type": "ephemeral_mcp", - "server_label": "huggingface", - "server_url": "https://huggingface.co/mcp", - "allowed_tools": ["model_search"] - } - ], - "context_length": 8000 - }' - ``` - - - - ```python - import os - import requests - import json - - response = requests.post( - "http://localhost:1234/api/v1/chat", - headers={ - "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", - "Content-Type": "application/json" - }, - json={ - "model": "ibm/granite-4-micro", - "input": "What is the top trending model on hugging face?", - "integrations": [ - { - "type": "ephemeral_mcp", - "server_label": "huggingface", - "server_url": "https://huggingface.co/mcp", - "allowed_tools": ["model_search"] - } - ], - "context_length": 8000 - } - ) - print(json.dumps(response.json(), indent=2)) - ``` - - - - ```typescript - const response = await fetch("http://localhost:1234/api/v1/chat", { - method: "POST", - headers: { - "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, - "Content-Type": "application/json" - }, - body: JSON.stringify({ - model: "ibm/granite-4-micro", - input: "What is the top trending model on hugging face?", - integrations: [ - { - type: "ephemeral_mcp", - server_label: "huggingface", - server_url: "https://huggingface.co/mcp", - allowed_tools: ["model_search"] - } - ], - context_length: 8000 - }) - }); - const data = await response.json(); - console.log(data); - ``` - - - -If `allowed_tools` is not provided, all tools from the server are available to the model. - -Custom headers for ephemeral servers [#custom-headers-for-ephemeral-servers] - -When using ephemeral MCP servers that require authentication, you can pass custom headers: - - - - - curl - - - - Python - - - - TypeScript - - - - - ```bash - curl http://localhost:1234/api/v1/chat \ - -H "Authorization: Bearer $LM_API_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "model": "ibm/granite-4-micro", - "input": "Give me details about my SUPER-SECRET-PRIVATE Hugging face model", - "integrations": [ - { - "type": "ephemeral_mcp", - "server_label": "huggingface", - "server_url": "https://huggingface.co/mcp", - "allowed_tools": ["model_search"], - "headers": { - "Authorization": "Bearer " - } - } - ], - "context_length": 8000 - }' - ``` - - - - ```python - import os - import requests - import json - - response = requests.post( - "http://localhost:1234/api/v1/chat", - headers={ - "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", - "Content-Type": "application/json" - }, - json={ - "model": "ibm/granite-4-micro", - "input": "Give me details about my SUPER-SECRET-PRIVATE Hugging face model", - "integrations": [ - { - "type": "ephemeral_mcp", - "server_label": "huggingface", - "server_url": "https://huggingface.co/mcp", - "allowed_tools": ["model_search"], - "headers": { - "Authorization": "Bearer " - } - } - ], - "context_length": 8000 - } - ) - print(json.dumps(response.json(), indent=2)) - ``` - - - - ```typescript - const response = await fetch("http://localhost:1234/api/v1/chat", { - method: "POST", - headers: { - "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, - "Content-Type": "application/json" - }, - body: JSON.stringify({ - model: "ibm/granite-4-micro", - input: "Give me details about my SUPER-SECRET-PRIVATE Hugging face model", - integrations: [ - { - type: "ephemeral_mcp", - server_label: "huggingface", - server_url: "https://huggingface.co/mcp", - allowed_tools: ["model_search"], - headers: { - Authorization: "Bearer " - } - } - ], - context_length: 8000 - }) - const data = await response.json(); - console.log(data); - ``` - - - - - - -Background [#background] - -* `JIT loading` makes it easy to use your LM Studio models in other apps: you don't need to manually load the model first before being able to use it. However, this also means that models can stay loaded in memory even when they're not being used. `[Default: enabled]` - -* (New) `Idle TTL` (technically: Time-To-Live) defines how long a model can stay loaded in memory without receiving any requests. When the TTL expires, the model is automatically unloaded from memory. You can set a TTL using the `ttl` field in your request payload. `[Default: 60 minutes]` - -* (New) `Auto-Evict` is a feature that unloads previously JIT loaded models before loading new ones. This enables easy switching between models from client apps without having to manually unload them first. You can enable or disable this feature in Developer tab > Server Settings. `[Default: enabled]` - -Idle TTL [#idle-ttl] - -**Use case**: imagine you're using an app like [Zed](https://github.com/zed-industries/zed/blob/main/crates/lmstudio/src/lmstudio.rs#L340), [Cline](https://github.com/cline/cline/blob/main/src/api/providers/lmstudio.ts), or [Continue.dev](https://docs.continue.dev/customize/model-providers/more/lmstudio) to interact with LLMs served by LM Studio. These apps leverage JIT to load models on-demand the first time you use them. - -**Problem**: When you're not actively using a model, you might don't want it to remain loaded in memory. - -**Solution**: Set a TTL for models loaded via API requests. The idle timer resets every time the model receives a request, so it won't disappear while you use it. A model is considered idle if it's not doing any work. When the idle TTL expires, the model is automatically unloaded from memory. - -Set App-default Idle TTL [#set-app-default-idle-ttl] - -By default, JIT-loaded models have a TTL of 60 minutes. You can configure a default TTL value for any model loaded via JIT like so: - - - -Set per-model TTL-model in API requests [#set-per-model-ttl-model-in-api-requests] - -When JIT loading is enabled, the **first request** to a model will load it into memory. You can specify a TTL for that model in the request payload. - -This works for requests targeting both the [OpenAI compatibility API](/docs/developer/openai-api) and the [LM Studio's REST API](/docs/developer/rest): - -```diff -curl http://localhost:1234/api/v0/chat/completions \ - -H "Content-Type: application/json" \ - -d '{ - "model": "deepseek-r1-distill-qwen-7b", -+ "ttl": 300, - "messages": [ ... ] -}' -``` - -This will set a TTL of 5 minutes (300 seconds) for this model if it is JIT loaded. [#this-will-set-a-ttl-of-5-minutes-300-seconds-for-this-model-if-it-is-jit-loaded] - -Set TTL for models loaded with `lms` [#set-ttl-for-models-loaded-with-lms] - -By default, models loaded with `lms load` do not have a TTL, and will remain loaded in memory until you manually unload them. - -You can set a TTL for a model loaded with `lms` like so: - -```bash -lms load --ttl 3600 -``` - -Load a `` with a TTL of 1 hour (3600 seconds) [#load-a-model-with-a-ttl-of-1-hour-3600-seconds] - -Specify TTL when loading models in the server tab [#specify-ttl-when-loading-models-in-the-server-tab] - -You can also set a TTL when loading a model in the server tab like so - - - -Configure Auto-Evict for JIT loaded models [#configure-auto-evict-for-jit-loaded-models] - -With this setting, you can ensure new models loaded via JIT automatically unload previously loaded models first. - -This is useful when you want to switch between models from another app without worrying about memory building up with unused models. - - - -**When Auto-Evict is ON** (default): - -* At most `1` model is kept loaded in memory at a time (when loaded via JIT) -* Non-JIT loaded models are not affected - -**When Auto-Evict is OFF**: - -* Switching models from an external app will keep previous models loaded in memory -* Models will remain loaded until either: - * Their TTL expires - * You manually unload them - -This feature works in tandem with TTL to provide better memory management for your workflow. - -Nomenclature [#nomenclature] - -`TTL`: Time-To-Live, is a term borrowed from networking protocols and cache systems. It defines how long a resource can remain allocated before it's considered stale and evicted. - - - - - - - `POST /api/v1/chat` - - **Request body** - - - - - - - - - Request with MCP - - - - Request with Images - - - - - ```bash - curl http://localhost:1234/api/v1/chat \ - -H "Authorization: Bearer $LM_API_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "model": "ibm/granite-4-micro", - "input": "Tell me the top trending model on hugging face and navigate to https://lmstudio.ai", - "integrations": [ - { - "type": "ephemeral_mcp", - "server_label": "huggingface", - "server_url": "https://huggingface.co/mcp", - "allowed_tools": [ - "model_search" - ] - }, - { - "type": "plugin", - "id": "mcp/playwright", - "allowed_tools": [ - "browser_navigate" - ] - } - ], - "context_length": 8000, - "temperature": 0 - }' - ``` - - - - ```bash - # Image is a small red square encoded as a base64 data URL - curl http://localhost:1234/api/v1/chat \ - -H "Authorization: Bearer $LM_API_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "model": "qwen/qwen3-vl-4b", - "input": [ - { - "type": "text", - "content": "Describe this image in two sentences" - }, - { - "type": "image", - "data_url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAFUlEQVR42mP8z8BQz0AEYBxVSF+FABJADveWkH6oAAAAAElFTkSuQmCC" - } - ], - "context_length": 2048, - "temperature": 0 - }' - ``` - - - - - -*** - - - - **Response fields** - - - - - - - - - Request with MCP - - - - Request with Images - - - - - ```json - { - "model_instance_id": "ibm/granite-4-micro", - "output": [ - { - "type": "tool_call", - "tool": "model_search", - "arguments": { - "sort": "trendingScore", - "query": "", - "limit": 1 - }, - "output": "...", - "provider_info": { - "server_label": "huggingface", - "type": "ephemeral_mcp" - } - }, - { - "type": "message", - "content": "..." - }, - { - "type": "tool_call", - "tool": "browser_navigate", - "arguments": { - "url": "https://lmstudio.ai" - }, - "output": "...", - "provider_info": { - "plugin_id": "mcp/playwright", - "type": "plugin" - } - }, - { - "type": "message", - "content": "**Top Trending Model on Hugging Face** ... Below is a quick snapshot of what’s on the landing page ... more details on the model or LM Studio itself!" - } - ], - "stats": { - "input_tokens": 646, - "total_output_tokens": 586, - "reasoning_output_tokens": 0, - "tokens_per_second": 29.753900615398926, - "time_to_first_token_seconds": 1.088, - "model_load_time_seconds": 2.656 - }, - "response_id": "resp_4ef013eba0def1ed23f19dde72b67974c579113f544086de" - } - ``` - - - - ```json - { - "model_instance_id": "qwen/qwen3-vl-4b", - "output": [ - { - "type": "message", - "content": "This image is a solid, vibrant red square that fills the entire frame, with no discernible texture, pattern, or other elements. It presents a minimalist, uniform visual field of pure red, evoking a sense of boldness or urgency." - } - ], - "stats": { - "input_tokens": 17, - "total_output_tokens": 50, - "reasoning_output_tokens": 0, - "tokens_per_second": 51.03762685242662, - "time_to_first_token_seconds": 0.814 - }, - "response_id": "resp_0182bd7c479d7451f9a35471f9c26b34de87a7255856b9a4" - } - ``` - - - - - - - - - - - `GET /api/v1/models/download/status/:job_id` - - **Path parameters** - - - - - - ```bash title="Example Request" - curl -H "Authorization: Bearer $LM_API_TOKEN" \ - http://localhost:1234/api/v1/models/download/status/job_493c7c9ded - ``` - - - - - - **Response fields** - - Returns a single download job status object. The response varies based on the download status. - - - - - - ```json title="Response" - { - "job_id": "job_493c7c9ded", - "status": "completed", - "total_size_bytes": 2279145003, - "downloaded_bytes": 2279145003, - "started_at": "2025-10-03T15:33:23.496Z", - "completed_at": "2025-10-03T15:43:12.102Z" - } - ``` - - - - - - - - - `POST /api/v1/models/download` - - **Request body** - - - - - - ```bash title="Example Request" - curl http://localhost:1234/api/v1/models/download \ - -H "Authorization: Bearer $LM_API_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "model": "ibm/granite-4-micro" - }' - ``` - - - - - - **Response fields** - - Returns a download job status object. The response varies based on the download status. - - - - - - ```json title="Response" - { - "job_id": "job_493c7c9ded", - "status": "downloading", - "total_size_bytes": 2279145003, - "started_at": "2025-10-03T15:33:23.496Z" - } - ``` - - - - - - - - LM Studio now has a [v1 REST API](/docs/developer/rest)! We recommend using the v1 API for new projects! - - -Requires LM Studio 0.3.6 or newer. [#requires-lm-studio-036-or-newer] - -LM Studio now has its own REST API, in addition to OpenAI-compatible endpoints ([learn more](/docs/developer/openai-compat)) and Anthropic-compatible endpoints ([learn more](/docs/developer/anthropic-compat)). - -The REST API includes enhanced stats such as Token / Second and Time To First Token (TTFT), as well as rich information about models such as loaded vs unloaded, max context, quantization, and more. - -Supported API Endpoints [#supported-api-endpoints] - -* [`GET /api/v0/models`](#get-apiv0models) - List available models -* [`GET /api/v0/models/{model}`](#get-apiv0modelsmodel) - Get info about a specific model -* [`POST /api/v0/chat/completions`](#post-apiv0chatcompletions) - Chat Completions (messages -> assistant response) -* [`POST /api/v0/completions`](#post-apiv0completions) - Text Completions (prompt -> completion) -* [`POST /api/v0/embeddings`](#post-apiv0embeddings) - Text Embeddings (text -> embedding) - -*** - -Start the REST API server [#start-the-rest-api-server] - -To start the server, run the following command: - -```bash -lms server start -``` - - - You can run LM Studio as a service and get the server to auto-start on boot without launching the GUI. [Learn about Headless Mode](/docs/developer/core/headless). - - -Endpoints [#endpoints] - -`GET /api/v0/models` [#get-apiv0models] - -List all loaded and downloaded models - -**Example request** - -```bash -curl -H "Authorization: Bearer $LM_API_TOKEN" http://localhost:1234/api/v0/models -``` - -**Response format** - -```json -{ - "object": "list", - "data": [ - { - "id": "qwen2-vl-7b-instruct", - "object": "model", - "type": "vlm", - "publisher": "mlx-community", - "arch": "qwen2_vl", - "compatibility_type": "mlx", - "quantization": "4bit", - "state": "not-loaded", - "max_context_length": 32768 - }, - { - "id": "meta-llama-3.1-8b-instruct", - "object": "model", - "type": "llm", - "publisher": "lmstudio-community", - "arch": "llama", - "compatibility_type": "gguf", - "quantization": "Q4_K_M", - "state": "not-loaded", - "max_context_length": 131072 - }, - { - "id": "text-embedding-nomic-embed-text-v1.5", - "object": "model", - "type": "embeddings", - "publisher": "nomic-ai", - "arch": "nomic-bert", - "compatibility_type": "gguf", - "quantization": "Q4_0", - "state": "not-loaded", - "max_context_length": 2048 - } - ] -} -``` - -*** - -`GET /api/v0/models/{model}` [#get-apiv0modelsmodel] - -Get info about one specific model - -**Example request** - -```bash -curl -H "Authorization: Bearer $LM_API_TOKEN" http://localhost:1234/api/v0/models/qwen2-vl-7b-instruct -``` - -**Response format** - -```json -{ - "id": "qwen2-vl-7b-instruct", - "object": "model", - "type": "vlm", - "publisher": "mlx-community", - "arch": "qwen2_vl", - "compatibility_type": "mlx", - "quantization": "4bit", - "state": "not-loaded", - "max_context_length": 32768 -} -``` - -*** - -`POST /api/v0/chat/completions` [#post-apiv0chatcompletions] - -Chat Completions API. You provide a messages array and receive the next assistant response in the chat. - -**Example request** - -```bash -curl http://localhost:1234/api/v0/chat/completions \ - -H "Authorization: Bearer $LM_API_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "model": "granite-3.0-2b-instruct", - "messages": [ - { "role": "system", "content": "Always answer in rhymes." }, - { "role": "user", "content": "Introduce yourself." } - ], - "temperature": 0.7, - "max_tokens": -1, - "stream": false - }' -``` - -**Response format** - -```json -{ - "id": "chatcmpl-i3gkjwthhw96whukek9tz", - "object": "chat.completion", - "created": 1731990317, - "model": "granite-3.0-2b-instruct", - "choices": [ - { - "index": 0, - "logprobs": null, - "finish_reason": "stop", - "message": { - "role": "assistant", - "content": "Greetings, I'm a helpful AI, here to assist,\nIn providing answers, with no distress.\nI'll keep it short and sweet, in rhyme you'll find,\nA friendly companion, all day long you'll bind." - } - } - ], - "usage": { - "prompt_tokens": 24, - "completion_tokens": 53, - "total_tokens": 77 - }, - "stats": { - "tokens_per_second": 51.43709529007664, - "time_to_first_token": 0.111, - "generation_time": 0.954, - "stop_reason": "eosFound" - }, - "model_info": { - "arch": "granite", - "quant": "Q4_K_M", - "format": "gguf", - "context_length": 4096 - }, - "runtime": { - "name": "llama.cpp-mac-arm64-apple-metal-advsimd", - "version": "1.3.0", - "supported_formats": ["gguf"] - } -} -``` - -*** - -`POST /api/v0/completions` [#post-apiv0completions] - -Text Completions API. You provide a prompt and receive a completion. - -**Example request** - -```bash -curl http://localhost:1234/api/v0/completions \ - -H "Authorization: Bearer $LM_API_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "model": "granite-3.0-2b-instruct", - "prompt": "the meaning of life is", - "temperature": 0.7, - "max_tokens": 10, - "stream": false, - "stop": "\n" - }' -``` - -**Response format** - -```json -{ - "id": "cmpl-p9rtxv6fky2v9k8jrd8cc", - "object": "text_completion", - "created": 1731990488, - "model": "granite-3.0-2b-instruct", - "choices": [ - { - "index": 0, - "text": " to find your purpose, and once you have", - "logprobs": null, - "finish_reason": "length" - } - ], - "usage": { - "prompt_tokens": 5, - "completion_tokens": 9, - "total_tokens": 14 - }, - "stats": { - "tokens_per_second": 57.69230769230769, - "time_to_first_token": 0.299, - "generation_time": 0.156, - "stop_reason": "maxPredictedTokensReached" - }, - "model_info": { - "arch": "granite", - "quant": "Q4_K_M", - "format": "gguf", - "context_length": 4096 - }, - "runtime": { - "name": "llama.cpp-mac-arm64-apple-metal-advsimd", - "version": "1.3.0", - "supported_formats": ["gguf"] - } -} -``` - -*** - -`POST /api/v0/embeddings` [#post-apiv0embeddings] - -Text Embeddings API. You provide a text and a representation of the text as an embedding vector is returned. - -**Example request** - -```bash -curl http://localhost:1234/api/v0/embeddings \ - -H "Authorization: Bearer $LM_API_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "model": "text-embedding-nomic-embed-text-v1.5", - "input": "Some text to embed" - } -``` - -**Example response** - -```json -{ - "object": "list", - "data": [ - { - "object": "embedding", - "embedding": [ - -0.016731496900320053, - 0.028460891917347908, - -0.1407836228609085, - ... (truncated for brevity) ..., - 0.02505224384367466, - -0.0037634256295859814, - -0.04341062530875206 - ], - "index": 0 - } - ], - "model": "text-embedding-nomic-embed-text-v1.5@q4_k_m", - "usage": { - "prompt_tokens": 0, - "total_tokens": 0 - } -} -``` - -*** - -Please report bugs by opening an issue on [Github](https://github.com/lmstudio-ai/lmstudio-bug-tracker/issues). - - - - -LM Studio offers a powerful REST API with first-class support for local inference and model management. In addition to our native API, we provide OpenAI-compatible endpoints ([learn more](/docs/developer/openai-compat)) and Anthropic-compatible endpoints ([learn more](/docs/developer/anthropic-compat)). - -What's new [#whats-new] - -Previously, there was a [v0 REST API](/docs/developer/rest/endpoints). With LM Studio 0.4.0, we have officially released our native v1 REST API at `/api/v1/*` endpoints and recommend using it. - -The v1 REST API includes enhanced features such as: - -* [MCP via API](/docs/developer/core/mcp) -* [Stateful chats](/docs/developer/rest/stateful-chats) -* [Authentication](/docs/developer/core/authentication) configuration with API tokens -* Model [download](/docs/developer/rest/download), [load](/docs/developer/rest/load) and [unload](/docs/developer/rest/unload) endpoints - -Supported endpoints [#supported-endpoints] - -The following endpoints are available in LM Studio's v1 REST API. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Endpoint - - Method - - Docs -
- /api/v1/chat - - - - Chat -
- /api/v1/models - - - - List Models -
- /api/v1/models/load - - - - Load -
- /api/v1/models/unload - - - - Unload -
- /api/v1/models/download - - - - Download -
- /api/v1/models/download/status - - - - Download Status -
- -Inference endpoint comparison [#inference-endpoint-comparison] - -The table below compares the features of LM Studio's `/api/v1/chat` endpoint with OpenAI-compatible and Anthropic-compatible inference endpoints. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Feature - - /api/v1/chat - - /v1/responses - - /v1/chat/completions - - /v1/messages -
- Streaming - - ✅ - - ✅ - - ✅ - - ✅ -
- Stateful chat - - ✅ - - ✅ - - ❌ - - ❌ -
- Remote MCPs - - ✅ - - ✅ - - ❌ - - ❌ -
- MCPs you have in LM Studio - - ✅ - - ✅ - - ❌ - - ❌ -
- Custom tools - - ❌ - - ✅ - - ✅ - - ✅ -
- Include assistant messages in the request - - ❌ - - ✅ - - ✅ - - ✅ -
- Model load streaming events - - ✅ - - ❌ - - ❌ - - ❌ -
- Prompt processing streaming events - - ✅ - - ❌ - - ❌ - - ❌ -
- Specify context length in the request - - ✅ - - ❌ - - ❌ - - ❌ -
- -*** - -Please report bugs by opening an issue on [Github](https://github.com/lmstudio-ai/lmstudio-bug-tracker/issues). - - - - - - - `GET /api/v1/models` - - This endpoint has no request parameters. - - - - ```bash title="Example Request" - curl http://localhost:1234/api/v1/models \ - -H "Authorization: Bearer $LM_API_TOKEN" - ``` - - - -*** - - - - **Response fields** - - - - - - ```json title="Response" - { - "models": [ - { - "type": "llm", - "publisher": "google", - "key": "google/gemma-4-26b-a4b", - "display_name": "Gemma 4 26B A4B", - "architecture": "gemma4", - "quantization": { - "name": "Q4_K_M", - "bits_per_weight": 4 - }, - "size_bytes": 17990911801, - "params_string": "26B-A4B", - "loaded_instances": [ - { - "id": "google/gemma-4-26b-a4b", - "config": { - "context_length": 4096, - "eval_batch_size": 512, - "parallel": 4, - "flash_attention": true, - "num_experts": 8, - "offload_kv_cache_to_gpu": true - } - } - ], - "max_context_length": 262144, - "format": "gguf", - "capabilities": { - "vision": true, - "trained_for_tool_use": true, - "reasoning": { - "allowed_options": [ - "off", - "on" - ], - "default": "on" - } - }, - "description": null, - "variants": [ - "google/gemma-4-26b-a4b@q4_k_m" - ], - "selected_variant": "google/gemma-4-26b-a4b@q4_k_m" - }, - { - "type": "llm", - "publisher": "deepseek", - "key": "deepseek-r1", - "display_name": "DeepSeek R1", - "architecture": "deepseek", - "quantization": { - "name": "Q4_K_M", - "bits_per_weight": 4 - }, - "size_bytes": 40492610355, - "params_string": "671B", - "loaded_instances": [], - "max_context_length": 131072, - "format": "gguf", - "capabilities": { - "vision": false, - "trained_for_tool_use": true, - "reasoning": { - "allowed_options": ["on"], - "default": "on" - } - }, - "description": null - }, - { - "type": "embedding", - "publisher": "gaianet", - "key": "text-embedding-nomic-embed-text-v1.5-embedding", - "display_name": "Nomic Embed Text v1.5", - "quantization": { - "name": "F16", - "bits_per_weight": 16 - }, - "size_bytes": 274290560, - "params_string": null, - "loaded_instances": [], - "max_context_length": 2048, - "format": "gguf" - } - ] - } - ``` - - - - - - - - - `POST /api/v1/models/load` - - **Request body** - - - - - - ```bash title="Example Request" - curl http://localhost:1234/api/v1/models/load \ - -H "Authorization: Bearer $LM_API_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "model": "openai/gpt-oss-20b", - "context_length": 16384, - "flash_attention": true, - "echo_load_config": true - }' - ``` - - - -*** - - - - **Response fields** - - - - - - ```json title="Response" - { - "type": "llm", - "instance_id": "openai/gpt-oss-20b", - "load_time_seconds": 9.099, - "status": "loaded", - "load_config": { - "context_length": 16384, - "eval_batch_size": 512, - "flash_attention": true, - "offload_kv_cache_to_gpu": true, - "num_experts": 4 - } - } - ``` - - - - - - -Start the server [#start-the-server] - -[Install](/download) and launch LM Studio. - -Then ensure the server is running through the toggle at the top left of the Developer page, or through [lms](/docs/cli) in the terminal: - -```bash -lms server start -``` - -By default, the server is available at `http://localhost:1234`. - -If you don't have a model downloaded yet, you can download the model: - -```bash -lms get ibm/granite-4-micro -``` - -API Authentication [#api-authentication] - -By default, the LM Studio API server does **not** require authentication. You can configure the server to require authentication by API token in the [server settings](/docs/developer/core/server/settings) for added security. - -To authenticate API requests, generate an API token from the Developer page in LM Studio, and include it in the `Authorization` header of your requests as follows: `Authorization: Bearer $LM_API_TOKEN`. Read more about authentication [here](/docs/developer/core/authentication). - -Chat with a model [#chat-with-a-model] - -Use the chat endpoint to send a message to a model. By default, the model will be automatically loaded if it is not already. - -The `/api/v1/chat` endpoint is stateful, which means you do not need to pass the full history in every request. Read more about it [here](/docs/developer/rest/stateful-chats). - - - - - curl - - - - Python - - - - TypeScript - - - - - ```bash - curl http://localhost:1234/api/v1/chat \ - -H "Authorization: Bearer $LM_API_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "model": "ibm/granite-4-micro", - "input": "Write a short haiku about sunrise." - }' - ``` - - - - ```python - import os - import requests - import json - - response = requests.post( - "http://localhost:1234/api/v1/chat", - headers={ - "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", - "Content-Type": "application/json" - }, - json={ - "model": "ibm/granite-4-micro", - "input": "Write a short haiku about sunrise." - } - ) - print(json.dumps(response.json(), indent=2)) - ``` - - - - ```typescript - const response = await fetch("http://localhost:1234/api/v1/chat", { - method: "POST", - headers: { - "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, - "Content-Type": "application/json" - }, - body: JSON.stringify({ - model: "ibm/granite-4-micro", - input: "Write a short haiku about sunrise." - }) - }); - const data = await response.json(); - console.log(data); - ``` - - - -See the full [chat](/docs/developer/rest/chat) docs for more details. - -Use MCP servers via API [#use-mcp-servers-via-api] - -Enable the model interact with ephemeral Model Context Protocol (MCP) servers in `/api/v1/chat` by specifying servers in the `integrations` field. - - - - - curl - - - - Python - - - - TypeScript - - - - - ```bash - curl http://localhost:1234/api/v1/chat \ - -H "Authorization: Bearer $LM_API_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "model": "ibm/granite-4-micro", - "input": "What is the top trending model on hugging face?", - "integrations": [ - { - "type": "ephemeral_mcp", - "server_label": "huggingface", - "server_url": "https://huggingface.co/mcp", - "allowed_tools": ["model_search"] - } - ], - "context_length": 8000 - }' - ``` - - - - ```python - import os - import requests - import json - - response = requests.post( - "http://localhost:1234/api/v1/chat", - headers={ - "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", - "Content-Type": "application/json" - }, - json={ - "model": "ibm/granite-4-micro", - "input": "What is the top trending model on hugging face?", - "integrations": [ - { - "type": "ephemeral_mcp", - "server_label": "huggingface", - "server_url": "https://huggingface.co/mcp", - "allowed_tools": ["model_search"] - } - ], - "context_length": 8000 - } - ) - print(json.dumps(response.json(), indent=2)) - ``` - - - - ```typescript - const response = await fetch("http://localhost:1234/api/v1/chat", { - method: "POST", - headers: { - "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, - "Content-Type": "application/json" - }, - body: JSON.stringify({ - model: "ibm/granite-4-micro", - input: "What is the top trending model on hugging face?", - integrations: [ - { - type: "ephemeral_mcp", - server_label: "huggingface", - server_url: "https://huggingface.co/mcp", - allowed_tools: ["model_search"] - } - ], - context_length: 8000 - }) - const data = await response.json(); - console.log(data); - ``` - - - -You can also use locally configured MCP plugins (from your `mcp.json`) via the `integrations` field. Using locally run MCP plugins requires authentication via an API token passed through the `Authorization` header. Read more about authentication [here](/docs/developer/core/authentication). - - - - - curl - - - - Python - - - - TypeScript - - - - - ```bash - curl http://localhost:1234/api/v1/chat \ - -H "Authorization: Bearer $LM_API_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "model": "ibm/granite-4-micro", - "input": "Open lmstudio.ai", - "integrations": [ - { - "type": "plugin", - "id": "mcp/playwright", - "allowed_tools": ["browser_navigate"] - } - ], - "context_length": 8000 - }' - ``` - - - - ```python - import os - import requests - import json - - response = requests.post( - "http://localhost:1234/api/v1/chat", - headers={ - "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", - "Content-Type": "application/json" - }, - json={ - "model": "ibm/granite-4-micro", - "input": "Open lmstudio.ai", - "integrations": [ - { - "type": "plugin", - "id": "mcp/playwright", - "allowed_tools": ["browser_navigate"] - } - ], - "context_length": 8000 - } - ) - print(json.dumps(response.json(), indent=2)) - ``` - - - - ```typescript - const response = await fetch("http://localhost:1234/api/v1/chat", { - method: "POST", - headers: { - "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, - "Content-Type": "application/json" - }, - body: JSON.stringify({ - model: "ibm/granite-4-micro", - input: "Open lmstudio.ai", - integrations: [ - { - type: "plugin", - id: "mcp/playwright", - allowed_tools: ["browser_navigate"] - } - ], - context_length: 8000 - }) - }); - const data = await response.json(); - console.log(data); - ``` - - - -See the full [chat](/docs/developer/rest/chat) docs for more details. - -Download a model [#download-a-model] - -Use the download endpoint to download models by identifier from the [LM Studio model catalog](https://lmstudio.ai/models), or by Hugging Face model URL. - - - - - curl - - - - Python - - - - TypeScript - - - - - ```bash - curl http://localhost:1234/api/v1/models/download \ - -H "Authorization: Bearer $LM_API_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "model": "ibm/granite-4-micro" - }' - ``` - - - - ```python - import os - import requests - import json - - response = requests.post( - "http://localhost:1234/api/v1/models/download", - headers={ - "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", - "Content-Type": "application/json" - }, - json={"model": "ibm/granite-4-micro"} - ) - print(json.dumps(response.json(), indent=2)) - ``` - - - - ```typescript - const response = await fetch("http://localhost:1234/api/v1/models/download", { - method: "POST", - headers: { - "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, - "Content-Type": "application/json" - }, - body: JSON.stringify({ - model: "ibm/granite-4-micro" - }) - }); - const data = await response.json(); - console.log(data); - ``` - - - -The response will return a `job_id` that you can use to track download progress. - - - - - curl - - - - Python - - - - TypeScript - - - - - ```bash - curl -H "Authorization: Bearer $LM_API_TOKEN" \ - http://localhost:1234/api/v1/models/download/status/{job_id} - ``` - - - - ```python - import os - import requests - import json - - job_id = "your-job-id" - response = requests.get( - f"http://localhost:1234/api/v1/models/download/status/{job_id}", - headers={"Authorization": f"Bearer {os.environ['LM_API_TOKEN']}"} - ) - print(json.dumps(response.json(), indent=2)) - ``` - - - - ```typescript - const jobId = "your-job-id"; - const response = await fetch( - `http://localhost:1234/api/v1/models/download/status/${jobId}`, - { - headers: { - "Authorization": `Bearer ${process.env.LM_API_TOKEN}` - } - } - ); - const data = await response.json(); - console.log(data); - ``` - - - -See the [download](/docs/developer/rest/download) and [download status](/docs/developer/rest/download-status) docs for more details. - - - - -The `/api/v1/chat` endpoint is stateful by default. This means you don't need to pass the full conversation history in every request — LM Studio automatically stores and manages the context for you. - -How it works [#how-it-works] - -When you send a chat request, LM Studio stores the conversation in a chat thread and returns a `response_id` in the response. Use this `response_id` in subsequent requests to continue the conversation. - -```bash title="Start a new conversation" -curl http://localhost:1234/api/v1/chat \ - -H "Authorization: Bearer $LM_API_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "model": "ibm/granite-4-micro", - "input": "My favorite color is blue." - }' -``` - -The response includes a `response_id`: - - - Every response includes an unique `response_id` that you can use to reference that specific point in the conversation for future requests. This allows you to branch conversations. - - -```json title="Response" -{ - "model_instance_id": "ibm/granite-4-micro", - "output": [ - { - "type": "message", - "content": "That's great! Blue is a beautiful color..." - } - ], - "response_id": "resp_abc123xyz..." -} -``` - -Continue a conversation [#continue-a-conversation] - -Pass the `previous_response_id` in your next request to continue the conversation. The model will remember the previous context. - -```bash title="Continue the conversation" -curl http://localhost:1234/api/v1/chat \ - -H "Authorization: Bearer $LM_API_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "model": "ibm/granite-4-micro", - "input": "What color did I just mention?", - "previous_response_id": "resp_abc123xyz..." - }' -``` - -The model can reference the previous message without you needing to resend it and will return a new `response_id` for further continuation. - -Disable stateful storage [#disable-stateful-storage] - -If you don't want to store the conversation, set `store` to `false`. The response will not include a `response_id`. - -```bash title="Stateless chat" -curl http://localhost:1234/api/v1/chat \ - -H "Authorization: Bearer $LM_API_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "model": "ibm/granite-4-micro", - "input": "Tell me a joke.", - "store": false - }' -``` - -This is useful for one-off requests where you don't need to maintain context. - - - - -Streaming events let you render chat responses incrementally over Server‑Sent Events (SSE). When you call `POST /api/v1/chat` with `stream: true`, the server emits a series of named events that you can consume. These events arrive in order and may include multiple deltas (for reasoning and message content), tool call boundaries and payloads, and any errors encountered. The stream always begins with `chat.start` and concludes with `chat.end`, which contains the aggregated result equivalent to a non‑streaming response. - -List of event types that can be sent in an `/api/v1/chat` response stream: - -* `chat.start` -* `model_load.start` -* `model_load.progress` -* `model_load.end` -* `prompt_processing.start` -* `prompt_processing.progress` -* `prompt_processing.end` -* `reasoning.start` -* `reasoning.delta` -* `reasoning.end` -* `tool_call.start` -* `tool_call.arguments` -* `tool_call.success` -* `tool_call.failure` -* `message.start` -* `message.delta` -* `message.end` -* `error` -* `chat.end` - -Events will be streamed out in the following raw format: - -```bash -event: -data: -``` - -`chat.start` [#chatstart] - - - - An event that is emitted at the start of a chat response stream. - - - - - - ```json title="Example Event Data" - { - "type": "chat.start", - "model_instance_id": "openai/gpt-oss-20b" - } - ``` - - - -`model_load.start` [#model_loadstart] - - - - Signals the start of a model being loaded to fulfill the chat request. Will not be emitted if the requested model is already loaded. - - - - - - ```json title="Example Event Data" - { - "type": "model_load.start", - "model_instance_id": "openai/gpt-oss-20b" - } - ``` - - - -`model_load.progress` [#model_loadprogress] - - - - Progress of the model load. - - - - - - ```json title="Example Event Data" - { - "type": "model_load.progress", - "model_instance_id": "openai/gpt-oss-20b", - "progress": 0.65 - } - ``` - - - -`model_load.end` [#model_loadend] - - - - Signals a successfully completed model load. - - - - - - ```json title="Example Event Data" - { - "type": "model_load.end", - "model_instance_id": "openai/gpt-oss-20b", - "load_time_seconds": 12.34 - } - ``` - - - -`prompt_processing.start` [#prompt_processingstart] - - - - Signals the start of the model processing a prompt. - - - - - - ```json title="Example Event Data" - { - "type": "prompt_processing.start" - } - ``` - - - -`prompt_processing.progress` [#prompt_processingprogress] - - - - Progress of the model processing a prompt. - - - - - - ```json title="Example Event Data" - { - "type": "prompt_processing.progress", - "progress": 0.5 - } - ``` - - - -`prompt_processing.end` [#prompt_processingend] - - - - Signals the end of the model processing a prompt. - - - - - - ```json title="Example Event Data" - { - "type": "prompt_processing.end" - } - ``` - - - -`reasoning.start` [#reasoningstart] - - - - Signals the model is starting to stream reasoning content. - - - - - - ```json title="Example Event Data" - { - "type": "reasoning.start" - } - ``` - - - -`reasoning.delta` [#reasoningdelta] - - - - A chunk of reasoning content. Multiple deltas may arrive. - - - - - - ```json title="Example Event Data" - { - "type": "reasoning.delta", - "content": "Need to" - } - ``` - - - -`reasoning.end` [#reasoningend] - - - - Signals the end of the reasoning stream. - - - - - - ```json title="Example Event Data" - { - "type": "reasoning.end" - } - ``` - - - -`tool_call.start` [#tool_callstart] - - - - Emitted when the model starts a tool call. - - - - - - ```json title="Example Event Data" - { - "type": "tool_call.start", - "tool": "model_search", - "provider_info": { - "type": "ephemeral_mcp", - "server_label": "huggingface" - } - } - ``` - - - -`tool_call.arguments` [#tool_callarguments] - - - - Arguments streamed for the current tool call. - - - - - - ```json title="Example Event Data" - { - "type": "tool_call.arguments", - "tool": "model_search", - "arguments": { - "sort": "trendingScore", - "limit": 1 - }, - "provider_info": { - "type": "ephemeral_mcp", - "server_label": "huggingface" - } - } - ``` - - - -`tool_call.success` [#tool_callsuccess] - - - - Result of the tool call, along with the arguments used. - - - - - - ```json title="Example Event Data" - { - "type": "tool_call.success", - "tool": "model_search", - "arguments": { - "sort": "trendingScore", - "limit": 1 - }, - "output": "[{\"type\":\"text\",\"text\":\"Showing first 1 models...\"}]", - "provider_info": { - "type": "ephemeral_mcp", - "server_label": "huggingface" - } - } - ``` - - - -`tool_call.failure` [#tool_callfailure] - - - - Indicates that the tool call failed. - - - - - - ```json title="Example Event Data" - { - "type": "tool_call.failure", - "reason": "Cannot find tool with name open_browser.", - "metadata": { - "type": "invalid_name", - "tool_name": "open_browser" - } - } - ``` - - - -`message.start` [#messagestart] - - - - Signals the model is about to stream a message. - - - - - - ```json title="Example Event Data" - { - "type": "message.start" - } - ``` - - - -`message.delta` [#messagedelta] - - - - A chunk of message content. Multiple deltas may arrive. - - - - - - ```json title="Example Event Data" - { - "type": "message.delta", - "content": "The current" - } - ``` - - - -`message.end` [#messageend] - - - - Signals the end of the message stream. - - - - - - ```json title="Example Event Data" - { - "type": "message.end" - } - ``` - - - -`error` [#error] - - - - An error occurred during streaming. The final payload will still be sent in `chat.end` with whatever was generated. - - - - - - ```json title="Example Event Data" - { - "type": "error", - "error": { - "type": "invalid_request", - "message": "\"model\" is required", - "code": "missing_required_parameter", - "param": "model" - } - } - ``` - - - -`chat.end` [#chatend] - - - - Final event containing the full aggregated response, equivalent to the non-streaming `POST /api/v1/chat` response body. - - - - - - ```json title="Example Event Data" - { - "type": "chat.end", - "result": { - "model_instance_id": "openai/gpt-oss-20b", - "output": [ - { "type": "reasoning", "content": "Need to call function." }, - { - "type": "tool_call", - "tool": "model_search", - "arguments": { "sort": "trendingScore", "limit": 1 }, - "output": "[{\"type\":\"text\",\"text\":\"Showing first 1 models...\"}]", - "provider_info": { "type": "ephemeral_mcp", "server_label": "huggingface" } - }, - { "type": "message", "content": "The current top‑trending model is..." } - ], - "stats": { - "input_tokens": 329, - "total_output_tokens": 268, - "reasoning_output_tokens": 5, - "tokens_per_second": 43.73, - "time_to_first_token_seconds": 0.781 - }, - "response_id": "resp_02b2017dbc06c12bfc353a2ed6c2b802f8cc682884bb5716" - } - } - ``` - - - - - - - - - `POST /api/v1/models/unload` - - **Request body** - - - - - - ```bash title="Example Request" - curl http://localhost:1234/api/v1/models/unload \ - -H "Authorization: Bearer $LM_API_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "instance_id": "openai/gpt-oss-20b" - }' - ``` - - - -*** - - - - **Response fields** - - - - - - ```json title="Response" - { - "instance_id": "openai/gpt-oss-20b" - } - ``` - - - - - - -* Method: `POST` -* Prompt template is applied automatically for chat‑tuned models -* Provide inference parameters (temperature, top\_p, etc.) in the payload -* See OpenAI docs: [https://platform.openai.com/docs/api-reference/chat](https://platform.openai.com/docs/api-reference/chat) -* Tip: keep a terminal open with [`lms log stream`](/docs/cli/serve/log-stream) to inspect model input - -Python example [#python-example] - -```python -from openai import OpenAI -client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio") - -completion = client.chat.completions.create( - model="model-identifier", - messages=[ - {"role": "system", "content": "Always answer in rhymes."}, - {"role": "user", "content": "Introduce yourself."} - ], - temperature=0.7, -) - -print(completion.choices[0].message) -``` - -Supported payload parameters [#supported-payload-parameters] - -See [https://platform.openai.com/docs/api-reference/chat/create](https://platform.openai.com/docs/api-reference/chat/create) for parameter semantics. - -```py -model -top_p -top_k -messages -temperature -max_tokens -stream -stop -presence_penalty -frequency_penalty -logit_bias -repeat_penalty -seed -``` - - - - - - This endpoint is no longer supported by OpenAI. LM Studio continues to support it. - - Using this endpoint with chat‑tuned models may produce unexpected tokens. Prefer base models. - - -* Method: `POST` -* Prompt template is not applied -* See OpenAI docs: [https://platform.openai.com/docs/api-reference/completions](https://platform.openai.com/docs/api-reference/completions) - - - - -* Method: `POST` -* See OpenAI docs: [https://platform.openai.com/docs/api-reference/embeddings](https://platform.openai.com/docs/api-reference/embeddings) - -Python example [#python-example] - -```python -from openai import OpenAI -client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio") - -def get_embedding(text, model="model-identifier"): - text = text.replace("\n", " ") - return client.embeddings.create(input=[text], model=model).data[0].embedding - -print(get_embedding("Once upon a time, there was a cat.")) -``` - - - - -Supported endpoints [#supported-endpoints] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Endpoint - - Method - - Docs -
- /v1/models - - - - Models -
- /v1/responses - - - - Responses -
- /v1/chat/completions - - - - Chat Completions -
- /v1/embeddings - - - - Embeddings -
- /v1/completions - - - - Completions -
- -
- -Set the `base url` to point to LM Studio [#set-the-base-url-to-point-to-lm-studio] - -You can reuse existing OpenAI clients (in Python, JS, C#, etc) by switching up the "base URL" property to point to your LM Studio instead of OpenAI's servers. - -Note: The following examples assume the server port is `1234` - -Python Example [#python-example] - -```diff -from openai import OpenAI - -client = OpenAI( -+ base_url="http://localhost:1234/v1" -) - -# ... the rest of your code ... -``` - -Typescript Example [#typescript-example] - -```diff -import OpenAI from 'openai'; - -const client = new OpenAI({ -+ baseUrl: "http://localhost:1234/v1" -}); - -// ... the rest of your code ... -``` - -cURL Example [#curl-example] - -```diff -- curl https://api.openai.com/v1/chat/completions \ -+ curl http://localhost:1234/v1/chat/completions \ - -H "Content-Type: application/json" \ - -d '{ -- "model": "gpt-4o-mini", -+ "model": "use the model identifier from LM Studio here", - "messages": [{"role": "user", "content": "Say this is a test!"}], - "temperature": 0.7 - }' -``` - -Using Codex with LM Studio [#using-codex-with-lm-studio] - -Codex is supported because LM Studio implements the OpenAI-compatible `POST /v1/responses` endpoint. - -See: [Use Codex with LM Studio](/docs/integrations/codex) and [Responses](/docs/developer/openai-compat/responses). - -*** - -Other OpenAI client libraries should have similar options to set the base URL. - -If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) and enter the `#🔨-developers` channel. - - - - -* Method: `GET` -* Returns the models visible to the server. The list may include all downloaded models when Just‑In‑Time loading is enabled. - -cURL [#curl] - -```bash -curl http://localhost:1234/v1/models -``` - - - - -* Method: `POST` -* See OpenAI docs: [https://platform.openai.com/docs/api-reference/responses](https://platform.openai.com/docs/api-reference/responses) - -cURL (non‑streaming) [#curl-nonstreaming] - -```bash -curl http://localhost:1234/v1/responses \ - -H "Content-Type: application/json" \ - -d '{ - "model": "openai/gpt-oss-20b", - "input": "Provide a prime number less than 50", - "reasoning": { "effort": "low" } - }' -``` - -Stateful follow‑up [#stateful-followup] - -Use the `id` from a previous response as `previous_response_id`. - -```bash -curl http://localhost:1234/v1/responses \ - -H "Content-Type: application/json" \ - -d '{ - "model": "openai/gpt-oss-20b", - "input": "Multiply it by 2", - "previous_response_id": "resp_123" - }' -``` - -Streaming [#streaming] - -```bash -curl http://localhost:1234/v1/responses \ - -H "Content-Type: application/json" \ - -d '{ - "model": "openai/gpt-oss-20b", - "input": "Hello", - "stream": true - }' -``` - -You will receive SSE events such as `response.created`, `response.output_text.delta`, and `response.completed`. - -Tools and Remote MCP (opt‑in) [#tools-and-remote-mcp-optin] - -Enable Remote MCP in the app (Developer → Settings). Example payload using an MCP server tool: - -```bash -curl http://localhost:1234/v1/responses \ - -H "Content-Type: application/json" \ - -d '{ - "model": "ibm/granite-4-micro", - "input": "What is the top trending model on hugging face?", - "tools": [ - { - "type": "mcp", - "server_label": "huggingface", - "server_url": "https://huggingface.co/mcp", - "allowed_tools": [ - "model_search" - ] - } - ] - }' -``` - - - - -You can enforce a particular response format from an LLM by providing a JSON schema to the `/v1/chat/completions` endpoint, via LM Studio's REST API (or via any OpenAI client). - -
- -Start LM Studio as a server [#start-lm-studio-as-a-server] - -To use LM Studio programmatically from your own code, run LM Studio as a local server. - -You can turn on the server from the "Developer" tab in LM Studio, or via the `lms` CLI: - -``` -lms server start -``` - -Install `lms` by running `npx lmstudio install-cli` [#install-lms-by-running-npx-lmstudio-install-cli] - -This will allow you to interact with LM Studio via the REST API. For an intro to LM Studio's REST API, see [REST API Overview](/docs/developer/rest). - -Structured Output [#structured-output] - -The API supports structured JSON outputs through the `/v1/chat/completions` endpoint when given a [JSON schema](https://json-schema.org/overview/what-is-jsonschema). Doing this will cause the LLM to respond in valid JSON conforming to the schema provided. - -It follows the same format as OpenAI's recently announced [Structured Output](https://platform.openai.com/docs/guides/structured-outputs) API and is expected to work via the OpenAI client SDKs. - -**Example using `curl`** - -This example demonstrates a structured output request using the `curl` utility. - -To run this example on Mac or Linux, use any terminal. On Windows, use [Git Bash](https://git-scm.com/download/win). - -```bash -curl http://localhost:1234/v1/chat/completions \ - -H "Content-Type: application/json" \ - -d '{ - "model": "{{model}}", - "messages": [ - { - "role": "system", - "content": "You are a helpful jokester." - }, - { - "role": "user", - "content": "Tell me a joke." - } - ], - "response_format": { - "type": "json_schema", - "json_schema": { - "name": "joke_response", - "strict": "true", - "schema": { - "type": "object", - "properties": { - "joke": { - "type": "string" - } - }, - "required": ["joke"] - } - } - }, - "temperature": 0.7, - "max_tokens": 50, - "stream": false - }' -``` - -All parameters recognized by `/v1/chat/completions` will be honored, and the JSON schema should be provided in the `json_schema` field of `response_format`. - -The JSON object will be provided in `string` form in the typical response field, `choices[0].message.content`, and will need to be parsed into a JSON object. - -**Example using `python`** - -```python -from openai import OpenAI -import json - -# Initialize OpenAI client that points to the local LM Studio server -client = OpenAI( - base_url="http://localhost:1234/v1", - api_key="lm-studio" -) - -# Define the conversation with the AI -messages = [ - {"role": "system", "content": "You are a helpful AI assistant."}, - {"role": "user", "content": "Create 1-3 fictional characters"} -] - -# Define the expected response structure -character_schema = { - "type": "json_schema", - "json_schema": { - "name": "characters", - "schema": { - "type": "object", - "properties": { - "characters": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": {"type": "string"}, - "occupation": {"type": "string"}, - "personality": {"type": "string"}, - "background": {"type": "string"} - }, - "required": ["name", "occupation", "personality", "background"] - }, - "minItems": 1, - } - }, - "required": ["characters"] - }, - } -} - -# Get response from AI -response = client.chat.completions.create( - model="your-model", - messages=messages, - response_format=character_schema, -) - -# Parse and display the results -results = json.loads(response.choices[0].message.content) -print(json.dumps(results, indent=2)) -``` - -**Important**: Not all models are capable of structured output, particularly LLMs below 7B parameters. - -Check the model card README if you are unsure if the model supports structured output. - -Structured output engine [#structured-output-engine] - -* For `GGUF` models: utilize `llama.cpp`'s grammar-based sampling APIs. -* For `MLX` models: using [Outlines](https://github.com/dottxt-ai/outlines). - -The MLX implementation is available on Github: [lmstudio-ai/mlx-engine](https://github.com/lmstudio-ai/mlx-engine). - -
- -Community [#community] - -Chat with other LM Studio users, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). - - - - - - -Tool use enables LLMs to request calls to external functions and APIs through the `/v1/chat/completions` and `v1/responses` endpoints ([Learn more](/docs/developer/openai-compat)), via LM Studio's REST API (or via any OpenAI client). This expands their functionality far beyond text output. - -
- -Quick Start [#quick-start] - - - -

- Start LM Studio as a server -

- - To use LM Studio programmatically from your own code, run LM Studio as a local server. - - You can turn on the server from the "Developer" tab in LM Studio, or via the `lms` CLI: - - ```bash - lms server start - ``` - - **Install `lms` by running `npx lmstudio install-cli`** - - This will allow you to interact with LM Studio via the REST API. For an intro to LM Studio's REST API, see [REST API Overview](/docs/developer/rest). -
- - -

- Load a Model -

- - You can load a model from the "Chat" or "Developer" tabs in LM Studio, or via the `lms` CLI: - - ```bash - lms load - ``` -
- - -

- Copy, Paste, and Run an Example! -

- - * `Curl` - * [Single Turn Tool Call Request](#example-using-curl) - * `Python` - * [Single Turn Tool Call + Tool Use](#single-turn-example) - * [Multi-Turn Example](#multi-turn-example) - * [Advanced Agent Example](#advanced-agent-example) -
-
- -Tool Use [#tool-use] - -What really is "Tool Use"? [#what-really-is-tool-use] - -Tool use describes: - -* LLMs output text requesting functions to be called (LLMs cannot directly execute code) -* Your code executes those functions -* Your code feeds the results back to the LLM. - -High-level flow [#high-level-flow] - -```xml -┌──────────────────────────┐ -│ SETUP: LLM + Tool list │ -└──────────┬───────────────┘ - ▼ -┌──────────────────────────┐ -│ Get user input │◄────┐ -└──────────┬───────────────┘ │ - ▼ │ -┌──────────────────────────┐ │ -│ LLM prompted w/messages │ │ -└──────────┬───────────────┘ │ - ▼ │ - Needs tools? │ - │ │ │ - Yes No │ - │ │ │ - ▼ └────────────┐ │ -┌─────────────┐ │ │ -│Tool Response│ │ │ -└──────┬──────┘ │ │ - ▼ │ │ -┌─────────────┐ │ │ -│Execute tools│ │ │ -└──────┬──────┘ │ │ - ▼ ▼ │ -┌─────────────┐ ┌───────────┐ -│Add results │ │ Normal │ -│to messages │ │ response │ -└──────┬──────┘ └─────┬─────┘ - │ ▲ - └───────────────────────┘ -``` - -In-depth flow [#in-depth-flow] - -LM Studio supports tool use through the `/v1/chat/completions` endpoint when given function definitions in the `tools` parameter of the request body. Tools are specified as an array of function definitions that describe their parameters and usage, like: - -It follows the same format as OpenAI's [Function Calling](https://platform.openai.com/docs/guides/function-calling) API and is expected to work via the OpenAI client SDKs. - -We will use [lmstudio-community/Qwen2.5-7B-Instruct-GGUF](https://model.lmstudio.ai/download/lmstudio-community/Qwen2.5-7B-Instruct-GGUF) as the model in this example flow. - -1. You provide a list of tools to an LLM. These are the tools that the model can *request* calls to. - For example: - -```json -// the list of tools is model-agnostic -[ - { - "type": "function", - "function": { - "name": "get_delivery_date", - "description": "Get the delivery date for a customer's order", - "parameters": { - "type": "object", - "properties": { - "order_id": { - "type": "string" - } - }, - "required": ["order_id"] - } - } - } -] -``` - -This list will be injected into the `system` prompt of the model depending on the model's chat template. For `Qwen2.5-Instruct`, this looks like: - -```json -<|im_start|>system -You are Qwen, created by Alibaba Cloud. You are a helpful assistant. - -# Tools - -You may call one or more functions to assist with the user query. - -You are provided with function signatures within XML tags: - -{"type": "function", "function": {"name": "get_delivery_date", "description": "Get the delivery date for a customer's order", "parameters": {"type": "object", "properties": {"order_id": {"type": "string"}}, "required": ["order_id"]}}} - - -For each function call, return a json object with function name and arguments within XML tags: - -{"name": , "arguments": } -<|im_end|> -``` - -**Important**: The model can only *request* calls to these tools because LLMs *cannot* directly call functions, APIs, or any other tools. They can only output text, which can then be parsed to programmatically call the functions. - -2. When prompted, the LLM can then decide to either: - - * (a) Call one or more tools - - ```xml - User: Get me the delivery date for order 123 - Model: - {"name": "get_delivery_date", "arguments": {"order_id": "123"}} - - ``` - - * (b) Respond normally - - ```xml - User: Hi - Model: Hello! How can I assist you today? - ``` - -3. LM Studio parses the text output from the model into an OpenAI-compliant `chat.completion` response object. - - * If the model was given access to `tools`, LM Studio will attempt to parse the tool calls into the `response.choices[0].message.tool_calls` field of the `chat.completion` response object. - * If LM Studio cannot parse any **correctly formatted** tool calls, it will simply return the response to the standard `response.choices[0].message.content` field. - * **Note**: Smaller models and models that were not trained for tool use may output improperly formatted tool calls, resulting in LM Studio being unable to parse them into the `tool_calls` field. This is useful for troubleshooting when you do not receive `tool_calls` as expected. Example of an improperly formatting `Qwen2.5-Instruct` tool call: - - ```xml - - ["name": "get_delivery_date", function: "date"] - - ``` - - > Note that the brackets are incorrect, and the call does not follow the `name, argument` format. - -4. Your code parses the `chat.completion` response to check for tool calls from the model, then calls the appropriate tools with the parameters specified by the model. Your code then adds both: - - 1. The model's tool call message - 2. The result of the tool call - - To the `messages` array to send back to the model - - ```python - # pseudocode, see examples for copy-paste snippets - if response.has_tool_calls: - for each tool_call: - # Extract function name & args - function_to_call = tool_call.name # e.g. "get_delivery_date" - args = tool_call.arguments # e.g. {"order_id": "123"} - - # Execute the function - result = execute_function(function_to_call, args) - - # Add result to conversation - add_to_messages([ - ASSISTANT_TOOL_CALL_MESSAGE, # The request to use the tool - TOOL_RESULT_MESSAGE # The tool's response - ]) - else: - # Normal response without tools - add_to_messages(response.content) - ``` - -5. The LLM is then prompted again with the updated messages array, but without access to tools. This is because: - * The LLM already has the tool results in the conversation history - * We want the LLM to provide a final response to the user, not call more tools - ```python - # Example messages - messages = [ - {"role": "user", "content": "When will order 123 be delivered?"}, - {"role": "assistant", "function_call": { - "name": "get_delivery_date", - "arguments": {"order_id": "123"} - }}, - {"role": "tool", "content": "2024-03-15"}, - ] - response = client.chat.completions.create( - model="lmstudio-community/qwen2.5-7b-instruct", - messages=messages - ) - ``` - The `response.choices[0].message.content` field after this call may be something like: - ```xml - Your order #123 will be delivered on March 15th, 2024 - ``` - -6. The loop continues back at step 2 of the flow - -Note: This is the `pedantic` flow for tool use. However, you can certainly experiment with this flow to best fit your use case. - -Supported Models [#supported-models] - -Through LM Studio, **all** models support at least some degree of tool use. - -However, there are currently two levels of support that may impact the quality of the experience: Native and Default. - -Models with Native tool use support will have a hammer badge in the app, and generally perform better in tool use scenarios. - -Native tool use support [#native-tool-use-support] - -"Native" tool use support means that both: - -1. The model has a chat template that supports tool use (usually means the model has been trained for tool use) - * This is what will be used to format the `tools` array into the system prompt and tell them model how to format tool calls - * Example: [Qwen2.5-Instruct chat template](https://huggingface.co/mlx-community/Qwen2.5-7B-Instruct-4bit?chat_template=default) -2. LM Studio supports that model's tool use format - * Required for LM Studio to properly input the chat history into the chat template, and parse the tool calls the model outputs into the `chat.completion` object - -Models that currently have native tool use support in LM Studio (subject to change): - -* Qwen - * `GGUF` [lmstudio-community/Qwen2.5-7B-Instruct-GGUF](https://model.lmstudio.ai/download/lmstudio-community/Qwen2.5-7B-Instruct-GGUF) (4.68 GB) - * `MLX` [mlx-community/Qwen2.5-7B-Instruct-4bit](https://model.lmstudio.ai/download/mlx-community/Qwen2.5-7B-Instruct-4bit) (4.30 GB) -* Llama-3.1, Llama-3.2 - * `GGUF` [lmstudio-community/Meta-Llama-3.1-8B-Instruct-GGUF](https://model.lmstudio.ai/download/lmstudio-community/Meta-Llama-3.1-8B-Instruct-GGUF) (4.92 GB) - * `MLX` [mlx-community/Meta-Llama-3.1-8B-Instruct-8bit](https://model.lmstudio.ai/download/mlx-community/Meta-Llama-3.1-8B-Instruct-8bit) (8.54 GB) -* Mistral - * `GGUF` [bartowski/Ministral-8B-Instruct-2410-GGUF](https://model.lmstudio.ai/download/bartowski/Ministral-8B-Instruct-2410-GGUF) (4.67 GB) - * `MLX` [mlx-community/Ministral-8B-Instruct-2410-4bit](https://model.lmstudio.ai/download/mlx-community/Ministral-8B-Instruct-2410-4bit) (4.67 GB GB) - -Default tool use support [#default-tool-use-support] - -"Default" tool use support means that **either**: - -1. The model does not have chat template that supports tool use (usually means the model has not been trained for tool use) -2. LM Studio does not currently support that model's tool use format - -Under the hood, default tool use works by: - -* Giving models a custom system prompt and a default tool call format to use -* Converting `tool` role messages to the `user` role so that chat templates without the `tool` role are compatible -* Converting `assistant` role `tool_calls` into the default tool call format - -Results will vary by model. - -You can see the default format by running `lms log stream` in your terminal, then sending a chat completion request with `tools` to a model that doesn't have Native tool use support. The default format is subject to change. - -
- - Expand to see example of default tool use format - - - ```bash - -> % lms log stream - Streaming logs from LM Studio - - timestamp: 11/13/2024, 9:35:15 AM - type: llm.prediction.input - modelIdentifier: gemma-2-2b-it - modelPath: lmstudio-community/gemma-2-2b-it-GGUF/gemma-2-2b-it-Q4_K_M.gguf - input: "system - You are a tool-calling AI. You can request calls to available tools with this EXACT format: - [TOOL_REQUEST]{\"name\": \"tool_name\", \"arguments\": {\"param1\": \"value1\"}}[END_TOOL_REQUEST] - - AVAILABLE TOOLS: - { - \"type\": \"toolArray\", - \"tools\": [ - { - \"type\": \"function\", - \"function\": { - \"name\": \"get_delivery_date\", - \"description\": \"Get the delivery date for a customer's order\", - \"parameters\": { - \"type\": \"object\", - \"properties\": { - \"order_id\": { - \"type\": \"string\" - } - }, - \"required\": [ - \"order_id\" - ] - } - } - } - ] - } - - RULES: - - Only use tools from AVAILABLE TOOLS - - Include all required arguments - - Use one [TOOL_REQUEST] block per tool - - Never use [TOOL_RESULT] - - If you decide to call one or more tools, there should be no other text in your message - - Examples: - \"Check Paris weather\" - [TOOL_REQUEST]{\"name\": \"get_weather\", \"arguments\": {\"location\": \"Paris\"}}[END_TOOL_REQUEST] - - \"Send email to John about meeting and open browser\" - [TOOL_REQUEST]{\"name\": \"send_email\", \"arguments\": {\"to\": \"John\", \"subject\": \"meeting\"}}[END_TOOL_REQUEST] - [TOOL_REQUEST]{\"name\": \"open_browser\", \"arguments\": {}}[END_TOOL_REQUEST] - - Respond conversationally if no matching tools exist. - user - Get me delivery date for order 123 - model - " - ``` - - If the model follows this format exactly to call tools, i.e: - - ``` - [TOOL_REQUEST]{\"name\": \"get_delivery_date\", \"arguments\": {\"order_id\": \"123\"}}[END_TOOL_REQUEST] - ``` - - Then LM Studio will be able to parse those tool calls into the `chat.completions` object, just like for natively supported models. -
- -All models that don't have native tool use support will have default tool use support. - -Example using `curl` [#example-using-curl] - -This example demonstrates a model requesting a tool call using the `curl` utility. - -To run this example on Mac or Linux, use any terminal. On Windows, use [Git Bash](https://git-scm.com/download/win). - -```bash -curl http://localhost:1234/v1/chat/completions \ - -H "Content-Type: application/json" \ - -d '{ - "model": "lmstudio-community/qwen2.5-7b-instruct", - "messages": [{"role": "user", "content": "What dell products do you have under $50 in electronics?"}], - "tools": [ - { - "type": "function", - "function": { - "name": "search_products", - "description": "Search the product catalog by various criteria. Use this whenever a customer asks about product availability, pricing, or specifications.", - "parameters": { - "type": "object", - "properties": { - "query": { - "type": "string", - "description": "Search terms or product name" - }, - "category": { - "type": "string", - "description": "Product category to filter by", - "enum": ["electronics", "clothing", "home", "outdoor"] - }, - "max_price": { - "type": "number", - "description": "Maximum price in dollars" - } - }, - "required": ["query"], - "additionalProperties": false - } - } - } - ] - }' -``` - -All parameters recognized by `/v1/chat/completions` will be honored, and the array of available tools should be provided in the `tools` field. - -If the model decides that the user message would be best fulfilled with a tool call, an array of tool call request objects will be provided in the response field, `choices[0].message.tool_calls`. - -The `finish_reason` field of the top-level response object will also be populated with `"tool_calls"`. - -An example response to the above `curl` request will look like: - -```bash -{ - "id": "chatcmpl-gb1t1uqzefudice8ntxd9i", - "object": "chat.completion", - "created": 1730913210, - "model": "lmstudio-community/qwen2.5-7b-instruct", - "choices": [ - { - "index": 0, - "logprobs": null, - "finish_reason": "tool_calls", - "message": { - "role": "assistant", - "tool_calls": [ - { - "id": "365174485", - "type": "function", - "function": { - "name": "search_products", - "arguments": "{\"query\":\"dell\",\"category\":\"electronics\",\"max_price\":50}" - } - } - ] - } - } - ], - "usage": { - "prompt_tokens": 263, - "completion_tokens": 34, - "total_tokens": 297 - }, - "system_fingerprint": "lmstudio-community/qwen2.5-7b-instruct" -} -``` - -In plain english, the above response can be thought of as the model saying: - -> "Please call the `search_products` function, with arguments: -> -> * 'dell' for the `query` parameter, -> * 'electronics' for the `category` parameter -> * '50' for the `max_price` parameter -> -> and give me back the results" - -The `tool_calls` field will need to be parsed to call actual functions/APIs. The below examples demonstrate how. - -Examples using `python` [#examples-using-python] - -Tool use shines when paired with program languages like python, where you can implement the functions specified in the `tools` field to programmatically call them when the model requests. - -Single-turn example [#single-turn-example] - -Below is a simple single-turn (model is only called once) example of enabling a model to call a function called `say_hello` that prints a hello greeting to the console: - -`single-turn-example.py` - -```python -from openai import OpenAI - -# Connect to LM Studio -client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio") - -# Define a simple function -def say_hello(name: str) -> str: - print(f"Hello, {name}!") - -# Tell the AI about our function -tools = [ - { - "type": "function", - "function": { - "name": "say_hello", - "description": "Says hello to someone", - "parameters": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "The person's name" - } - }, - "required": ["name"] - } - } - } -] - -# Ask the AI to use our function -response = client.chat.completions.create( - model="lmstudio-community/qwen2.5-7b-instruct", - messages=[{"role": "user", "content": "Can you say hello to Bob the Builder?"}], - tools=tools -) - -# Get the name the AI wants to use a tool to say hello to -# (Assumes the AI has requested a tool call and that tool call is say_hello) -tool_call = response.choices[0].message.tool_calls[0] -name = eval(tool_call.function.arguments)["name"] - -# Actually call the say_hello function -say_hello(name) # Prints: Hello, Bob the Builder! - -``` - -Running this script from the console should yield results like: - -```xml --> % python single-turn-example.py -Hello, Bob the Builder! -``` - -Play around with the name in - -```python -messages=[{"role": "user", "content": "Can you say hello to Bob the Builder?"}] -``` - -to see the model call the `say_hello` function with different names. - -Multi-turn example [#multi-turn-example] - -Now for a slightly more complex example. - -In this example, we'll: - -1. Enable the model to call a `get_delivery_date` function -2. Hand the result of calling that function back to the model, so that it can fulfill the user's request in plain text - -
- - multi-turn-example.py - - (click to expand) - - - ```python - from datetime import datetime, timedelta - import json - import random - from openai import OpenAI - - # Point to the local server - client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio") - model = "lmstudio-community/qwen2.5-7b-instruct" - - - def get_delivery_date(order_id: str) -> datetime: - # Generate a random delivery date between today and 14 days from now - # in a real-world scenario, this function would query a database or API - today = datetime.now() - random_days = random.randint(1, 14) - delivery_date = today + timedelta(days=random_days) - print( - f"\nget_delivery_date function returns delivery date:\n\n{delivery_date}", - flush=True, - ) - return delivery_date - - - tools = [ - { - "type": "function", - "function": { - "name": "get_delivery_date", - "description": "Get the delivery date for a customer's order. Call this whenever you need to know the delivery date, for example when a customer asks 'Where is my package'", - "parameters": { - "type": "object", - "properties": { - "order_id": { - "type": "string", - "description": "The customer's order ID.", - }, - }, - "required": ["order_id"], - "additionalProperties": False, - }, - }, - } - ] - - messages = [ - { - "role": "system", - "content": "You are a helpful customer support assistant. Use the supplied tools to assist the user.", - }, - { - "role": "user", - "content": "Give me the delivery date and time for order number 1017", - }, - ] - - # LM Studio - response = client.chat.completions.create( - model=model, - messages=messages, - tools=tools, - ) - - print("\nModel response requesting tool call:\n", flush=True) - print(response, flush=True) - - # Extract the arguments for get_delivery_date - # Note this code assumes we have already determined that the model generated a function call. - tool_call = response.choices[0].message.tool_calls[0] - arguments = json.loads(tool_call.function.arguments) - - order_id = arguments.get("order_id") - - # Call the get_delivery_date function with the extracted order_id - delivery_date = get_delivery_date(order_id) - - assistant_tool_call_request_message = { - "role": "assistant", - "tool_calls": [ - { - "id": response.choices[0].message.tool_calls[0].id, - "type": response.choices[0].message.tool_calls[0].type, - "function": response.choices[0].message.tool_calls[0].function, - } - ], - } - - # Create a message containing the result of the function call - function_call_result_message = { - "role": "tool", - "content": json.dumps( - { - "order_id": order_id, - "delivery_date": delivery_date.strftime("%Y-%m-%d %H:%M:%S"), - } - ), - "tool_call_id": response.choices[0].message.tool_calls[0].id, - } - - # Prepare the chat completion call payload - completion_messages_payload = [ - messages[0], - messages[1], - assistant_tool_call_request_message, - function_call_result_message, - ] - - # Call the OpenAI API's chat completions endpoint to send the tool call result back to the model - # LM Studio - response = client.chat.completions.create( - model=model, - messages=completion_messages_payload, - ) - - print("\nFinal model response with knowledge of the tool call result:\n", flush=True) - print(response.choices[0].message.content, flush=True) - - ``` -
- -Running this script from the console should yield results like: - -```xml --> % python multi-turn-example.py - -Model response requesting tool call: - -ChatCompletion(id='chatcmpl-wwpstqqu94go4hvclqnpwn', choices=[Choice(finish_reason='tool_calls', index=0, logprobs=None, message=ChatCompletionMessage(content=None, refusal=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='377278620', function=Function(arguments='{"order_id":"1017"}', name='get_delivery_date'), type='function')]))], created=1730916196, model='lmstudio-community/qwen2.5-7b-instruct', object='chat.completion', service_tier=None, system_fingerprint='lmstudio-community/qwen2.5-7b-instruct', usage=CompletionUsage(completion_tokens=24, prompt_tokens=223, total_tokens=247, completion_tokens_details=None, prompt_tokens_details=None)) - -get_delivery_date function returns delivery date: - -2024-11-19 13:03:17.773298 - -Final model response with knowledge of the tool call result: - -Your order number 1017 is scheduled for delivery on November 19, 2024, at 13:03 PM. -``` - -Advanced agent example [#advanced-agent-example] - -Building upon the principles above, we can combine LM Studio models with locally defined functions to create an "agent" - a system that pairs a language model with custom functions to understand requests and perform actions beyond basic text generation. - -The agent in the below example can: - -1. Open safe urls in your default browser -2. Check the current time -3. Analyze directories in your file system - -
- - agent-chat-example.py - - (click to expand) - - - ```python - import json - from urllib.parse import urlparse - import webbrowser - from datetime import datetime - import os - from openai import OpenAI - - # Point to the local server - client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio") - model = "lmstudio-community/qwen2.5-7b-instruct" - - - def is_valid_url(url: str) -> bool: - - try: - result = urlparse(url) - return bool(result.netloc) # Returns True if there's a valid network location - except Exception: - return False - - - def open_safe_url(url: str) -> dict: - # List of allowed domains (expand as needed) - SAFE_DOMAINS = { - "lmstudio.ai", - "huggingface.co", - "github.com", - "google.com", - "wikipedia.org", - "weather.com", - "stackoverflow.com", - "python.org", - "docs.python.org", - } - - try: - # Add http:// if no scheme is present - if not url.startswith(('http://', 'https://')): - url = 'http://' + url - - # Validate URL format - if not is_valid_url(url): - return {"status": "error", "message": f"Invalid URL format: {url}"} - - # Parse the URL and check domain - parsed_url = urlparse(url) - domain = parsed_url.netloc.lower() - base_domain = ".".join(domain.split(".")[-2:]) - - if base_domain in SAFE_DOMAINS: - webbrowser.open(url) - return {"status": "success", "message": f"Opened {url} in browser"} - else: - return { - "status": "error", - "message": f"Domain {domain} not in allowed list", - } - } - except Exception as e: - return {"status": "error", "message": str(e)} - - - def get_current_time() -> dict: - """Get the current system time with timezone information""" - try: - current_time = datetime.now() - timezone = datetime.now().astimezone().tzinfo - formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S %Z") - return { - "status": "success", - "time": formatted_time, - "timezone": str(timezone), - "timestamp": current_time.timestamp(), - } - except Exception as e: - return {"status": "error", "message": str(e)} - - - def analyze_directory(path: str = ".") -> dict: - """Count and categorize files in a directory""" - try: - stats = { - "total_files": 0, - "total_dirs": 0, - "file_types": {}, - "total_size_bytes": 0, - } - - for entry in os.scandir(path): - if entry.is_file(): - stats["total_files"] += 1 - ext = os.path.splitext(entry.name)[1].lower() or "no_extension" - stats["file_types"][ext] = stats["file_types"].get(ext, 0) + 1 - stats["total_size_bytes"] += entry.stat().st_size - elif entry.is_dir(): - stats["total_dirs"] += 1 - # Add size of directory contents - for root, _, files in os.walk(entry.path): - for file in files: - try: - stats["total_size_bytes"] += os.path.getsize(os.path.join(root, file)) - except (OSError, FileNotFoundError): - continue - - return {"status": "success", "stats": stats, "path": os.path.abspath(path)} - except Exception as e: - return {"status": "error", "message": str(e)} - - - tools = [ - { - "type": "function", - "function": { - "name": "open_safe_url", - "description": "Open a URL in the browser if it's deemed safe", - "parameters": { - "type": "object", - "properties": { - "url": { - "type": "string", - "description": "The URL to open", - }, - }, - "required": ["url"], - }, - }, - }, - { - "type": "function", - "function": { - "name": "get_current_time", - "description": "Get the current system time with timezone information", - "parameters": { - "type": "object", - "properties": {}, - "required": [], - }, - }, - }, - { - "type": "function", - "function": { - "name": "analyze_directory", - "description": "Analyze the contents of a directory, counting files and folders", - "parameters": { - "type": "object", - "properties": { - "path": { - "type": "string", - "description": "The directory path to analyze. Defaults to current directory if not specified.", - }, - }, - "required": [], - }, - }, - }, - ] - - - def process_tool_calls(response, messages): - """Process multiple tool calls and return the final response and updated messages""" - # Get all tool calls from the response - tool_calls = response.choices[0].message.tool_calls - - # Create the assistant message with tool calls - assistant_tool_call_message = { - "role": "assistant", - "tool_calls": [ - { - "id": tool_call.id, - "type": tool_call.type, - "function": tool_call.function, - } - for tool_call in tool_calls - ], - } - - # Add the assistant's tool call message to the history - messages.append(assistant_tool_call_message) - - # Process each tool call and collect results - tool_results = [] - for tool_call in tool_calls: - # For functions with no arguments, use empty dict - arguments = ( - json.loads(tool_call.function.arguments) - if tool_call.function.arguments.strip() - else {} - ) - - # Determine which function to call based on the tool call name - if tool_call.function.name == "open_safe_url": - result = open_safe_url(arguments["url"]) - elif tool_call.function.name == "get_current_time": - result = get_current_time() - elif tool_call.function.name == "analyze_directory": - path = arguments.get("path", ".") - result = analyze_directory(path) - else: - # llm tried to call a function that doesn't exist, skip - continue - - # Add the result message - tool_result_message = { - "role": "tool", - "content": json.dumps(result), - "tool_call_id": tool_call.id, - } - tool_results.append(tool_result_message) - messages.append(tool_result_message) - - # Get the final response - final_response = client.chat.completions.create( - model=model, - messages=messages, - ) - - return final_response - - - def chat(): - messages = [ - { - "role": "system", - "content": "You are a helpful assistant that can open safe web links, tell the current time, and analyze directory contents. Use these capabilities whenever they might be helpful.", - } - ] - - print( - "Assistant: Hello! I can help you open safe web links, tell you the current time, and analyze directory contents. What would you like me to do?" - ) - print("(Type 'quit' to exit)") - - while True: - # Get user input - user_input = input("\nYou: ").strip() - - # Check for quit command - if user_input.lower() == "quit": - print("Assistant: Goodbye!") - break - - # Add user message to conversation - messages.append({"role": "user", "content": user_input}) - - try: - # Get initial response - response = client.chat.completions.create( - model=model, - messages=messages, - tools=tools, - ) - - # Check if the response includes tool calls - if response.choices[0].message.tool_calls: - # Process all tool calls and get final response - final_response = process_tool_calls(response, messages) - print("\nAssistant:", final_response.choices[0].message.content) - - # Add assistant's final response to messages - messages.append( - { - "role": "assistant", - "content": final_response.choices[0].message.content, - } - ) - else: - # If no tool call, just print the response - print("\nAssistant:", response.choices[0].message.content) - - # Add assistant's response to messages - messages.append( - { - "role": "assistant", - "content": response.choices[0].message.content, - } - ) - - except Exception as e: - print(f"\nAn error occurred: {str(e)}") - exit(1) - - - if __name__ == "__main__": - chat() - - ``` -
- -Running this script from the console will allow you to chat with the agent: - -```xml --> % python agent-example.py -Assistant: Hello! I can help you open safe web links, tell you the current time, and analyze directory contents. What would you like me to do? -(Type 'quit' to exit) - -You: What time is it? - -Assistant: The current time is 14:11:40 (EST) as of November 6, 2024. - -You: What time is it now? - -Assistant: The current time is 14:13:59 (EST) as of November 6, 2024. - -You: Open lmstudio.ai - -Assistant: The link to lmstudio.ai has been opened in your default web browser. - -You: What's in my current directory? - -Assistant: Your current directory at `/Users/matt/project` contains a total of 14 files and 8 directories. Here's the breakdown: - -- Files without an extension: 3 -- `.mjs` files: 2 -- `.ts` (TypeScript) files: 3 -- Markdown (`md`) file: 1 -- JSON files: 4 -- TOML file: 1 - -The total size of these items is 1,566,990,604 bytes. - -You: Thank you! - -Assistant: You're welcome! If you have any other questions or need further assistance, feel free to ask. - -You: -``` - -Streaming [#streaming] - -When streaming through `/v1/chat/completions` (`stream=true`), tool calls are sent in chunks. Function names and arguments are sent in pieces via `chunk.choices[0].delta.tool_calls.function.name` and `chunk.choices[0].delta.tool_calls.function.arguments`. - -For example, to call `get_current_weather(location="San Francisco")`, the streamed `ChoiceDeltaToolCall` in each `chunk.choices[0].delta.tool_calls[0]` object will look like: - -```py -ChoiceDeltaToolCall(index=0, id='814890118', function=ChoiceDeltaToolCallFunction(arguments='', name='get_current_weather'), type='function') -ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='{"', name=None), type=None) -ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='location', name=None), type=None) -ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='":"', name=None), type=None) -ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='San Francisco', name=None), type=None) -ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='"}', name=None), type=None) -``` - -These chunks must be accumulated throughout the stream to form the complete function signature for execution. - -The below example shows how to create a simple tool-enhanced chatbot through the `/v1/chat/completions` streaming endpoint (`stream=true`). - -
- - tool-streaming-chatbot.py - - (click to expand) - - - ```python - from openai import OpenAI - import time - - client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio") - MODEL = "lmstudio-community/qwen2.5-7b-instruct" - - TIME_TOOL = { - "type": "function", - "function": { - "name": "get_current_time", - "description": "Get the current time, only if asked", - "parameters": {"type": "object", "properties": {}}, - }, - } - - def get_current_time(): - return {"time": time.strftime("%H:%M:%S")} - - def process_stream(stream, add_assistant_label=True): - """Handle streaming responses from the API""" - collected_text = "" - tool_calls = [] - first_chunk = True - - for chunk in stream: - delta = chunk.choices[0].delta - - # Handle regular text output - if delta.content: - if first_chunk: - print() - if add_assistant_label: - print("Assistant:", end=" ", flush=True) - first_chunk = False - print(delta.content, end="", flush=True) - collected_text += delta.content - - # Handle tool calls - elif delta.tool_calls: - for tc in delta.tool_calls: - if len(tool_calls) <= tc.index: - tool_calls.append({ - "id": "", "type": "function", - "function": {"name": "", "arguments": ""} - }) - tool_calls[tc.index] = { - "id": (tool_calls[tc.index]["id"] + (tc.id or "")), - "type": "function", - "function": { - "name": (tool_calls[tc.index]["function"]["name"] + (tc.function.name or "")), - "arguments": (tool_calls[tc.index]["function"]["arguments"] + (tc.function.arguments or "")) - } - } - return collected_text, tool_calls - - def chat_loop(): - messages = [] - print("Assistant: Hi! I am an AI agent empowered with the ability to tell the current time (Type 'quit' to exit)") - - while True: - user_input = input("\nYou: ").strip() - if user_input.lower() == "quit": - break - - messages.append({"role": "user", "content": user_input}) - - # Get initial response - response_text, tool_calls = process_stream( - client.chat.completions.create( - model=MODEL, - messages=messages, - tools=[TIME_TOOL], - stream=True, - temperature=0.2 - ) - ) - - if not tool_calls: - print() - - text_in_first_response = len(response_text) > 0 - if text_in_first_response: - messages.append({"role": "assistant", "content": response_text}) - - # Handle tool calls if any - if tool_calls: - tool_name = tool_calls[0]["function"]["name"] - print() - if not text_in_first_response: - print("Assistant:", end=" ", flush=True) - print(f"**Calling Tool: {tool_name}**") - messages.append({"role": "assistant", "tool_calls": tool_calls}) - - # Execute tool calls - for tool_call in tool_calls: - if tool_call["function"]["name"] == "get_current_time": - result = get_current_time() - messages.append({ - "role": "tool", - "content": str(result), - "tool_call_id": tool_call["id"] - }) - - # Get final response after tool execution - final_response, _ = process_stream( - client.chat.completions.create( - model=MODEL, - messages=messages, - stream=True - ), - add_assistant_label=False - ) - - if final_response: - print() - messages.append({"role": "assistant", "content": final_response}) - - if __name__ == "__main__": - chat_loop() - ``` -
- -You can chat with the bot by running this script from the console: - -```xml --> % python tool-streaming-chatbot.py -Assistant: Hi! I am an AI agent empowered with the ability to tell the current time (Type 'quit' to exit) - -You: Tell me a joke, then tell me the current time - -Assistant: Sure! Here's a light joke for you: Why don't scientists trust atoms? Because they make up everything. - -Now, let me get the current time for you. - -**Calling Tool: get_current_time** - -The current time is 18:49:31. Enjoy your day! - -You: -``` - -Community [#community] - -Chat with other LM Studio users, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). - - - - -Supported endpoints [#supported-endpoints] - - - - - - - - - - - - - - - - - - - - - -
- Endpoint - - Method - - Docs -
- /v1/messages - - - - Messages -
- -Using Claude Code with LM Studio [#using-claude-code-with-lm-studio] - -For a full walkthrough, see: [Use Claude Code with LM Studio](/docs/integrations/claude-code). - -```bash -export ANTHROPIC_BASE_URL=http://localhost:1234 -export ANTHROPIC_AUTH_TOKEN=lmstudio -claude --model openai/gpt-oss-20b -``` - -Authentication headers [#authentication-headers] - -When Require Authentication is enabled, LM Studio accepts both `x-api-key` and the standard `Authorization: Bearer ` header. To learn more about enabling auth in LM Studio, see [Authentication](/docs/developer/core/authentication). - -Set the base URL to point to LM Studio [#set-the-base-url-to-point-to-lm-studio] - -Point your Anthropic client, or any HTTP request, at your local LM Studio server. - -Note: The following examples assume the server port is `1234`. - -cURL example [#curl-example] - -```diff -- curl https://api.anthropic.com/v1/messages \ -+ curl http://localhost:1234/v1/messages \ - -H "Content-Type: application/json" \ -+ -H "x-api-key: $LM_API_TOKEN" \ - -d '{ -- "model": "claude-4-5-sonnet", -+ "model": "ibm/granite-4-micro", - "max_tokens": 256, - "messages": [ - {"role": "user", "content": "Write a haiku about local LLMs."} - ] - }' -``` - -Python example [#python-example] - -```python -from anthropic import Anthropic - -client = Anthropic( - base_url="http://localhost:1234", - api_key="lmstudio", -) - -message = client.messages.create( - max_tokens=1024, - messages=[ - { - "role": "user", - "content": "Hello from LM Studio", - } - ], - model="ibm/granite-4-micro", -) - -print(message.content) -``` - -If you have not enabled Require Authentication, the `x-api-key` header is optional. For the Python example, you can also omit `api_key` when authentication is disabled. - -If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) and enter the developers channel. - - - - -* Method: `POST` -* Endpoint: `/v1/messages` -* See Anthropic docs: [https://platform.claude.com/docs/en/api/messages/create](https://platform.claude.com/docs/en/api/messages/create) - -cURL example [#curl-example] - -```bash -curl http://localhost:1234/v1/messages \ - -H "Content-Type: application/json" \ - -H "x-api-key: $LM_API_TOKEN" \ - -d '{ - "model": "ibm/granite-4-micro", - "max_tokens": 256, - "messages": [ - {"role": "user", "content": "Say hello from LM Studio."} - ] - }' -``` - -If you have not enabled Require Authentication, the `x-api-key` header is optional. - -cURL (streaming) [#curl-streaming] - -```bash -curl http://localhost:1234/v1/messages \ - -H "Content-Type: application/json" \ - -H "x-api-key: $LM_API_TOKEN" \ - -d '{ - "model": "ibm/granite-4-micro", - "messages": [{"role": "user", "content": "Hello"}], - "max_tokens": 256, - "stream": true - }' -``` - -You will receive SSE events such as `message_start`, `content_block_start`, `content_block_delta`, `content_block_stop`, `message_delta`, and `message_stop`. - -cURL (tools) [#curl-tools] - -```bash -curl http://localhost:1234/v1/messages \ - -H "Content-Type: application/json" \ - -H "x-api-key: $LM_API_TOKEN" \ - -d '{ - "model": "ibm/granite-4-micro", - "max_tokens": 1024, - "tools": [ - { - "name": "get_weather", - "description": "Get the current weather in a given location", - "input_schema": { - "type": "object", - "properties": { - "location": { - "type": "string", - "description": "The city and state, e.g. San Francisco, CA" - } - }, - "required": ["location"] - } - } - ], - "tool_choice": {"type": "any"}, - "messages": [ - { - "role": "user", - "content": "What is the weather like in San Francisco?" - } - ] - }' -``` - - - - -Requires LM Studio 0.4.0 or newer. [#requires-lm-studio-040-or-newer] - -LM Studio supports API Tokens for authentication, providing a secure and convenient way to access the LM Studio API. - -By default, the LM Studio API runs **without enforcing authentication**. For production or shared environments, enable API Token authentication for secure access. - - - To enable API Token authentication, create tokens and control granular permissions, check [this guide](/docs/developer/core/authentication) for more details. - - -Providing the API Token [#providing-the-api-token] - -The API Token can be provided in two ways: - -1. **Environment Variable (Recommended)**: Set the `LM_API_TOKEN` environment variable, and the SDK will automatically read it. -2. **Function Argument**: Pass the token directly as the `api_token` parameter. - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - - # Configure the default client with an API token - lms.configure_default_client(api_token="your-token-here") - - model = lms.llm() - result = model.respond("What is the meaning of life?") - print(result) - ``` - - - - ```python - import lmstudio as lms - - # Pass api_token to the Client constructor - with lms.Client(api_token="your-token-here") as client: - model = client.llm.model() - result = model.respond("What is the meaning of life?") - print(result) - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - # Pass api_token to the AsyncClient constructor - async with lms.AsyncClient(api_token="your-token-here") as client: - model = await client.llm.model() - result = await model.respond("What is the meaning of life?") - print(result) - ``` - - - - - - -`lmstudio` is a library published on PyPI that allows you to use `lmstudio-python` in your own projects. -It is open source and developed on GitHub. -You can find the source code [here](https://github.com/lmstudio-ai/lmstudio-python). - -Installing `lmstudio-python` [#installing-lmstudio-python] - -As it is published to PyPI, `lmstudio-python` may be installed using `pip` -or your preferred project dependency manager (`pdm` and `uv` are shown, but other -Python project management tools offer similar dependency addition commands). - - - - - pip - - - - pdm - - - - uv - - - - - ```bash - pip install lmstudio - ``` - - - - ```bash - pdm add lmstudio - ``` - - - - ```bash - uv add lmstudio - ``` - - - -Customizing the server API host and TCP port [#customizing-the-server-api-host-and-tcp-port] - -All of the examples in the documentation assume that the server API is running locally -on one of the default application ports (Note: in Python SDK versions prior to 1.5.0, the -SDK also required that the optional HTTP REST server be enabled). - -The network location of the server API can be overridden by -passing a `"host:port"` string when creating the client instance. - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - SERVER_API_HOST = "localhost:1234" - - # This must be the *first* convenience API interaction (otherwise the SDK - # implicitly creates a client that accesses the default server API host) - lms.configure_default_client(SERVER_API_HOST) - - # Note: the dedicated configuration API was added in lmstudio-python 1.3.0 - # For compatibility with earlier SDK versions, it is still possible to use - # lms.get_default_client(SERVER_API_HOST) to configure the default client - ``` - - - - ```python - import lmstudio as lms - SERVER_API_HOST = "localhost:1234" - - # When using the scoped resource API, each client instance - # can be configured to use a specific server API host - with lms.Client(SERVER_API_HOST) as client: - model = client.llm.model() - - for fragment in model.respond_stream("What is the meaning of life?"): - print(fragment.content, end="", flush=True) - print() # Advance to a new line at the end of the response - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - SERVER_API_HOST = "localhost:1234" - - # When using the asynchronous API, each client instance - # can be configured to use a specific server API host - async with lms.AsyncClient(SERVER_API_HOST) as client: - model = await client.llm.model() - - for fragment in await model.respond_stream("What is the meaning of life?"): - print(fragment.content, end="", flush=True) - print() # Advance to a new line at the end of the response - ``` - - - -Checking a specified API server host is running [#checking-a-specified-api-server-host-is-running] - -*Required Python SDK version*: **1.5.0** - -While the most common connection pattern is to let the SDK raise an exception if it can't -connect to the specified API server host, the SDK also supports running the API check directly -without creating an SDK client instance first: - - - - - Python (synchronous API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - SERVER_API_HOST = "localhost:1234" - - if lms.Client.is_valid_api_host(SERVER_API_HOST): - print(f"An LM Studio API server instance is available at {SERVER_API_HOST}") - else: - print("No LM Studio API server instance found at {SERVER_API_HOST}") - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - SERVER_API_HOST = "localhost:1234" - - if await lms.AsyncClient.is_valid_api_host(SERVER_API_HOST): - print(f"An LM Studio API server instance is available at {SERVER_API_HOST}") - else: - print("No LM Studio API server instance found at {SERVER_API_HOST}") - ``` - - - -Determining the default local API server port [#determining-the-default-local-api-server-port] - -*Required Python SDK version*: **1.5.0** - -When no API server host is specified, the SDK queries a number of ports on the local loopback -interface for a running API server instance. This scan is repeated for each new client instance -created. Rather than letting the SDK perform this scan implicitly, the SDK also supports running -the scan explicitly, and passing in the reported API server details when creating clients: - - - - - Python (synchronous API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - - api_host = lms.Client.find_default_local_api_host() - if api_host is not None: - print(f"An LM Studio API server instance is available at {api_host}") - else: - print("No LM Studio API server instance found on any of the default local ports") - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - api_host = await lms.AsyncClient.find_default_local_api_host() - if api_host is not None: - print(f"An LM Studio API server instance is available at {api_host}") - else: - print("No LM Studio API server instance found on any of the default local ports") - ``` - - - - - - -To simplify interactive use, `lmstudio-python` offers a convenience API which manages -its resources via `atexit` hooks, allowing a default synchronous client session -to be used across multiple interactive commands. - -This convenience API is shown in the examples throughout the documentation as the -`Python (convenience API)` tab (alongside the `Python (scoped resource API)` examples, -which use `with` statements to ensure deterministic cleanup of network communication -resources). - -The convenience API allows the standard Python REPL, or more flexible alternatives like -Juypter Notebooks, to be used to interact with AI models loaded into LM Studio. For -example: - -```python title="Python REPL" ->>> import lmstudio as lms ->>> loaded_models = lms.list_loaded_models() ->>> for idx, model in enumerate(loaded_models): -... print(f"{idx:>3} {model}") -... - 0 LLM(identifier='qwen2.5-7b-instruct') ->>> model = loaded_models[0] ->>> chat = lms.Chat("You answer questions concisely") ->>> chat = lms.Chat("You answer questions concisely") ->>> chat.add_user_message("Tell me three fruits") -UserMessage(content=[TextData(text='Tell me three fruits')]) ->>> print(model.respond(chat, on_message=chat.append)) -Banana, apple, orange. ->>> chat.add_user_message("Tell me three more fruits") -UserMessage(content=[TextData(text='Tell me three more fruits')]) ->>> print(model.respond(chat, on_message=chat.append)) -Mango, strawberry, avocado. ->>> chat.add_user_message("How many fruits have you told me?") -UserMessage(content=[TextData(text='How many fruits have you told me?')]) ->>> print(model.respond(chat, on_message=chat.append)) -You asked for three initial fruits and three more, so I've listed a total of six fruits. -``` - -While not primarily intended for use this way, the SDK's asynchronous structured concurrency API -is compatible with the asynchronous Python REPL that is launched by `python -m asyncio`. -For example: - -```python title="Python REPL" -# Note: assumes use of the "python -m asyncio" asynchronous REPL (or equivalent) -# Requires Python SDK version 1.5.0 or later ->>> from contextlib import AsyncExitStack ->>> import lmstudio as lms ->>> resources = AsyncExitStack() ->>> client = await resources.enter_async_context(lms.AsyncClient()) ->>> loaded_models = await client.llm.list_loaded() ->>> for idx, model in enumerate(loaded_models): -... print(f"{idx:>3} {model}") -... - 0 AsyncLLM(identifier='qwen2.5-7b-instruct-1m') ->>> model = loaded_models[0] ->>> chat = lms.Chat("You answer questions concisely") ->>> chat.add_user_message("Tell me three fruits") -UserMessage(content=[TextData(text='Tell me three fruits')]) ->>> print(await model.respond(chat, on_message=chat.append)) -Apple, banana, and orange. ->>> chat.add_user_message("Tell me three more fruits") -UserMessage(content=[TextData(text='Tell me three more fruits')]) ->>> print(await model.respond(chat, on_message=chat.append)) -Mango, strawberry, and pineapple. ->>> chat.add_user_message("How many fruits have you told me?") -UserMessage(content=[TextData(text='How many fruits have you told me?')]) ->>> print(await model.respond(chat, on_message=chat.append)) -You asked for three fruits initially, then three more, so I've listed six fruits in total. -``` - - - - -One benefit of using the streaming API is the ability to cancel the -prediction request based on criteria that can't be represented using -the `stopStrings` or `maxPredictedTokens` configuration settings. - -The following snippet illustrates cancelling the request in response -to an application specification cancellation condition (such as polling -an event set by another thread). - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - model = lms.llm() - - prediction_stream = model.respond_stream("What is the meaning of life?") - cancelled = False - for fragment in prediction_stream: - if ...: # Cancellation condition will be app specific - cancelled = True - prediction_stream.cancel() - # Note: it is recommended to let the iteration complete, - # as doing so allows the partial result to be recorded. - # Breaking the loop *is* permitted, but means the partial result - # and final prediction stats won't be available to the client - # The stream allows the prediction result to be retrieved after iteration - if not cancelled: - print(prediction_stream.result()) - ``` - - - - ```python - import lmstudio as lms - - with lms.Client() as client: - model = client.llm.model() - - prediction_stream = model.respond_stream("What is the meaning of life?") - cancelled = False - for fragment in prediction_stream: - if ...: # Cancellation condition will be app specific - cancelled = True - prediction_stream.cancel() - # Note: it is recommended to let the iteration complete, - # as doing so allows the partial result to be recorded. - # Breaking the loop *is* permitted, but means the partial result - # and final prediction stats won't be available to the client - # The stream allows the prediction result to be retrieved after iteration - if not cancelled: - print(prediction_stream.result()) - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - async with lms.AsyncClient() as client: - model = await client.llm.model() - - prediction_stream = await model.respond_stream("What is the meaning of life?") - cancelled = False - async for fragment in prediction_stream: - if ...: # Cancellation condition will be app specific - cancelled = True - await prediction_stream.cancel() - # Note: it is recommended to let the iteration complete, - # as doing so allows the partial result to be recorded. - # Breaking the loop *is* permitted, but means the partial result - # and final prediction stats won't be available to the client - # The stream allows the prediction result to be retrieved after iteration - if not cancelled: - print(prediction_stream.result()) - ``` - - - - - - -Use `llm.respond(...)` to generate completions for a chat conversation. - -Quick Example: Generate a Chat Response [#quick-example-generate-a-chat-response] - -The following snippet shows how to obtain the AI's response to a quick chat prompt. - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - - model = lms.llm() - print(model.respond("What is the meaning of life?")) - ``` - - - - ```python - import lmstudio as lms - - with lms.Client() as client: - model = client.llm.model() - print(model.respond("What is the meaning of life?")) - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - async with lms.AsyncClient() as client: - model = await client.llm.model() - print(await model.respond("What is the meaning of life?")) - ``` - - - -Streaming a Chat Response [#streaming-a-chat-response] - -The following snippet shows how to stream the AI's response to a chat prompt, -displaying text fragments as they are received (rather than waiting for the -entire response to be generated before displaying anything). - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - model = lms.llm() - - for fragment in model.respond_stream("What is the meaning of life?"): - print(fragment.content, end="", flush=True) - print() # Advance to a new line at the end of the response - ``` - - - - ```python - import lmstudio as lms - - with lms.Client() as client: - model = client.llm.model() - - for fragment in model.respond_stream("What is the meaning of life?"): - print(fragment.content, end="", flush=True) - print() # Advance to a new line at the end of the response - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - async with lms.AsyncClient() as client: - model = await client.llm.model() - - async for fragment in model.respond_stream("What is the meaning of life?"): - print(fragment.content, end="", flush=True) - print() # Advance to a new line at the end of the response - ``` - - - -Cancelling a Chat Response [#cancelling-a-chat-response] - -See the [Cancelling a Prediction](./cancelling-predictions) section for how to cancel a prediction in progress. - -Obtain a Model [#obtain-a-model] - -First, you need to get a model handle. -This can be done using the top-level `llm` convenience API, -or the `model` method in the `llm` namespace when using the scoped resource API. -For example, here is how to use Qwen2.5 7B Instruct. - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - - model = lms.llm("qwen2.5-7b-instruct") - ``` - - - - ```python - import lmstudio as lms - - with lms.Client() as client: - model = client.llm.model("qwen2.5-7b-instruct") - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - async with lms.AsyncClient() as client: - model = await client.llm.model("qwen2.5-7b-instruct") - ``` - - - -There are other ways to get a model handle. See [Managing Models in Memory](./../manage-models/loading) for more info. - -Manage Chat Context [#manage-chat-context] - -The input to the model is referred to as the "context". -Conceptually, the model receives a multi-turn conversation as input, -and it is asked to predict the assistant's response in that conversation. - -```python -import lmstudio as lms - -# Create a chat with an initial system prompt. -chat = lms.Chat("You are a resident AI philosopher.") - -# Build the chat context by adding messages of relevant types. -chat.add_user_message("What is the meaning of life?") -# ... continued in next example -``` - -See [Working with Chats](./working-with-chats) for more information on managing chat context. - - - -Generate a response [#generate-a-response] - -You can ask the LLM to predict the next response in the chat context using the `respond()` method. - - - - - Non-streaming (synchronous API) - - - - Streaming (synchronous API) - - - - Non-streaming (asynchronous API) - - - - Streaming (asynchronous API) - - - - - ```python - # The `chat` object is created in the previous step. - result = model.respond(chat) - - print(result) - ``` - - - - ```python - # The `chat` object is created in the previous step. - prediction_stream = model.respond_stream(chat) - - for fragment in prediction_stream: - print(fragment.content, end="", flush=True) - print() # Advance to a new line at the end of the response - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - # The `chat` object is created in the previous step. - result = await model.respond(chat) - - print(result) - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - # The `chat` object is created in the previous step. - prediction_stream = await model.respond_stream(chat) - - async for fragment in prediction_stream: - print(fragment.content, end="", flush=True) - print() # Advance to a new line at the end of the response - ``` - - - -Customize Inferencing Parameters [#customize-inferencing-parameters] - -You can pass in inferencing parameters via the `config` keyword parameter on `.respond()`. - - - - - Non-streaming (synchronous API) - - - - Streaming (synchronous API) - - - - Non-streaming (asynchronous API) - - - - Streaming (asynchronous API) - - - - - ```python - result = model.respond(chat, config={ - "temperature": 0.6, - "maxTokens": 50, - }) - ``` - - - - ```python - prediction_stream = model.respond_stream(chat, config={ - "temperature": 0.6, - "maxTokens": 50, - }) - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - result = await model.respond(chat, config={ - "temperature": 0.6, - "maxTokens": 50, - }) - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - prediction_stream = await model.respond_stream(chat, config={ - "temperature": 0.6, - "maxTokens": 50, - }) - ``` - - - -See [Configuring the Model](./parameters) for more information on what can be configured. - -Print prediction stats [#print-prediction-stats] - -You can also print prediction metadata, such as the model used for generation, number of generated -tokens, time to first token, and stop reason. - - - - - Non-streaming - - - - Streaming - - - - - ```python - # `result` is the response from the model. - print("Model used:", result.model_info.display_name) - print("Predicted tokens:", result.stats.predicted_tokens_count) - print("Time to first token (seconds):", result.stats.time_to_first_token_sec) - print("Stop reason:", result.stats.stop_reason) - ``` - - - - ```python - # After iterating through the prediction fragments, - # the overall prediction result may be obtained from the stream - result = prediction_stream.result() - - print("Model used:", result.model_info.display_name) - print("Predicted tokens:", result.stats.predicted_tokens_count) - print("Time to first token (seconds):", result.stats.time_to_first_token_sec) - print("Stop reason:", result.stats.stop_reason) - ``` - - - -Both the non-streaming and streaming result access is consistent across the synchronous and -asynchronous APIs, as `prediction_stream.result()` is a non-blocking API that raises an exception -if no result is available (either because the prediction is still running, or because the -prediction request failed). Prediction streams also offer a blocking (synchronous API) or -awaitable (asynchronous API) `prediction_stream.wait_for_result()` method that internally handles -iterating the stream to completion before returning the result. - -Example: Multi-turn Chat [#example-multi-turn-chat] - -```python title="chatbot.py" -import lmstudio as lms - -model = lms.llm() -chat = lms.Chat("You are a task focused AI assistant") - -while True: - try: - user_input = input("You (leave blank to exit): ") - except EOFError: - print() - break - if not user_input: - break - chat.add_user_message(user_input) - prediction_stream = model.respond_stream( - chat, - on_message=chat.append, - ) - print("Bot: ", end="", flush=True) - for fragment in prediction_stream: - print(fragment.content, end="", flush=True) - print() -``` - -Progress Callbacks [#progress-callbacks] - -Long prompts will often take a long time to first token, i.e. it takes the model a long time to process your prompt. -If you want to get updates on the progress of this process, you can provide a float callback to `respond` -that receives a float from 0.0-1.0 representing prompt processing progress. - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - - llm = lms.llm() - - response = llm.respond( - "What is LM Studio?", - on_prompt_processing_progress = (lambda progress: print(f"{progress*100}% complete")), - ) - ``` - - - - ```python - import lmstudio as lms - - with lms.Client() as client: - llm = client.llm.model() - - response = llm.respond( - "What is LM Studio?", - on_prompt_processing_progress = (lambda progress: print(f"{progress*100}% complete")), - ) - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - async with lms.AsyncClient() as client: - llm = await client.llm.model() - - response = await llm.respond( - "What is LM Studio?", - on_prompt_processing_progress = (lambda progress: print(f"{progress*100}% complete")), - ) - ``` - - - -In addition to `on_prompt_processing_progress`, the other available progress callbacks are: - -* `on_first_token`: called after prompt processing is complete and the first token is being emitted. - Does not receive any arguments (use the streaming iteration API or `on_prediction_fragment` - to process tokens as they are emitted). -* `on_prediction_fragment`: called for each prediction fragment received by the client. - Receives the same prediction fragments as iterating over the stream iteration API. -* `on_message`: called with an assistant response message when the prediction is complete. - Intended for appending received messages to a chat history instance. - - - - - - -Use `llm.complete(...)` to generate text completions from a loaded language model. -Text completions mean sending a non-formatted string to the model with the expectation that the model will complete the text. - -This is different from multi-turn chat conversations. For more information on chat completions, see [Chat Completions](./chat-completion). - -Quickstart [#quickstart] - - - -

- Instantiate a Model -

- - First, you need to load a model to generate completions from. - This can be done using the top-level `llm` convenience API, - or the `model` method in the `llm` namespace when using the scoped resource API. - For example, here is how to use Qwen2.5 7B Instruct. - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - - model = lms.llm("qwen2.5-7b-instruct") - ``` - - - - ```python - import lmstudio as lms - - with lms.Client() as client: - model = client.llm.model("qwen2.5-7b-instruct") - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - async with lms.AsyncClient() as client: - model = await client.llm.model("qwen2.5-7b-instruct") - ``` - - -
- - -

- Generate a Completion -

- - Once you have a loaded model, you can generate completions by passing a string to the `complete` method on the `llm` handle. - - - - - Non-streaming (synchronous API) - - - - Streaming (synchronous API) - - - - Non-streaming (asynchronous API) - - - - Streaming (asynchronous API) - - - - - ```python - # The `model` object is created in the previous step. - result = model.complete("My name is", config={"maxTokens": 100}) - - print(result) - ``` - - - - ```python - # The `model` object is created in the previous step. - prediction_stream = model.complete_stream("My name is", config={"maxTokens": 100}) - - for fragment in prediction_stream: - print(fragment.content, end="", flush=True) - print() # Advance to a new line at the end of the response - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - # The `model` object is created in the previous step. - result = await model.complete("My name is", config={"maxTokens": 100}) - - print(result) - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - # The `model` object is created in the previous step. - prediction_stream = await model.complete_stream("My name is", config={"maxTokens": 100}) - - async for fragment in prediction_stream: - print(fragment.content, end="", flush=True) - print() # Advance to a new line at the end of the response - ``` - - -
- - -

- Print Prediction Stats -

- - You can also print prediction metadata, such as the model used for generation, number of generated tokens, time to first token, and stop reason. - - - - - Non-streaming - - - - Streaming - - - - - ```python - # `result` is the response from the model. - print("Model used:", result.model_info.display_name) - print("Predicted tokens:", result.stats.predicted_tokens_count) - print("Time to first token (seconds):", result.stats.time_to_first_token_sec) - print("Stop reason:", result.stats.stop_reason) - ``` - - - - ```python - # After iterating through the prediction fragments, - # the overall prediction result may be obtained from the stream - result = prediction_stream.result() - - print("Model used:", result.model_info.display_name) - print("Predicted tokens:", result.stats.predicted_tokens_count) - print("Time to first token (seconds):", result.stats.time_to_first_token_sec) - print("Stop reason:", result.stats.stop_reason) - ``` - - - - Both the non-streaming and streaming result access is consistent across the synchronous and - asynchronous APIs, as `prediction_stream.result()` is a non-blocking API that raises an exception - if no result is available (either because the prediction is still running, or because the - prediction request failed). Prediction streams also offer a blocking (synchronous API) or - awaitable (asynchronous API) `prediction_stream.wait_for_result()` method that internally handles - iterating the stream to completion before returning the result. -
-
- -Example: Get an LLM to Simulate a Terminal [#example-get-an-llm-to-simulate-a-terminal] - -Here's an example of how you might use the `complete` method to simulate a terminal. - -```python title="terminal-sim.py" -import lmstudio as lms - -model = lms.llm() -console_history = [] - -while True: - try: - user_command = input("$ ") - except EOFError: - print() - break - if user_command.strip() == "exit": - break - console_history.append(f"$ {user_command}") - history_prompt = "\n".join(console_history) - prediction_stream = model.complete_stream( - history_prompt, - config={ "stopStrings": ["$"] }, - ) - for fragment in prediction_stream: - print(fragment.content, end="", flush=True) - print() - console_history.append(prediction_stream.result().content) -``` - -Customize Inferencing Parameters [#customize-inferencing-parameters] - -You can pass in inferencing parameters via the `config` keyword parameter on `.complete()`. - - - - - Non-streaming (synchronous API) - - - - Streaming (synchronous API) - - - - Non-streaming (asynchronous API) - - - - Streaming (asynchronous API) - - - - - ```python - result = model.complete(initial_text, config={ - "temperature": 0.6, - "maxTokens": 50, - }) - ``` - - - - ```python - prediction_stream = model.complete_stream(initial_text, config={ - "temperature": 0.6, - "maxTokens": 50, - }) - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - result = await model.complete(initial_text, config={ - "temperature": 0.6, - "maxTokens": 50, - }) - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - prediction_stream = await model.complete_stream(initial_text, config={ - "temperature": 0.6, - "maxTokens": 50, - }) - ``` - - - -See [Configuring the Model](./parameters) for more information on what can be configured. - -Progress Callbacks [#progress-callbacks] - -Long prompts will often take a long time to first token, i.e. it takes the model a long time to process your prompt. -If you want to get updates on the progress of this process, you can provide a float callback to `complete` -that receives a float from 0.0-1.0 representing prompt processing progress. - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - - llm = lms.llm() - - completion = llm.complete( - "My name is", - on_prompt_processing_progress = (lambda progress: print(f"{progress*100}% complete")), - ) - ``` - - - - ```python - import lmstudio as lms - - with lms.Client() as client: - llm = client.llm.model() - - completion = llm.complete( - "My name is", - on_prompt_processing_progress = (lambda progress: print(f"{progress*100}% processed")), - ) - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - async with lms.AsyncClient() as client: - llm = await client.llm.model() - - completion = await llm.complete( - "My name is", - on_prompt_processing_progress = (lambda progress: print(f"{progress*100}% processed")), - ) - ``` - - - -In addition to `on_prompt_processing_progress`, the other available progress callbacks are: - -* `on_first_token`: called after prompt processing is complete and the first token is being emitted. - Does not receive any arguments (use the streaming iteration API or `on_prediction_fragment` - to process tokens as they are emitted). -* `on_prediction_fragment`: called for each prediction fragment received by the client. - Receives the same prediction fragments as iterating over the stream iteration API. -* `on_message`: called with an assistant response message when the prediction is complete. - Intended for appending received messages to a chat history instance. - - - - - - -*Required Python SDK version*: **1.1.0** - -Some models, known as VLMs (Vision-Language Models), can accept images as input. You can pass images to the model using the `.respond()` method. - -Prerequisite: Get a VLM (Vision-Language Model) [#prerequisite-get-a-vlm-vision-language-model] - -If you don't yet have a VLM, you can download a model like `qwen2-vl-2b-instruct` using the following command: - -```bash -lms get qwen2-vl-2b-instruct -``` - - - -

- Instantiate the Model -

- - Connect to LM Studio and obtain a handle to the VLM (Vision-Language Model) you want to use. - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - - model = lms.llm("qwen2-vl-2b-instruct") - ``` - - - - ```python - import lmstudio as lms - - with lms.Client() as client: - model = client.llm.model("qwen2-vl-2b-instruct") - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - async with lms.AsyncClient() as client: - model = await client.llm.model("qwen2-vl-2b-instruct") - ``` - - -
- - -

- Prepare the Image -

- - Use the `prepare_image()` function or `files` namespace method to - get a handle to the image that can subsequently be passed to the model. - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - - image_path = "/path/to/image.jpg" # Replace with the path to your image - image_handle = lms.prepare_image(image_path) - ``` - - - - ```python - import lmstudio as lms - - with lms.Client() as client: - image_path = "/path/to/image.jpg" # Replace with the path to your image - image_handle = client.files.prepare_image(image_path) - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - async with lms.AsyncClient() as client: - image_path = "/path/to/image.jpg" # Replace with the path to your image - image_handle = await client.files.prepare_image(image_path) - ``` - - - - If you only have the raw data of the image, you can supply the raw data directly as a bytes - object without having to write it to disk first. Due to this feature, binary filesystem - paths are *not* supported (as they will be handled as malformed image data rather than as - filesystem paths). - - Binary IO objects are also accepted as local file inputs. - - The LM Studio server supports JPEG, PNG, and WebP image formats. -
- - -

- Pass the Image to the Model in - - `.respond()` -

- - Generate a prediction by passing the image to the model in the `.respond()` method. - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - - image_path = "/path/to/image.jpg" # Replace with the path to your image - image_handle = lms.prepare_image(image_path) - model = lms.llm("qwen2-vl-2b-instruct") - chat = lms.Chat() - chat.add_user_message("Describe this image please", images=[image_handle]) - prediction = model.respond(chat) - ``` - - - - ```python - import lmstudio as lms - - with lms.Client() as client: - image_path = "/path/to/image.jpg" # Replace with the path to your image - image_handle = client.files.prepare_image(image_path) - model = client.llm.model("qwen2-vl-2b-instruct") - chat = lms.Chat() - chat.add_user_message("Describe this image please", images=[image_handle]) - prediction = model.respond(chat) - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - async with lms.AsyncClient() as client: - image_path = "/path/to/image.jpg" # Replace with the path to your image - image_handle = client.files.prepare_image(image_path) - model = await client.llm.model("qwen2-vl-2b-instruct") - chat = lms.Chat() - chat.add_user_message("Describe this image please", images=[image_handle]) - prediction = await model.respond(chat) - ``` - - -
-
- - - - -You can customize both inference-time and load-time parameters for your model. Inference parameters can be set on a per-request basis, while load parameters are set when loading the model. - -Inference Parameters [#inference-parameters] - -Set inference-time parameters such as `temperature`, `maxTokens`, `topP` and more. - - - - - .respond() - - - - .complete() - - - - - ```python - result = model.respond(chat, config={ - "temperature": 0.6, - "maxTokens": 50, - }) - ``` - - - - ```python - result = model.complete(chat, config={ - "temperature": 0.6, - "maxTokens": 50, - "stopStrings": ["\n\n"], - }) - ``` - - - -See [`LLMPredictionConfigInput`](./../../typescript/api-reference/llm-prediction-config-input) in the -Typescript SDK documentation for all configurable fields. - -Note that while `structured` can be set to a JSON schema definition as an inference-time configuration parameter -(Zod schemas are not supported in the Python SDK), the preferred approach is to instead set the -[dedicated `response_format` parameter](\(./structured-responses\)), which allows you to more rigorously -enforce the structure of the output using a JSON or class based schema definition. - -Load Parameters [#load-parameters] - -Set load-time parameters such as the context length, GPU offload ratio, and more. - -Set Load Parameters with `.model()` [#set-load-parameters-with-model] - -The `.model()` retrieves a handle to a model that has already been loaded, or loads a new one on demand (JIT loading). - -**Note**: if the model is already loaded, the given configuration will be **ignored**. - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - - model = lms.llm("qwen2.5-7b-instruct", config={ - "contextLength": 8192, - "gpu": { - "ratio": 0.5, - } - }) - ``` - - - - ```python - import lmstudio as lms - - with lms.Client() as client: - model = client.llm.model( - "qwen2.5-7b-instruct", - config={ - "contextLength": 8192, - "gpu": { - "ratio": 0.5, - } - } - ) - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - async with lms.AsyncClient() as client: - model = await client.llm.model( - "qwen2.5-7b-instruct", - config={ - "contextLength": 8192, - "gpu": { - "ratio": 0.5, - } - } - ) - ``` - - - -See [`LLMLoadModelConfig`](./../../typescript/api-reference/llm-load-model-config) in the -Typescript SDK documentation for all configurable fields. - -Set Load Parameters with `.load_new_instance()` [#set-load-parameters-with-load_new_instance] - -The `.load_new_instance()` method creates a new model instance and loads it with the specified configuration. - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - - client = lms.get_default_client() - model = client.llm.load_new_instance("qwen2.5-7b-instruct", config={ - "contextLength": 8192, - "gpu": { - "ratio": 0.5, - } - }) - ``` - - - - ```python - import lmstudio as lms - - with lms.Client() as client: - model = client.llm.load_new_instance( - "qwen2.5-7b-instruct", - config={ - "contextLength": 8192, - "gpu": { - "ratio": 0.5, - } - } - ) - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - async with lms.AsyncClient() as client: - model = await client.llm.load_new_instance( - "qwen2.5-7b-instruct", - config={ - "contextLength": 8192, - "gpu": { - "ratio": 0.5, - } - } - ) - ``` - - - -See [`LLMLoadModelConfig`](./../../typescript/api-reference/llm-load-model-config) in the -Typescript SDK documentation for all configurable fields. - - - - -*Required Python SDK version*: **1.2.0** - -Speculative decoding is a technique that can substantially increase the generation speed of large language models (LLMs) without reducing response quality. See [Speculative Decoding](./../../app/advanced/speculative-decoding) for more info. - -To use speculative decoding in `lmstudio-python`, simply provide a `draftModel` parameter when performing the prediction. You do not need to load the draft model separately. - - - - - Non-streaming - - - - Streaming - - - - - ```python - import lmstudio as lms - - main_model_key = "qwen2.5-7b-instruct" - draft_model_key = "qwen2.5-0.5b-instruct" - - model = lms.llm(main_model_key) - result = model.respond( - "What are the prime numbers between 0 and 100?", - config={ - "draftModel": draft_model_key, - } - ) - - print(result) - stats = result.stats - print(f"Accepted {stats.accepted_draft_tokens_count}/{stats.predicted_tokens_count} tokens") - ``` - - - - ```python - import lmstudio as lms - - main_model_key = "qwen2.5-7b-instruct" - draft_model_key = "qwen2.5-0.5b-instruct" - - model = lms.llm(main_model_key) - prediction_stream = model.respond_stream( - "What are the prime numbers between 0 and 100?", - config={ - "draftModel": draft_model_key, - } - ) - for fragment in prediction_stream: - print(fragment.content, end="", flush=True) - print() # Advance to a new line at the end of the response - - stats = prediction_stream.result().stats - print(f"Accepted {stats.accepted_draft_tokens_count}/{stats.predicted_tokens_count} tokens") - ``` - - - - - - -You can enforce a particular response format from an LLM by providing a JSON schema to the `.respond()` method. -This guarantees that the model's output conforms to the schema you provide. - -The JSON schema can either be provided directly, -or by providing an object that implements the `lmstudio.ModelSchema` protocol, -such as `pydantic.BaseModel` or `lmstudio.BaseModel`. - -The `lmstudio.ModelSchema` protocol is defined as follows: - -```python -@runtime_checkable -class ModelSchema(Protocol): - """Protocol for classes that provide a JSON schema for their model.""" - - @classmethod - def model_json_schema(cls) -> DictSchema: - """Return a JSON schema dict describing this model.""" - ... - -``` - -When a schema is provided, the prediction result's `parsed` field will contain a string-keyed dictionary that conforms -to the given schema (for unstructured results, this field is a string field containing the same value as `content`). - -Enforce Using a Class Based Schema Definition [#enforce-using-a-class-based-schema-definition] - -If you wish the model to generate JSON that satisfies a given schema, -it is recommended to provide a class based schema definition using a library -such as [`pydantic`](https://docs.pydantic.dev/) or [`msgspec`](https://jcristharif.com/msgspec/). - -Pydantic models natively implement the `lmstudio.ModelSchema` protocol, -while `lmstudio.BaseModel` is a `msgspec.Struct` subclass that implements `.model_json_schema()` appropriately. - -Define a Class Based Schema [#define-a-class-based-schema] - - - - - pydantic.BaseModel - - - - lmstudio.BaseModel - - - - - ```python - from pydantic import BaseModel - - # A class based schema for a book - class BookSchema(BaseModel): - title: str - author: str - year: int - ``` - - - - ```python - from lmstudio import BaseModel - - # A class based schema for a book - class BookSchema(BaseModel): - title: str - author: str - year: int - ``` - - - -Generate a Structured Response [#generate-a-structured-response] - - - - - Non-streaming - - - - Streaming - - - - - ```python - result = model.respond("Tell me about The Hobbit", response_format=BookSchema) - book = result.parsed - - print(book) - # ^ - # Note that `book` is correctly typed as { title: string, author: string, year: number } - ``` - - - - ```python - prediction_stream = model.respond_stream("Tell me about The Hobbit", response_format=BookSchema) - - # Optionally stream the response - # for fragment in prediction: - # print(fragment.content, end="", flush=True) - # print() - # Note that even for structured responses, the *fragment* contents are still only text - - # Get the final structured result - result = prediction_stream.result() - book = result.parsed - - print(book) - # ^ - # Note that `book` is correctly typed as { title: string, author: string, year: number } - ``` - - - -Enforce Using a JSON Schema [#enforce-using-a-json-schema] - -You can also enforce a structured response using a JSON schema. - -Define a JSON Schema [#define-a-json-schema] - -```python -# A JSON schema for a book -schema = { - "type": "object", - "properties": { - "title": { "type": "string" }, - "author": { "type": "string" }, - "year": { "type": "integer" }, - }, - "required": ["title", "author", "year"], -} -``` - -Generate a Structured Response [#generate-a-structured-response-1] - - - - - Non-streaming - - - - Streaming - - - - - ```python - result = model.respond("Tell me about The Hobbit", response_format=schema) - book = result.parsed - - print(book) - # ^ - # Note that `book` is correctly typed as { title: string, author: string, year: number } - ``` - - - - ```python - prediction_stream = model.respond_stream("Tell me about The Hobbit", response_format=schema) - - # Stream the response - for fragment in prediction: - print(fragment.content, end="", flush=True) - print() - # Note that even for structured responses, the *fragment* contents are still only text - - # Get the final structured result - result = prediction_stream.result() - book = result.parsed - - print(book) - # ^ - # Note that `book` is correctly typed as { title: string, author: string, year: number } - ``` - - - - - - - - -SDK methods such as `llm.respond()`, `llm.applyPromptTemplate()`, or `llm.act()` -take in a chat parameter as an input. -There are a few ways to represent a chat when using the SDK. - -Option 1: Input a Single String [#option-1-input-a-single-string] - -If your chat only has one single user message, you can use a single string to represent the chat. -Here is an example with the `.respond` method. - -```python -prediction = llm.respond("What is the meaning of life?") -``` - -Option 2: Using the `Chat` Helper Class [#option-2-using-the-chat-helper-class] - -For more complex tasks, it is recommended to use the `Chat` helper class. -It provides various commonly used methods to manage the chat. -Here is an example with the `Chat` class, where the initial system prompt -is supplied when initializing the chat instance, and then the initial user -message is added via the corresponding method call. - -```python -chat = Chat("You are a resident AI philosopher.") -chat.add_user_message("What is the meaning of life?") - -prediction = llm.respond(chat) -``` - -You can also quickly construct a `Chat` object using the `Chat.from_history` method. - - - - - Chat history data - - - - Single string - - - - - ```python - chat = Chat.from_history({"messages": [ - { "role": "system", "content": "You are a resident AI philosopher." }, - { "role": "user", "content": "What is the meaning of life?" }, - ]}) - ``` - - - - ```python - # This constructs a chat with a single user message - chat = Chat.from_history("What is the meaning of life?") - ``` - - - -Option 3: Providing Chat History Data Directly [#option-3-providing-chat-history-data-directly] - -As the APIs that accept chat histories use `Chat.from_history` internally, -they also accept the chat history data format as a regular dictionary: - -```python -prediction = llm.respond({"messages": [ - { "role": "system", "content": "You are a resident AI philosopher." }, - { "role": "user", "content": "What is the meaning of life?" }, -]}) -``` - - - - -Automatic tool calling [#automatic-tool-calling] - -We introduce the concept of execution "rounds" to describe the combined process of running a tool, providing its output to the LLM, and then waiting for the LLM to decide what to do next. - -**Execution Round** - -``` - • run a tool -> - ↑ • provide the result to the LLM -> - │ • wait for the LLM to generate a response - │ - └────────────────────────────────────────┘ └➔ (return) -``` - -A model might choose to run tools multiple times before returning a final result. For example, if the LLM is writing code, it might choose to compile or run the program, fix errors, and then run it again, rinse and repeat until it gets the desired result. - -With this in mind, we say that the `.act()` API is an automatic "multi-round" tool calling API. - -Quick Example [#quick-example] - -```python -import lmstudio as lms - -def multiply(a: float, b: float) -> float: - """Given two numbers a and b. Returns the product of them.""" - return a * b - -model = lms.llm("qwen2.5-7b-instruct") -model.act( - "What is the result of 12345 multiplied by 54321?", - [multiply], - on_message=print, -) -``` - -What does it mean for an LLM to "use a tool"? [#what-does-it-mean-for-an-llm-to-use-a-tool] - -LLMs are largely text-in, text-out programs. So, you may ask "how can an LLM use a tool?". The answer is that some LLMs are trained to ask the human to call the tool for them, and expect the tool output to to be provided back in some format. - -Imagine you're giving computer support to someone over the phone. You might say things like "run this command for me ... OK what did it output? ... OK now click there and tell me what it says ...". In this case you're the LLM! And you're "calling tools" vicariously through the person on the other side of the line. - -Running multiple tool calls in parallel [#running-multiple-tool-calls-in-parallel] - -By default, version 1.4.0 and later of the Python SDK will only run a single tool call request at a time, -even if the model requests multiple tool calls in a single response message. This ensures the requests will -be processed correctly even if the tool implementations do not support multiple concurrent calls. - -When the tool implementations are known to be thread-safe, and are both slow and frequent enough to be worth -running in parallel, the `max_parallel_tool_calls` option specifies the maximum number of tool call requests -that will be processed in parallel from a single model response. This value defaults to 1 (waiting for each -tool call to complete before starting the next one). Setting this value to `None` will automatically scale -the maximum number of parallel tool calls to a multiple of the number of CPU cores available to the process. - -Important: Model Selection [#important-model-selection] - -The model selected for tool use will greatly impact performance. - -Some general guidance when selecting a model: - -* Not all models are capable of intelligent tool use -* Bigger is better (i.e., a 7B parameter model will generally perform better than a 3B parameter model) -* We've observed [Qwen2.5-7B-Instruct](https://model.lmstudio.ai/download/lmstudio-community/Qwen2.5-7B-Instruct-GGUF) to perform well in a wide variety of cases -* This guidance may change - -Example: Multiple Tools [#example-multiple-tools] - -The following code demonstrates how to provide multiple tools in a single `.act()` call. - -```python -import math -import lmstudio as lms - -def add(a: int, b: int) -> int: - """Given two numbers a and b, returns the sum of them.""" - return a + b - -def is_prime(n: int) -> bool: - """Given a number n, returns True if n is a prime number.""" - if n < 2: - return False - sqrt = int(math.sqrt(n)) - for i in range(2, sqrt): - if n % i == 0: - return False - return True - -model = lms.llm("qwen2.5-7b-instruct") -model.act( - "Is the result of 12345 + 45668 a prime? Think step by step.", - [add, is_prime], - on_message=print, -) -``` - -Example: Chat Loop with Create File Tool [#example-chat-loop-with-create-file-tool] - -The following code creates a conversation loop with an LLM agent that can create files. - -```python -import readline # Enables input line editing -from pathlib import Path - -import lmstudio as lms - -def create_file(name: str, content: str): - """Create a file with the given name and content.""" - dest_path = Path(name) - if dest_path.exists(): - return "Error: File already exists." - try: - dest_path.write_text(content, encoding="utf-8") - except Exception as exc: - return "Error: {exc!r}" - return "File created." - -def print_fragment(fragment, round_index=0): - # .act() supplies the round index as the second parameter - # Setting a default value means the callback is also - # compatible with .complete() and .respond(). - print(fragment.content, end="", flush=True) - -model = lms.llm() -chat = lms.Chat("You are a task focused AI assistant") - -while True: - try: - user_input = input("You (leave blank to exit): ") - except EOFError: - print() - break - if not user_input: - break - chat.add_user_message(user_input) - print("Bot: ", end="", flush=True) - model.act( - chat, - [create_file], - on_message=chat.append, - on_prediction_fragment=print_fragment, - ) - print() -``` - -Progress Callbacks [#progress-callbacks] - -Complex interactions with a tool using agent may take some time to process. - -The regular progress callbacks for any prediction request are available, -but the expected capabilities differ from those for single round predictions. - -* `on_prompt_processing_progress`: called during prompt processing for each - prediction round. Receives the progress ratio (as a float) and the round - index as positional arguments. -* `on_first_token`: called after prompt processing is complete for each prediction round. - Receives the round index as its sole argument. -* `on_prediction_fragment`: called for each prediction fragment received by the client. - Receives the prediction fragment and the round index as positional arguments. -* `on_message`: called with an assistant response message when each prediction round is - complete, and with tool result messages as each tool call request is completed. - Intended for appending received messages to a chat history instance, and hence - does *not* receive the round index as an argument. - -The following additional callbacks are available to monitor the prediction rounds: - -* `on_round_start`: called before submitting the prediction request for each round. - Receives the round index as its sole argument. -* `on_prediction_completed`: called after the prediction for the round has been completed, - but before any requested tool calls have been initiated. Receives the round's prediction - result as its sole argument. A round prediction result is a regular prediction result - with an additional `round_index` attribute. -* `on_round_end`: called after any tool call requests for the round have been resolved. - -Finally, applications may request notifications when agents emit invalid tool requests: - -* `handle_invalid_tool_request`: called when a tool request was unable to be processed. - Receives the exception that is about to be reported, as well as the original tool - request that resulted in the problem. When no tool request is given, this is - purely a notification of an unrecoverable error before the agent interaction raises - the given exception (allowing the application to raise its own exception instead). - When a tool request is given, it indicates that rather than being raised locally, - the text description of the exception is going to be passed back to the agent - as the result of that failed tool request. In these cases, the callback may either - return `None` to indicate that the error description should be sent to the agent, - raise the given exception (or a different exception) locally, or return a text - string that should be sent to the agent instead of the error description. - -For additional details on defining tools, and an example of overriding the invalid -tool request handling to raise all exceptions locally instead of passing them to -back the agent, refer to [Tool Definition](./tools.md). - - - - -You can define tools as regular Python functions and pass them to the model in the `act()` call. -Alternatively, tools can be defined with `lmstudio.ToolFunctionDef` in order to control the -name and description passed to the language model. - -Anatomy of a Tool [#anatomy-of-a-tool] - -Follow one of the following examples to define functions as tools (the first approach -is typically going to be the most convenient): - - - - - Python function - - - - ToolFunctionDef.from_callable - - - - ToolFunctionDef - - - - - ```python - # Type hinted functions with clear names and docstrings - # may be used directly as tool definitions - def add(a: int, b: int) -> int: - """Given two numbers a and b, returns the sum of them.""" - # The SDK ensures arguments are coerced to their specified types - return a + b - - # Pass `add` directly to `act()` as a tool definition - ``` - - - - ```python - from lmstudio import ToolFunctionDef - - def cryptic_name(a: int, b: int) -> int: - return a + b - - # Type hinted functions with cryptic names and missing or poor docstrings - # can be turned into clear tool definitions with `from_callable` - tool_def = ToolFunctionDef.from_callable( - cryptic_name, - name="add", - description="Given two numbers a and b, returns the sum of them." - ) - # Pass `tool_def` to `act()` as a tool definition - ``` - - - - ```python - from lmstudio import ToolFunctionDef - - def cryptic_name(a, b): - return a + b - - # Functions without type hints can be used without wrapping them - # at runtime by defining a tool function directly. - tool_def = ToolFunctionDef( - name="add", - description="Given two numbers a and b, returns the sum of them.", - parameters={ - "a": int, - "b": int, - }, - implementation=cryptic_name, - ) - # Pass `tool_def` to `act()` as a tool definition - ``` - - - -**Important**: The tool name, description, and the parameter definitions are all passed to the model! - -This means that your wording will affect the quality of the generation. Make sure to always provide a clear description of the tool so the model knows how to use it. - -Tools with External Effects (like Computer Use or API Calls) [#tools-with-external-effects-like-computer-use-or-api-calls] - -Tools can also have external effects, such as creating files or calling programs and even APIs. By implementing tools with external effects, you -can essentially turn your LLMs into autonomous agents that can perform tasks on your local machine. - -Example: `create_file_tool` [#example-create_file_tool] - -Tool Definition [#tool-definition] - -```python title="create_file_tool.py" -from pathlib import Path - -def create_file(name: str, content: str): - """Create a file with the given name and content.""" - dest_path = Path(name) - if dest_path.exists(): - return "Error: File already exists." - try: - dest_path.write_text(content, encoding="utf-8") - except Exception as exc: - return "Error: {exc!r}" - return "File created." -``` - -Example code using the `create_file` tool: [#example-code-using-the-create_file-tool] - -```python title="example.py" -import lmstudio as lms -from create_file_tool import create_file - -model = lms.llm("qwen2.5-7b-instruct") -model.act( - "Please create a file named output.txt with your understanding of the meaning of life.", - [create_file], -) -``` - -Handling tool calling errors [#handling-tool-calling-errors] - -By default, version 1.3.0 and later of the Python SDK will automatically convert -exceptions raised by tool calls to text and report them back to the language model. -In many cases, when notified of an error in this way, a language model is able -to either adjust its request to avoid the failure, or else accept the failure as -a valid response to its request (consider a prompt like `Attempt to divide 1 by 0 -using the provided tool. Explain the result.`, where the expected -response is an explanation of the `ZeroDivisionError` exception the Python -interpreter raises when instructed to divide by zero). - -This error handling behaviour can be overridden using the `handle_invalid_tool_request` -callback. For example, the following code reverts the error handling back to raising -exceptions locally in the client: - -```python title="example.py" -import lmstudio as lms - -def divide(numerator: float, denominator: float) -> float: - """Divide the given numerator by the given denominator. Return the result.""" - return numerator / denominator - -model = lms.llm("qwen2.5-7b-instruct") -chat = Chat() -chat.add_user_message( - "Attempt to divide 1 by 0 using the tool. Explain the result." -) - -def _raise_exc_in_client( - exc: LMStudioPredictionError, request: ToolCallRequest | None -) -> None: - raise exc - -act_result = llm.act( - chat, - [divide], - handle_invalid_tool_request=_raise_exc_in_client, -) -``` - -When a tool request is passed in, the callback results are processed as follows: - -* `None`: the original exception text is passed to the LLM unmodified -* a string: the returned string is passed to the LLM instead of the original - exception text -* raising an exception (whether the passed in exception or a new exception): - the raised exception is propagated locally in the client, terminating the - prediction process - -If no tool request is passed in, the callback invocation is a notification only, -and the exception cannot be converted to text for passing pack to the LLM -(although it can still be replaced with a different exception). These cases -indicate failures in the expected communication with the server API that mean -the prediction process cannot reasonably continue, so if the callback doesn't -raise an exception, the calling code will raise the original exception directly. - - - - -Generate embeddings for input text. Embeddings are vector representations of text that capture semantic meaning. Embeddings are a building block for RAG (Retrieval-Augmented Generation) and other similarity-based tasks. - -Prerequisite: Get an Embedding Model [#prerequisite-get-an-embedding-model] - -If you don't yet have an embedding model, you can download a model like `nomic-ai/nomic-embed-text-v1.5` using the following command: - -```bash -lms get nomic-ai/nomic-embed-text-v1.5 -``` - -Create Embeddings [#create-embeddings] - -To convert a string to a vector representation, pass it to the `embed` method on the corresponding embedding model handle. - -```python title="example.py" -import lmstudio as lms - -model = lms.embedding_model("nomic-embed-text-v1.5") - -embedding = model.embed("Hello, world!") -``` - - - - -Models use a tokenizer to internally convert text into "tokens" they can deal with more easily. LM Studio exposes this tokenizer for utility. - -Tokenize [#tokenize] - -You can tokenize a string with a loaded LLM or embedding model using the SDK. -In the below examples, the LLM reference can be replaced with an -embedding model reference without requiring any other changes. - -```python -import lmstudio as lms - -model = lms.llm() - -tokens = model.tokenize("Hello, world!") - -print(tokens) # Array of token IDs. -``` - -Count tokens [#count-tokens] - -If you only care about the number of tokens, simply check the length of the resulting array. - -```python -token_count = len(model.tokenize("Hello, world!")) -print("Token count:", token_count) -``` - -Example: count context [#example-count-context] - -You can determine if a given conversation fits into a model's context by doing the following: - -1. Convert the conversation to a string using the prompt template. -2. Count the number of tokens in the string. -3. Compare the token count to the model's context length. - -```python -import lmstudio as lms - -def does_chat_fit_in_context(model: lms.LLM, chat: lms.Chat) -> bool: - # Convert the conversation to a string using the prompt template. - formatted = model.apply_prompt_template(chat) - # Count the number of tokens in the string. - token_count = len(model.tokenize(formatted)) - # Get the current loaded context length of the model - context_length = model.get_context_length() - return token_count < context_length - -model = lms.llm() - -chat = lms.Chat.from_history({ - "messages": [ - { "role": "user", "content": "What is the meaning of life." }, - { "role": "assistant", "content": "The meaning of life is..." }, - # ... More messages - ] -}) - -print("Fits in context:", does_chat_fit_in_context(model, chat)) -``` - - - - -You can iterate through locally available models using the downloaded model listing methods. - -The listing results offer `.model()` and `.load_new_instance()` methods, which allow the -downloaded model reference to be converted in the full SDK handle for a loaded model. - -Available Models on the LM Studio Server [#available-models-on-the-lm-studio-server] - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - - downloaded = lms.list_downloaded_models() - llm_only = lms.list_downloaded_models("llm") - embedding_only = lms.list_downloaded_models("embedding") - - for model in downloaded: - print(model) - ``` - - - - ```python - import lmstudio as lms - - with lms.Client() as client: - downloaded = client.list_downloaded_models() - llm_only = client.llm.list_downloaded() - embedding_only = client.embedding.list_downloaded() - - for model in downloaded: - print(model) - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - async with lms.AsyncClient() as client: - downloaded = await client.list_downloaded_models() - llm_only = await client.llm.list_downloaded() - embedding_only = await client.embedding.list_downloaded() - - for model in downloaded: - print(model) - ``` - - - -This will give you results equivalent to using [`lms ls`](../../cli/ls) in the CLI. - -Example output: [#example-output] - -```python -DownloadedLlm(model_key='qwen2.5-7b-instruct-1m', display_name='Qwen2.5 7B Instruct 1M', architecture='qwen2', vision=False) -DownloadedEmbeddingModel(model_key='text-embedding-nomic-embed-text-v1.5', display_name='Nomic Embed Text v1.5', architecture='nomic-bert') -``` - - - - -You can iterate through models loaded into memory using the functions and methods shown below. - -The results are full SDK model handles, allowing access to all model functionality. - -List Models Currently Loaded in Memory [#list-models-currently-loaded-in-memory] - -This will give you results equivalent to using [`lms ps`](../../cli/ps) in the CLI. - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - - all_loaded_models = lms.list_loaded_models() - llm_only = lms.list_loaded_models("llm") - embedding_only = lms.list_loaded_models("embedding") - - print(all_loaded_models) - ``` - - - - ```python - import lms - - with lms.Client() as client: - all_loaded_models = client.list_loaded_models() - llm_only = client.llm.list_loaded() - embedding_only = client.embedding.list_loaded() - - print(all_loaded_models) - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - async with lms.AsyncClient() as client: - all_loaded_models = await client.list_loaded_models() - llm_only = await client.llm.list_loaded() - embedding_only = await client.embedding.list_loaded() - - print(all_loaded_models) - ``` - - - - - - -AI models are huge. It can take a while to load them into memory. LM Studio's SDK allows you to precisely control this process. - -**Model namespaces:** - -* LLMs are accessed through the `client.llm` namespace -* Embedding models are accessed through the `client.embedding` namespace -* `lmstudio.llm` is equivalent to `client.llm.model` on the default client -* `lmstudio.embedding_model` is equivalent to `client.embedding.model` on the default client - -**Most commonly:** - -* Use `.model()` to get any currently loaded model -* Use `.model("model-key")` to use a specific model - -**Advanced (manual model management):** - -* Use `.load_new_instance("model-key")` to load a new instance of a model -* Use `.unload("model-key")` or `model_handle.unload()` to unload a model from memory - -Get the Current Model with `.model()` [#get-the-current-model-with-model] - -If you already have a model loaded in LM Studio (either via the GUI or `lms load`), -you can use it by calling `.model()` without any arguments. - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - - model = lms.llm() - ``` - - - - ```python - import lmstudio as lms - - with lms.Client() as client: - model = client.llm.model() - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - async with lms.AsyncClient() as client: - model = await client.llm.model() - ``` - - - -Get a Specific Model with `.model("model-key")` [#get-a-specific-model-with-modelmodel-key] - -If you want to use a specific model, you can provide the model key as an argument to `.model()`. - -Get if Loaded, or Load if not [#get-if-loaded-or-load-if-not] - -Calling `.model("model-key")` will load the model if it's not already loaded, or return the existing instance if it is. - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - - model = lms.llm("qwen/qwen3-4b-2507") - ``` - - - - ```python - import lmstudio as lms - - with lms.Client() as client: - model = client.llm.model("qwen/qwen3-4b-2507") - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - async with lms.AsyncClient() as client: - model = await client.llm.model("qwen/qwen3-4b-2507") - ``` - - - -Load a New Instance of a Model with `.load_new_instance()` [#load-a-new-instance-of-a-model-with-load_new_instance] - -Use `load_new_instance()` to load a new instance of a model, even if one already exists. -This allows you to have multiple instances of the same or different models loaded at the same time. - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - - client = lms.get_default_client() - model = client.llm.load_new_instance("qwen/qwen3-4b-2507") - another_model = client.llm.load_new_instance("qwen/qwen3-4b-2507", "my-second-model") - ``` - - - - ```python - import lmstudio as lms - - with lms.Client() as client: - model = client.llm.load_new_instance("qwen/qwen3-4b-2507") - another_model = client.llm.load_new_instance("qwen/qwen3-4b-2507", "my-second-model") - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - async with lms.AsyncClient() as client: - model = await client.llm.load_new_instance("qwen/qwen3-4b-2507") - another_model = await client.llm.load_new_instance("qwen/qwen3-4b-2507", "my-second-model") - ``` - - - -Note about Instance Identifiers [#note-about-instance-identifiers] - -If you provide an instance identifier that already exists, the server will throw an error. -So if you don't really care, it's safer to not provide an identifier, in which case -the server will generate one for you. You can always check in the server tab in LM Studio, too! - -Unload a Model from Memory with `.unload()` [#unload-a-model-from-memory-with-unload] - -Once you no longer need a model, you can unload it by simply calling `unload()` on its handle. - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - - model = lms.llm() - model.unload() - ``` - - - - ```python - import lmstudio as lms - - with lms.Client() as client: - model = client.llm.model() - model.unload() - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - async with lms.AsyncClient() as client: - model = await client.llm.model() - await model.unload() - ``` - - - -Set Custom Load Config Parameters [#set-custom-load-config-parameters] - -You can also specify the same load-time configuration options when loading a model, such as Context Length and GPU offload. - -See [load-time configuration](../llm-prediction/parameters) for more. - -Set an Auto Unload Timer (TTL) [#set-an-auto-unload-timer-ttl] - -You can specify a *time to live* for a model you load, which is the idle time (in seconds) -after the last request until the model unloads. See [Idle TTL](/docs/app/api/ttl-and-auto-evict) for more on this. - - - If you specify a TTL to `model()`, it will only apply if `model()` loads - a new instance, and will *not* retroactively change the TTL of an existing instance. - - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - - model = lms.llm("qwen/qwen3-4b-2507", ttl=3600) - ``` - - - - ```python - import lmstudio as lms - - with lms.Client() as client: - model = client.llm.model("qwen/qwen3-4b-2507", ttl=3600) - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - async with lms.AsyncClient() as client: - model = await client.llm.model("qwen/qwen3-4b-2507", ttl=3600) - ``` - - - - - - -LLMs and embedding models, due to their fundamental architecture, have a property called `context length`, and more specifically a **maximum** context length. Loosely speaking, this is how many tokens the models can "keep in memory" when generating text or embeddings. Exceeding this limit will result in the model behaving erratically. - -Use the `get_context_length()` function on the model object [#use-the-get_context_length-function-on-the-model-object] - -It's useful to be able to check the context length of a model, especially as an extra check before providing potentially long input to the model. - -```python title="example.py" -context_length = model.get_context_length() -``` - -The `model` in the above code snippet is an instance of a loaded model you get from the `llm.model` method. See [Manage Models in Memory](../manage-models/loading) for more information. - -Example: Check if the input will fit in the model's context window [#example-check-if-the-input-will-fit-in-the-models-context-window] - -You can determine if a given conversation fits into a model's context by doing the following: - -1. Convert the conversation to a string using the prompt template. -2. Count the number of tokens in the string. -3. Compare the token count to the model's context length. - -```python -import lmstudio as lms - -def does_chat_fit_in_context(model: lms.LLM, chat: lms.Chat) -> bool: - # Convert the conversation to a string using the prompt template. - formatted = model.apply_prompt_template(chat) - # Count the number of tokens in the string. - token_count = len(model.tokenize(formatted)) - # Get the current loaded context length of the model - context_length = model.get_context_length() - return token_count < context_length - -model = lms.llm() - -chat = lms.Chat.from_history({ - "messages": [ - { "role": "user", "content": "What is the meaning of life." }, - { "role": "assistant", "content": "The meaning of life is..." }, - # ... More messages - ] -}) - -print("Fits in context:", does_chat_fit_in_context(model, chat)) -``` - - - - -*Required Python SDK version*: **1.2.0** - -LM Studio allows you to configure certain parameters when loading a model -[through the server UI](/docs/advanced/per-model) or [through the API](/docs/api/sdk/load-model). - -You can retrieve the config with which a given model was loaded using the SDK. - -In the below examples, the LLM reference can be replaced with an -embedding model reference without requiring any other changes. - - - Context length is a special case that [has its own method](/docs/api/sdk/get-context-length). - - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - - model = lms.llm() - - print(model.get_load_config()) - ``` - - - - ```python - import lmstudio as lms - - with lms.Client() as client: - model = client.llm.model() - - print(model.get_load_config()) - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - async with lms.Client() as client: - model = await client.llm.model() - - print(await model.get_load_config()) - ``` - - - - - - -You can access general information and metadata about a model itself from a loaded -instance of that model. - -In the below examples, the LLM reference can be replaced with an -embedding model reference without requiring any other changes. - - - - - Python (convenience API) - - - - Python (scoped resource API) - - - - Python (asynchronous API) - - - - - ```python - import lmstudio as lms - - model = lms.llm() - - print(model.get_info()) - ``` - - - - ```python - import lmstudio as lms - - with lms.Client() as client: - model = client.llm.model() - - print(model.get_info()) - ``` - - - - ```python - # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL - # Requires Python SDK version 1.5.0 or later - import lmstudio as lms - - async with lms.AsyncClient() as client: - model = await client.llm.model() - - print(await model.get_info()) - ``` - - - -Example output [#example-output] - -```python -LlmInstanceInfo.from_dict({ - "architecture": "qwen2", - "contextLength": 4096, - "displayName": "Qwen2.5 7B Instruct 1M", - "format": "gguf", - "identifier": "qwen2.5-7b-instruct", - "instanceReference": "lpFZPBQjhSZPrFevGyY6Leq8", - "maxContextLength": 1010000, - "modelKey": "qwen2.5-7b-instruct-1m", - "paramsString": "7B", - "path": "lmstudio-community/Qwen2.5-7B-Instruct-1M-GGUF/Qwen2.5-7B-Instruct-1M-Q4_K_M.gguf", - "sizeBytes": 4683073888, - "trainedForToolUse": true, - "type": "llm", - "vision": false -}) -``` - - - - -The `lms daemon down` command stops the running llmster. - -```shell -lms daemon down -``` - - - `lms daemon down` only works if llmster is running. It will not stop LM Studio if it is running as a GUI app. - - -Learn more [#learn-more] - -To find out more about llmster, see [Headless Mode](/docs/developer/core/headless). - - - - -The `lms daemon status` command reports whether llmster is currently running. - -Flags [#flags] - - - -Check daemon status [#check-daemon-status] - -```shell -lms daemon status -``` - -JSON output [#json-output] - -For scripting or automation: - -```shell -lms daemon status --json -``` - -Example output when running: - -```json -{ "status": "running", "pid": 12345, "isDaemon": true } -``` - -Example output when not running: - -```json -{ "status": "not-running" } -``` - -Start or stop the daemon [#start-or-stop-the-daemon] - -* [`lms daemon up`](/docs/cli/daemon/daemon-up) — start the daemon. -* [`lms daemon down`](/docs/cli/daemon/daemon-down) — stop the daemon. - -To find out more about llmster, see [Headless Mode](/docs/developer/core/headless). - - - - -The `lms daemon up` command starts llmster - -Flags [#flags] - - - -Start the daemon [#start-the-daemon] - -```shell -lms daemon up -``` - -If the daemon is not already running, this starts it and prints the PID. If it is already running, it reports the current status. - -JSON output [#json-output] - -For scripting or automation: - -```shell -lms daemon up --json -``` - -Example output: - -```json -{ "status": "running", "pid": 26754, "isDaemon": true, "version": "0.4.4+1" } -``` - -Check the daemon status [#check-the-daemon-status] - -See [`lms daemon status`](/docs/cli/daemon/daemon-status) to check whether the daemon is running. - -Learn more [#learn-more] - -To find out more about llmster, see [Headless Mode](/docs/developer/core/headless). - - - - -The `lms daemon update` command fetches and installs the latest version of llmster. - -Flags [#flags] - - - -Update the daemon [#update-the-daemon] - -Stop the daemon first: - -```shell -lms daemon down -``` - -Then run the update: - -```shell -lms daemon update -``` - -Fetches the latest stable release and installs it. - -Update to the beta channel [#update-to-the-beta-channel] - -```shell -lms daemon update --beta -``` - -After updating [#after-updating] - -Start the daemon again to use the new version: - -```shell -lms daemon up -``` - -To find out more about llmster, see [Headless Mode](/docs/developer/core/headless). - - - - -Use `lms chat` to talk to a local model directly in the terminal. This is handy for quick experiments or scripting. - -Flags [#flags] - - - -Start an interactive chat [#start-an-interactive-chat] - -```shell -lms chat -``` - -You will be prompted to pick a model if one is not provided. - -Chat with a specific model [#chat-with-a-specific-model] - -```shell -lms chat my-model -``` - -Send a single prompt and exit [#send-a-single-prompt-and-exit] - -Use `-p` to print the response to stdout and exit instead of staying interactive: - -```shell -lms chat my-model -p "Summarize this release note" -``` - -Set a system prompt [#set-a-system-prompt] - -```shell -lms chat my-model -s "You are a terse assistant. Reply in two sentences." -``` - -Keep the model loaded after chatting [#keep-the-model-loaded-after-chatting] - -```shell -lms chat my-model --ttl 600 -``` - -Pipe input from another command [#pipe-input-from-another-command] - -`lms chat` reads from stdin, so you can pipe content directly into a prompt: - -```shell -cat my_file.txt | lms chat -p "Summarize this, please" -``` - - - - -The `lms get` command allows you to search and download models from online repositories. If no model is specified, it shows staff-picked recommendations. - -Models you download via `lms get` will be stored in your LM Studio model directory. - -Flags [#flags] - - - -Download a model [#download-a-model] - -Download a model by name: - -```shell -lms get llama-3.1-8b -``` - -Specify quantization [#specify-quantization] - -Download a specific model quantization: - -```shell -lms get llama-3.1-8b@q4_k_m -``` - -Filter by format [#filter-by-format] - -Show only MLX or GGUF models: - -```shell -lms get --mlx -lms get --gguf -``` - -Control search results [#control-search-results] - -Limit the number of results: - -```shell -lms get --limit 5 -``` - -Always show all options: - -```shell -lms get --always-show-all-results -lms get --always-show-download-options -``` - - - - -Use `lms import` to bring an existing model file into LM Studio without downloading it. - -Flags [#flags] - - - -Only one of `--copy`, `--hard-link`, or `--symbolic-link` can be used at a time. If none is provided, `lms import` moves the file by default. - -Import a model file [#import-a-model-file] - -```shell -lms import ~/Downloads/model.gguf -``` - -Keep the original file [#keep-the-original-file] - -```shell -lms import ~/Downloads/model.gguf --copy -``` - -Pick the target folder yourself [#pick-the-target-folder-yourself] - -Use `--user-repo` to skip prompts and place the model in the chosen namespace: - -```shell -lms import ~/Downloads/model.gguf --user-repo my-user/custom-models -``` - -Dry run before importing [#dry-run-before-importing] - -```shell -lms import ~/Downloads/model.gguf --dry-run -``` - - - - -The `lms load` command loads a model into memory. You can optionally set parameters such as context length, GPU offload, and TTL. This guide also covers unloading models with `lms unload`. - -Flags [#flags] - - - -Load a model [#load-a-model] - -Load a model into memory by running the following command: - -```shell -lms load -``` - -You can find the `model_key` by first running [`lms ls`](/docs/cli/local-models/ls) to list your locally downloaded models. - -Set a custom identifier [#set-a-custom-identifier] - -Optionally, you can assign a custom identifier to the loaded model for API reference: - -```shell -lms load --identifier "my-custom-identifier" -``` - -You will then be able to refer to this model by the identifier `my_model` in subsequent commands and API calls (`model` parameter). - -Set context length [#set-context-length] - -You can set the context length when loading a model using the `--context-length` flag: - -```shell -lms load --context-length 4096 -``` - -This determines how many tokens the model will consider as context when generating text. - -Set GPU offload [#set-gpu-offload] - -Control GPU memory usage with the `--gpu` flag: - -```shell -lms load --gpu 0.5 # Offload 50% of layers to GPU -lms load --gpu max # Offload all layers to GPU -lms load --gpu off # Disable GPU offloading -``` - -If not specified, LM Studio will automatically determine optimal GPU usage. - -Set TTL [#set-ttl] - -Set an auto-unload timer with the `--ttl` flag (in seconds): - -```shell -lms load --ttl 3600 # Unload after 1 hour of inactivity -``` - -Estimate resources without loading [#estimate-resources-without-loading] - -Preview memory requirements before loading a model using `--estimate-only`: - -```shell -lms load --estimate-only -``` - -Optional flags such as `--context-length` and `--gpu` are honored and reflected in the estimate. The estimator accounts for factors like context length, flash attention, and whether the model is vision‑enabled. - -Example: - -```bash -$ lms load --estimate-only gpt-oss-120b -Model: openai/gpt-oss-120b -Estimated GPU Memory: 65.68 GB -Estimated Total Memory: 65.68 GB - -Estimate: This model may be loaded based on your resource guardrails settings. -``` - -Unload models [#unload-models] - -Use `lms unload` to remove models from memory. - -Flags [#flags-1] - - - -Unload a specific model [#unload-a-specific-model] - -```shell -lms unload -``` - -If no model key is provided, you will be prompted to select from currently loaded models. - -Unload all models [#unload-all-models] - -```shell -lms unload --all -``` - -Unload from a remote LM Studio instance [#unload-from-a-remote-lm-studio-instance] - -```shell -lms unload --host -``` - -Operate on a remote LM Studio instance [#operate-on-a-remote-lm-studio-instance] - -`lms load` supports the `--host` flag to connect to a remote LM Studio instance. - -```shell -lms load --host -``` - -For this to work, the remote LM Studio instance must be running and accessible from your local machine, e.g. be accessible on the same subnet. - - - - -The `lms ls` command displays a list of all models downloaded to your machine, including their size, architecture, and parameters. - -Flags [#flags] - - - -List all models [#list-all-models] - -Show all downloaded models: - -```shell -lms ls -``` - -Example output: - -``` -You have 47 models, taking up 160.78 GB of disk space. - -LLMs (Large Language Models) PARAMS ARCHITECTURE SIZE -lmstudio-community/meta-llama-3.1-8b-instruct 8B Llama 4.92 GB -hugging-quants/llama-3.2-1b-instruct 1B Llama 1.32 GB -mistral-7b-instruct-v0.3 Mistral 4.08 GB -zeta 7B Qwen2 4.09 GB - -... (abbreviated in this example) ... - -Embedding Models PARAMS ARCHITECTURE SIZE -text-embedding-nomic-embed-text-v1.5@q4_k_m Nomic BERT 84.11 MB -text-embedding-bge-small-en-v1.5 33M BERT 24.81 MB -``` - -Filter by model type [#filter-by-model-type] - -List only LLM models: - -```shell -lms ls --llm -``` - -List only embedding models: - -```shell -lms ls --embedding -``` - -Additional output formats [#additional-output-formats] - -Get detailed information about models: - -```shell -lms ls --detailed -``` - -Output in JSON format: - -```shell -lms ls --json -``` - -Operate on a remote LM Studio instance [#operate-on-a-remote-lm-studio-instance] - -`lms ls` supports the `--host` flag to connect to a remote LM Studio instance: - -```shell -lms ls --host -``` - -For this to work, the remote LM Studio instance must be running and accessible from your local machine, e.g. be accessible on the same subnet. - - - - -The `lms ps` command displays information about all models currently loaded in memory. - -List loaded models [#list-loaded-models] - -Show all currently loaded models: - -```shell -lms ps -``` - -Example output: - -``` - LOADED MODELS - -Identifier: unsloth/deepseek-r1-distill-qwen-1.5b - • Type: LLM - • Path: unsloth/DeepSeek-R1-Distill-Qwen-1.5B-GGUF/DeepSeek-R1-Distill-Qwen-1.5B-Q4_K_M.gguf - • Size: 1.12 GB - • Architecture: Qwen2 -``` - -JSON output [#json-output] - -Get the list in machine-readable format: - -```shell -lms ps --json -``` - -Operate on a remote LM Studio instance [#operate-on-a-remote-lm-studio-instance] - -`lms ps` supports the `--host` flag to connect to a remote LM Studio instance: - -```shell -lms ps --host -``` - -For this to work, the remote LM Studio instance must be running and accessible from your local machine, e.g. be accessible on the same subnet. - - - - -The `lms link disable` command disables LM Link on this device. The device will no longer connect to or be visible to other devices on the link. - -Disable LM Link [#disable-lm-link] - -```shell -lms link disable -``` - -You can re-enable LM Link at any time with [`lms link enable`](/docs/cli/link/link-enable). - -Learn more [#learn-more] - -See the [LM Link documentation](/docs/lmlink) for a full overview of LM Link. - - - - -The `lms link enable` command enables LM Link on this device, allowing it to connect with other devices on the same link. - - - LM Link requires an LM Studio account. Run `lms login` first if you haven't already. - - -Enable LM Link [#enable-lm-link] - -```shell -lms link enable -``` - -After enabling, the CLI waits for a connection to be established. If there are issues, the relevant next step is printed. - -Check the connection status [#check-the-connection-status] - -See [`lms link status`](/docs/cli/link/link-status) to verify the connection and see connected peers. - -Disable LM Link [#disable-lm-link] - -See [`lms link disable`](/docs/cli/link/link-disable) to turn LM Link off. - -Learn more [#learn-more] - -See the [LM Link documentation](/docs/lmlink) for a full overview of LM Link. - - - - -The `lms link set-device-name` command sets a display name for this device, visible to other devices on the link. - -Rename this device [#rename-this-device] - -```shell -lms link set-device-name "My Mac Studio" -``` - -The new name takes effect immediately and is visible to connected peers via [`lms link status`](/docs/cli/link/link-status). - -Learn more [#learn-more] - -See the [LM Link documentation](/docs/lmlink) for a full overview of LM Link. - - - - -The `lms link set-preferred-device` command sets which device on the link is used when a model is available on multiple connected devices. - -Set a preferred device [#set-a-preferred-device] - -Run the command without arguments to pick from an interactive list of connected devices: - -```shell -lms link set-preferred-device -``` - -Or pass the device identifier directly to skip the prompt: - -```shell -lms link set-preferred-device -``` - -Device identifiers are listed in the output of [`lms link status`](/docs/cli/link/link-status). - -See [Using LM Link with the REST API](/docs/developer/core/lmlink) for more on how preferred devices affect model routing. - -Learn more [#learn-more] - -See the [LM Link documentation](/docs/lmlink) for a full overview of LM Link. - - - - -The `lms link status` command shows whether LM Link is enabled on this device, and lists connected peers and their loaded models. - -Flags [#flags] - - - -Check status [#check-status] - -```shell -lms link status -``` - -Displays this device's name, connection state, and a list of connected peers with their currently loaded models. - -JSON output [#json-output] - -For scripting or automation: - -```shell -lms link status --json -``` - -Enable or disable LM Link [#enable-or-disable-lm-link] - -* [`lms link enable`](/docs/cli/link/link-enable) — enable LM Link on this device. -* [`lms link disable`](/docs/cli/link/link-disable) — disable LM Link on this device. - -Learn more [#learn-more] - -See the [LM Link documentation](/docs/lmlink) for a full overview of LM Link. - - - - -Use `lms runtime` to list, download, switch, or remove inference runtimes without opening the app. - -Commands [#commands] - -* `lms runtime ls` — list installed runtimes. -* `lms runtime get` — download a runtime. -* `lms runtime select` — set the active runtime. -* `lms runtime remove` — uninstall a runtime. -* `lms runtime update` — update an installed runtime. - -List installed runtimes [#list-installed-runtimes] - -```shell -lms runtime ls -``` - -Download a runtime [#download-a-runtime] - -```shell -lms runtime get -``` - -Switch to a runtime [#switch-to-a-runtime] - -```shell -lms runtime select -``` - -Follow the interactive prompts to choose the version you want. - - - - -`lms log stream` lets you inspect the exact strings LM Studio sends to and receives from models, and (new in 0.3.26) stream server logs. This is useful for debugging prompt templates, model IO, and server operations. - -Flags [#flags] - - - -Quick start [#quick-start] - -Stream model IO (default): - -```shell -lms log stream -``` - -Stream server logs: - -```shell -lms log stream --source server -``` - -Filter model logs [#filter-model-logs] - -```bash -# Only the formatted user input -lms log stream --source model --filter input - -# Only the model output (emitted once the message completes) -lms log stream --source model --filter output - -# Both directions -lms log stream --source model --filter input,output -``` - -JSON output and stats [#json-output-and-stats] - -Emit JSON: - -```shell -lms log stream --source model --filter input,output --json -``` - -Include prediction stats: - -```shell -lms log stream --source model --filter output --stats -``` - - - - -The `lms server start` command launches the LM Studio local server, allowing you to interact with loaded models via HTTP API calls. - -Flags [#flags] - - - -Start the server [#start-the-server] - -Start the server with default settings: - -```shell -lms server start -``` - -Specify a custom port [#specify-a-custom-port] - -Run the server on a specific port: - -```shell -lms server start --port 3000 -``` - -Enable CORS support [#enable-cors-support] - -For usage with web applications or some VS Code extensions, you may need to enable CORS support: - -```shell -lms server start --cors -``` - -Note that enabling CORS may expose your server to security risks, so use it only when necessary. - -Check the server status [#check-the-server-status] - -See [`lms server status`](/docs/cli/serve/server-status) for more information on checking the status of the server. - - - - -The `lms server status` command displays the current status of the LM Studio local server, including whether it's running and its configuration. - -Flags [#flags] - - - -Check server status [#check-server-status] - -Get the basic status of the server: - -```shell -lms server status -``` - -Example output: - -``` -The server is running on port 1234. -``` - -Example usage [#example-usage] - -```console -➜ ~ lms server start -Starting server... -Waking up LM Studio service... -Success! Server is now running on port 1234 - -➜ ~ lms server status -The server is running on port 1234. -``` - -JSON output [#json-output] - -Get the status in machine-readable JSON format: - -```shell -lms server status --json --quiet -``` - -Example output: - -```json -{ "running": true, "port": 1234 } -``` - -Control logging output [#control-logging-output] - -Adjust logging verbosity: - -```shell -lms server status --verbose -lms server status --quiet -lms server status --log-level debug -``` - -You can only use one logging control flag at a time (`--verbose`, `--quiet`, or `--log-level`). - - - - -The `lms server stop` command gracefully stops the running LM Studio server. - -```shell -lms server stop -``` - -Example output: - -``` -Stopped the server on port 1234. -``` - -Any active request will be terminated when the server is stopped. You can restart the server using [`lms server start`](/docs/cli/serve/server-start). - - - - -Use `lms clone` to copy an artifact from LM Studio Hub onto your machine. - -Flags [#flags] - - - -If no path is provided, `lms clone owner/name` creates a folder called `name` in the current directory. The command exits if the target path already exists. - -Clone the latest revision [#clone-the-latest-revision] - -```shell -lms clone alice/sample-plugin -``` - -Clone into a specific directory [#clone-into-a-specific-directory] - -```shell -lms clone alice/sample-plugin ./my-folder -``` - - - - -Use `lms dev` inside a plugin project to run a local dev server that rebuilds and reloads on file changes. - -This feature is a part of LM Studio [Plugins](/docs/typescript/plugins), currently in private beta. - -Run the dev plugin server [#run-the-dev-plugin-server] - -```shell -lms dev -``` - -This verifies `manifest.json`, installs dependencies if needed, and starts a watcher that rebuilds the plugin on changes. Supported runners: Node/ECMAScript and Deno. - -Install the plugin instead of running dev [#install-the-plugin-instead-of-running-dev] - -```shell -lms dev --install -``` - -Flags [#flags] - - - - - - -Use `lms login` to authenticate the CLI with LM Studio Hub. - -Sign in with the browser [#sign-in-with-the-browser] - -```shell -lms login -``` - -The CLI opens a browser window for authentication. If a browser cannot be opened automatically, copy the printed URL into your browser. - -"CI style" login with pre-authenticated keys [#ci-style-login-with-pre-authenticated-keys] - -```bash -lms login --with-pre-authenticated-keys \ - --key-id \ - --public-key \ - --private-key -``` - -Advanced Flags [#advanced-flags] - - - - - - -Run `lms push` from inside a [plugin](/docs/typescript/plugins), [preset](/docs/app/presets), or [`model.yaml`](/docs/app/modelyaml) project to publish a new revision. If a `model.yaml` exists, the CLI will generate a `manifest.json` for you before pushing. - -For plugins, the CLI will ask for confirmation unless you pass `-y`. - -Publish the current folder [#publish-the-current-folder] - -```shell -lms push -``` - -Flags [#flags] - - - -Advanced [#advanced] - -Publish quietly and keep the revision in manifest.json [#publish-quietly-and-keep-the-revision-in-manifestjson] - -```shell -lms push -y --write-revision -``` - -Override metadata for this upload [#override-metadata-for-this-upload] - -```shell -lms push --description "New beta build" --overrides '{"tags": ["beta"]}' -``` - - - - -LM Studio now supports MCP with OAuth. Seamlessly connect integrations that require authentication without copying tokens or configuring headers. Simply add your integration, log in via browser, and its tools are instantly available to your models in LM Studio. - - - -How it works [#how-it-works] - -When you add an OAuth-backed MCP integration, LM Studio: - -1. Opens a browser window to the service's authorization page -2. Stores the token securely after you approve access -3. Makes the server's tools available in chat - -From that point on, your model can call tools from that service just like any other MCP server. - -*** - -Connecting with your own OAuth credentials [#connecting-with-your-own-oauth-credentials] - -Some services require you to bring your own OAuth app, either because they don't support dynamic client registration, or because they need a specific redirect URL whitelisted in their developer portal. - -In these cases, add an `auth` object to the server entry in `mcp.json`. When configuring your OAuth app, use the following callback URL: - -``` -http://127.0.0.1:33389/mcp-oauth-callback -``` - -```json -{ - "mcpServers": { - "oauth-server": { - "url": "https://api.example.com/mcp", - "auth": { - "CLIENT_ID": "TEST_CLIENT_ID", - "CLIENT_SECRET": "TEST_CLIENT_SECRET" - } - } - } -} -``` - - - - -Linear [#linear] - -Create issues, search projects, update statuses, and more in Linear, directly from LM Studio. - - - -```json -{ - "mcpServers": { - "linear": { - "url": "https://mcp.linear.app/mcp" - } - } -} -``` - -*** - -Notion [#notion] - -Search pages, create documents, and read from your Notion workspace. - - - -```json -{ - "mcpServers": { - "notion": { - "url": "https://mcp.notion.com/mcp" - } - } -} -``` - -*** - -Atlassian [#atlassian] - -Work with Jira issues and Confluence pages from within LM Studio. - - - -```json -{ - "mcpServers": { - "atlassian": { - "url": "https://mcp.atlassian.com/v1/mcp" - } - } -} -``` - -*** - -Sentry [#sentry] - -Query issues, inspect stack traces, and analyze errors from your Sentry projects. - - - -```json -{ - "mcpServers": { - "sentry": { - "url": "https://mcp.sentry.dev/mcp" - } - } -} -``` - -*** - -Many more integrations are supported. Any MCP server that uses OAuth or standard HTTP transport can be connected to LM Studio. See [Use MCP Servers](/docs/app/mcp) for how to add custom servers manually via `mcp.json`. - - - - -Add a new device [#add-a-new-device] - - - -Machines with GUI [#machines-with-gui] - -To begin using LM Link, add an additional device to the link: - -1. Download and install LM Studio on the device, at [https://lmstudio.ai/download](https://lmstudio.ai/download) -2. Click on LM Link in the sidebar and follow the steps to enable LM Link. - -Once LM Link is enabled, your devices will connect to each other automatically. - -Machines without GUI [#machines-without-gui] - -To add a headless machine, connect remotely by using llmster in the terminal: - -1. Install `llmster` on the headless machine - -```bash -curl -fsSL https://lmstudio.ai/install.sh | bash -``` - -2. Log in from the terminal - -```bash -lms login -``` - -3. Follow the instructions in your terminal output to complete login. -4. Once logged in, run the following command: - -```bash -lms link enable -``` - -Your devices will automatically discover each other over the link, and your headless machine will immediately appear on the LM Link page for your other device. Once connected, models from remote machines will appear locally for loading and inference. - -Load models on remote machines [#load-models-on-remote-machines] - - - -When using LM Link, the model loader shows both local models and remote models on linked devices. - -You can filter the model loader to display only local or remote models, or to display all available models at once. Remote models can be loaded and configured with the same familiar controls, either in the GUI or by using lms in the terminal. - -If you have the same model on multiple devices, they will show up as separate entries, with the associated device name identified. If you are loading models via API/SDK, you can [set a preferred device](/docs/lmlink/basics/preferred-device) to specify which device to load the model from when multiple options are available. - -Using LM Studio’s parallel requests, you can also serve multiple clients simultaneously across your LM Link network. - - - - -Q&A [#qa] - -Got questions about LM Link? We cover some of the most common questions below. - -Q: Does LM Link open up my computer to the public internet? [#q-does-lm-link-open-up-my-computer-to-the-public-internet] - -A: No! All your devices in the LM Link network communicate with each other using Tailscale’s internal end-to-end encrypted connections. None of your devices are ever exposed to the public Internet. - -Q: Can I use remote models with LM Studio's local server? [#q-can-i-use-remote-models-with-lm-studios-local-server] - -A: Yes. Any model in your LM Link network can be used as if they are local. This means that any tool that already connects to your local LM Studio will be able to use remote models as well, just by pointing to localhost:1234 as usual. - -Q: Can I use remote models through the LM Studio API/SDKs? [#q-can-i-use-remote-models-through-the-lm-studio-apisdks] - -A: Yes. Any model in your LM Link network can be used as if they are local. Just specify the model key as usual. If the model can be found on a remote device, it can be used through LM Link. - -Q: Will LM Link interfere with my existing Tailscale VPN? [#q-will-lm-link-interfere-with-my-existing-tailscale-vpn] - -A: No. LM Link is an entirely separate and self-contained utilization of Tailscale VPN primitives. LM Link will coexist with other Tailscale utilization on your machine or network, with no interference or interplay. - -Q: Can the LM Studio Hub see my chats? [#q-can-the-lm-studio-hub-see-my-chats] - -A: No. The LM Studio Hub is only used to facilitate discovery between LM Studio/llmster instances. All communication afterwards, including chats and model listing, happens within Tailscale’s end-to-end encrypted connection. - -Q: How can I disable LM Link? [#q-how-can-i-disable-lm-link] - -A: In the LM Studio app, go to Settings -> LM Link -> Enable LM Link - OFF. If you are using llmster (our headless daemon), run `lms link disable`. - -Q: Why does a device show up as “disconnected”? [#q-why-does-a-device-show-up-as-disconnected] - -A: LM Link uses end-to-end encrypted tunnels to connect to each other. If a device shows up as “disconnected”, it is possible that device has crashed but has not reported to the discovery server. Please make sure LM Studio/llmster is indeed running on that device. If the error persists, please report a bug at [bugs@lmstudio.ai](mailto:bugs@lmstudio.ai). - -Q: If I have the same model on multiple devices, how do I choose which one to use? [#q-if-i-have-the-same-model-on-multiple-devices-how-do-i-choose-which-one-to-use] - -A: If you are loading the model via LM Studio or `lms load`, the same model on different devices will show up as separate entries, with the device name identified. If you are loading models via API/SDK, you can set a preferred device from the in-app LM Link page, or use command `lms link set-preferred-device`. Once set, the model will always load on your preferred device. - -Q: Can linked devices do anything besides LM Studio tasks on my computer? [#q-can-linked-devices-do-anything-besides-lm-studio-tasks-on-my-computer] - -A: No. LM Link only lets LM Studio/llmster talk to each other for model and API access. It does not expose your operating system, files, or other services to linked devices. - -Q: Can I use my existing Tailscale network? [#q-can-i-use-my-existing-tailscale-network] - -A: Not at the moment. When you enable LM Link we create a dedicated network programmatically and take full control over the ACL. This will not work well with any existing Tailscale networks. If you wish, you can DIY several aspects of the LM Link feature set yourself. - - - - -Requesting Access [#requesting-access] - - - -To get started, find the LM Link icon in the LM Studio app, just above the Settings gear icon. LM Link is a network between your devices, so log-in is required to associate devices to users in order to facilitate discovery. - -A custom link is **automatically provisioned** for you the first time you access the feature. - -Once your first device has joined the link, [add another device](/docs/lmlink/basics/add-device) to experience the power of LM Link! - - - - -Choosing a preferred device [#choosing-a-preferred-device] - -When the same model is available on multiple devices in the link, LM Link uses the preferred device to load and use the model. This setting is per-machine: each device on the link independently controls which remote machine it prefers. - -This is especially relevant when accessing remote models via the SDK or [REST API](/docs/developer/core/lmlink). - -Machines with GUI [#machines-with-gui] - -In the app, head to the LM Link page, select the device and toggle the "Set as preferred device" option. - - - -Machines without GUI [#machines-without-gui] - -To set a preferred device from the terminal, use the following command: - -```bash -lms link set-preferred-device -``` - - - - - - -Sometimes you may want to halt a prediction before it finishes. For example, the user might change their mind or your UI may navigate away. `lmstudio-js` provides two simple ways to cancel a running prediction. - - - -

- Call - - `.cancel()` - - on the prediction -

- - Every prediction method returns an `OngoingPrediction` instance. Calling `.cancel()` stops generation and causes the final `stopReason` to be `"userStopped"`. In the example below we schedule the cancel call on a timer: - - ```typescript - import { LMStudioClient } from "@lmstudio/sdk"; - - const client = new LMStudioClient(); - const model = await client.llm.model("qwen2.5-7b-instruct"); - - const prediction = model.respond("What is the meaning of life?", { - maxTokens: 50, - }); - setTimeout(() => prediction.cancel(), 1000); // cancel after 1 second - - const result = await prediction.result(); - console.info(result.stats.stopReason); // "userStopped" - ``` -
- - -

- Use an - - `AbortController` -

- - If your application already uses an `AbortController` to propagate cancellation, you can pass its `signal` to the prediction method. Aborting the controller stops the prediction with the same `stopReason`: - - ```typescript - import { LMStudioClient } from "@lmstudio/sdk"; - - const client = new LMStudioClient(); - const model = await client.llm.model("qwen2.5-7b-instruct"); - - const controller = new AbortController(); - const prediction = model.respond("What is the meaning of life?", { - maxTokens: 50, - signal: controller.signal, - }); - setTimeout(() => controller.abort(), 1000); // cancel after 1 second - - const result = await prediction.result(); - console.info(result.stats.stopReason); // "userStopped" - ``` -
-
- -Both approaches halt generation immediately, and the returned stats indicate that the prediction ended because you stopped it. - - - - -Use `llm.respond(...)` to generate completions for a chat conversation. - -Quick Example: Generate a Chat Response [#quick-example-generate-a-chat-response] - -The following snippet shows how to stream the AI's response to quick chat prompt. - -```typescript title="index.ts" -import { LMStudioClient } from "@lmstudio/sdk"; -const client = new LMStudioClient(); - -const model = await client.llm.model(); - -for await (const fragment of model.respond("What is the meaning of life?")) { - process.stdout.write(fragment.content); -} -``` - -Obtain a Model [#obtain-a-model] - -First, you need to get a model handle. This can be done using the `model` method in the `llm` namespace. For example, here is how to use Qwen2.5 7B Instruct. - -```typescript title="index.ts" -import { LMStudioClient } from "@lmstudio/sdk"; -const client = new LMStudioClient(); - -const model = await client.llm.model("qwen2.5-7b-instruct"); -``` - -There are other ways to get a model handle. See [Managing Models in Memory](./../manage-models/loading) for more info. - -Manage Chat Context [#manage-chat-context] - -The input to the model is referred to as the "context". Conceptually, the model receives a multi-turn conversation as input, and it is asked to predict the assistant's response in that conversation. - - - - - Using an array of messages - - - - Constructing a Chat object - - - - - ```typescript - import { Chat } from "@lmstudio/sdk"; - - // Create a chat object from an array of messages. - const chat = Chat.from([ - { role: "system", content: "You are a resident AI philosopher." }, - { role: "user", content: "What is the meaning of life?" }, - ]); - ``` - - - - ```typescript - import { Chat } from "@lmstudio/sdk"; - - // Create an empty chat object. - const chat = Chat.empty(); - - // Build the chat context by appending messages. - chat.append("system", "You are a resident AI philosopher."); - chat.append("user", "What is the meaning of life?"); - ``` - - - -See [Working with Chats](./working-with-chats) for more information on managing chat context. - - - -Generate a response [#generate-a-response] - -You can ask the LLM to predict the next response in the chat context using the `respond()` method. - - - - - Streaming - - - - Non-streaming - - - - - ```typescript - // The `chat` object is created in the previous step. - const prediction = model.respond(chat); - - for await (const { content } of prediction) { - process.stdout.write(content); - } - - console.info(); // Write a new line to prevent text from being overwritten by your shell. - ``` - - - - ```typescript - // The `chat` object is created in the previous step. - const result = await model.respond(chat); - - console.info(result.content); - ``` - - - -Customize Inferencing Parameters [#customize-inferencing-parameters] - -You can pass in inferencing parameters as the second parameter to `.respond()`. - - - - - Streaming - - - - Non-streaming - - - - - ```typescript - const prediction = model.respond(chat, { - temperature: 0.6, - maxTokens: 50, - }); - ``` - - - - ```typescript - const result = await model.respond(chat, { - temperature: 0.6, - maxTokens: 50, - }); - ``` - - - -See [Configuring the Model](./parameters) for more information on what can be configured. - -Print prediction stats [#print-prediction-stats] - -You can also print prediction metadata, such as the model used for generation, number of generated -tokens, time to first token, and stop reason. - - - - - Streaming - - - - Non-streaming - - - - - ```typescript - // If you have already iterated through the prediction fragments, - // doing this will not result in extra waiting. - const result = await prediction.result(); - - console.info("Model used:", result.modelInfo.displayName); - console.info("Predicted tokens:", result.stats.predictedTokensCount); - console.info("Time to first token (seconds):", result.stats.timeToFirstTokenSec); - console.info("Stop reason:", result.stats.stopReason); - ``` - - - - ```typescript - // `result` is the response from the model. - console.info("Model used:", result.modelInfo.displayName); - console.info("Predicted tokens:", result.stats.predictedTokensCount); - console.info("Time to first token (seconds):", result.stats.timeToFirstTokenSec); - console.info("Stop reason:", result.stats.stopReason); - ``` - - - -Example: Multi-turn Chat [#example-multi-turn-chat] - - - -```typescript -import { Chat, LMStudioClient } from "@lmstudio/sdk"; -import { createInterface } from "readline/promises"; - -const rl = createInterface({ input: process.stdin, output: process.stdout }); -const client = new LMStudioClient(); -const model = await client.llm.model(); -const chat = Chat.empty(); - -while (true) { - const input = await rl.question("You: "); - // Append the user input to the chat - chat.append("user", input); - - const prediction = model.respond(chat, { - // When the model finish the entire message, push it to the chat - onMessage: (message) => chat.append(message), - }); - process.stdout.write("Bot: "); - for await (const { content } of prediction) { - process.stdout.write(content); - } - process.stdout.write("\n"); -} -``` - - - - - - - - -Use `llm.complete(...)` to generate text completions from a loaded language model. Text completions mean sending an non-formatted string to the model with the expectation that the model will complete the text. - -This is different from multi-turn chat conversations. For more information on chat completions, see [Chat Completions](./chat-completion). - -Quickstart [#quickstart] - - - -

- Instantiate a Model -

- - First, you need to load a model to generate completions from. This can be done using the `model` method on the `llm` handle. - - ```typescript title="index.ts" - import { LMStudioClient } from "@lmstudio/sdk"; - - const client = new LMStudioClient(); - const model = await client.llm.model("qwen2.5-7b-instruct"); - ``` -
- - -

- Generate a Completion -

- - Once you have a loaded model, you can generate completions by passing a string to the `complete` method on the `llm` handle. - - - - - Streaming - - - - Non-streaming - - - - - ```typescript - const completion = model.complete("My name is", { - maxTokens: 100, - }); - - for await (const { content } of completion) { - process.stdout.write(content); - } - - console.info(); // Write a new line for cosmetic purposes - ``` - - - - ```typescript - const completion = await model.complete("My name is", { - maxTokens: 100, - }); - - console.info(completion.content); - ``` - - -
- - -

- Print Prediction Stats -

- - You can also print prediction metadata, such as the model used for generation, number of generated tokens, time to first token, and stop reason. - - ```typescript title="index.ts" - console.info("Model used:", completion.modelInfo.displayName); - console.info("Predicted tokens:", completion.stats.predictedTokensCount); - console.info("Time to first token (seconds):", completion.stats.timeToFirstTokenSec); - console.info("Stop reason:", completion.stats.stopReason); - ``` -
-
- -Example: Get an LLM to Simulate a Terminal [#example-get-an-llm-to-simulate-a-terminal] - -Here's an example of how you might use the `complete` method to simulate a terminal. - -```typescript title="terminal-sim.ts" -import { LMStudioClient } from "@lmstudio/sdk"; -import { createInterface } from "node:readline/promises"; - -const rl = createInterface({ input: process.stdin, output: process.stdout }); -const client = new LMStudioClient(); -const model = await client.llm.model(); -let history = ""; - -while (true) { - const command = await rl.question("$ "); - history += "$ " + command + "\n"; - - const prediction = model.complete(history, { stopStrings: ["$"] }); - for await (const { content } of prediction) { - process.stdout.write(content); - } - process.stdout.write("\n"); - - const { content } = await prediction.result(); - history += content; -} -``` - -{/* ## Advanced Usage - - ### Prediction metadata - - Prediction responses are really returned as `PredictionResult` objects that contain additional dot-accessible metadata about the inference request. - This entails info about the model used, the configuration with which it was loaded, and the configuration for this particular prediction. It also provides - inference statistics like stop reason, time to first token, tokens per second, and number of generated tokens. - - Please consult your specific SDK to see exact syntax. - - ### Progress callbacks - - TODO: TS has onFirstToken callback which Python does not - - Long prompts will often take a long time to first token, i.e. it takes the model a long time to process your prompt. - If you want to get updates on the progress of this process, you can provide a float callback to `complete` - that receives a float from 0.0-1.0 representing prompt processing progress. - - ```python tab="Python" - import lmstudio as lm - - llm = lm.llm() - - completion = llm.complete( - "My name is", - on_progress: lambda progress: print(f"{progress*100}% complete") - ) - ``` - - ```python tab="Python (with scoped resources)" - import lmstudio - - with lmstudio.Client() as client: - llm = client.llm.model() - - completion = llm.complete( - "My name is", - on_progress: lambda progress: print(f"{progress*100}% processed") - ) - ``` - - ```typescript tab="TypeScript" - import { LMStudioClient } from "@lmstudio/sdk"; - - const client = new LMStudioClient(); - const llm = await client.llm.model(); - - const prediction = llm.complete( - "My name is", - {onPromptProcessingProgress: (progress) => process.stdout.write(`${progress*100}% processed`)}); - ``` - - ### Prediction configuration - - You can also specify the same prediction configuration options as you could in the - in-app chat window sidebar. Please consult your specific SDK to see exact syntax. */} - - - - - - -Some models, known as VLMs (Vision-Language Models), can accept images as input. You can pass images to the model using the `.respond()` method. - -Prerequisite: Get a VLM (Vision-Language Model) [#prerequisite-get-a-vlm-vision-language-model] - -If you don't yet have a VLM, you can download a model like `qwen2-vl-2b-instruct` using the following command: - -```bash -lms get qwen2-vl-2b-instruct -``` - - - -

- Instantiate the Model -

- - Connect to LM Studio and obtain a handle to the VLM (Vision-Language Model) you want to use. - - ```typescript - import { LMStudioClient } from "@lmstudio/sdk"; - const client = new LMStudioClient(); - - const model = await client.llm.model("qwen2-vl-2b-instruct"); - ``` -
- - -

- Prepare the Image -

- - Use the `client.files.prepareImage()` method to get a handle to the image that can be subsequently passed to the model. - - ```typescript - const imagePath = "/path/to/image.jpg"; // Replace with the path to your image - const image = await client.files.prepareImage(imagePath); - ``` - - If you only have the image in the form of a base64 string, you can use the `client.files.prepareImageBase64()` method instead. - - ```typescript - const imageBase64 = "Your base64 string here"; - const image = await client.files.prepareImageBase64(imageBase64); - ``` - - The LM Studio server supports JPEG, PNG, and WebP image formats. -
- - -

- Pass the Image to the Model in - - `.respond()` -

- - Generate a prediction by passing the image to the model in the `.respond()` method. - - ```typescript - const prediction = model.respond([ - { role: "user", content: "Describe this image please", images: [image] }, - ]); - ``` -
-
- - - - -You can customize both inference-time and load-time parameters for your model. Inference parameters can be set on a per-request basis, while load parameters are set when loading the model. - -Inference Parameters [#inference-parameters] - -Set inference-time parameters such as `temperature`, `maxTokens`, `topP` and more. - - - - - .respond() - - - - .complete() - - - - - ```typescript - const prediction = model.respond(chat, { - temperature: 0.6, - maxTokens: 50, - }); - ``` - - - - ```typescript - const prediction = model.complete(prompt, { - temperature: 0.6, - maxTokens: 50, - stop: ["\n\n"], - }); - ``` - - - -See [`LLMPredictionConfigInput`](./../api-reference/llm-prediction-config-input) for all configurable fields. - -Another useful inference-time configuration parameter is [`structured`](\(./structured-responses\)), which allows you to rigorously enforce the structure of the output using a JSON or zod schema. - -Load Parameters [#load-parameters] - -Set load-time parameters such as the context length, GPU offload ratio, and more. - -Set Load Parameters with `.model()` [#set-load-parameters-with-model] - -The `.model()` retrieves a handle to a model that has already been loaded, or loads a new one on demand (JIT loading). - -**Note**: if the model is already loaded, the configuration will be **ignored**. - -```typescript -const model = await client.llm.model("qwen2.5-7b-instruct", { - config: { - contextLength: 8192, - gpu: { - ratio: 0.5, - }, - }, -}); -``` - -See [`LLMLoadModelConfig`](./../api-reference/llm-load-model-config) for all configurable fields. - -Set Load Parameters with `.load()` [#set-load-parameters-with-load] - -The `.load()` method creates a new model instance and loads it with the specified configuration. - -```typescript -const model = await client.llm.load("qwen2.5-7b-instruct", { - config: { - contextLength: 8192, - gpu: { - ratio: 0.5, - }, - }, -}); -``` - -See [`LLMLoadModelConfig`](./../api-reference/llm-load-model-config) for all configurable fields. - - - - -Speculative decoding is a technique that can substantially increase the generation speed of large language models (LLMs) without reducing response quality. See [Speculative Decoding](./../../app/advanced/speculative-decoding) for more info. - -To use speculative decoding in `lmstudio-js`, simply provide a `draftModel` parameter when performing the prediction. You do not need to load the draft model separately. - - - - - Non-streaming - - - - Streaming - - - - - ```typescript - import { LMStudioClient } from "@lmstudio/sdk"; - - const client = new LMStudioClient(); - - const mainModelKey = "qwen2.5-7b-instruct"; - const draftModelKey = "qwen2.5-0.5b-instruct"; - - const model = await client.llm.model(mainModelKey); - const result = await model.respond("What are the prime numbers between 0 and 100?", { - draftModel: draftModelKey, - }); - - const { content, stats } = result; - console.info(content); - console.info(`Accepted ${stats.acceptedDraftTokensCount}/${stats.predictedTokensCount} tokens`); - ``` - - - - ```typescript - import { LMStudioClient } from "@lmstudio/sdk"; - - const client = new LMStudioClient(); - - const mainModelKey = "qwen2.5-7b-instruct"; - const draftModelKey = "qwen2.5-0.5b-instruct"; - - const model = await client.llm.model(mainModelKey); - const prediction = model.respond("What are the prime numbers between 0 and 100?", { - draftModel: draftModelKey, - }); - - for await (const { content } of prediction) { - process.stdout.write(content); - } - process.stdout.write("\n"); - - const { stats } = await prediction.result(); - console.info(`Accepted ${stats.acceptedDraftTokensCount}/${stats.predictedTokensCount} tokens`); - ``` - - - - - - -You can enforce a particular response format from an LLM by providing a schema (JSON or `zod`) to the `.respond()` method. This guarantees that the model's output conforms to the schema you provide. - -Enforce Using a `zod` Schema [#enforce-using-a-zod-schema] - -If you wish the model to generate JSON that satisfies a given schema, it is recommended to provide -the schema using [`zod`](https://zod.dev/). When a `zod` schema is provided, the prediction result will contain an extra field `parsed`, which contains parsed, validated, and typed result. - -Define a `zod` Schema [#define-a-zod-schema] - -```ts -import { z } from "zod"; - -// A zod schema for a book -const bookSchema = z.object({ - title: z.string(), - author: z.string(), - year: z.number().int(), -}); -``` - -Generate a Structured Response [#generate-a-structured-response] - - - - - Non-streaming - - - - Streaming - - - - - ```typescript - const result = await model.respond("Tell me about The Hobbit.", - { structured: bookSchema }, - maxTokens: 100, // Recommended to avoid getting stuck - ); - - const book = result.parsed; - console.info(book); - // ^ - // Note that `book` is now correctly typed as { title: string, author: string, year: number } - ``` - - - - ```typescript - const prediction = model.respond("Tell me about The Hobbit.", - { structured: bookSchema }, - maxTokens: 100, // Recommended to avoid getting stuck - ); - - for await (const { content } of prediction) { - process.stdout.write(content); - } - process.stdout.write("\n"); - - // Get the final structured result - const result = await prediction.result(); - const book = result.parsed; - - console.info(book); - // ^ - // Note that `book` is now correctly typed as { title: string, author: string, year: number } - ``` - - - -Enforce Using a JSON Schema [#enforce-using-a-json-schema] - -You can also enforce a structured response using a JSON schema. - -Define a JSON Schema [#define-a-json-schema] - -```ts -// A JSON schema for a book -const schema = { - type: "object", - properties: { - title: { type: "string" }, - author: { type: "string" }, - year: { type: "integer" }, - }, - required: ["title", "author", "year"], -}; -``` - -Generate a Structured Response [#generate-a-structured-response-1] - - - - - Non-streaming - - - - Streaming - - - - - ```typescript - const result = await model.respond("Tell me about The Hobbit.", { - structured: { - type: "json", - jsonSchema: schema, - }, - maxTokens: 100, // Recommended to avoid getting stuck - }); - - const book = JSON.parse(result.content); - console.info(book); - ``` - - - - ```typescript - const prediction = model.respond("Tell me about The Hobbit.", { - structured: { - type: "json", - jsonSchema: schema, - }, - maxTokens: 100, // Recommended to avoid getting stuck - }); - - for await (const { content } of prediction) { - process.stdout.write(content); - } - process.stdout.write("\n"); - - const result = await prediction.result(); - const book = JSON.parse(result.content); - - console.info("Parsed", book); - ``` - - - - - Structured generation works by constraining the model to only generate tokens that conform to the provided schema. This ensures valid output in normal cases, but comes with two important limitations: - - 1. Models (especially smaller ones) may occasionally get stuck in an unclosed structure (like an open bracket), when they "forget" they are in such structure and cannot stop due to schema requirements. Thus, it is recommended to always include a `maxTokens` parameter to prevent infinite generation. - - 2. Schema compliance is only guaranteed for complete, successful generations. If generation is interrupted (by cancellation, reaching the `maxTokens` limit, or other reasons), the output will likely violate the schema. With `zod` schema input, this will raise an error; with JSON schema, you'll receive an invalid string that doesn't satisfy schema. - - - - - -SDK methods such as `model.respond()`, `model.applyPromptTemplate()`, or `model.act()` -takes in a chat parameter as an input. There are a few ways to represent a chat in the SDK. - -Option 1: Array of Messages [#option-1-array-of-messages] - -You can use an array of messages to represent a chat. Here is an example with the `.respond()` method. - - - - - Text-only - - - - With Images - - - - - ```typescript - const prediction = model.respond([ - { role: "system", content: "You are a resident AI philosopher." }, - { role: "user", content: "What is the meaning of life?" }, - ]); - ``` - - - - ```typescript - const image = await client.files.prepareImage("/path/to/image.jpg"); - - const prediction = model.respond([ - { role: "system", content: "You are a state-of-art object recognition system." }, - { role: "user", content: "What is this object?", images: [image] }, - ]); - ``` - - - -Option 2: Input a Single String [#option-2-input-a-single-string] - -If your chat only has one single user message, you can use a single string to represent the chat. Here is an example with the `.respond` method. - -```typescript -const prediction = model.respond("What is the meaning of life?"); -``` - -Option 3: Using the `Chat` Helper Class [#option-3-using-the-chat-helper-class] - -For more complex tasks, it is recommended to use the `Chat` helper classes. It provides various commonly used methods to manage the chat. Here is an example with the `Chat` class. - - - - - Text-only - - - - With Images - - - - - ```typescript - const chat = Chat.empty(); - chat.append("system", "You are a resident AI philosopher."); - chat.append("user", "What is the meaning of life?"); - - const prediction = model.respond(chat); - ``` - - - - ```typescript - const image = await client.files.prepareImage("/path/to/image.jpg"); - - const chat = Chat.empty(); - chat.append("system", "You are a state-of-art object recognition system."); - chat.append("user", "What is this object?", { images: [image] }); - - const prediction = model.respond(chat); - ``` - - - -You can also quickly construct a `Chat` object using the `Chat.from` method. - - - - - Array of messages - - - - Single string - - - - - ```typescript - const chat = Chat.from([ - { role: "system", content: "You are a resident AI philosopher." }, - { role: "user", content: "What is the meaning of life?" }, - ]); - ``` - - - - ```typescript - // This constructs a chat with a single user message - const chat = Chat.from("What is the meaning of life?"); - ``` - - - - - - -Automatic tool calling [#automatic-tool-calling] - -We introduce the concept of execution "rounds" to describe the combined process of running a tool, providing its output to the LLM, and then waiting for the LLM to decide what to do next. - -**Execution Round** - -``` - • run a tool -> - ↑ • provide the result to the LLM -> - │ • wait for the LLM to generate a response - │ - └────────────────────────────────────────┘ └➔ (return) -``` - -A model might choose to run tools multiple times before returning a final result. For example, if the LLM is writing code, it might choose to compile or run the program, fix errors, and then run it again, rinse and repeat until it gets the desired result. - -With this in mind, we say that the `.act()` API is an automatic "multi-round" tool calling API. - -Quick Example [#quick-example] - -```typescript -import { LMStudioClient, tool } from "@lmstudio/sdk"; -import { z } from "zod"; - -const client = new LMStudioClient(); - -const multiplyTool = tool({ - name: "multiply", - description: "Given two numbers a and b. Returns the product of them.", - parameters: { a: z.number(), b: z.number() }, - implementation: ({ a, b }) => a * b, -}); - -const model = await client.llm.model("qwen2.5-7b-instruct"); -await model.act("What is the result of 12345 multiplied by 54321?", [multiplyTool], { - onMessage: (message) => console.info(message.toString()), -}); -``` - -> ***NOTE:*** at this time, this code expects zod v3 - -What does it mean for an LLM to "use a tool"? [#what-does-it-mean-for-an-llm-to-use-a-tool] - -LLMs are largely text-in, text-out programs. So, you may ask "how can an LLM use a tool?". The answer is that some LLMs are trained to ask the human to call the tool for them, and expect the tool output to to be provided back in some format. - -Imagine you're giving computer support to someone over the phone. You might say things like "run this command for me ... OK what did it output? ... OK now click there and tell me what it says ...". In this case you're the LLM! And you're "calling tools" vicariously through the person on the other side of the line. - -Important: Model Selection [#important-model-selection] - -The model selected for tool use will greatly impact performance. - -Some general guidance when selecting a model: - -* Not all models are capable of intelligent tool use -* Bigger is better (i.e., a 7B parameter model will generally perform better than a 3B parameter model) -* We've observed [Qwen2.5-7B-Instruct](https://model.lmstudio.ai/download/lmstudio-community/Qwen2.5-7B-Instruct-GGUF) to perform well in a wide variety of cases -* This guidance may change - -Example: Multiple Tools [#example-multiple-tools] - -The following code demonstrates how to provide multiple tools in a single `.act()` call. - -```typescript -import { LMStudioClient, tool } from "@lmstudio/sdk"; -import { z } from "zod"; - -const client = new LMStudioClient(); - -const additionTool = tool({ - name: "add", - description: "Given two numbers a and b. Returns the sum of them.", - parameters: { a: z.number(), b: z.number() }, - implementation: ({ a, b }) => a + b, -}); - -const isPrimeTool = tool({ - name: "isPrime", - description: "Given a number n. Returns true if n is a prime number.", - parameters: { n: z.number() }, - implementation: ({ n }) => { - if (n < 2) return false; - const sqrt = Math.sqrt(n); - for (let i = 2; i <= sqrt; i++) { - if (n % i === 0) return false; - } - return true; - }, -}); - -const model = await client.llm.model("qwen2.5-7b-instruct"); -await model.act( - "Is the result of 12345 + 45668 a prime? Think step by step.", - [additionTool, isPrimeTool], - { onMessage: (message) => console.info(message.toString()) }, -); -``` - -Example: Chat Loop with Create File Tool [#example-chat-loop-with-create-file-tool] - -The following code creates a conversation loop with an LLM agent that can create files. - -```typescript -import { Chat, LMStudioClient, tool } from "@lmstudio/sdk"; -import { existsSync } from "fs"; -import { writeFile } from "fs/promises"; -import { createInterface } from "readline/promises"; -import { z } from "zod"; - -const rl = createInterface({ input: process.stdin, output: process.stdout }); -const client = new LMStudioClient(); -const model = await client.llm.model(); -const chat = Chat.empty(); - -const createFileTool = tool({ - name: "createFile", - description: "Create a file with the given name and content.", - parameters: { name: z.string(), content: z.string() }, - implementation: async ({ name, content }) => { - if (existsSync(name)) { - return "Error: File already exists."; - } - await writeFile(name, content, "utf-8"); - return "File created."; - }, -}); - -while (true) { - const input = await rl.question("You: "); - // Append the user input to the chat - chat.append("user", input); - - process.stdout.write("Bot: "); - await model.act(chat, [createFileTool], { - // When the model finish the entire message, push it to the chat - onMessage: (message) => chat.append(message), - onPredictionFragment: ({ content }) => { - process.stdout.write(content); - }, - }); - process.stdout.write("\n"); -} -``` - - - - -You can define tools with the `tool()` function and pass them to the model in the `act()` call. - -Anatomy of a Tool [#anatomy-of-a-tool] - -Follow this standard format to define functions as tools: - -```typescript title="index.ts" -import { tool } from "@lmstudio/sdk"; -import { z } from "zod"; - -const exampleTool = tool({ - // The name of the tool - name: "add", - - // A description of the tool - description: "Given two numbers a and b. Returns the sum of them.", - - // zod schema of the parameters - parameters: { a: z.number(), b: z.number() }, - - // The implementation of the tool. Just a regular function. - implementation: ({ a, b }) => a + b, -}); -``` - -**Important**: The tool name, description, and the parameter definitions are all passed to the model! - -This means that your wording will affect the quality of the generation. Make sure to always provide a clear description of the tool so the model knows how to use it. - -Tools with External Effects (like Computer Use or API Calls) [#tools-with-external-effects-like-computer-use-or-api-calls] - -Tools can also have external effects, such as creating files or calling programs and even APIs. By implementing tools with external effects, you -can essentially turn your LLMs into autonomous agents that can perform tasks on your local machine. - -Example: `createFileTool` [#example-createfiletool] - -Tool Definition [#tool-definition] - -```typescript title="createFileTool.ts" -import { tool } from "@lmstudio/sdk"; -import { existsSync } from "fs"; -import { writeFile } from "fs/promises"; -import { z } from "zod"; - -const createFileTool = tool({ - name: "createFile", - description: "Create a file with the given name and content.", - parameters: { name: z.string(), content: z.string() }, - implementation: async ({ name, content }) => { - if (existsSync(name)) { - return "Error: File already exists."; - } - await writeFile(name, content, "utf-8"); - return "File created."; - }, -}); -``` - -Example code using the `createFile` tool: [#example-code-using-the-createfile-tool] - -```typescript title="index.ts" -import { LMStudioClient } from "@lmstudio/sdk"; -import { createFileTool } from "./createFileTool"; - -const client = new LMStudioClient(); - -const model = await client.llm.model("qwen2.5-7b-instruct"); -await model.act( - "Please create a file named output.txt with your understanding of the meaning of life.", - [createFileTool], -); -``` - - - - -Add dependencies to your plugin with `npm` [#add-dependencies-to-your-plugin-with-npm] - -LM Studio plugins supports `npm` packages. You can just install them using `npm install`. - -When the plugin is installed, LM Studio will automatically download all the required dependencies that are declared in `package.json` and `package-lock.json`. (The user does not need to have Node.js/npm installed.) - -`postinstall` scripts [#postinstall-scripts] - -For safety reasons, we do **not** run `postinstall` scripts. Thus please make sure you are not using any npm packages that require postinstall scripts to work. - -Using Other Package Managers [#using-other-package-managers] - -Since we rely on `package-lock.json`, lock files produced by other package managers will not work. Thus we recommend only using `npm` when developing LM Studio plugins. - - - - -Plugins extend LM Studio's functionality by providing "hook functions" that execute at specific points during operation. - -Plugins are currently written in JavaScript/TypeScript and run on Node.js v22.21.1. Python support is in development. - -Getting Started [#getting-started] - -LM Studio includes Node.js, so no separate installation is required. - -Create a new plugin [#create-a-new-plugin] - -To create a new plugin, navigate to LM Studio... \[TO BE CONTINUED] - -Run a plugin in development mode [#run-a-plugin-in-development-mode] - -Once you've created a plugin, run this command in the plugin directory to start development mode: - -```bash -lms dev -``` - -Your plugin will appear in LM Studio's plugin list. Development mode automatically rebuilds and reloads your plugin when you make code changes. - -You only need `lms dev` during development. When the plugin is installed, LM Studio automatically runs them as needed. Learn more about distributing and installing plugins in the [Sharing Plugins](./plugins/publish-plugins) section. - -Next Steps [#next-steps] - -* [Tools Providers](./plugins/tools-provider) - - Give models extra capabilities by creating tools they can use during generation, like accessing external APIs or performing calculations. - -* [Prompt Preprocessors](./plugins/prompt-preprocessor) - - Modify user input before it reaches the model - handle file uploads, inject context, or transform queries. - -* [Generators](./plugins/generator) - - Create custom text generation sources that replace the local model, perfect for online model adapters. - -* [Custom Configurations](./plugins/custom-configuration) - - Add configuration UIs so users can customize your plugin's behavior. - -* [Third-Party Dependencies](./plugins/dependencies) - - Use npm packages to leverage existing libraries in your plugins. - -* [Sharing Plugins](./plugins/publish-plugins) - - Package and share your plugins with the community. - - - - -Generate embeddings for input text. Embeddings are vector representations of text that capture semantic meaning. Embeddings are a building block for RAG (Retrieval-Augmented Generation) and other similarity-based tasks. - -Prerequisite: Get an Embedding Model [#prerequisite-get-an-embedding-model] - -If you don't yet have an embedding model, you can download a model like `nomic-ai/nomic-embed-text-v1.5` using the following command: - -```bash -lms get nomic-ai/nomic-embed-text-v1.5 -``` - -Create Embeddings [#create-embeddings] - -To convert a string to a vector representation, pass it to the `embed` method on the corresponding embedding model handle. - -```typescript title="index.ts" -import { LMStudioClient } from "@lmstudio/sdk"; -const client = new LMStudioClient(); - -const model = await client.embedding.model("nomic-embed-text-v1.5"); - -const { embedding } = await model.embed("Hello, world!"); -``` - - - - -Models use a tokenizer to internally convert text into "tokens" they can deal with more easily. LM Studio exposes this tokenizer for utility. - -Tokenize [#tokenize] - -You can tokenize a string with a loaded LLM or embedding model using the SDK. In the below examples, `llm` can be replaced with an embedding model `emb`. - -```typescript -import { LMStudioClient } from "@lmstudio/sdk"; - -const client = new LMStudioClient(); -const model = await client.llm.model(); - -const tokens = await model.tokenize("Hello, world!"); - -console.info(tokens); // Array of token IDs. -``` - -Count tokens [#count-tokens] - -If you only care about the number of tokens, you can use the `.countTokens` method instead. - -```typescript -const tokenCount = await model.countTokens("Hello, world!"); -console.info("Token count:", tokenCount); -``` - -Example: Count Context [#example-count-context] - -You can determine if a given conversation fits into a model's context by doing the following: - -1. Convert the conversation to a string using the prompt template. -2. Count the number of tokens in the string. -3. Compare the token count to the model's context length. - -```typescript -import { Chat, type LLM, LMStudioClient } from "@lmstudio/sdk"; - -async function doesChatFitInContext(model: LLM, chat: Chat) { - // Convert the conversation to a string using the prompt template. - const formatted = await model.applyPromptTemplate(chat); - // Count the number of tokens in the string. - const tokenCount = await model.countTokens(formatted); - // Get the current loaded context length of the model - const contextLength = await model.getContextLength(); - return tokenCount < contextLength; -} - -const client = new LMStudioClient(); -const model = await client.llm.model(); - -const chat = Chat.from([ - { role: "user", content: "What is the meaning of life." }, - { role: "assistant", content: "The meaning of life is..." }, - // ... More messages -]); - -console.info("Fits in context:", await doesChatFitInContext(model, chat)); -``` - - - - - - -You can iterate through locally available models using the `listLocalModels` method. - -Available Model on the Local Machine [#available-model-on-the-local-machine] - -`listLocalModels` lives under the `system` namespace of the `LMStudioClient` object. - -```typescript -import { LMStudioClient } from "@lmstudio/sdk"; -const client = new LMStudioClient(); - -console.info(await client.system.listDownloadedModels()); -``` - -This will give you results equivalent to using [`lms ls`](../../cli/ls) in the CLI. - -Example output: [#example-output] - -```json -[ - { - "type": "llm", - "modelKey": "qwen2.5-7b-instruct", - "format": "gguf", - "displayName": "Qwen2.5 7B Instruct", - "path": "lmstudio-community/Qwen2.5-7B-Instruct-GGUF/Qwen2.5-7B-Instruct-Q4_K_M.gguf", - "sizeBytes": 4683073952, - "paramsString": "7B", - "architecture": "qwen2", - "vision": false, - "trainedForToolUse": true, - "maxContextLength": 32768 - }, - { - "type": "embedding", - "modelKey": "text-embedding-nomic-embed-text-v1.5@q4_k_m", - "format": "gguf", - "displayName": "Nomic Embed Text v1.5", - "path": "nomic-ai/nomic-embed-text-v1.5-GGUF/nomic-embed-text-v1.5.Q4_K_M.gguf", - "sizeBytes": 84106624, - "architecture": "nomic-bert", - "maxContextLength": 2048 - } -] -``` - - - - - - -You can iterate through models loaded into memory using the `listLoaded` method. This method lives under the `llm` and `embedding` namespaces of the `LMStudioClient` object. - -List Models Currently Loaded in Memory [#list-models-currently-loaded-in-memory] - -This will give you results equivalent to using [`lms ps`](../../cli/ps) in the CLI. - -```typescript -import { LMStudioClient } from "@lmstudio/sdk"; - -const client = new LMStudioClient(); - -const llmOnly = await client.llm.listLoaded(); -const embeddingOnly = await client.embedding.listLoaded(); -``` - - - - - - -AI models are huge. It can take a while to load them into memory. LM Studio's SDK allows you to precisely control this process. - -**Most commonly:** - -* Use `.model()` to get any currently loaded model -* Use `.model("model-key")` to use a specific model - -**Advanced (manual model management):** - -* Use `.load("model-key")` to load a new instance of a model -* Use `model.unload()` to unload a model from memory - -Get the Current Model with `.model()` [#get-the-current-model-with-model] - -If you already have a model loaded in LM Studio (either via the GUI or `lms load`), you can use it by calling `.model()` without any arguments. - -```typescript -import { LMStudioClient } from "@lmstudio/sdk"; -const client = new LMStudioClient(); - -const model = await client.llm.model(); -``` - -Get a Specific Model with `.model("model-key")` [#get-a-specific-model-with-modelmodel-key] - -If you want to use a specific model, you can provide the model key as an argument to `.model()`. - -Get if Loaded, or Load if not [#get-if-loaded-or-load-if-not] - -Calling `.model("model-key")` will load the model if it's not already loaded, or return the existing instance if it is. - -```typescript -import { LMStudioClient } from "@lmstudio/sdk"; -const client = new LMStudioClient(); - -const model = await client.llm.model("qwen/qwen3-4b-2507"); -``` - - - -Load a New Instance of a Model with `.load()` [#load-a-new-instance-of-a-model-with-load] - -Use `load()` to load a new instance of a model, even if one already exists. This allows you to have multiple instances of the same or different models loaded at the same time. - -```typescript -import { LMStudioClient } from "@lmstudio/sdk"; -const client = new LMStudioClient(); - -const llama = await client.llm.load("qwen/qwen3-4b-2507"); -const another_llama = await client.llm.load("qwen/qwen3-4b-2507", { - identifier: "second-llama" -}); -``` - - - -Note about Instance Identifiers [#note-about-instance-identifiers] - -If you provide an instance identifier that already exists, the server will throw an error. -So if you don't really care, it's safer to not provide an identifier, in which case -the server will generate one for you. You can always check in the server tab in LM Studio, too! - -Unload a Model from Memory with `.unload()` [#unload-a-model-from-memory-with-unload] - -Once you no longer need a model, you can unload it by simply calling `unload()` on its handle. - -```typescript -import { LMStudioClient } from "@lmstudio/sdk"; - -const client = new LMStudioClient(); - -const model = await client.llm.model(); -await model.unload(); -``` - -Set Custom Load Config Parameters [#set-custom-load-config-parameters] - -You can also specify the same load-time configuration options when loading a model, such as Context Length and GPU offload. - -See [load-time configuration](../llm-prediction/parameters) for more. - -Set an Auto Unload Timer (TTL) [#set-an-auto-unload-timer-ttl] - -You can specify a *time to live* for a model you load, which is the idle time (in seconds) -after the last request until the model unloads. See [Idle TTL](/docs/api/ttl-and-auto-evict) for more on this. - - - - - Using .load - - - - Using .model - - - - - ```typescript - import { LMStudioClient } from "@lmstudio/sdk"; - - const client = new LMStudioClient(); - - const model = await client.llm.load("qwen/qwen3-4b-2507", { - ttl: 300, // 300 seconds - }); - ``` - - - - ```typescript - import { LMStudioClient } from "@lmstudio/sdk"; - - const client = new LMStudioClient(); - - const model = await client.llm.model("qwen/qwen3-4b-2507", { - // Note: specifying ttl in `.model` will only set the TTL for the model if the model is - // loaded from this call. If the model was already loaded, the TTL will not be updated. - ttl: 300, // 300 seconds - }); - ``` - - - - - - -Parameters [#parameters] - - - - - - -Fields [#fields] - - - - - - -LLMs and embedding models, due to their fundamental architecture, have a property called `context length`, and more specifically a **maximum** context length. Loosely speaking, this is how many tokens the models can "keep in memory" when generating text or embeddings. Exceeding this limit will result in the model behaving erratically. - -Use the `getContextLength()` Function on the Model Object [#use-the-getcontextlength-function-on-the-model-object] - -It's useful to be able to check the context length of a model, especially as an extra check before providing potentially long input to the model. - -```typescript title="index.ts" -const contextLength = await model.getContextLength(); -``` - -The `model` in the above code snippet is an instance of a loaded model you get from the `llm.model` method. See [Manage Models in Memory](../manage-models/loading) for more information. - -Example: Check if the input will fit in the model's context window [#example-check-if-the-input-will-fit-in-the-models-context-window] - -You can determine if a given conversation fits into a model's context by doing the following: - -1. Convert the conversation to a string using the prompt template. -2. Count the number of tokens in the string. -3. Compare the token count to the model's context length. - -```typescript -import { Chat, type LLM, LMStudioClient } from "@lmstudio/sdk"; - -async function doesChatFitInContext(model: LLM, chat: Chat) { - // Convert the conversation to a string using the prompt template. - const formatted = await model.applyPromptTemplate(chat); - // Count the number of tokens in the string. - const tokenCount = await model.countTokens(formatted); - // Get the current loaded context length of the model - const contextLength = await model.getContextLength(); - return tokenCount < contextLength; -} - -const client = new LMStudioClient(); -const model = await client.llm.model(); - -const chat = Chat.from([ - { role: "user", content: "What is the meaning of life." }, - { role: "assistant", content: "The meaning of life is..." }, - // ... More messages -]); - -console.info("Fits in context:", await doesChatFitInContext(model, chat)); -``` - - - - -You can access information about a loaded model using the `getInfo` method. - - - - - LLM - - - - Embedding Model - - - - - ```typescript - import { LMStudioClient } from "@lmstudio/sdk"; - - const client = new LMStudioClient(); - const model = await client.llm.model(); - - const modelInfo = await model.getInfo(); - - console.info("Model Key", modelInfo.modelKey); - console.info("Current Context Length", model.contextLength); - console.info("Model Trained for Tool Use", modelInfo.trainedForToolUse); - // etc. - ``` - - - - ```typescript - import { LMStudioClient } from "@lmstudio/sdk"; - - const client = new LMStudioClient(); - const model = await client.embedding.model(); - - const modelInfo = await model.getInfo(); - - console.info("Model Key", modelInfo.modelKey); - console.info("Current Context Length", modelInfo.contextLength); - // etc. - ``` - - - - - - -You can serve local LLMs from LM Studio's Developer tab, either on `localhost` or on the network. - -LM Studio's APIs can be used through [REST API](/docs/developer/rest), client libraries like [lmstudio-js](/docs/typescript) and [lmstudio-python](/docs/python), and compatibility endpoints like [OpenAI-compatible](/docs/developer/openai-compat) and [Anthropic-compatible](/docs/developer/anthropic-compat). - - - -Running the server [#running-the-server] - -To run the server, go to the Developer tab in LM Studio, and toggle the "Start server" switch to start the API server. - - - -Alternatively, you can use `lms` ([LM Studio's CLI](/docs/cli)) to start the server from your terminal: - -```bash -lms server start -``` - -API options [#api-options] - -* [LM Studio REST API](/docs/developer/rest) -* [TypeScript SDK](/docs/typescript) - `lmstudio-js` -* [Python SDK](/docs/python) - `lmstudio-python` -* [OpenAI-compatible endpoints](/docs/developer/openai-compat) -* [Anthropic-compatible endpoints](/docs/developer/anthropic-compat) - - - - -Enabling the "Serve on Local Network" option allows the LM Studio API server running on your machine to be accessible by other devices connected to the same local network. - -This is useful for scenarios where you want to: - -* Use a local LLM on your other less powerful devices by connecting them to a more powerful machine running LM Studio. -* Let multiple people use a single LM Studio instance on the network. -* Use the API from IoT devices, edge computing units, or other services in your local setup. - -Once enabled, the server will bind to your local network IP address instead of localhost. The API access URL will be updated accordingly which you can use in your applications. - - - - - - -You can configure server settings, such as the port number, whether to allow other API clients to access the server and MCP features. - - - -Settings information [#settings-information] - - - - - - -You can access custom configurations via `ctl.getPluginConfig` and `ctl.getGlobalPluginConfig`. See [Custom Configurations](./configurations) for more details. - -The following is an example of how you can make the `specialInstructions` and `triggerWord` configurable: - -First, add the config field to `config.ts`: - -```typescript title="src/config.ts" -import { createConfigSchematics } from "@lmstudio/sdk"; -export const configSchematics = createConfigSchematics() - .field( - "specialInstructions", - "string", - { - displayName: "Special Instructions", - subtitle: "Special instructions to be injected when the trigger word is found.", - }, - "Here is some default special instructions.", - ) - .field( - "triggerWord", - "string", - { - displayName: "Trigger Word", - subtitle: "The word that will trigger the special instructions.", - }, - "@init", - ) - .build(); -``` - - - In this example, we added the field to `configSchematics`, which is the "per-chat" configuration. If you want to add a global configuration field that is shared across different chats, you should add it under the section `globalConfigSchematics` in the same file. - - Learn more about configurations in [Custom Configurations](../plugins/configurations). - - -Then, modify the prompt preprocessor to use the configuration: - -```typescript title="src/promptPreprocessor.ts" -import { type PromptPreprocessorController, type ChatMessage } from "@lmstudio/sdk"; -import { configSchematics } from "./config"; - -export async function preprocess(ctl: PromptPreprocessorController, userMessage: ChatMessage) { - const textContent = userMessage.getText(); - const pluginConfig = ctl.getPluginConfig(configSchematics); - - const triggerWord = pluginConfig.get("triggerWord"); - const specialInstructions = pluginConfig.get("specialInstructions"); - - const transformed = textContent.replaceAll(triggerWord, specialInstructions); - return transformed; -} -``` - - - - -Depending on the task, the prompt preprocessor may take some time to complete, for example, it may need to fetch some data from the internet or perform some heavy computation. In such cases, you can report the status of the preprocessing using `ctl.setStatus`. - -```typescript title="src/promptPreprocessor.ts" -const status = ctl.createStatus({ - status: "loading", - text: "Preprocessing.", -}); -``` - -You can update the status at any time by calling `status.setState`. - -```typescript title="src/promptPreprocessor.ts" -status.setState({ - status: "done", - text: "Preprocessing done.", -}) -``` - -You can even add sub status to the status: - -```typescript title="src/promptPreprocessor.ts" -const subStatus = status.addSubStatus({ - status: "loading", - text: "I am a sub status." -}); -``` - - - - -Example: Inject Current Time [#example-inject-current-time] - -The following is an example preprocessor that injects the current time before each user message. - -```typescript title="src/promptPreprocessor.ts" -import { type PromptPreprocessorController, type ChatMessage } from "@lmstudio/sdk"; -export async function preprocess(ctl: PromptPreprocessorController, userMessage: ChatMessage) { - const textContent = userMessage.getText(); - const transformed = `Current time: ${new Date().toString()}\n\n${textContent}`; - return transformed; -} -``` - -Example: Replace Trigger Words [#example-replace-trigger-words] - -Another example you can do it with simple text only processing is by replacing certain trigger words. For example, you can replace a `@init` trigger with a special initialization message. - -```typescript title="src/promptPreprocessor.ts" -import { type PromptPreprocessorController, type ChatMessage, text } from "@lmstudio/sdk"; - -const mySpecialInstructions = text` - Here are some special instructions... -`; - -export async function preprocess(ctl: PromptPreprocessorController, userMessage: ChatMessage) { - const textContent = userMessage.getText(); - const transformed = textContent.replaceAll("@init", mySpecialInstructions); - return transformed; -} -``` - - - - -A prediction may be aborted by the user while your generator is still running. In such cases, you should handle the abort gracefully by handling the `ctl.abortSignal`. - -You can learn more about `AbortSignal` in the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal). - - - - -Prompt Preprocessor is a function that is called upon the user hitting the "Send" button. It receives the user input and can modify it before it reaches the model. If multiple prompt preprocessors are registered, they will be chained together, with each one receiving the output of the previous one. - -The modified result will be saved in the chat history, meaning that even if your plugin is disabled afterwards, the modified input will still be used. - -Prompt preprocessors will only be triggered for the current user input. It will not be triggered for previous messages in the chat history even if they were not preprocessed. - -Prompt preprocessors takes in a `ctl` object for controlling the preprocessing and a `userMessage` it needs to preprocess. It returns either a string or a message object which will replace the user message. - -Examples [#examples] - -The following are some plugins that make use of prompt preprocessors: - -* [lmstudio/rag-v1](https://lmstudio.ai/lmstudio/rag-v1) - - Retrieval Augmented Generation (RAG) for LM Studio. This is the plugin that gives document handling capabilities to LM Studio. - - - - -You can add custom configuration options to your tools provider, so the user of plugin can customize the behavior without modifying the code. - -In the example below, we will ask the user to specify a folder name, and we will create files inside that folder within the working directory. - -First, add the config field to `config.ts`: - -```typescript title="src/config.ts" -export const configSchematics = createConfigSchematics() - .field( - "folderName", // Key of the configuration field - "string", // Type of the configuration field - { - displayName: "Folder Name", - subtitle: "The name of the folder where files will be created.", - }, - "default_folder", // Default value - ) - .build(); -``` - - - In this example, we added the field to `configSchematics`, which is the "per-chat" configuration. If you want to add a global configuration field that is shared across different chats, you should add it under the section `globalConfigSchematics` in the same file. - - Learn more about configurations in [Custom Configurations](../plugins/configurations). - - -Then, modify the tools provider to use the configuration value: - -```typescript title="src/toolsProvider.ts" -import { tool, Tool, ToolsProviderController } from "@lmstudio/sdk"; -import { existsSync } from "fs"; -import { mkdir, writeFile } from "fs/promises"; -import { join } from "path"; -import { z } from "zod"; -import { configSchematics } from "./config"; - -export async function toolsProvider(ctl: ToolsProviderController) { - const tools: Tool[] = []; - - const createFileTool = tool({ - name: `create_file`, - description: "Create a file with the given name and content.", - parameters: { file_name: z.string(), content: z.string() }, - implementation: async ({ file_name, content }) => { - // Read the config field - const folderName = ctl.getPluginConfig(configSchematics).get("folderName"); - const folderPath = join(ctl.getWorkingDirectory(), folderName); - - // Ensure the folder exists - await mkdir(folderPath, { recursive: true }); - - // Create the file - const filePath = join(folderPath, file_name); - if (existsSync(filePath)) { - return "Error: File already exists."; - } - await writeFile(filePath, content, "utf-8"); - return "File created."; - }, - }); - tools.push(createFileTool); // First tool - - return tools; // Return the tools array -} -``` - - - - -A prediction may be aborted by the user while your tool is still running. In such cases, you should handle the abort gracefully by handling the `AbortSignal` object passed as the second parameter to the tool's implementation function. - -```typescript title="src/toolsProvider.ts" -import { tool, Tool, ToolsProviderController } from "@lmstudio/sdk"; -import { z } from "zod"; - -export async function toolsProvider(ctl: ToolsProviderController) { - const tools: Tool[] = []; - - const fetchTool = tool({ - name: `fetch`, - description: "Fetch a URL using GET method.", - parameters: { url: z.string() }, - implementation: async ({ url }, { signal }) => { - const response = await fetch(url, { - method: "GET", - signal, // <-- Here, we pass the signal to fetch to allow cancellation - }); - if (!response.ok) { - return `Error: Failed to fetch ${url}: ${response.statusText}`; - } - const data = await response.text(); - return { - status: response.status, - headers: Object.fromEntries(response.headers.entries()), - data: data.substring(0, 1000), // Limit to 1000 characters - }; - }, - }); - tools.push(fetchTool); - - return tools; -} -``` - -You can learn more about `AbortSignal` in the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal). - - - - -Tools provider is a function that returns an array of tools that the model can use during generation. - -Examples [#examples] - -The following are some plugins that make use of tools providers: - -* [lmstudio/wikipedia](https://lmstudio.ai/lmstudio/wikipedia) - - Gives the LLM tools to search and read Wikipedia articles. - -* [lmstudio/js-code-sandbox](https://lmstudio.ai/lmstudio/js-code-sandbox) - - Gives the LLM tools to run JavaScript/TypeScript code in a sandbox environment using [deno](https://deno.com/). - -* [lmstudio/dice](https://lmstudio.ai/lmstudio/dice) - - Allows the LLM to generate random numbers using "dice". - - - - -A tools provider can define multiple tools for the model to use. Simply create additional tool instances and add them to the tools array. - -In the example below, we add a second tool to read the content of a file: - -```typescript title="src/toolsProvider.ts" -import { tool, Tool, ToolsProviderController } from "@lmstudio/sdk"; -import { z } from "zod"; -import { existsSync } from "fs"; -import { readFile, writeFile } from "fs/promises"; -import { join } from "path"; - -export async function toolsProvider(ctl: ToolsProviderController) { - const tools: Tool[] = []; - - const createFileTool = tool({ - name: `create_file`, - description: "Create a file with the given name and content.", - parameters: { file_name: z.string(), content: z.string() }, - implementation: async ({ file_name, content }) => { - const filePath = join(ctl.getWorkingDirectory(), file_name); - if (existsSync(filePath)) { - return "Error: File already exists."; - } - await writeFile(filePath, content, "utf-8"); - return "File created."; - }, - }); - tools.push(createFileTool); // First tool - - const readFileTool = tool({ - name: `read_file`, - description: "Read the content of a file with the given name.", - parameters: { file_name: z.string() }, - implementation: async ({ file_name }) => { - const filePath = join(ctl.getWorkingDirectory(), file_name); - if (!existsSync(filePath)) { - return "Error: File does not exist."; - } - const content = await readFile(filePath, "utf-8"); - return content; - }, - }); - tools.push(readFileTool); // Second tool - - return tools; // Return the tools array -} -``` - - - - -To setup a tools provider, first create the a file `toolsProvider.ts` in your plugin's `src` directory: - -```typescript title="src/toolsProvider.ts" -import { tool, Tool, ToolsProviderController } from "@lmstudio/sdk"; -import { z } from "zod"; -import { existsSync } from "fs"; -import { writeFile } from "fs/promises"; -import { join } from "path"; - -export async function toolsProvider(ctl: ToolsProviderController) { - const tools: Tool[] = []; - - const createFileTool = tool({ - // Name of the tool, this will be passed to the model. Aim for concise, descriptive names - name: `create_file`, - // Your description here, more details will help the model to understand when to use the tool - description: "Create a file with the given name and content.", - parameters: { file_name: z.string(), content: z.string() }, - implementation: async ({ file_name, content }) => { - const filePath = join(ctl.getWorkingDirectory(), file_name); - if (existsSync(filePath)) { - return "Error: File already exists."; - } - await writeFile(filePath, content, "utf-8"); - return "File created."; - }, - }); - tools.push(createFileTool); - - return tools; -} -``` - -The above tools provider defines a single tool called `create_file` that allows the model to create a file with a specified name and content inside the working directory. You can learn more about defining tools in [Tool Definition](../agent/tools). - -Then register the tools provider in your plugin's `index.ts`: - -```typescript title="src/index.ts" -// ... other imports ... -import { toolsProvider } from "./toolsProvider"; - -export async function main(context: PluginContext) { - // ... other plugin setup code ... - - // Register the tools provider. - context.withToolsProvider(toolsProvider); // <-- Register the tools provider - - // ... other plugin setup code ... -} -``` - -Now, you can try to ask the LLM to create a file, and it should be able to do so using the tool you just created. - -Tips [#tips] - -* **Use Descriptive Names and Descriptions**: When defining tools, use descriptive names and detailed descriptions. This helps the model understand when and how to use each tool effectively. -* **Return Errors as Strings**: Sometimes, the model may make a mistake when calling a tool. In such cases, you can return an error message as a string. In most cases, the model will try to correct itself and call the tool again with the correct parameters. - - - - -Sometimes, a tool may take a long time to execute. In such cases, it will be helpful to provide status updates, so the user knows what is happening. In order times, you may want to warn the user about potential issues. - -You can use `status` and `warn` methods on the second parameter of the tool's implementation function to send status updates and warnings. - -The following example shows how to implement a tool that waits for a specified number of seconds, providing status updates and warnings if the wait time exceeds 10 seconds: - -```typescript title="src/toolsProvider.ts" -import { tool, Tool, ToolsProviderController } from "@lmstudio/sdk"; -import { z } from "zod"; - -export async function toolsProvider(ctl: ToolsProviderController) { - const tools: Tool[] = []; - - const waitTool = tool({ - name: `wait`, - description: "Wait for a specified number of seconds.", - parameters: { seconds: z.number().min(1) }, - implementation: async ({ seconds }, { status, warn }) => { - if (seconds > 10) { - warn("The model asks to wait for more than 10 seconds."); - } - for (let i = 0; i < seconds; i++) { - status(`Waiting... ${i + 1}/${seconds} seconds`); - await new Promise((resolve) => setTimeout(resolve, 1000)); - } - }, - }); - tools.push(waitTool); - - return tools; // Return the tools array -} -``` - -Note status updates and warnings are only visible to the user. If you want the model to also see those messages, you should return them as part of the tool's return value. - -Handling Aborts [#handling-aborts] - -A prediction may be aborted by the user while your tool is still running. In such cases, you should handle the abort gracefully by handling the `AbortSignal` object passed as the second parameter to the tool's implementation function. - -```typescript title="src/toolsProvider.ts" -import { tool, Tool, ToolsProviderController } from "@lmstudio/sdk"; -import { z } from "zod"; - -export async function toolsProvider(ctl: ToolsProviderController) { - const tools: Tool[] = []; - - const fetchTool = tool({ - name: `fetch`, - description: "Fetch a URL using GET method.", - parameters: { url: z.string() }, - implementation: async ({ url }, { signal }) => { - const response = await fetch(url, { - method: "GET", - signal, // <-- Here, we pass the signal to fetch to allow cancellation - }); - if (!response.ok) { - return `Error: Failed to fetch ${url}: ${response.statusText}`; - } - const data = await response.text(); - return { - status: response.status, - headers: Object.fromEntries(response.headers.entries()), - data: data.substring(0, 1000), // Limit to 1000 characters - }; - }, - }); - tools.push(fetchTool); - - return tools; -} -``` - -You can learn more about `AbortSignal` in the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal). - - - - -Generators are replacement for local LLMs. They act like a token source. When a plugin with a generator is used, LM Studio will no longer use the local model to generate text. The generator will be used instead. - -Generators are useful for implementing adapters for external models, such as using a remote LM Studio instance or other online models. - -If a plugin contains a generator, it will no longer show up in the plugins list. Instead, it will show up in the model dropdown and act as a model. If your plugins contains [Tools Provider](./tools-providers.md) or [Prompt Preprocessor](./prompt-preprocessors.md), they will be used when your generator is being selected. - -Examples [#examples] - -The following are some plugins that make use of generators: - -* [lmstudio/remote-lmstudio](https://lmstudio.ai/lmstudio/remote-lmstudio) - - Basic support for using a remote LM Studio instance to generate text. - -* [lmstudio/openai-compat-endpoint](https://lmstudio.ai/lmstudio/openai-compat-endpoint) - - Use any OpenAI-compatible API in LM Studio. - - - - -Generators take in the the generator controller and the current conversation state, start the generation, and then report the generated text using the `ctl.fragmentGenerated` method. - -The following is an example of a simple generator that echos back the last user message with 200 ms delay between each word: - -```typescript title="src/toolsProvider.ts" -import { Chat, GeneratorController } from "@lmstudio/sdk"; - -export async function generate(ctl: GeneratorController, chat: Chat) { - // Just echo back the last message - const lastMessage = chat.at(-1).getText(); - // Split the last message into words - const words = lastMessage.split(/(?= )/); - for (const word of words) { - ctl.fragmentGenerated(word); // Send each word as a fragment - ctl.abortSignal.throwIfAborted(); // Allow for cancellation - await new Promise((resolve) => setTimeout(resolve, 200)); // Simulate some processing time - } -} -``` - -Custom Configurations [#custom-configurations] - -You can access custom configurations via `ctl.getPluginConfig` and `ctl.getGlobalPluginConfig`. See [Custom Configurations](./configurations) for more details. - -Handling Aborts [#handling-aborts] - -A prediction may be aborted by the user while your generator is still running. In such cases, you should handle the abort gracefully by handling the `ctl.abortSignal`. - -You can learn more about `AbortSignal` in the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal). - - - - -To enable tool use, it is slightly more involved. To see a comprehensive example that adapts OpenAI API, see the [openai-compat-endpoint plugin](https://lmstudio.ai/lmstudio/openai-compat-endpoint). - -You can read the definition of tools available using `ctl.getToolDefinitions()`. For example, if you are making an online model adapter, you need to pass the tool definition to the model. - -Once the model starts to make tool calls, you need to tell LM Studio about those calls. - -Use `ctl.toolCallGenerationStarted` to report the start of a tool call generation (i.e. the model starts to generate a tool call). - -Use `ctl.toolCallGenerationEnded` to report a successful generation of a tool call or use `ctl.toolCallGenerationFailed` to report a failed generation of a tool call. - -Optionally, you can also `ctl.toolCallGenerationNameReceived` to eagerly report the name of the tool being called once that is available. You can also use `ctl.toolCallGenerationArgumentFragmentGenerated` to report fragments of the tool call arguments as they are generated. These two methods are useful for providing better user experience, but are not strictly necessary. - -Overall, your generator must call these ctl methods in the following order: - -1. 0 - N calls to `ctl.fragmentGenerated` to report the generated non-tool-call text fragments. -2. For each tool call: - 1. Call `ctl.toolCallGenerationStarted` to indicate the start of a tool call generation. - 2. (Optionally) Call `ctl.toolCallGenerationNameReceived` to report the name of the tool being called. - 3. (Optionally) Call any times of `ctl.toolCallGenerationArgumentFragmentGenerated` to report the generated fragments of the tool call arguments. - 4. Call either `ctl.toolCallGenerationEnded` to report a successful generation of the tool call or `ctl.toolCallGenerationFailed` to report a failed generation of the tool call. - 5. If the model generates more text between/after the tool call, 0 - N calls to `ctl.fragmentGenerated` to report the generated non-tool-call text fragments. (This should not happen normally, but it is technically possible for some smaller models to do this. **Critically: this is not the same as model receiving the tool results and continuing the conversation. This is just model refusing to stop talking after made a tool request - the tool result is not available to the model yet.** When multi-round prediction happens, i.e. the model actually receives the tool call, your generator function will be called again with the updated conversation state.) - -Some API formats may report the tool name together with the beginning of the tool call generation, in which case you can call `ctl.toolCallGenerationNameReceived` immediately after `ctl.toolCallGenerationStarted`. - -Some API formats may not have incremental tool call updates (i.e. the entire tool call request is given at once), in which case you can just call `ctl.toolCallGenerationStarted` then immediately `ctl.toolCallGenerationEnded`. - - - - -To share publish your LM Studio plugin, open the plugin directory in a terminal and run: - -```bash -lms push -``` - -This command will package your plugin and upload it to the LM Studio Hub. You can use this command to create new plugins or update existing ones. - -Changing Plugin Names [#changing-plugin-names] - -If you wish to change the name of the plugin, you can do so by editing the `manifest.json` file in the root of your plugin directory. Look for the `name` field and update it to your desired plugin name. Note the `name` must be kebab-case. - -When you `lms push` the plugin, it will be treated as a new plugin if the name has changed. You can delete the old plugin from the LM Studio Hub if you no longer need it. - -Publishing Plugins to an Organization [#publishing-plugins-to-an-organization] - -If you are in an organization and wish to publish the plugin to the organization, you can do so by editing the `manifest.json` file in the root of your plugin directory. Look for the `owner` field and set it to the name of your organization. When you run `lms push`, the plugin will be published to the organization instead of your personal account. - -Private Plugins [#private-plugins] - -If your account supports private plugins, you can publish your plugins privately by using the `--private` flag when running `lms push`: - -```bash -lms push --private -``` - -Private artifact is in test. Get in touch if you are interested. - - - - -You can access the configuration using the method `ctl.getPluginConfig(configSchematics)` and `ctl.getGlobalConfig(globalConfigSchematics)` respectively. - -For example, here is how to access the config within the promptPreprocessor: - -```typescript title="src/promptPreprocessor.ts" -import { type PreprocessorController, type ChatMessage } from "@lmstudio/sdk"; -import { configSchematics } from "./config"; - -export async function preprocess(ctl: PreprocessorController, userMessage: ChatMessage) { - const pluginConfig = ctl.getPluginConfig(configSchematics); - const myCustomField = pluginConfig.get("myCustomField"); - - const globalPluginConfig = ctl.getGlobalPluginConfig(configSchematics); - const globalMyCustomField = globalPluginConfig.get("myCustomField"); - - return ( - `${userMessage.getText()},` + - `myCustomField: ${myCustomField}, ` + - `globalMyCustomField: ${globalMyCustomField}` - ); -} -``` - - - - -By default, the plugin scaffold will create a `config.ts` file in the `src/` directory which will contain the schematics of the configurations. If the files does not exist, you can create it manually: - -```typescript title="src/toolsProvider.ts" -import { createConfigSchematics } from "@lmstudio/sdk"; - -export const configSchematics = createConfigSchematics() - .field( - "myCustomField", // The key of the field. - "numeric", // Type of the field. - // Options for the field. Different field types will have different options. - { - displayName: "My Custom Field", - hint: "This is my custom field. Doesn't do anything special.", - slider: { min: 0, max: 100, step: 1 }, // Add a slider to the field. - }, - 80, // Default Value - ) - // You can add more fields by chaining the field method. - // For example: - // .field("anotherField", ...) - .build(); - -export const globalConfigSchematics = createConfigSchematics() - .field( - "myGlobalCustomField", // The key of the field. - "string", - { - displayName: "My Global Custom Field", - hint: "This is my global custom field. Doesn't do anything special.", - }, - "default value", // Default Value - ) - // You can add more fields by chaining the field method. - // For example: - // .field("anotherGlobalField", ...) - .build(); -``` - -If you've added your config schematics manual, you will also need to register the configurations in your plugin's `index.ts` file. - -This is done by calling `context.withConfigSchematics(configSchematics)` and `context.withGlobalConfigSchematics(globalConfigSchematics)` in the `main` function of your plugin. - -```typescript title="src/index.ts" -// ... other imports ... -import { toolsProvider } from "./toolsProvider"; - -export async function main(context: PluginContext) { - // ... other plugin setup code ... - - // Register the configuration schematics. - context.withConfigSchematics(configSchematics); - // Register the global configuration schematics. - context.withGlobalConfigSchematics(globalConfigSchematics); - - // ... other plugin setup code ... -} -``` - - - - -We support the following field types: - -* `string`: A text input field. - - ```typescript - // ... other fields ... - .field( - "stringField", // The key of the field. - "string", // Type of the field. - { - displayName: "A string field", - subtitle: "Subtitle", // Optional subtitle for the field. (Show below the field) - hint: "Hint", // Optional hint for the field. (Show on hover) - isParagraph: false, // Whether to show a large text input area for this field. - isProtected: false, // Whether the value should be obscured in the UI (e.g., for passwords). - placeholder: "Placeholder text", // Optional placeholder text for the field. - }, - "default value", // Default Value - ) - // ... other fields ... - ``` - -* `numeric`: A number input field with optional validation and slider UI. - - ```typescript - // ... other fields ... - .field( - "numberField", // The key of the field. - "numeric", // Type of the field. - { - displayName: "A number field", - subtitle: "Subtitle for", // Optional subtitle for the field. (Show below the field) - hint: "Hint for number field", // Optional hint for the field. (Show on hover) - int: false, // Whether the field should accept only integer values. - min: 0, // Minimum value for the field. - max: 100, // Maximum value for the field. - slider: { - // If present, configurations for the slider UI - min: 0, // Minimum value for the slider. - max: 100, // Maximum value for the slider. - step: 1, // Step value for the slider. - }, - }, - 42, // Default Value - ) - // ... other fields ... - ``` - -* `boolean`: A checkbox or toggle input field. - - ```typescript - // ... other fields ... - .field( - "booleanField", // The key of the field. - "boolean", // Type of the field. - { - displayName: "A boolean field", - subtitle: "Subtitle", // Optional subtitle for the field. (Show below the field) - hint: "Hint", // Optional hint for the field. (Show on hover) - }, - true, // Default Value - ) - // ... other fields ... - ``` - -* `stringArray`: An array of string values with configurable constraints. - - ```typescript - // ... other fields ... - .field( - "stringArrayField", - "stringArray", - { - displayName: "A string array field", - subtitle: "Subtitle", // Optional subtitle for the field. (Show below the field) - hint: "Hint", // Optional hint for the field. (Show on hover) - allowEmptyStrings: true, // Whether to allow empty strings in the array. - maxNumItems: 5, // Maximum number of items in the array. - }, - ["default", "values"], // Default Value - ) - // ... other fields ... - ``` - -* `select`: A dropdown selection field with predefined options. - - ```typescript - // ... other fields ... - .field( - "selectField", - "select", - { - displayName: "A select field", - options: [ - { value: "option1", displayName: "Option 1" }, - { value: "option2", displayName: "Option 2" }, - { value: "option3", displayName: "Option 3" }, - ], - subtitle: "Subtitle", // Optional subtitle for the field. (Show below the field) - hint: "Hint", // Optional hint for the field. (Show on hover) - }, - "option1", // Default Value - ) - // ... other fields ... - ``` - - - - -LM Studio plugins support custom configurations. That is, you can define a configuration schema and LM Studio will present a UI to the user so they can configure your plugin without having to edit any code. - -There are two types of configurations: - -* **Per-chat configuration**: tied to a specific chat. Different chats can have different configurations. Most configurations that affects the behavior of the plugin should be of this type. -* **Global configuration**: apply to *all* chats and are shared across the application. This is useful for global settings such as API keys. - -Types of Configurations [#types-of-configurations] - -You can define configurations in TypeScript using the `createConfigSchematics` function from the `@lmstudio/sdk` package. This function allows you to define fields with various types and options. - -Supported types include: - -* `string`: A text input field. -* `numeric`: A number input field with optional validation and slider UI. -* `boolean`: A checkbox or toggle input field. -* `stringArray`: An array of string values with configurable constraints. -* `select`: A dropdown selection field with predefined options. - -See the [Defining New Fields](./custom-configuration/defining-new-fields) section for more details on how to define these fields. - -Examples [#examples] - -The following are some plugins that make use of custom configurations - -* [lmstudio/wikipedia](https://lmstudio.ai/lmstudio/wikipedia) - - Gives the LLM tools to search and read Wikipedia articles. - -* [lmstudio/openai-compat-endpoint](https://lmstudio.ai/lmstudio/openai-compat-endpoint) - - Use any OpenAI-compatible API in LM Studio. diff --git a/webllms/docs/cli/local-models/load/Model.gguf b/webllms/docs/cli/local-models/load/Model.gguf new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/webllms/docs/cli/local-models/load/Model.gguf @@ -0,0 +1 @@ + From 3b929074d8f8d1cfc21c2947ef369fc694a36a9e Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 10 May 2026 19:38:21 +0100 Subject: [PATCH 29/30] Create README.md --- webllms/docs/README.md | 14514 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 14514 insertions(+) create mode 100644 webllms/docs/README.md diff --git a/webllms/docs/README.md b/webllms/docs/README.md new file mode 100644 index 0000000..8b124d8 --- /dev/null +++ b/webllms/docs/README.md @@ -0,0 +1,14514 @@ +*** +LMLM Studio 0.4.1 [#lmlm-studio-041] +Anthropic-compatible API [#anthropic-compatible-api] +* New Anthropic-compatible endpoint: `POST /v1/messages`. + * Use Claude code models with LM Studio + * See docs for more details: [/docs/developer/anthropic-compat](/docs/developer/anthropic-compat). + +***LM Studio 0.4.0 [#lm-studio-040] +LM Studio native v1 REST API [#lm-studio-native-v1-rest-api] +* Official release of LM Studio's native v1 REST API at `/api/v1/*` endpoints. + * [MCP via API](/docs/developer/core/mcp) + * [Stateful chats](/docs/developer/rest/stateful-chats) + * [Authentication](/docs/developer/core/authentication) configuration with API tokens + * Model [download](/docs/developer/rest/download), [load](/docs/developer/rest/load) and [unload](/docs/developer/rest/unload) endpoints + * See [overview](/docs/developer/rest) page for more details and [comparison](/docs/developer/rest#inference-endpoint-comparison) with OpenAI-compatible endpoints.*** + +LM Studio 0.3.29 • 2025‑10‑06 [#lm-studio-0329-20251006] + +OpenAI `/v1/responses` and variant listing [#openai-v1responses-and-variant-listing] + +* New OpenAI‑compatible endpoint: `POST /v1/responses`. + * Stateful interactions via `previous_response_id`. + * Custom tool calling and Remote MCP support (opt‑in). + * Reasoning support with `reasoning.effort` for `openai/gpt‑oss‑20b`. + * Streaming via SSE when `stream: true`. +* CLI: `lms ls --variants` lists all variants for multi‑variant models. +* Docs: [/docs/developer/openai-compat](/docs/developer/openai-compat). Full release notes: [/blog/lmstudio-v0.3.29](/blog/lmstudio-v0.3.29). + +*** + +LM Studio 0.3.27 • 2025‑09‑24 [#lm-studio-0327-20250924] + +CLI: model resource estimates, status, and interrupts [#cli-model-resource-estimates-status-and-interrupts] + +* New: `lms load --estimate-only ` prints estimated GPU and total memory before loading. Honors `--context-length` and `--gpu`, and uses an improved estimator that now accounts for flash attention and vision models. +* `lms chat`: press `Ctrl+C` to interrupt an ongoing prediction. +* `lms ps --json` now reports each model's generation status and the number of queued prediction requests. +* CLI color contrast improved for light mode. +* See docs: [/docs/cli/local-models/load](/docs/cli/local-models/load). Full release notes: [/blog/lmstudio-v0.3.27](/blog/lmstudio-v0.3.27). + +*** + +LM Studio 0.3.26 • 2025‑09‑15 [#lm-studio-0326-20250915] + +CLI log streaming: server + model [#cli-log-streaming-server--model] + +* `lms log stream` now supports multiple sources and filters. + * `--source server` streams HTTP server logs (startup, endpoints, status) + * `--source model --filter input,output` streams formatted user input and model output + * Append `--json` for machine‑readable logs; `--stats` adds tokens/sec and related metrics (model source) +* See usage and examples: [/docs/cli/serve/log-stream](/docs/cli/serve/log-stream). Full release notes: [/blog/lmstudio-v0.3.26](/blog/lmstudio-v0.3.26). + +*** + +LM Studio 0.3.25 • 2025‑09‑04 [#lm-studio-0325-20250904] + +New model support (API) [#new-model-support-api] + +* Added support for NVIDIA Nemotron‑Nano‑v2 with tool‑calling via the OpenAI‑compatible endpoints [‡](/blog/lmstudio-v0.3.25). +* Added support for Google EmbeddingGemma for the `/v1/embeddings` endpoint [‡](/blog/lmstudio-v0.3.25). + +*** + +LM Studio 0.3.24 • 2025‑08‑28 [#lm-studio-0324-20250828] + +Seed‑OSS tool‑calling and template fixes [#seedoss-toolcalling-and-template-fixes] + +* Added support for ByteDance/Seed‑OSS including tool‑calling and prompt‑template compatibility fixes in the OpenAI‑compatible API [‡](/blog/lmstudio-v0.3.24). +* Fixed cases where tool calls were not parsed for certain prompt templates [‡](/blog/lmstudio-v0.3.24). + +*** + +LM Studio 0.3.23 • 2025‑08‑12 [#lm-studio-0323-20250812] + +Reasoning content and tool‑calling reliability [#reasoning-content-and-toolcalling-reliability] + +* For `gpt‑oss` on `POST /v1/chat/completions`, reasoning content moves out of `message.content` and into `choices.message.reasoning` (non‑streaming) and `choices.delta.reasoning` (streaming), aligning with `o3‑mini` [‡](/blog/lmstudio-v0.3.23). +* Tool names are normalized (e.g., snake\_case) before being provided to the model to improve tool‑calling reliability [‡](/blog/lmstudio-v0.3.23). +* Fixed errors for certain tools‑containing requests to `POST /v1/chat/completions` (e.g., "reading 'properties'") and non‑streaming tool‑call failures [‡](/blog/lmstudio-v0.3.23). + +*** + +LM Studio 0.3.19 • 2025‑07‑21 [#lm-studio-0319-20250721] + +Bug fixes for streaming and tool calls [#bug-fixes-for-streaming-and-tool-calls] + +* Corrected usage statistics returned by OpenAI‑compatible streaming responses [‡](https://lmstudio.ai/blog/lmstudio-v0.3.19#:~:text=,OpenAI%20streaming%20responses%20were%20incorrect). +* Improved handling of parallel tool calls via the streaming API [‡](https://lmstudio.ai/blog/lmstudio-v0.3.19#:~:text=,API%20were%20not%20handled%20correctly). +* Fixed parsing of correct tool calls for certain Mistral models [‡](https://lmstudio.ai/blog/lmstudio-v0.3.19#:~:text=,Ryzen%20AI%20PRO%20300%20series). + +*** + +LM Studio 0.3.18 • 2025‑07‑10 [#lm-studio-0318-20250710] + +Streaming options and tool‑calling improvements [#streaming-options-and-toolcalling-improvements] + +* Added support for the `stream_options` object on OpenAI‑compatible endpoints. Setting `stream_options.include_usage` to `true` returns prompt and completion token usage during streaming [‡](https://lmstudio.ai/blog/lmstudio-v0.3.18#:~:text=%2A%20Added%20support%20for%20%60,to%20support%20more%20prompt%20templates). +* Errors returned from streaming endpoints now follow the correct format expected by OpenAI clients [‡](https://lmstudio.ai/blog/lmstudio-v0.3.18#:~:text=,with%20proper%20chat%20templates). +* Tool‑calling support added for Mistral v13 tokenizer models, using proper chat templates [‡](https://lmstudio.ai/blog/lmstudio-v0.3.18#:~:text=,with%20proper%20chat%20templates). +* The `response_format.type` field now accepts `"text"` in chat‑completion requests [‡](https://lmstudio.ai/blog/lmstudio-v0.3.18#:~:text=,that%20are%20split%20across%20multiple). +* Fixed bugs where parallel tool calls split across multiple chunks were dropped and where root‑level `$defs` in tool definitions were stripped [‡](https://lmstudio.ai/blog/lmstudio-v0.3.18#:~:text=,being%20stripped%20in%20tool%20definitions). + +*** + +LM Studio 0.3.17 • 2025‑06‑25 [#lm-studio-0317-20250625] + +Tool‑calling reliability and token‑count updates [#toolcalling-reliability-and-tokencount-updates] + +* Token counts now include the system prompt and tool definitions [‡](https://lmstudio.ai/blog/lmstudio-v0.3.17#:~:text=,have%20a%20URL%20in%20the). This makes usage reporting more accurate for both the UI and the API. +* Tool‑call argument tokens are streamed as they are generated [‡](https://lmstudio.ai/blog/lmstudio-v0.3.17#:~:text=Build%206), improving responsiveness when using streamed function calls. +* Various fixes improve MCP and tool‑calling reliability, including correct handling of tools that omit a `parameters` object and preventing hangs when an MCP server reloads [‡](https://lmstudio.ai/blog/lmstudio-v0.3.17#:~:text=,tool%20calls%20would%20hang%20indefinitely). + +** + +LM Studio 0.3.16 • 2025‑05‑23 [#lm-studio-0316-20250523] + +Model capabilities in `GET /models` [#model-capabilities-in-getmodels] + +* The OpenAI‑compatible REST API (`/api/v0`) now returns a `capabilities` array in the `GET /models` response. Each model lists its supported capabilities (e.g. `"tool_use"`) [‡](https://lmstudio.ai/blog/lmstudio-v0.3.16#:~:text=,response) so clients can programmatically discover tool‑enabled models. +* Fixed a streaming bug where an empty function name string was appended after the first packet of streamed tool calls [‡](https://lmstudio.ai/blog/lmstudio-v0.3.16#:~:text=%2A%20Bugfix%3A%20%5BOpenAI,packet%20of%20streamed%20function%20calls). + +** + +👾 LM Studio 0.3.15 • 2025-04-24 [#-lm-studio-0315--2025-04-24] + +Release post: [LM Studio 0.3.15](/blog/lmstudio-v0.3.15) + +Improved Tool Use API Support [#improved-tool-use-api-support] + +OpenAI-like REST API now supports the `tool_choice` parameter: + +```jsonl +{ + "tool_choice": "auto" // or "none", "required" +} +``` + +* `"tool_choice": "none"` — Model will not call tools +* `"tool_choice": "auto"` — Model decides +* `"tool_choice": "required"` — Model must call tools (llama.cpp only) + +Chunked responses now set `"finish_reason": "tool_calls"` when appropriate. + +*** + +👾 LM Studio 0.3.14 • 2025-03-27 [#-lm-studio-0314--2025-03-27] + +Release post: [LM Studio 0.3.14](/blog/lmstudio-v0.3.14) + +\[API/SDK] Preset Support [#apisdk-preset-support] + +RESTful API and SDKs support specifying presets in requests. + +*(example needed)* + +👾 LM Studio 0.3.10 • 2025-02-18 [#-lm-studio-0310--2025-02-18] + +Release post: [LM Studio 0.3.10](/blog/lmstudio-v0.3.10) + +Speculative Decoding API [#speculative-decoding-api] + +Enable speculative decoding in API requests with `"draft_model"`: + +```json +{ + + + "model": "LMLMmodels", + "draft_model": "@lmlm", + "messages": [ ... ] + "model": "deepseek-r1-distill-qwen-7b", + "draft_model": "deepseek-r1-distill-qwen-0.5b", + "messages": [ ... ] + "model": "qwicklmlm", + "draft_model": "qwicklmkn", + "messages": [ ... ] + "model": "webllms", + "draft_model": "webllms", + "messages": [ ... ] + "model": "reallms", + "draft_model": "reallms", + "messages": [ ... ] + "model": "hybridai + "draft_model": "hybridai", + "messages": [ ... ] + "model": "aura + "draft_model": "aura", + "messages": [ ... ] + "model": "web4ai", + "draft_model": "web4ai", + "messages": [ ... ] + "model": "Brain", + "draft_model": "Brain", + "messages": [ ... ] +} + +``` + +Responses now include a `stats` object for speculative decoding: + +```jsonl +"stats": { + "tokens_per_second": ..., + "draft_model": "...", + "total_draft_tokens_count": ..., + "accepted_draft_tokens_count": ..., + "rejected_draft_tokens_count": ..., + "ignored_draft_tokens_count": ... +} +``` + +*** + +👾 LM Studio 0.3.9 • 2025-01-30 [#-lm-studio-039--2025-01-30] + +Release post: [LM Studio 0.3.9](blog/lmstudio-v0.3.9) + +Idle TTL and Auto Evict [#idle-ttl-and-auto-evict] + +Set a TTL (in seconds) for models loaded via API requests (docs article: [Idle TTL and Auto-Evict](/docs/developer/core/ttl-and-auto-evict)) + +```diff +curl http://localhost:1234/api/v0/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "deepseek-r1-distill-qwen-7b", + "messages": [ ... ] ++ "ttl": 300, +}' +``` + +With `lms`: + +``` +lms load --ttl +``` + +Separate `reasoning_content` in Chat Completion responses [#separate-reasoning_content-in-chat-completion-responses] + +For DeepSeek R1 models, get reasoning content in a separate field. See more [here](/blog/lmstudio-v0.3.9#separate-reasoningcontent-in-chat-completion-responses). + +Turn this on in App Settings > Developer. + +*** + +👾 LM Studio 0.3.6 • 2025-01-06 [#-lm-studio-036--2025-01-06] + +Release post: [LM Studio 0.3.6](blog/lmstudio-v0.3.6) + +Tool and Function Calling API [#tool-and-function-calling-api] + +Use any LLM that supports Tool Use and Function Calling through the OpenAI-like API. + +Docs: [Tool Use and Function Calling](/docs/developer/core/tools). + +*** + +👾 LM Studio 0.3.5 • 2024-10-22 [#-lm-studio-035--2024-10-22] + +Release post: [LM Studio 0.3.5](blog/lmstudio-v0.3.5) + +Introducing `lms get`: download models from the terminal [#introducing-lms-get-download-models-from-the-terminal] + +You can now download models directly from the terminal using a keyword + +```bash +lms get deepseek-r1 +``` + +or a full Hugging Face URL + +```bash +lms get +``` + +To filter for MLX models only, add `--mlx` to the command. + +```bash +lms get deepseek-r1 --mlx +``` + + + + + + +Get to know the stack [#get-to-know-the-stack] + + + + + + + + + + + + + + + +What you can build [#what-you-can-build] + + + + + + + + + + + + + +Install `llmster` for headless deployments [#install-llmster-for-headless-deployments] + +`llmster` is LM Studio's core, packaged as a daemon for headless deployment on servers, cloud instances, or CI. The daemon runs standalone, and it is not dependent on the LM Studio GUI. + +**Mac / Linux** + +```bash +curl -fsSL https://lmstudio.ai/install.sh | bash +``` + +**Windows** + +```powershell +irm https://lmstudio.ai/install.ps1 | iex +``` + +**Basic usage** + +```bash +lms daemon up # Start the daemon +lms get # Download a model +lms server start # Start the local server +lms chat # Open an interactive session +``` + +Learn more: [Headless deployments](/blog/0.4.0#deploy-on-servers-deploy-in-ci-deploy-anywhere) + +Super quick start [#super-quick-start] + +TypeScript (`lmstudio-js`) [#typescript-lmstudio-js] + +```bash +npm install @lmstudio/sdk +``` + +```ts +import { LMStudioClient } from "@lmstudio/sdk"; + +const client = new LMStudioClient(); +const model = await client.llm.model("openai/gpt-oss-20b"); +const result = await model.respond("Who are you, and what can you do?"); + +console.info(result.content); +``` + +Full docs: [lmstudio-js](/docs/typescript), Source: [GitHub](https://github.com/lmstudio-ai/lmstudio-js) + +Python (`lmstudio-python`) [#python-lmstudio-python] + +```bash +pip install lmstudio +``` + +```python +import lmstudio as lms + +with lms.Client() as client: + model = client.llm.model("openai/gpt-oss-20b") + result = model.respond("Who are you, and what can you do?") + print(result) +``` + +Full docs: [lmstudio-python](/docs/python), Source: [GitHub](https://github.com/lmstudio-ai/lmstudio-python) + +HTTP (LM Studio REST API) [#http-lm-studio-rest-api] + +```bash +lms server start --port 1234 +``` + +```bash +curl http://localhost:1234/api/v1/chat \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -d '{ + "model": "openai/gpt-oss-20b", + "input": "Who are you, and what can you do?" + }' +``` + +Full docs: [LM Studio REST API](/docs/developer/rest) + +Helpful links [#helpful-links] + +* [API Changelog](/docs/developer/api-changelog) +* [Local server basics](/docs/developer/core/server) +* [CLI reference](/docs/cli) +* [Discord Community](https://discord.gg/lmstudio) + + + + +`lmstudio-python` provides you a set APIs to interact with LLMs, embeddings models, and agentic flows. + +Installing the SDK [#installing-the-sdk] + +`lmstudio-python` is available as a PyPI package. You can install it using pip. + +```bash +pip install lmstudio +``` + +For the source code and open source contribution, visit [lmstudio-python](https://github.com/lmstudio-ai/lmstudio-python) on GitHub. + +Features [#features] + +* Use LLMs to [respond in chats](./python/llm-prediction/chat-completion) or predict [text completions](./python/llm-prediction/completion) +* Define functions as tools, and turn LLMs into [autonomous agents](./python/agent) that run completely locally +* [Load](./python/manage-models/loading), [configure](./python/llm-prediction/parameters), and [unload](./python/manage-models/loading) models from memory +* Generate embeddings for text, and more! + +Quick Example: Chat with a Llama Model [#quick-example-chat-with-a-llama-model] + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + model = lms.llm("qwen/qwen3-4b-2507") + result = model.respond("What is the meaning of life?") + + print(result) + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model("qwen/qwen3-4b-2507") + result = model.respond("What is the meaning of life?") + + print(result) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model("qwen/qwen3-4b-2507") + result = await model.respond("What is the meaning of life?") + + print(result) + ``` + + + +Getting Local Models [#getting-local-models] + +The above code requires the [qwen3-4b-2507](https://lmstudio.ai/models/qwen/qwen3-4b-2507) model. +If you don't have the model, run the following command in the terminal to download it. + +```bash +lms get qwen/qwen3-4b-2507 +``` + +Read more about `lms get` in LM Studio's CLI [here](./cli/get). + +Interactive Convenience, Deterministic Resource Management, or Structured Concurrency? [#interactive-convenience-deterministic-resource-management-or-structured-concurrency] + +As shown in the example above, there are three distinct approaches for working +with the LM Studio Python SDK. + +The first is the interactive convenience API (listed as "Python (convenience API)" +in examples), which focuses on the use of a default LM Studio client instance for +convenient interactions at a synchronous Python prompt, or when using Jupyter notebooks. + +The second is a synchronous scoped resource API (listed as "Python (scoped resource API)" +in examples), which uses context managers to ensure that allocated resources +(such as network connections) are released deterministically, rather than +potentially remaining open until the entire process is terminated. + +The last is an asynchronous structured concurrency API (listed as "Python (asynchronous API)" in +examples), which is designed for use in asynchronous programs that follow the design principles of +["structured concurrency"](https://vorpus.org/blog/notes-on-structured-concurrency-or-go-statement-considered-harmful/) +in order to ensure the background tasks handling the SDK's connections to the API server host +are managed correctly. Asynchronous applications which do not adhere to those design principles +will need to rely on threaded access to the synchronous scoped resource API rather than attempting +to use the SDK's native asynchronous API. Python SDK version 1.5.0 is the first version to fully +support the asynchronous API. + +Some examples are common between the interactive convenience API and the synchronous scoped +resource API. These examples are listed as "Python (synchronous API)". + +Timeouts in the synchronous API [#timeouts-in-the-synchronous-api] + +*Required Python SDK version*: **1.5.0** + +Starting in Python SDK version 1.5.0, the synchronous API defaults to timing out after 60 seconds +with no activity when waiting for a response or streaming event notification from the API server. + +The number of seconds to wait for responses and event notifications can be adjusted using the +`lmstudio.set_sync_api_timeout()` function. Setting the timeout to `None` disables the timeout +entirely (restoring the behaviour of previous SDK versions). + +The current synchronous API timeout can be queried using the `lmstudio.get_sync_api_timeout()` +function. + +Timeouts in the asynchronous API [#timeouts-in-the-asynchronous-api] + +*Required Python SDK version*: **1.5.0** + +As asynchronous coroutines support cancellation, there is no specific timeout support implemented +in the asynchronous API. Instead, general purpose async timeout mechanisms, such as +[`asyncio.wait_for()`](https://docs.python.org/3/library/asyncio-task.html#asyncio.wait_for) or +[`anyio.move_on_after()`](https://anyio.readthedocs.io/en/stable/cancellation.html#timeouts), +should be used. + + + + +The `lms` CLI is open source on GitHub: [https://github.com/lmstudio-ai/lms](https://github.com/lmstudio-ai/lms) + +If you spot a bug, want to request a feature, or plan to contribute: + +* File issues or feature requests in the GitHub repository. +* Open pull requests against the `main` branch with a concise summary and testing notes. +* Review the repository README for setup instructions and coding standards. + + + + +Install `lms` [#install-lms] + +`lms` ships with LM Studio, so you don't need to do any additional installation steps if you have LM Studio installed. + +Just open a terminal window and run `lms`: + +```shell +lms --help +``` + +Open source [#open-source] + +`lms` is **MIT Licensed** and is developed in this repository on GitHub: [https://github.com/lmstudio-ai/lms](https://github.com/lmstudio-ai/lms) + +Command quick links [#command-quick-links] + +| Command | Syntax | Docs | +| ----------------------------- | ------------------ | ------------------------------------- | +| Chat in the terminal | `lms chat` | [Guide](/docs/cli/local-models/chat) | +| Download models | `lms get` | [Guide](/docs/cli/local-models/get) | +| List your models | `lms ls` | [Guide](/docs/cli/local-models/ls) | +| See models loaded into memory | `lms ps` | [Guide](/docs/cli/local-models/ps) | +| Control the server | `lms server start` | [Guide](/docs/cli/serve/server-start) | +| Manage the inference runtime | `lms runtime` | [Guide](/docs/cli/runtime) | +| Manage the headless daemon | `lms daemon` | [Guide](/docs/cli/daemon/daemon-up) | +| Manage LM Link | `lms link` | [Guide](/docs/cli/link/link-enable) | + +Verify the installation [#verify-the-installation] + + + 👉 You need to run LM Studio *at least once* before you can use `lms`. + + +Open a terminal window and run `lms`. + +```bash title="Terminal" +$ lms +``` +lms is LM Studio's CLI utility for your models, server, and inference runtime. (v0.0.47) + +Usage: lms [options] [command] + +Local models + chat Start an interactive chat with a model + get Search and download models + load Load a model + unload Unload a model + ls List the models available on disk + ps List the models currently loaded in memory + import Import a model file into LM Studio + +Serve + server Commands for managing the local server + log Log incoming and outgoing messages + +Runtime + runtime Manage and update the inference runtime + +Develop & Publish (Beta) + clone Clone an artifact from LM Studio Hub to a local folder + push Uploads the artifact in the current folder to LM Studio Hub + dev Starts a plugin dev server in the current folder + login Authenticate with LM Studio + +Learn more: https://lmstudio.ai/docs/developer +Join our Discord: https://discord.gg/lmstudio +``` +``` +Use `lms` to automate and debug your workflows [#use-lms-to-automate-and-debug-your-workflows] + +Start and stop the local server [#start-and-stop-the-local-server] + +```bash +lms server start +lms server stop +``` + +Learn more about [`lms server`](/docs/cli/serve/server-start). + +List the local models on the machine [#list-the-local-models-on-the-machine] + +```bash +lms ls +``` + +Learn more about [`lms ls`](/docs/cli/local-models/ls). + +This will reflect the current LM Studio models directory, which you set in **📂 My Models** tab in the app. + +List the currently loaded models [#list-the-currently-loaded-models] + +```bash +lms ps +``` + +Learn more about [`lms ps`](/docs/cli/local-models/ps). + +Load a model (with options) [#load-a-model-with-options] + +```bash +lms load [--gpu=max|auto|0.0-1.0] [--context-length=1-N] +``` + +`--gpu=1.0` means 'attempt to offload 100% of the computation to the GPU'. + +* Optionally, assign an identifier to your local LLM: + +```bash +lms load openai/gpt-oss-20b --identifier="my-model-name" +``` + +This is useful if you want to keep the model identifier consistent. + +Unload a model [#unload-a-model] + +``` +lms unload [--all] +``` + +Learn more about [`lms load and unload`](/docs/cli/local-models/load). + + + + + + +Claude Code can talk to LM Studio via the Anthropic-compatible `POST /v1/messages` endpoint. +See: [Anthropic-compatible Messages endpoint](/docs/developer/anthropic-compat/messages). + + + + + Have a powerful LLM rig? Use [LM Link](/docs/integrations/lmlink) to run Claude Code from your laptop while the model runs on your rig. + + +Setup [#setup] + + + +

+ Start LM Studio's local server +

+ + Make sure LM Studio is running as a server (default port `1234`). + + You can start it from the app, or from the terminal with `lms`: + + ```bash + lms server start --port 1234 + ``` +
+ + +

+ Configure Claude Code +

+ + Set these environment variables so the `claude` CLI points to your local LM Studio: + + ```bash + export ANTHROPIC_BASE_URL=http://localhost:1234 + export ANTHROPIC_AUTH_TOKEN=lmstudio + ``` + + Notes: + + * If Require Authentication is enabled, set `ANTHROPIC_AUTH_TOKEN` to your LM Studio API token. To learn more, see: [Authentication](/docs/developer/core/authentication). +
+ + +

+ Run Claude Code against a local model +

+ + ```bash + claude --model openai/gpt-oss-20b + ``` + + Use a model (and server/model settings) with more than \~25k context length. Tools like Claude Code can consume a lot of context. + +
+ + +

+ If Require Authentication is enabled, use your LM Studio API token +

+ + + If you turned on "Require Authentication" in LM Studio, create an API token and set: + + ```bash + export LM_API_TOKEN= + export ANTHROPIC_AUTH_TOKEN=$LM_API_TOKEN + ``` + + When Require Authentication is enabled, LM Studio accepts both `x-api-key` and `Authorization: Bearer `. +
+
+ +If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) + + + + + + +Codex can talk to LM Studio via the OpenAI-compatible `POST /v1/responses` endpoint. +See: [OpenAI-compatible Responses endpoint](/docs/developer/openai-compat/responses). + + + + + Have a powerful LLM rig? Use [LM Link](/docs/integrations/lmlink) to run Codex from your laptop while the model runs on your rig. + + +Setup [#setup] + + + +

+ Start LM Studio's local server +

+ + Make sure LM Studio is running as a server (default port `1234`). + + You can start it from the app, or from the terminal with `lms`: + + ```bash + lms server start --port 1234 + ``` +
+ + +

+ Run Codex against a local model +

+ + Run Codex as you normally would, but with the `--oss` flag to point it to LM Studio. + + Example: + + ```bash + codex --oss + ``` + + By default, Codex will download and use [openai/gpt-oss-20b](https://lmstudio.ai/models/openai/gpt-oss-20b). + + + Use a model (and server/model settings) with more than \~25k context length. Tools like Codex can consume a lot of context. + + + You can also use any other model you have available in LM Studio. For example: + + ```bash + codex --oss -m ibm/granite-4-micro + ``` +
+
+ +If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) + + + + + + +Hermes Agent now supports LM Studio as a first class model provider. It comes with JIT loading with higher context length (64K) and reasoning effort support. + +See: [Hermes Agent Docs](https://hermes-agent.nousresearch.com/docs/integrations/providers#lm-studio--desktop-app-with-local-models). + + + + + Have a powerful LLM rig? Use [LM Link](/docs/integrations/lmlink) to run Hermes Agent from your laptop while the model runs on your rig. + + +Setup [#setup] + + + +

+ Start LM Studio's local server +

+ + Make sure LM Studio is running as a server (default port `1234`). + + You can start it from the app, or from the terminal with `lms`: + + ```bash + lms server start --port 1234 + ``` +
+ + +

+ Run Hermes Agent with LM Studio as model provider +

+ + Run your hermes setup with the following command: + + ```bash + hermes setup + ``` + + or if you have hermes setup already, run + + ```bash + hermes model + ``` + + and complete the interactive setup with LM Studio as your model provider. + + + + ```bash + hermes config set model.provider lmstudio + hermes config set model.base_url http://localhost:1234/v1 + hermes config set model.default your-model-name + hermes config set LM_API_KEY your-key + ``` + + + + + Use a model with more than \~64k context length. Tools like Hermes Agent can consume a lot of context and have better experience with longer context. + +
+
+ +If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) + + + + +Use LM Studio as a seamless, drop-in local backend for your favorite tools. + +Whether you are using an IDE extension or a custom automation script, simply point your base URL to `http://localhost:1234` to power your workflows with LM Studio and maintain complete control over your data privacy. + +We provide guides below for popular tools and are constantly expanding this list to include new integrations. + +Available Integrations [#available-integrations] + +* [Claude Code](/docs/integrations/claude-code) +* [Codex](/docs/integrations/codex) +* [Hermes Agent](/docs/integrations/hermes) +* [OpenClaw](/docs/integrations/openclaw) + + + + +With [LM Link](/docs/lmlink), your coding tools can run models on a remote device (like a dedicated LLM rig on your network) while you work from your laptop + + + +Use your integration as normal [#use-your-integration-as-normal] + +Start LM Studio's server on your local machine and configure your tool to point to it. Model loads are routed to the device the model is loaded on or the preferred device if set. + +Your local machine handles the API surface at `localhost:1234`, while the model runs on the device the model is present on. + +```bash +lms server start --port 1234 +``` + +Claude Code [#claude-code] + +```bash +export ANTHROPIC_BASE_URL=http://127.0.0.1:5000 +export ANTHROPIC_AUTH_TOKEN=lmstudio +claude --model qwen3-8b +``` + +See the full [Claude Code](/docs/integrations/claude-code) guide. + +Codex [#codex] + +```bash +codex --oss -m qwen3-8b +``` + +See the full [Codex](/docs/integrations/codex) guide. + +Set a preferred device [#set-a-preferred-device] + +To use a model on a specific remote device, set the device as the preferred device. + +See [set a preferred device](/docs/lmlink/basics/preferred-device) for more details. + +If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) + + + + + + +OpenClaw now supports LM Studio as a native model provider. +See: [OpenClaw Docs](https://docs.openclaw.ai/providers/lmstudio). + + + + + Have a powerful LLM rig? Use [LM Link](/docs/integrations/lmlink) to run OpenClaw from your laptop while the model runs on your rig. + + +Setup [#setup] + + + +

+ Start LM Studio's local server +

+ + Make sure LM Studio is running as a server (default port `1234`). + + You can start it from the app, or from the terminal with `lms`: + + ```bash + lms server start --port 1234 + ``` +
+ + +

+ Run OpenClaw with LM Studio as model provider +

+ Install OpenClaw as normal or run the OpenClaw onboard command as follows *(recommended)* + +```bash + openclaw onboard +``` + and complete the interactive setup with LM Studio as your model provider + + You can do the onboarding in non-interactive way by using the following command: + ```bash + openclaw onboard \ + --non-interactive \ + --accept-risk \ + --auth-choice lmstudio \ + --custom-base-url http://localhost:1234/v1 \ + --lmstudio-api-key "$LM_API_TOKEN" \ + --custom-model-id qwen/qwen3.5-9b + ``` + + + Use a model (and server/model settings) with more than \~50k context length. Tools like OpenClaw can consume a lot of context. + +
+ + +

+ Set up LM Studio as default memory search provider +

+ + To use LM Studio as the embedding model provider for memory search, run the following command and restart openclaw gateway + + ```bash + openclaw config set agents.defaults.memorySearch.provider lmstudio + openclaw gateway restart + ``` +
+
+ +If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) + + + + + + +LM Link is a new feature in LM Studio that provides a way to access local models across devices, wherever you are. Links are custom made, end-to-end encrypted networks intended for loading and serving LLMs across devices you own, made possible in partnership with Tailscale. + +What can I do with LM Link? [#what-can-i-do-with-lm-link] + +LM Link unlocks the full potential of your hardware by sharing compute across connected devices. For example, you might have a powerful desktop in your home office, and a lightweight laptop you carry on the go. With LM Link, you can run large open-weight models on a powerful machine, and use them seamlessly from your laptop as if they were local. All communication and data transfer between devices is always end-to-end encrypted, thanks to Tailscale. + +Use Cases [#use-cases] + +LM Link use cases span individuals as well as teams. + +You can manage a private link to keep your prized gaming GPU busy even when you're on the go. Moreover, LM Link allows you to set up LLM serving in a server and start using it with just few clicks. + +Use LM Link with [#use-lm-link-with] + +* **CLI** — manage LM Link from the terminal with [`lms link`](/docs/cli/link/link-enable) +* **REST API** — use remote models via the REST API with [LM Link](/docs/developer/core/lmlink) +* **Integrations** — use remote models with coding tools like Claude Code and Codex via [LM Link](/docs/integrations/lmlink) + + + + +Requires LM Studio 0.4.0 or newer. [#requires-lm-studio-040-or-newer] + +LM Studio supports API Tokens for authentication, providing a secure and convenient way to access the LM Studio API. + +By default, the LM Studio API runs **without enforcing authentication**. For production or shared environments, enable API Token authentication for secure access. + + + To enable API Token authentication, create tokens and control granular permissions, check [this guide](/docs/developer/core/authentication) for more details. + + +Providing the API Token [#providing-the-api-token] + +There are two ways to provide the API Token when creating an instance of `LMStudioClient`: + +1. **Environment Variable (Recommended)**: Set the `LM_API_TOKEN` environment variable, and the SDK will automatically read it. +2. **Function Argument**: Pass the token directly as the `apiToken` parameter in the constructor. + + + + + Environment Variable + + + + Function Argument + + + + + ```typescript + // Set environment variables in your terminal before running the code: + // export LM_API_TOKEN="your-token-here" + + import { LMStudioClient } from "@lmstudio/sdk"; + // The SDK automatically reads from LM_API_TOKEN environment variable + const client = new LMStudioClient(); + + const model = await client.llm.model("qwen/qwen3-4b-2507"); + const result = await model.respond("What is the meaning of life?"); + + console.info(result.content); + ``` + + + + ```typescript + import { LMStudioClient } from "@lmstudio/sdk"; + const client = new LMStudioClient({ + apiToken: "your-token-here", + }); + + const model = await client.llm.model("qwen/qwen3-4b-2507"); + const result = await model.respond("What is the meaning of life?"); + + console.info(result.content); + ``` + + + + + + +The SDK provides you a set of programmatic tools to interact with LLMs, embeddings models, and agentic flows. + +Installing the SDK [#installing-the-sdk] + +`lmstudio-js` is available as an npm package. You can install it using npm, yarn, or pnpm. + + + + npm + + + yarn + + + pnpm + + + +```bash + npm install @lmstudio/sdk --save + ``` + + + + + + ```bash + yarn add @lmstudio/sdk +``` + + + + +```bash + pnpm add @lmstudio/sdk +``` + + + +For the source code and open source contribution, visit [lmstudio-js](https://github.com/lmstudio-ai/lmstudio-js) on GitHub. + +Features [#features] + +* Use LLMs to [respond in chats](./typescript/llm-prediction/chat-completion) or predict [text completions](./typescript/llm-prediction/completion) +* Define functions as tools, and turn LLMs into [autonomous agents](./typescript/agent/act) that run completely locally +* [Load](./typescript/manage-models/loading), [configure](./typescript/llm-prediction/parameters), and [unload](./typescript/manage-models/loading) models from memory +* Supports for both browser and any Node-compatible environments +* Generate embeddings for text, and more! + +Quick Example: Chat with a Llama Model [#quick-example-chat-with-a-llama-model] + +```typescript title="index.ts" +import { LMStudioClient } from "@lmstudio/sdk"; +const client = new LMStudioClient(); + +const model = await client.llm.model("qwen/qwen3-4b-2507"); +const result = await model.respond("What is the meaning of life?"); + +console.info(result.content); +``` + +Getting Local Models [#getting-local-models] + +The above code requires the [qwen3-4b-2507](https://lmstudio.ai/models/qwen/qwen3-4b-2507). If you don't have the model, run the following command in the terminal to download it. + +```bash +lms get qwen/qwen3-4b-2507 +``` + +Read more about `lms get` in LM Studio's CLI [here](./cli/get). + + + + +`@lmstudio/sdk` is a library published on npm that allows you to use `lmstudio-js` in your own projects. It is open source and it's developed on GitHub. You can find the source code [here](https://github.com/lmstudio-ai/lmstudio-js). + +Creating a New `node` Project [#creating-a-new-node-project] + +Use the following command to start an interactive project setup: + + + + + TypeScript (Recommended) + + + + Javascript + + + + + ```bash + lms create node-typescript + ``` + + + + + ```bash + lms create node-javascript + ``` + + + +Add `lmstudio-js` to an Exiting Project [#add-lmstudio-js-to-an-exiting-project] + +If you have already created a project and would like to use `lmstudio-js` in it, you can install it using npm, yarn, or pnpm. + + + + + npm + + + + yarn + + + + pnpm + + + + + + ```bash + npm install @lmstudio/sdk --save + ``` + + + + + ```bash + yarn add @lmstudio/sdk + ``` + + + + + ```bash + pnpm add @lmstudio/sdk + ``` + + + + + + + + +Explore the docs [#explore-the-docs] + + + + + + + + + + + + + + + +To get LM Studio, head over to the [Downloads page](/download) and download an installer for your operating system. + +LM Studio is available for macOS, Windows, and Linux. + +What can I do with LM Studio? [#what-can-i-do-with-lm-studio] + +1. Download and run local LLMs like gpt-oss or Llama, Qwen +2. Use a simple and flexible chat interface +3. Connect MCP servers and use them with local models +4. Search & download functionality (via Hugging Face 🤗) +5. Serve local models on OpenAI-like endpoints, locally and on the network +6. Manage your local models, prompts, and configurations + +System requirements [#system-requirements] + +LM Studio generally supports Apple Silicon Macs, x64/ARM64 Windows PCs, and x64 Linux PCs. + +Consult the [System Requirements](app/system-requirements) page for more detailed information. + +Run llama.cpp (GGUF) or MLX models [#run-llamacpp-gguf-or-mlx-models] + +LM Studio supports running LLMs on Mac, Windows, and Linux using [`llama.cpp`](https://github.com/ggerganov/llama.cpp). + +On Apple Silicon Macs, LM Studio also supports running LLMs using Apple's [`MLX`](https://github.com/ml-explore/mlx). + +To install or manage LM Runtimes, press `⌘` `Shift` `R` on Mac or `Ctrl` `Shift` `R` on Windows/Linux. + +LM Studio as an MCP client [#lm-studio-as-an-mcp-client] + +You can install MCP servers in LM Studio and use them with your local models. + +See the docs for more: [Use MCP server](/docs/app/plugins/mcp). + +If you're develping an MCP server, check out [Add to LM Studio Button](/docs/app/plugins/mcp/deeplink). + +Run an LLM like `gpt-oss`, `Llama`, `Qwen`, `Mistral`, or `DeepSeek R1` on your computer [#run-an-llm-like-gpt-oss-llama-qwen-mistral-or-deepseek-r1-on-your-computer] + +To run an LLM on your computer you first need to download the model weights. + +You can do this right within LM Studio! See [Download an LLM](app/basics/download-model) for guidance. + +Chat with documents entirely offline on your computer [#chat-with-documents-entirely-offline-on-your-computer] + +You can attach documents to your chat messages and interact with them entirely offline, also known as "RAG". + +Read more about how to use this feature in the [Chat with Documents](app/basics/rag) guide. + +Run LM Studio without the GUI (llmster) [#run-lm-studio-without-the-gui-llmster] + +llmster is the headless version of LM Studio, no desktop app required. It's ideal for servers, CI environments, or any machine where you don't need a GUI. + +Learn more: [Headless Mode](/docs/developer/core/headless). + +Use LM Studio's API from your own apps and scripts [#use-lm-studios-api-from-your-own-apps-and-scripts] + +LM Studio provides a REST API that you can use to interact with your local models from your own apps and scripts. + +* [OpenAI Compatibility API](api/openai-api) +* [LM Studio REST API (beta)](api/rest-api) + +
+ +Community [#community] + +Join the LM Studio community on [Discord](https://discord.gg/aPQfnNkxGC) to ask questions, share knowledge, and get help from other users and the LM Studio team. + + + + + + In general, LM Studio does not require the internet in order to work. This includes core functions like chatting with models, chatting with documents, or running a local server, none of which require the internet. + + +Operations that do NOT require connectivity [#operations-that-do-not-require-connectivity] + +Using downloaded LLMs [#using-downloaded-llms] + +Once you have an LLM onto your machine, the model will run locally and you should be good to go entirely offline. Nothing you enter into LM Studio when chatting with LLMs leaves your device. + +Chatting with documents (RAG) [#chatting-with-documents-rag] + +When you drag and drop a document into LM Studio to chat with it or perform RAG, that document stays on your machine. All document processing is done locally, and nothing you upload into LM Studio leaves the application. + +Running a local server [#running-a-local-server] + +LM Studio can be used as a server to provide LLM inferencing on localhost or the local network. Requests to LM Studio use OpenAI endpoints and return OpenAI-like response objects, but stay local. + +Operations that require connectivity [#operations-that-require-connectivity] + +Several operations, described below, rely on internet connectivity. Once you get an LLM onto your machine, you should be good to go entirely offline. + +Searching for models [#searching-for-models] + +When you search for models in the Discover tab, LM Studio makes network requests (e.g. to huggingface.co). Search will not work without internet connection. + +Downloading new models [#downloading-new-models] + +In order to download models you need a stable (and decently fast) internet connection. You can also 'sideload' models (use models that were procured outside the app). See instructions for [sideloading models](/docs/advanced/sideload). + +Discover tab's model catalog [#discover-tabs-model-catalog] + +Any given version of LM Studio ships with an initial model catalog built-in. The entries in the catalog are typically the state of the online catalog near the moment we cut the release. However, in order to show stats and download options for each model, we need to make network requests (e.g. to huggingface.co). + +Downloading runtimes [#downloading-runtimes] + +[LM Runtimes](advanced/lm-runtimes) are individually packaged software libraries, or LLM engines, that allow running certain formats of models (e.g. `llama.cpp`). As of LM Studio 0.3.0 (read the [announcement](https://lmstudio.ai/blog/lmstudio-v0.3.0)) it's easy to download and even hot-swap runtimes without a full LM Studio update. To check for available runtimes, and to download them, we need to make network requests. + +Checking for app updates [#checking-for-app-updates] + +On macOS and Windows, LM Studio has a built-in app updater that's capable. The linux in-app updater [is in the works](https://github.com/lmstudio-ai/lmstudio-bug-tracker/issues/89). When you open LM Studio, the app updater will make a network request to check if there are any new updates available. If there's a new version, the app will show you a notification to update now or later. +Without internet connectivity you will not be able to update the app via the in-app updater. + + + + +macOS [#macos] + +* Chip: Apple Silicon (M1/M2/M3/M4). +* macOS 14.0 or newer is required. +* 16GB+ RAM recommended. + * You may still be able to use LM Studio on 8GB Macs, but stick to smaller models and modest context sizes. +* Intel-based Macs are currently not supported. Chime in [here](https://github.com/lmstudio-ai/lmstudio-bug-tracker/issues/9) if you are interested in this. + +Windows [#windows] + +LM Studio is supported on both x64 and ARM (Snapdragon X Elite) based systems. + +* CPU: AVX2 instruction set support is required (for x64) +* RAM: LLMs can consume a lot of RAM. At least 16GB of RAM is recommended. +* GPU: at least 4GB of dedicated VRAM is recommended. + +Linux [#linux] + +LM Studio is supported on both x64 and ARM64 (aarch64) based systems. + +* LM Studio for Linux is distributed as an AppImage. +* Ubuntu 20.04 or newer is required +* Ubuntu versions newer than 22 are not well tested. Let us know if you're running into issues by opening a bug [here](https://github.com/lmstudio-ai/lmstudio-bug-tracker). +* CPU: + * On x64, LM Studio ships with AVX2 support by default + + + + +LM Studio has a ChatGPT-like interface for chatting with local LLMs. You can create many different conversation threads and manage them in folders. + +
+ +Create a new chat [#create-a-new-chat] + +You can create a new chat by clicking the "+" button or by using a keyboard shortcut: `⌘` + `N` on Mac, or `ctrl` + `N` on Windows / Linux. + +Create a folder [#create-a-folder] + +Create a new folder by clicking the new folder button or by pressing: `⌘` + `shift` + `N` on Mac, or `ctrl` + `shift` + `N` on Windows / Linux. + +Drag and drop [#drag-and-drop] + +You can drag and drop chats in and out of folders, and even drag folders into folders! + +Duplicate chats [#duplicate-chats] + +You can duplicate a whole chat conversation by clicking the `•••` menu and selecting "Duplicate". If the chat has any files in it, they will be duplicated too. + +Split view in chat [#split-view-in-chat] + +You can view two chats side by side by dragging and dropping chat tabs to either half of the window. Alternatively, use the split view icon at the top right of a chat window to split left or right. + +Close one side of the split view with the 'x' button in the top right of each pane. + +FAQ [#faq] + +Where are chats stored in the file system? [#where-are-chats-stored-in-the-file-system] + +Right-click on a chat and choose "Reveal in Finder" / "Show in File Explorer". +Conversations are stored in JSON format. It is NOT recommended to edit them manually, nor to rely on their structure. + +Does the model learn from chats? [#does-the-model-learn-from-chats] + +The model doesn't 'learn' from chats. The model only 'knows' the content that is present in the chat or is provided to it via configuration options such as the "system prompt". + +Conversations folder filesystem path [#conversations-folder-filesystem-path] + +Mac / Linux: + +```shell +~/.lmstudio/conversations/ +``` + +Windows: + +```ps +%USERPROFILE%\.lmstudio\conversations +``` + +
+ +Community [#community] + +Chat with other LM Studio users, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). + + + + +LM Studio comes with a built-in model downloader that let's you download any supported model from [Hugging Face](https://huggingface.co). + + + +
+ +Searching for models [#searching-for-models] + +You can search for models by keyword (e.g. `llama`, `gemma`, `lmstudio`), or by providing a specific `user/model` string. You can even insert full Hugging Face URLs into the search bar! + +Pro tip: you can jump to the Discover tab from anywhere by pressing `⌘` + `2` on Mac, or `ctrl` + `2` on Windows / Linux. [#pro-tip-you-can-jump-to-the-discover-tab-from-anywhere-by-pressing---2-on-mac-or-ctrl--2-on-windows--linux] + +Which download option to choose? [#which-download-option-to-choose] + +You will often see several options for any given model named things like `Q3_K_S`, `Q_8` etc. These are all copies of the same model, provided in varying degrees of fidelity. The `Q` represents a technique called "Quantization", which roughly means compressing model files in size, while giving up some degree of quality. + +Choose a 4-bit option or higher if your machine is capable enough for running it. + + + +
+ +`Advanced` + +Changing the models directory [#changing-the-models-directory] + +You can change the models directory by heading to My Models + + + +
+ +Community [#community] + +Chat with other LM Studio users, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). + + + + + + +Double check computer meets the minimum [system requirements](/docs/system-requirements). + + + You might sometimes see terms such as `open-source models` or `open-weights models`. Different models might be released under different licenses and varying degrees of 'openness'. In order to run a model locally, you need to be able to get access to its "weights", often distributed as one or more files that end with `.gguf`, `.safetensors` etc. + + +
+ +Getting up and running [#getting-up-and-running] + +First, **install the latest version of LM Studio**. You can get it from [here](/download). + +Once you're all set up, you need to **download your first LLM**. + + + +

+ Download an LLM to your computer +

+ + Head over to the Discover tab to download models. Pick one of the curated options or search for models by search query (e.g. `"Llama"`). See more in-depth information about downloading models [here](/docs/basics/download-models). + + +
+ + +

+ Load a model to memory +

+ + Head over to the **Chat** tab, and + + 1. Open the model loader + 2. Select one of the models you downloaded (or [sideloaded](/docs/advanced/sideload)). + 3. Optionally, choose load configuration parameters. + + + +

+ What does loading a model mean? +

+ + Loading a model typically means allocating memory to be able to accommodate the model's weights and other parameters in your computer's RAM. +
+ + +

+ Chat! +

+ + Once the model is loaded, you can start a back-and-forth conversation with the model in the Chat tab. + + +
+
+ +
+ +Community [#community] + +Chat with other LM Studio users, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). + + + + +LM Studio app, llmster, and lms [#lm-studio-app-llmster-and-lms] + +The LM Studio app, llmster, and `lms` are three different tools offered by LM Studio to make use of local AI easy and accessible. + +LM Studio (the desktop app) [#lm-studio-the-desktop-app] + +The LM Studio app is a user-friendly graphical interface containing the full capabilities of LM Studio. + +Notable capabilities: [#notable-capabilities] + +* Search and download models from Hugging Face +* Chat with models through a built-in chat interface +* Upload and chat documents (RAG) +* Configure model settings, prompt templates, and presets +* Run a local server with through native REST APIs or OpenAI/Anthropic compatible endpoints +* Connect MCP servers and use them with local models + +The desktop app is the easiest starting point if you're new to running models locally or prefer a graphical interface. + +llmster (the headless daemon) [#llmster-the-headless-daemon] + +llmster is LM Studio’s headless daemon – a standalone background service that can run without a GUI. This means you do not have to download the LM Studio app to use llmster via the terminal. + +llmster becomes useful when you need to run LM Studio: + +* On a Linux server or cloud instance +* On a GPU rig without a screen or display +* In a CI/CD pipeline +* As a background service that starts on machine boot + And more! + +Because llmster runs independently of the desktop app, you can get the full model-serving capabilities of LM Studio in environments where installing or launching a GUI application isn't practical. + +Learn more and install llmster [here](https://lmstudio.ai/docs/developer/core/headless) + +lms (the CLI) [#lms-the-cli] + +`lms` is LM Studio's CLI (command-line interface). It lets you interact with both the LM Studio desktop app and llmster, and manage your models directly from a terminal. + +`lms` is included automatically upon downloading the app or llmster. + +**Common commands:** + +```bash +lms get # Download a model +lms load # Load a model into memory +lms ls # List models available on disk +lms server start # Start the local HTTP server +lms chat # Start an interactive chat session in the terminal +lms log stream # Stream incoming and outgoing request logs +``` + +If LM Studio isn't already running when you run an `lms` command, it will start running automatically. + +**Example commands to download and serve a model:** + +```bash +lms get openai/gpt-oss-20b +lms load openai/gpt-oss-20b +lms server start +``` + +Once the server is running, it listens on [http://localhost:1234](http://localhost:1234). Point any SDK or compatible tool at our OpenAI or Anthropic-compatible endpoints to use your LM Studio models. + +In short, `lms` is the command-line tool to talk to both, the desktop app or llmster. + + + + +You can attach document files (`.docx`, `.pdf`, `.txt`) to chat sessions in LM Studio. + +This will provide additional context to LLMs you chat with through the app. + +
+ +Terminology [#terminology] + +* **Retrieval**: Identifying relevant portion of a long source document +* **Query**: The input to the retrieval operation +* **RAG**: Retrieval-Augmented Generation\* +* **Context**: the 'working memory' of an LLM. Has a maximum size + +\* In this context, 'Generation' means the output of the LLM. [#-in-this-context-generation-means-the-output-of-the-llm] + +Context sizes are measured in "tokens". One token is often about 3/4 of a word. [#context-sizes-are-measured-in-tokens-one-token-is-often-about-34-of-a-word] + +RAG vs. Full document 'in context' [#rag-vs-full-document-in-context] + +If the document is short enough (i.e., if it fits in the model's context), LM Studio will add the file contents to the conversation in full. This is particularly useful for models that support longer context sizes such as Meta's Llama 3.1 and Mistral Nemo. + +If the document is very long, LM Studio will opt into using "Retrieval Augmented Generation", frequently referred to as "RAG". RAG means attempting to fish out relevant bits of a very long document (or several documents) and providing them to the model for reference. This technique sometimes works really well, but sometimes it requires some tuning and experimentation. + +Tip for successful RAG [#tip-for-successful-rag] + +provide as much context in your query as possible. Mention terms, ideas, and words you expect to be in the relevant source material. This will often increase the chance the system will provide useful context to the LLM. As always, experimentation is the best way to find what works best. + + + + +You can install MCP servers in LM Studio with one click using a deeplink. + +Starting with version 0.3.17 (10), LM Studio can act as an MCP host. Learn more about it [here](../mcp). + +*** + +Generate your own MCP install link [#generate-your-own-mcp-install-link] + +Enter your MCP JSON entry to generate a deeplink for the `Add to LM Studio` button. + + + +Try an example [#try-an-example] + +Try to copy and paste the following into the link generator above. + +```json +{ + "hf-mcp-server": { + "url": "https://huggingface.co/mcp", + "headers": { + "Authorization": "Bearer " + } + } +} +``` + +Deeplink format [#deeplink-format] + +```bash +lmstudio://add_mcp?name=hf-mcp-server&config=eyJ1cmwiOiJodHRwczovL2h1Z2dpbmdmYWNlLmNvL21jcCIsImhlYWRlcnMiOnsiQXV0aG9yaXphdGlvbiI6IkJlYXJlciA8WU9VUl9IRl9UT0tFTj4ifX0%3D +``` + +Parameters [#parameters] + + + + + + +Starting LM Studio 0.3.17, LM Studio acts as an **Model Context Protocol (MCP) Host**. This means you can connect MCP servers to the app and make them available to your models. + +Be cautious [#be-cautious] + +Never install MCPs from untrusted sources. + + + Some MCP servers can run arbitrary code, access your local files, and use your network connection. Always be cautious when installing and using MCP servers. If you don't trust the source, don't install it. + + +Use MCP servers in LM Studio [#use-mcp-servers-in-lm-studio] + +Starting 0.3.17 (b10), LM Studio supports both local and remote MCP servers. You can add MCPs by editing the app's `mcp.json` file or via the ["Add to LM Studio" Button](mcp/deeplink), when available. LM Studio currently follows Cursor's `mcp.json` notation. + +Install new servers: `mcp.json` [#install-new-servers-mcpjson] + +Switch to the "Program" tab in the right hand sidebar. Click `Install > Edit mcp.json`. + + + +This will open the `mcp.json` file in the in-app editor. You can add MCP servers by editing this file. + + + +Example MCP to try: Hugging Face MCP Server [#example-mcp-to-try-hugging-face-mcp-server] + +This MCP server provides access to functions like model and dataset search. + + + +```json +{ + "mcpServers": { + "hf-mcp-server": { + "url": "https://huggingface.co/mcp", + "headers": { + "Authorization": "Bearer " + } + } + } +} +``` + +You will need to replace `` with your actual Hugging Face token. Learn more [here](https://huggingface.co/docs/hub/en/security-tokens). + +Use the [deeplink button](mcp/deeplink), or copy the JSON snippet above and paste it into your `mcp.json` file. + +*** + +Gotchas and Troubleshooting [#gotchas-and-troubleshooting] + +* Never install MCP servers from untrusted sources. Some MCPs can have far reaching access to your system. + +* Some MCP servers were designed to be used with Claude, ChatGPT, Gemini and might use excessive amounts of tokens. + * Watch out for this. It may quickly bog down your local model and trigger frequent context overflows. + +* When adding MCP servers manually, copy only the content after `"mcpServers": {` and before the closing `}`. + + + + +`Draft` + +[`model.yaml`](https://modelyaml.org) describes a model and all of its variants in a single portable file. Models in LM Studio's [model catalog](https://lmstudio.ai/models) are all implemented using model.yaml. + +This allows abstracting away the underlying format (GGUF, MLX, etc) and presenting a single entry point for a given model. Furthermore, the model.yaml file supports baking in additional metadata, load and inference options, and even custom logic (e.g. enable/disable thinking). + +**You can clone existing model.yaml files on the LM Studio Hub and even [publish your own](./modelyaml/publish)!** + +Core fields [#core-fields] + +`model` [#model] + +The canonical identifier in the form `publisher/model`. + +```yaml +model: qwen/qwen3-8b +``` + +`base` [#base] + +Points to the "concrete" model files or other virtual models. Each entry uses a unique `key` and one or more `sources` from which the file can be fetched. + +The snippet below demonstrates a case where the model (`qwen/qwen3-8b`) can resolve to one of 3 different concrete models. + +```yaml +model: qwen/qwen3-8b +base: + - key: lmstudio-community/qwen3-8b-gguf + sources: + - type: huggingface + user: lmstudio-community + repo: Qwen3-8B-GGUF + - key: lmstudio-community/qwen3-8b-mlx-4bit + sources: + - type: huggingface + user: lmstudio-community + repo: Qwen3-8B-MLX-4bit + - key: lmstudio-community/qwen3-8b-mlx-8bit + sources: + - type: huggingface + user: lmstudio-community + repo: Qwen3-8B-MLX-8bit +``` + +Concrete model files refer to the actual weights. + +`metadataOverrides` [#metadataoverrides] + +Overrides the base model's metadata. This is useful for presentation purposes, for example in LM Studio's model catalog or in app model search. It is not used for any functional changes to the model. + +```yaml +metadataOverrides: + domain: llm + architectures: + - qwen3 + compatibilityTypes: + - gguf + - safetensors + paramsStrings: + - 8B + minMemoryUsageBytes: 4600000000 + contextLengths: + - 40960 + vision: false + reasoning: true + trainedForToolUse: true +``` + +`config` [#config] + +Use this to "bake in" default runtime settings (such as sampling parameters) and even load time options. +This works similarly to [Per Model Defaults](/docs/app/advanced/per-model). + +* `operation:` inference time parameters +* `load:` load time parameters + +```yaml +config: + operation: + fields: + - key: llm.prediction.topKSampling + value: 20 + - key: llm.prediction.temperature + value: 0.7 + load: + fields: + - key: llm.load.contextLength + value: 42690 +``` + +`customFields` [#customfields] + +Define model-specific custom fields. + +```yaml +customFields: + - key: enableThinking + displayName: Enable Thinking + description: Controls whether the model will think before replying + type: boolean + defaultValue: true + effects: + - type: setJinjaVariable + variable: enable_thinking +``` + +In order for the above example to work, the jinja template needs to have a variable named `enable_thinking`. + +Complete example [#complete-example] + +Taken from [https://lmstudio.ai/models/qwen/qwen3-8b](https://lmstudio.ai/models/qwen/qwen3-8b) + +```yaml +# model.yaml is an open standard for defining cross-platform, composable AI models +# Learn more at https://modelyaml.org +model: qwen/qwen3-8b +base: + - key: lmstudio-community/qwen3-8b-gguf + sources: + - type: huggingface + user: lmstudio-community + repo: Qwen3-8B-GGUF + - key: lmstudio-community/qwen3-8b-mlx-4bit + sources: + - type: huggingface + user: lmstudio-community + repo: Qwen3-8B-MLX-4bit + - key: lmstudio-community/qwen3-8b-mlx-8bit + sources: + - type: huggingface + user: lmstudio-community + repo: Qwen3-8B-MLX-8bit +metadataOverrides: + domain: llm + architectures: + - qwen3 + compatibilityTypes: + - gguf + - safetensors + paramsStrings: + - 8B + minMemoryUsageBytes: 4600000000 + contextLengths: + - 40960 + vision: false + reasoning: true + trainedForToolUse: true +config: + operation: + fields: + - key: llm.prediction.topKSampling + value: 20 + - key: llm.prediction.minPSampling + value: + checked: true + value: 0 +customFields: + - key: enableThinking + displayName: Enable Thinking + description: Controls whether the model will think before replying + type: boolean + defaultValue: true + effects: + - type: setJinjaVariable + variable: enable_thinking +``` + +The [GitHub specification](https://github.com/modelyaml/modelyaml) contains further details and the latest schema. + + + + +Share portable models by uploading a [`model.yaml`](./) to your page on the LM Studio Hub. + +After you publish a model.yaml to the LM Studio Hub, it will be available for other users to download with `lms get`. + +Note: `model.yaml` refers to metadata only. This means it does not include the actual model weights. [#note-modelyaml-refers-to-metadata-only-this-means-it-does-not-include-the-actual-model-weights] + +Quickstart [#quickstart] + +The easiest way to get started is by cloning an existing model, modifying it, and then running `lms push`. + +For example, you can clone the Qwen 3 8B model: + +```shell +lms clone qwen/qwen3-8b +``` + +This will result in a local copy `model.yaml`, `README` and other metadata files. Importantly, this does NOT download the model weights. + +```bash title="Terminal" +$ ls +README.md manifest.json model.yaml thumbnail.png +``` + +Change the publisher to your user [#change-the-publisher-to-your-user] + +The first part in the `model:` field should be the username of the publisher. Change it to a username of a user or organization for which you have write access. + +```diff +- model: qwen/qwen3-8b ++ model: your-user-here/qwen3-8b +base: + - key: lmstudio-community/qwen3-8b-gguf + sources: +# ... the rest of the file +``` + +Sign in [#sign-in] + +Authenticate with the Hub from the command line: + +```shell +lms login +``` + +The CLI will print an authentication URL. After you approve access, the session token is saved locally so you can publish models. + +Publish your model [#publish-your-model] + +Run the push command in the directory containing `model.yaml`: + +```shell +lms push +``` + +The command packages the file, uploads it, and prints a revision number for the new version. + +Override metadata at publish time [#override-metadata-at-publish-time] + +Use `--overrides` to tweak fields without editing the file: + +```shell +lms push --overrides '{"description": "Qwen 3 8B model"}' +``` + +Downloading a model and using it in LM Studio [#downloading-a-model-and-using-it-in-lm-studio] + +After publishing, the model appears under your user or organization profile on the LM Studio Hub. + +It can then be downloaded with: + +```shell +lms get my-user/my-model +``` + + + + +You can import preset by file or URL. This is useful for sharing presets with others, or for importing presets from other users. + +
+ +Import Presets [#import-presets] + +First, click the presets dropdown in the sidebar. You will see a list of your presets along with 2 buttons: `+ New Preset` and `Import`. + +Click the `Import` button to import a preset. + + + +Import Presets from File [#import-presets-from-file] + +Once you click the Import button, you can select the source of the preset you want to import. You can either import from a file or from a URL. + +Import Presets from URL [#import-presets-from-url] + +Presets that are [published](/docs/app/presets/publish) to the LM Studio Hub can be imported by providing their URL. + +Importing public presets does not require logging in within LM Studio. + + + +Using `lms` CLI [#using-lms-cli] + +You can also use the CLI to import presets from URL. This is useful for sharing presets with others. + +``` +lms get {author}/{preset-name} +``` + +Example: + +```bash +lms get neil/qwen3-thinking +``` + +Find your config-presets directory [#find-your-config-presets-directory] + +LM Studio manages config presets on disk. Presets are local and private by default. You or others can choose to share them by sharing the file. + +Click on the `•••` button in the Preset dropdown and select "Reveal in Finder" (or "Show in Explorer" on Windows). + +This will download the preset file and automatically surface it in the preset dropdown in the app. + +Where Hub shared presets are stored [#where-hub-shared-presets-are-stored] + +Presets you share, and ones you download from the LM Studio Hub are saved in `~/.lmstudio/hub` on macOS and Linux, or `%USERPROFILE%\.lmstudio\hub` on Windows. + + + + +Presets are a way to bundle together a system prompt and other parameters into a single configuration that can be easily reused across different chats. + +New in 0.3.15: You can [import](/docs/app/presets/import) Presets from file or URL, and even [publish](/docs/app/presets/publish) your own Presets to share with others on to the LM Studio Hub. + +
+ +Saving, resetting, and deselecting Presets [#saving-resetting-and-deselecting-presets] + +Below is the anatomy of the Preset manager: + + + +Importing, Publishing, and Updating Downloaded Presets [#importing-publishing-and-updating-downloaded-presets] + +Presets are JSON files. You can share them by sending around the JSON, or you can share them by publishing them to the LM Studio Hub. +You can also import Presets from other users by URL. See the [Import](/docs/app/presets/import) and [Publish](/docs/app/presets/publish) sections for more details. + +Example: Build your own Prompt Library [#example-build-your-own-prompt-library] + +You can create your own prompt library by using Presets. + + + +In addition to system prompts, every parameter under the Advanced Configuration sidebar can be recorded in a named Preset. + +For example, you might want to always use a certain Temperature, Top P, or Max Tokens for a particular use case. You can save these settings as a Preset (with or without a system prompt) and easily switch between them. + +The Use Case for Presets [#the-use-case-for-presets] + +* Save your system prompts, inference parameters as a named `Preset`. +* Easily switch between different use cases, such as reasoning, creative writing, multi-turn conversations, or brainstorming. + +Where Presets are stored [#where-presets-are-stored] + +Presets are stored in the following directory: + +macOS or Linux [#macos-or-linux] + +```xml +~/.lmstudio/config-presets +``` + +Windows [#windows] + +```xml +%USERPROFILE%\.lmstudio\config-presets +``` + +Migration from LM Studio 0.2.* Presets [#migration-from-lm-studio-02-presets] + +* Presets you've saved in LM Studio 0.2.\* are automatically readable in 0.3.3 with no migration step needed. +* If you save **new changes** in a **legacy preset**, it'll be **copied** to a new format upon save. + * The old files are NOT deleted. +* Notable difference: Load parameters are not included in the new preset format. + * Favor editing the model's default config in My Models. See [how to do it here](/docs/configuration/per-model). + +
+ +Community [#community] + +Chat with other LM Studio users, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). + + + + +`Feature In Preview` + +Starting LM Studio 0.3.15, you can publish your Presets to the LM Studio community. This allows you to share your Presets with others and import Presets from other users. + +This feature is early and we would love to hear your feedback. Please report bugs and feedback to [bugs@lmstudio.ai](mailto:bugs@lmstudio.ai). + +*** + +Step 1: Click the Publish Button [#step-1-click-the-publish-button] + +Identify the Preset you want to publish in the Preset dropdown. Click the `•••` button and select "Publish" from the menu. + + + +Step 2: Set the Preset Details [#step-2-set-the-preset-details] + +You will be prompted to set the details of your Preset. This includes the name (slug) and optional description. + +Community presets are public and can be used by anyone on the internet! + + + +Privacy and Terms [#privacy-and-terms] + +For good measure, visit the [Privacy Policy](https://lmstudio.ai/hub-privacy) and [Terms of Service](https://lmstudio.ai/hub-terms) to understand what's suitable to share on the Hub, and how data is handled. Community presets are public and visible to everyone. Make sure you agree to what these documents say before publishing your Preset. + + + + +`Feature In Preview` + +You can pull the latest revisions of your Presets, or presets you have imported from others. This is useful for keeping your Presets up to date with the latest changes. + +
+ +How to Pull Updates [#how-to-pull-updates] + +Click the `•••` button in the Preset dropdown and select "Pull" from the menu. + + + +Your Presets vs Others' [#your-presets-vs-others] + +Both your published Presets and other downloaded Presets can be pulled and updated the same way. + + + + + + +`Feature In Preview` + +Starting LM Studio 0.3.15, you can publish your Presets to the LM Studio community. This allows you to share your Presets with others and import Presets from other users. + +This feature is early and we would love to hear your feedback. Please report bugs and feedback to [bugs@lmstudio.ai](mailto:bugs@lmstudio.ai). + +*** + +Published Presets [#published-presets] + +Presets you share on the LM Studio Hub can be updated. + + + + + +

+ Make Changes and Commit +

+ + Make any changes to your Preset, both in parameters that are already included in the Preset, or by adding new parameters. +
+ + +

+ Click the Push Button +

+ + Once changes are committed, you will see a `Push` button. Click it to push your changes to the Hub. + + Pushing changes will result in a new revision of your Preset on the Hub. + + +
+
+ + + + +LM Studio is available in `English`, `Spanish`, `Japanese`, `Chinese`, `German`, `Norwegian`, `Turkish`, `Russian`, `Korean`, `Polish`, `Vietnamese`, `Czech`, `Ukrainian`, `Portuguese (BR,PT)` and many more languages thanks to incredible community localizers. + +
+ +Selecting a Language [#selecting-a-language] + +You can choose a language in the Settings tab. + +Use the dropdown menu under Preferences > Language. + + + You can jump to Settings from anywhere in the app by pressing `cmd` + `,` on macOS or `ctrl` + `,` on Windows/Linux. + + +To get to the Settings page, you need to be on Power User mode or higher. + +
+ +Big thank you to community localizers 🙏 [#big-thank-you-to-community-localizers-] + +* Spanish [@xtianpaiva](https://github.com/xtianpaiva), [@AlexisGross](https://github.com/AlexisGross), [@Tonband](https://github.com/Tonband) +* Norwegian [@Exlo84](https://github.com/Exlo84) +* German [@marcelMaier](https://github.com/marcelMaier), [@Goekdeniz-Guelmez](https://github.com/Goekdeniz-Guelmez) +* Romanian (ro) [@alexandrughinea](https://github.com/alexandrughinea) +* Turkish (tr) [@progesor](https://github.com/progesor), [@nossbar](https://github.com/nossbar) +* Russian [@shelomitsky](https://github.com/shelomitsky), [@mlatysh](https://github.com/mlatysh), [@Adjacentai](https://github.com/Adjacentai), [@HostFly](https://github.com/HostFly), [@MotyaDev](https://github.com/MotyaDev), [@Autumn-Whisper](https://github.com/Autumn-Whisper), [@seropheem](https://github.com/seropheem) +* Korean [@williamjeong2](https://github.com/williamjeong2) +* Polish [@danieltechdev](https://github.com/danieltechdev) +* Czech [@ladislavsulc](https://github.com/ladislavsulc) +* Vietnamese [@trinhvanminh](https://github.com/trinhvanminh), [@godkyo98](https://github.com/godkyo98) +* Portuguese (BR) [@Sm1g00l](https://github.com/Sm1g00l), [@altiereslima](https://github.com/altiereslima) +* Portuguese (PT) [@catarino](https://github.com/catarino) +* Chinese (zh-CN) [@neotan](https://github.com/neotan), [@SweetDream0256](https://github.com/SweetDream0256), [@enKl03B](https://github.com/enKl03B), [@evansrrr](https://github.com/evansrrr), [@xkonglong](https://github.com/xkonglong), [@shadow01a](https://github.com/shadow01a) +* Chinese (zh-HK), (zh-TW) [@neotan](https://github.com/neotan), [ceshizhuanyong895](https://github.com/ceshizhuanyong895), [@BrassaiKao](https://github.com/BrassaiKao) +* Chinese (zh-Hant) [@kywarai](https://github.com/kywarai), [ceshizhuanyong895](https://github.com/ceshizhuanyong895) +* Ukrainian (uk) [@hmelenok](https://github.com/hmelenok) +* Japanese (ja) [@digitalsp](https://github.com/digitalsp) +* Dutch (nl) [@alaaf11](https://github.com/alaaf11) +* Italian (it) [@fralapo](https://github.com/fralapo), [@Bl4ck-D0g](https://github.com/Bl4ck-D0g), [@nikypalma](https://github.com/nikypalma) +* Indonesian (id) [@dwirx](https://github.com/dwirx) +* Greek (gr) [@ilikecatgirls](https://github.com/ilikecatgirls) +* Swedish (sv) [@reinew](https://github.com/reinew) +* Catalan (ca) [@Gopro3010](https://github.com/Gopro3010) +* French [@Plexi09](https://github.com/Plexi09) +* Finnish (fi) [@divergentti](https://github.com/divergentti) +* Bengali (bn) [@AbiruzzamanMolla](https://github.com/AbiruzzamanMolla) +* Malayalam (ml) [@prasanthc41m](https://github.com/prasanthc41m) +* Thai (th) [@gnoparus](https://github.com/gnoparus) +* Bosnian (bs) [@0haris0](https://github.com/0haris0) +* Bulgarian (bg) [@DenisZekiria](https://github.com/DenisZekiria) +* Hindi (hi) [@suhailtajshaik](https://github.com/suhailtajshaik) +* Hungarian (hu) [@Mekemoka](https://github.com/Mekemoka) +* Persian (Farsi) (fa) [@mohammad007kh](https://github.com/mohammad007kh), [@darwindev](https://github.com/darwindev) +* Arabic (ar) [@haqbany](https://github.com/haqbany) + +Still under development (due to lack of RTL support in LM Studio) + +* Hebrew: [@NHLOCAL](https://github.com/NHLOCAL) + +Contributing to LM Studio localization [#contributing-to-lm-studio-localization] + +If you want to improve existing translations or contribute new ones, you're more than welcome to jump in. + +LM Studio strings are maintained in [https://github.com/lmstudio-ai/localization](https://github.com/lmstudio-ai/localization). + +See instructions for contributing [here](https://github.com/lmstudio-ai/localization/blob/main/README.md). + + + + +Enable Developer Mode [#enable-developer-mode] + +Developer Mode combines the previous Developer and Power User modes into a single mode with all advanced features enabled. You can enable Developer mode in Settings > Developer. + + + +Which mode should I choose? [#which-mode-should-i-choose] + +`User` [#user] + +Show only the chat interface, and auto-configure everything. This is the best choice for beginners or anyone who's happy with the default settings. + +`Developer` [#developer] + +Full access to all aspects in LM Studio. This includes keyboard shortcuts and development features. + +Use LM Studio in this mode if you want access to configurable [load](/docs/configuration/load) and [inference](/docs/configuration/inference) parameters as well as advanced chat features such as [insert, edit, & continue](/docs/advanced/context) (for either role, user or assistant). + + + + +Selecting a Theme [#selecting-a-theme] + +Press `Cmd` + `K` then `T` (macOS) or `Ctrl` + `K` then `T` (Windows/Linux) to open the theme selector. + +You can also choose a theme in the Settings tab (`Cmd` + `,` on macOS or `Ctrl` + `,` on Windows/Linux). + +Choosing the "Auto" option will automatically switch between Light and Dark themes based on your system settings. + + + + +You can use compatible models you've downloaded outside of LM Studio by placing them in the expected directory structure. + +
+ +Use `lms import` (experimental) [#use-lms-import-experimental] + +To import a `GGUF` model you've downloaded outside of LM Studio, run the following command in your terminal: + +```bash +lms import +``` + +Follow the interactive prompt to complete the import process. [#follow-the-interactive-prompt-to-complete-the-import-process] + +LM Studio's expected models directory structure [#lm-studios-expected-models-directory-structure] + + + +LM Studio aims to preserves the directory structure of models downloaded from Hugging Face. The expected directory structure is as follows: + +```xml +~/.lmstudio/models/ +└── publisher/ + └── model/ + └── model-file.gguf +``` + +For example, if you have a model named `ocelot-v1` published by `infra-ai`, the structure would look like this: + +```xml +~/.lmstudio/models/ +└── infra-ai/ + └── ocelot-v1/ + └── ocelot-v1-instruct-q4_0.gguf +``` + +
+ +Community [#community] + +Chat with other LM Studio users, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). + + + + +When loading a model, you can now set Max Concurrent Predictions to allow multiple requests to be processed in parallel, instead of queued. This is supported for LM Studio's llama.cpp engine, with MLX coming soon. + +Please make sure your GGUF runtime is upgraded to llama.cpp v2.0.0. + +
+ +Parallel Requests via Continuous Batching [#parallel-requests-via-continuous-batching] + +Parallel requests via continuous batching allows the LM Studio server to dynamically combine multiple requests into a single batch. This enables concurrent workflows and results in higher throughput. + +Setting Max Concurrent Predictions [#setting-max-concurrent-predictions] + +Open the model loader and toggle on Manually choose model load parameters. Select a model to load, and toggle on Show advanced settings to set Max Concurrent Predictions. By default, Max Concurrent Predictions is set to 4. + +Sending parallel requests to chats in Split View [#sending-parallel-requests-to-chats-in-split-view] + +Use the [split view in chat feature](/docs/basics/chat) to send two requests simultaneously to two chats and view them side by side. + + + + + + +`Advanced` + +You can set default load settings for each model in LM Studio. + +When the model is loaded anywhere in the app (including through [`lms load`](/docs/cli#load-a-model-with-options)) these settings will be used. + +
+ +Setting default parameters for a model [#setting-default-parameters-for-a-model] + +Head to the My Models tab and click on the gear ⚙️ icon to edit the model's default parameters. + + + +This will open a dialog where you can set the default parameters for the model. + + + +Next time you load the model, these settings will be used. + + + Reasons to set default load parameters (not required, totally optional) [#reasons-to-set-default-load-parameters-not-required-totally-optional] + + * Set a particular GPU offload settings for a given model + * Set a particular context size for a given model + * Whether or not to utilize Flash Attention for a given model + + +Advanced Topics [#advanced-topics] + +Changing load settings before loading a model [#changing-load-settings-before-loading-a-model] + +When you load a model, you can optionally change the default load settings. + + + +Saving your changes as the default settings for a model [#saving-your-changes-as-the-default-settings-for-a-model] + +If you make changes to load settings when you load a model, you can save them as the default settings for that model. + + + +
+ +Community [#community] + +Chat with other LM Studio power users, discuss configs, models, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). + + + + +`Advanced` + +By default, LM Studio will automatically configure the prompt template based on the model file's metadata. + +However, you can customize the prompt template for any model. + +
+ +Overriding the Prompt Template for a Specific Model [#overriding-the-prompt-template-for-a-specific-model] + +Head over to the My Models tab and click on the gear ⚙️ icon to edit the model's default parameters. + +Pro tip: you can jump to the My Models tab from anywhere by pressing `⌘` + `3` on Mac, or `ctrl` + `3` on Windows / Linux. [#pro-tip-you-can-jump-to-the-my-models-tab-from-anywhere-by-pressing---3-on-mac-or-ctrl--3-on-windows--linux] + +Customize the Prompt Template [#customize-the-prompt-template] + +💡 In most cases you don't need to change the prompt template [#-in-most-cases-you-dont-need-to-change-the-prompt-template] + +When a model doesn't come with a prompt template information, LM Studio will surface the `Prompt Template` config box in the **🧪 Advanced Configuration** sidebar. + + + +You can make this config box always show up by right clicking the sidebar and selecting **Always Show Prompt Template**. + +Prompt template options [#prompt-template-options] + +Jinja Template [#jinja-template] + +You can express the prompt template in Jinja. + +Jinja is a templating engine used to encode the prompt template in several popular LLM model file formats. [#jinja-is-a-templating-engine-used-to-encode-the-prompt-template-in-several-popular-llm-model-file-formats] + +Manual [#manual] + +You can also express the prompt template manually by specifying message role prefixes and suffixes. + +
+ +Reasons you might want to edit the prompt template: [#reasons-you-might-want-to-edit-the-prompt-template] + +1. The model's metadata is incorrect, incomplete, or LM Studio doesn't recognize it +2. The model does not have a prompt template in its metadata (e.g. custom or older models) +3. You want to customize the prompt template for a specific use case + + + + +`Advanced` + +Speculative decoding is a technique that can substantially increase the generation speed of large language models (LLMs) without reducing response quality. + +
+ +What is Speculative Decoding [#what-is-speculative-decoding] + +Speculative decoding relies on the collaboration of two models: + +* A larger, "main" model +* A smaller, faster "draft" model + +During generation, the draft model rapidly proposes potential tokens (subwords), which the main model can verify faster than it would take it to generate them from scratch. To maintain quality, the main model only accepts tokens that match what it would have generated. After the last accepted draft token, the main model always generates one additional token. + +For a model to be used as a draft model, it must have the same "vocabulary" as the main model. + +How to enable Speculative Decoding [#how-to-enable-speculative-decoding] + +On `Power User` mode or higher, load a model, then select a `Draft Model` within the `Speculative Decoding` section of the chat sidebar: + + + +Finding compatible draft models [#finding-compatible-draft-models] + +You might see the following when you open the dropdown: + + + +Try to download a lower parameter variant of the model you have loaded, if it exists. If no smaller versions of your model exist, find a pairing that does. + +For example: + +
+ +| Main Model | Draft Model | +| :--------------------------: | :---------------------------: | +| Llama 3.1 8B Instruct | Llama 3.2 1B Instruct | +| Qwen 2.5 14B Instruct | Qwen 2.5 0.5B Instruct | +| DeepSeek R1 Distill Qwen 32B | DeepSeek R1 Distill Qwen 1.5B | + +
+ +Once you have both a main and draft model loaded, simply begin chatting to enable speculative decoding. + +Key factors affecting performance [#key-factors-affecting-performance] + +Speculative decoding speed-up is generally dependent on two things: + +1. How small and fast the *draft model* is compared with the *main model* +2. How often the draft model is able to make "good" suggestions + +In simple terms, you want to choose a draft model that's much smaller than the main model. And some prompts will work better than others. + +An important trade-off [#an-important-trade-off] + +Running a draft model alongside a main model to enable speculative decoding requires more **computation and resources** than running the main model on its own. + +The key to faster generation of the main model is choosing a draft model that's both small and capable enough. + +Here are general guidelines for the **maximum** draft model size you should select based on main model size (in parameters): + +
+ +| Main Model Size | Max Draft Model Size to Expect Speed-Ups | +| :-------------: | :--------------------------------------: | +| 3B | - | +| 7B | 1B | +| 14B | 3B | +| 32B | 7B | + +
+ +Generally, the larger the size difference is between the main model and the draft model, the greater the speed-up. + +Note: if the draft model is not fast enough or effective enough at making "good" suggestions to the main model, the generation speed will not increase, and could actually decrease. + +Prompt dependent [#prompt-dependent] + +One thing you will likely notice when using speculative decoding is that the generation speed is not consistent across all prompts. + +The reason that the speed-up is not consistent across all prompts is because for some prompts, the draft model is less likely to make "good" suggestions to the main model. + +Here are some extreme examples that illustrate this concept: + +1\. Discrete Example: Mathematical Question [#1-discrete-example-mathematical-question] + +Prompt: "What is the quadratic equation formula?" + +In this case, both a 70B model and a 0.5B model are both very likely to give the standard formula `x = (-b ± √(b² - 4ac))/(2a)`. So if the draft model suggested this formula as the next tokens, the target model would likely accept it, making this an ideal case for speculative decoding to work efficiently. + +2\. Creative Example: Story Generation [#2-creative-example-story-generation] + +Prompt: "Write a story that begins: 'The door creaked open...'" + +In this case, the smaller model's draft tokens are likely be rejected more often by the larger model, as each next word could branch into countless valid possibilities. + +While "4" is the only reasonable answer to "2+2", this story could continue with "revealing a monster", "as the wind howled", "and Sarah froze", or hundreds of other perfectly valid continuations, making the smaller model's specific word predictions much less likely to match the larger +model's choices. + + + + +Requires LM Studio 0.4.0 or newer. [#requires-lm-studio-040-or-newer] + +LM Studio supports API Tokens for authentication, providing a secure and convenient way to access the LM Studio API. + +Require Authentication for each request [#require-authentication-for-each-request] + +By default, LM Studio does not require authentication for API requests. To enable authentication so that only requests with a valid API Token are accepted, toggle the switch in the Developers Page > Server Settings. + + + Once enabled, all requests made through the REST API, Python SDK, or Typescript SDK will need to include a valid API Token. See usage [below](#api-token-usage). + + + + + + +Creating API Tokens [#creating-api-tokens] + +To create API Tokens, click on Manage Tokens in the Server Settings. It will open the API Tokens modal where you can create, view, and delete API Tokens. + + + +Create a token by clicking on the Create Token button. Provide a name for the token and select the desired permissions. + + + +Once created, make sure to copy the token as it will not be shown again. + + + +Configuring API Token Permissions [#configuring-api-token-permissions] + +To edit the permissions of an existing API Token, click on the Edit button next to the token in the API Tokens modal. You can modify the name and permissions of the token. + + + +API Token Usage [#api-token-usage] + +Using API Tokens with REST API: [#using-api-tokens-with-rest-api] + + + The example below requires [allowing calling servers from mcp.json](/docs/developer/core/server/settings) to be enabled and the [Playwright MCP](https://github.com/microsoft/playwright-mcp) in mcp.json. + + +```bash +curl -X POST \ + http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "Open lmstudio.ai", + "integrations": [ + { + "type": "plugin", + "id": "mcp/playwright", + "allowed_tools": ["browser_navigate"] + } + ], + "context_length": 8000 + }' +``` + +Using API Tokens with Python SDK [#using-api-tokens-with-python-sdk] + +To use API tokens with the Python SDK, see the [Python SDK guide](/docs/python/getting-started/authentication). + +Using API Tokens with TypeScript SDK [#using-api-tokens-with-typescript-sdk] + +To use API tokens with the TypeScript SDK, see the [TS SDK guide](/docs/typescript/authentication). + + + + +LM Studio can be run as a background service without the GUI. There are two ways to do this: + +1. **llmster** (recommended) — a standalone daemon, no GUI required +2. **Desktop app in headless mode** — hide the UI and run the desktop app as a service + +Option 1: llmster (recommended) [#option-1-llmster-recommended] + +llmster is the core of the LM Studio desktop app, packaged to be server-native, without reliance on the GUI. It can run on Linux boxes, cloud servers, GPU rigs, or your local machine without the GUI. See the [LM Studio 0.4.0 release post](/blog/0.4.0) for more details. + +llmster + +Install llmster [#install-llmster] + +**Linux / Mac** + +```bash +curl -fsSL https://lmstudio.ai/install.sh | bash +``` + +**Windows** + +```bash +irm https://lmstudio.ai/install.ps1 | iex +``` + +Start llmster [#start-llmster] + +```bash +lms daemon up +``` + +See the [daemon CLI docs](/docs/cli/daemon/daemon-up) for full reference. + +For setting up llmster as a startup task on Linux, see [Linux Startup Task](/docs/developer/core/headless_llmster). + +Option 2: Desktop app in headless mode [#option-2-desktop-app-in-headless-mode] + +This works on Mac, Windows, and Linux machines with a graphical user interface. It's useful if you already have the desktop app installed and want it to run as a background service. + +Run the LLM service on machine login [#run-the-llm-service-on-machine-login] + +Head to app settings (`Cmd` / `Ctrl` + `,`) and check the box to run the LLM server on login. + + + +When this setting is enabled, exiting the app will minimize it to the system tray, and the LLM server will continue to run in the background. + +Auto Server Start [#auto-server-start] + +Your last server state will be saved and restored on app or service launch. + +To achieve this programmatically: + +```bash +lms server start +``` + +Just-In-Time (JIT) model loading for REST endpoints [#just-in-time-jit-model-loading-for-rest-endpoints] + +Applies to both options. Useful when using LM Studio as an LLM service with other frontends or applications. + + + +When JIT loading is ON: [#when-jit-loading-is-on] + +* Calls to OpenAI-compatible `/v1/models` will return all downloaded models, not only the ones loaded into memory +* Calls to inference endpoints will load the model into memory if it's not already loaded + +When JIT loading is OFF: [#when-jit-loading-is-off] + +* Calls to OpenAI-compatible `/v1/models` will return only the models loaded into memory +* You have to first load the model into memory before being able to use it + +What about auto unloading? [#what-about-auto-unloading] + +JIT loaded models will be auto-unloaded from memory by default after a set period of inactivity ([learn more](/docs/developer/core/ttl-and-auto-evict)). + +Community [#community] + +Chat with other LM Studio developers, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). + +Please report bugs and issues in the [lmstudio-bug-tracker](https://github.com/lmstudio-ai/lmstudio-bug-tracker/issues) GitHub repository. + + + + +`llmster`, LM Studio's headless daemon, can be configured to run on startup. This guide covers setting up `llmster` to launch, load a model, and start an HTTP server automatically using `systemctl` on Linux. + + + This guide is for Linux systems without a graphical interface. For machines with a GUI, you can configure LM Studio to [run as a service on login](/docs/developer/core/headless) instead. + + +Install the Daemon [#install-the-daemon] + +Run the following command to install `llmster`: + +```bash +curl -fsSL https://lmstudio.ai/install.sh | bash +``` + +Verify the installation: + +```bash +lms --help +``` + +Download a Model [#download-a-model] + +Download a model to use with the server: + +```bash +lms get openai/gpt-oss-20b +``` + +The output will show the model path. You'll need this for the systemd configuration. + +Manual Test [#manual-test] + +Before configuring systemd, verify everything works manually. + +Load the model: + +```bash +lms load openai/gpt-oss-20b +``` + +Start the server: + +```bash +lms server start +``` + +Verify the API is responding: + +```bash +curl http://localhost:1234/v1/models +``` + +Stop the server when done testing: + +```bash +lms server stop +``` + +Create Systemd Service [#create-systemd-service] + +Create `/etc/systemd/system/lmstudio.service`. Replace `YOUR_USERNAME` with your username. + +```ini +[Unit] +Description=LM Studio Server + +[Service] +Type=oneshot +RemainAfterExit=yes +User=YOUR_USERNAME +Environment="HOME=/home/YOUR_USERNAME" +ExecStartPre=/home/YOUR_USERNAME/.lmstudio/bin/lms daemon up +ExecStartPre=/home/YOUR_USERNAME/.lmstudio/bin/lms load openai/gpt-oss-20b --yes +ExecStart=/home/YOUR_USERNAME/.lmstudio/bin/lms server start +ExecStop=/home/YOUR_USERNAME/.lmstudio/bin/lms daemon down + +[Install] +WantedBy=multi-user.target +``` + +This unit automatically loads the `openai/gpt-oss-20b` model on startup. Alternatively, you can avoid loading a specific model on startup and instead rely on [Just-In-Time (JIT) loading and Eviction](/docs/developer/core/ttl-and-auto-evict) in the server. + +Enable and Start the Service [#enable-and-start-the-service] + +```bash +sudo systemctl daemon-reload +sudo systemctl enable lmstudio.service +sudo systemctl start lmstudio.service +``` + +Verify [#verify] + +Check the service status: + +```bash +systemctl status lmstudio +``` + +Test the API: + +```bash +curl http://localhost:1234/v1/models +``` + +Service Management [#service-management] + +```bash +# Stop the service +sudo systemctl stop lmstudio + +# Restart the service +sudo systemctl restart lmstudio + +# Disable auto-start +sudo systemctl disable lmstudio +``` + +Community [#community] + +Chat with other LM Studio developers, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). + +Please report bugs and issues in the [lmstudio-bug-tracker](https://github.com/lmstudio-ai/lmstudio-bug-tracker/issues) GitHub repository. + + + + +Overview [#overview] + +With [LM Link](/docs/lmlink), you can use a model loaded on a remote device as if it were loaded locally — from any machine on the same link. This naturally extends to the REST API and SDK: your laptop can make requests to `localhost` and have them served by a powerful remote machine on your network. + +Requests to `localhost` still work as normal. LM Studio internally uses the model on the remote device as if it were loaded locally. For models present on multiple devices, the REST API will use the model on the preferred device. + + + +The preferred device setting is per-machine. Each device on the link independently controls which remote machine it prefers. See [how to set a preferred device](/docs/lmlink/basics/preferred-device) for more details. + +Use the REST API as normal [#use-the-rest-api-as-normal] + +Use the REST API exactly as you would locally. See the [REST API docs](/docs/developer/rest) for usage details. + +If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) + + + + +Requires LM Studio 0.4.0 or newer. [#requires-lm-studio-040-or-newer] + +LM Studio supports Model Context Protocol (MCP) usage via API. MCP allows models to interact with external tools and services through standardized servers. + +How it works [#how-it-works] + +MCP servers provide tools that models can call during chat requests. You can enable MCP servers in two ways: as ephemeral servers defined per-request, or as pre-configured servers in your `mcp.json` file. + +Ephemeral vs mcp.json servers [#ephemeral-vs-mcpjson-servers] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Feature + + Ephemeral + + mcp.json +
+ How to specify in request + + integrations + + -> + + "type": "ephemeral_mcp" + + integrations + + -> + + "type": "plugin" +
+ Configuration + + Only defined per-request + + Pre-configured in + + mcp.json +
+ Use case + + One-off requests, remote MCP tool execution + + MCP servers that require + + command + + , frequently used servers +
+ Server ID + + Specified via + + server_label + + in integration + + Specified via + + id + + (e.g., + + mcp/playwright + + ) in integration +
+ Custom headers + + Supported via + + headers + + field + + Configured in + + mcp.json +
+ +Ephemeral MCP servers [#ephemeral-mcp-servers] + +Ephemeral MCP servers are defined on-the-fly in each request. This is useful for testing or when you don't want to pre-configure servers. + + + Ephemeral MCP servers require the "Allow per-request MCPs" setting to be enabled in [Server Settings](/docs/developer/core/server/settings). + + + + + + curl + + + + Python + + + + TypeScript + + + + + ```bash + curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "What is the top trending model on hugging face?", + "integrations": [ + { + "type": "ephemeral_mcp", + "server_label": "huggingface", + "server_url": "https://huggingface.co/mcp", + "allowed_tools": ["model_search"] + } + ], + "context_length": 8000 + }' + ``` + + + + ```python + import os + import requests + import json + + response = requests.post( + "http://localhost:1234/api/v1/chat", + headers={ + "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", + "Content-Type": "application/json" + }, + json={ + "model": "ibm/granite-4-micro", + "input": "What is the top trending model on hugging face?", + "integrations": [ + { + "type": "ephemeral_mcp", + "server_label": "huggingface", + "server_url": "https://huggingface.co/mcp", + "allowed_tools": ["model_search"] + } + ], + "context_length": 8000 + } + ) + print(json.dumps(response.json(), indent=2)) + ``` + + + + ```typescript + const response = await fetch("http://localhost:1234/api/v1/chat", { + method: "POST", + headers: { + "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, + "Content-Type": "application/json" + }, + body: JSON.stringify({ + "model": "ibm/granite-4-micro", + "input": "What is the top trending model on hugging face?", + "integrations": [ + { + "type": "ephemeral_mcp", + "server_label": "huggingface", + "server_url": "https://huggingface.co/mcp", + "allowed_tools": ["model_search"] + } + ], + "context_length": 8000 + }); + const data = await response.json(); + console.log(data); + ``` + + + +The model can now call tools from the specified MCP server: + +```json +{ + "model_instance_id": "ibm/granite-4-micro", + "output": [ + { + "type": "reasoning", + "content": "..." + }, + { + "type": "message", + "content": "..." + }, + { + "type": "tool_call", + "tool": "model_search", + "arguments": { + "sort": "trendingScore", + "limit": 1 + }, + "output": "...", + "provider_info": { + "server_label": "huggingface", + "type": "ephemeral_mcp" + } + }, + { + "type": "reasoning", + "content": "\n" + }, + { + "type": "message", + "content": "The top trending model is ..." + } + ], + "stats": { + "input_tokens": 419, + "total_output_tokens": 362, + "reasoning_output_tokens": 195, + "tokens_per_second": 27.620159487314744, + "time_to_first_token_seconds": 1.437 + }, + "response_id": "resp_7c1a08e3d6e279efcfecb02df9de7cbd316e93422d0bb5cb" +} +``` + +MCP servers from mcp.json [#mcp-servers-from-mcpjson] + +MCP servers can be pre-configured in your `mcp.json` file. This is the recommended approach for using MCP servers that take actions on your computer (like [microsoft/playwright-mcp](https://github.com/microsoft/playwright-mcp)) and servers that you use frequently. + + + MCP servers from mcp.json require the "Allow calling servers from mcp.json" setting to be enabled in [Server Settings](/docs/developer/core/server/settings). + + + + + + + + curl + + + + Python + + + + TypeScript + + + + + ```bash + curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "Open lmstudio.ai", + "integrations": ["mcp/playwright"], + "context_length": 8000, + "temperature": 0 + }' + ``` + + + + ```python + import os + import requests + import json + + response = requests.post( + "http://localhost:1234/api/v1/chat", + headers={ + "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", + "Content-Type": "application/json" + }, + json={ + "model": "ibm/granite-4-micro", + "input": "Open lmstudio.ai", + "integrations": ["mcp/playwright"], + "context_length": 8000, + "temperature": 0 + } + ) + print(json.dumps(response.json(), indent=2)) + ``` + + + + ```typescript + const response = await fetch("http://localhost:1234/api/v1/chat", { + method: "POST", + headers: { + "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, + "Content-Type": "application/json" + }, + body: JSON.stringify({ + model: "ibm/granite-4-micro", + input: "Open lmstudio.ai", + integrations: ["mcp/playwright"], + context_length: 8000, + temperature: 0 + }) + }); + const data = await response.json(); + console.log(data); + ``` + + + +The response includes tool calls from the configured MCP server: + +```json +{ + "model_instance_id": "ibm/granite-4-micro", + "output": [ + { + "type": "reasoning", + "content": "..." + }, + { + "type": "message", + "content": "..." + }, + { + "type": "tool_call", + "tool": "browser_navigate", + "arguments": { + "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" + }, + "output": "...", + "provider_info": { + "plugin_id": "mcp/playwright", + "type": "plugin" + } + }, + { + "type": "reasoning", + "content": "..." + }, + { + "type": "message", + "content": "The YouTube video page for ..." + } + ], + "stats": { + "input_tokens": 2614, + "total_output_tokens": 594, + "reasoning_output_tokens": 389, + "tokens_per_second": 26.293245822877495, + "time_to_first_token_seconds": 0.154 + }, + "response_id": "resp_cdac6a9b5e2a40027112e441ce6189db18c9040f96736407" +} +``` + +Restricting tool access [#restricting-tool-access] + +For both ephemeral and mcp.json servers, you can limit which tools the model can call using the `allowed_tools` field. This is useful if you do not want certain tools from an MCP server to be used, and can speed up prompt processing due to the model receiving fewer tool definitions. + + + + + curl + + + + Python + + + + TypeScript + + + + + ```bash + curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "What is the top trending model on hugging face?", + "integrations": [ + { + "type": "ephemeral_mcp", + "server_label": "huggingface", + "server_url": "https://huggingface.co/mcp", + "allowed_tools": ["model_search"] + } + ], + "context_length": 8000 + }' + ``` + + + + ```python + import os + import requests + import json + + response = requests.post( + "http://localhost:1234/api/v1/chat", + headers={ + "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", + "Content-Type": "application/json" + }, + json={ + "model": "ibm/granite-4-micro", + "input": "What is the top trending model on hugging face?", + "integrations": [ + { + "type": "ephemeral_mcp", + "server_label": "huggingface", + "server_url": "https://huggingface.co/mcp", + "allowed_tools": ["model_search"] + } + ], + "context_length": 8000 + } + ) + print(json.dumps(response.json(), indent=2)) + ``` + + + + ```typescript + const response = await fetch("http://localhost:1234/api/v1/chat", { + method: "POST", + headers: { + "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, + "Content-Type": "application/json" + }, + body: JSON.stringify({ + model: "ibm/granite-4-micro", + input: "What is the top trending model on hugging face?", + integrations: [ + { + type: "ephemeral_mcp", + server_label: "huggingface", + server_url: "https://huggingface.co/mcp", + allowed_tools: ["model_search"] + } + ], + context_length: 8000 + }) + }); + const data = await response.json(); + console.log(data); + ``` + + + +If `allowed_tools` is not provided, all tools from the server are available to the model. + +Custom headers for ephemeral servers [#custom-headers-for-ephemeral-servers] + +When using ephemeral MCP servers that require authentication, you can pass custom headers: + + + + + curl + + + + Python + + + + TypeScript + + + + + ```bash + curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "Give me details about my SUPER-SECRET-PRIVATE Hugging face model", + "integrations": [ + { + "type": "ephemeral_mcp", + "server_label": "huggingface", + "server_url": "https://huggingface.co/mcp", + "allowed_tools": ["model_search"], + "headers": { + "Authorization": "Bearer " + } + } + ], + "context_length": 8000 + }' + ``` + + + + ```python + import os + import requests + import json + + response = requests.post( + "http://localhost:1234/api/v1/chat", + headers={ + "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", + "Content-Type": "application/json" + }, + json={ + "model": "ibm/granite-4-micro", + "input": "Give me details about my SUPER-SECRET-PRIVATE Hugging face model", + "integrations": [ + { + "type": "ephemeral_mcp", + "server_label": "huggingface", + "server_url": "https://huggingface.co/mcp", + "allowed_tools": ["model_search"], + "headers": { + "Authorization": "Bearer " + } + } + ], + "context_length": 8000 + } + ) + print(json.dumps(response.json(), indent=2)) + ``` + + + + ```typescript + const response = await fetch("http://localhost:1234/api/v1/chat", { + method: "POST", + headers: { + "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, + "Content-Type": "application/json" + }, + body: JSON.stringify({ + model: "ibm/granite-4-micro", + input: "Give me details about my SUPER-SECRET-PRIVATE Hugging face model", + integrations: [ + { + type: "ephemeral_mcp", + server_label: "huggingface", + server_url: "https://huggingface.co/mcp", + allowed_tools: ["model_search"], + headers: { + Authorization: "Bearer " + } + } + ], + context_length: 8000 + }) + const data = await response.json(); + console.log(data); + ``` + + + + + + +Background [#background] + +* `JIT loading` makes it easy to use your LM Studio models in other apps: you don't need to manually load the model first before being able to use it. However, this also means that models can stay loaded in memory even when they're not being used. `[Default: enabled]` + +* (New) `Idle TTL` (technically: Time-To-Live) defines how long a model can stay loaded in memory without receiving any requests. When the TTL expires, the model is automatically unloaded from memory. You can set a TTL using the `ttl` field in your request payload. `[Default: 60 minutes]` + +* (New) `Auto-Evict` is a feature that unloads previously JIT loaded models before loading new ones. This enables easy switching between models from client apps without having to manually unload them first. You can enable or disable this feature in Developer tab > Server Settings. `[Default: enabled]` + +Idle TTL [#idle-ttl] + +**Use case**: imagine you're using an app like [Zed](https://github.com/zed-industries/zed/blob/main/crates/lmstudio/src/lmstudio.rs#L340), [Cline](https://github.com/cline/cline/blob/main/src/api/providers/lmstudio.ts), or [Continue.dev](https://docs.continue.dev/customize/model-providers/more/lmstudio) to interact with LLMs served by LM Studio. These apps leverage JIT to load models on-demand the first time you use them. + +**Problem**: When you're not actively using a model, you might don't want it to remain loaded in memory. + +**Solution**: Set a TTL for models loaded via API requests. The idle timer resets every time the model receives a request, so it won't disappear while you use it. A model is considered idle if it's not doing any work. When the idle TTL expires, the model is automatically unloaded from memory. + +Set App-default Idle TTL [#set-app-default-idle-ttl] + +By default, JIT-loaded models have a TTL of 60 minutes. You can configure a default TTL value for any model loaded via JIT like so: + + + +Set per-model TTL-model in API requests [#set-per-model-ttl-model-in-api-requests] + +When JIT loading is enabled, the **first request** to a model will load it into memory. You can specify a TTL for that model in the request payload. + +This works for requests targeting both the [OpenAI compatibility API](/docs/developer/openai-api) and the [LM Studio's REST API](/docs/developer/rest): + +```diff +curl http://localhost:1234/api/v0/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "deepseek-r1-distill-qwen-7b", ++ "ttl": 300, + "messages": [ ... ] +}' +``` + +This will set a TTL of 5 minutes (300 seconds) for this model if it is JIT loaded. [#this-will-set-a-ttl-of-5-minutes-300-seconds-for-this-model-if-it-is-jit-loaded] + +Set TTL for models loaded with `lms` [#set-ttl-for-models-loaded-with-lms] + +By default, models loaded with `lms load` do not have a TTL, and will remain loaded in memory until you manually unload them. + +You can set a TTL for a model loaded with `lms` like so: + +```bash +lms load --ttl 3600 +``` + +Load a `` with a TTL of 1 hour (3600 seconds) [#load-a-model-with-a-ttl-of-1-hour-3600-seconds] + +Specify TTL when loading models in the server tab [#specify-ttl-when-loading-models-in-the-server-tab] + +You can also set a TTL when loading a model in the server tab like so + + + +Configure Auto-Evict for JIT loaded models [#configure-auto-evict-for-jit-loaded-models] + +With this setting, you can ensure new models loaded via JIT automatically unload previously loaded models first. + +This is useful when you want to switch between models from another app without worrying about memory building up with unused models. + + + +**When Auto-Evict is ON** (default): + +* At most `1` model is kept loaded in memory at a time (when loaded via JIT) +* Non-JIT loaded models are not affected + +**When Auto-Evict is OFF**: + +* Switching models from an external app will keep previous models loaded in memory +* Models will remain loaded until either: + * Their TTL expires + * You manually unload them + +This feature works in tandem with TTL to provide better memory management for your workflow. + +Nomenclature [#nomenclature] + +`TTL`: Time-To-Live, is a term borrowed from networking protocols and cache systems. It defines how long a resource can remain allocated before it's considered stale and evicted. + + + + + + + `POST /api/v1/chat` + + **Request body** + + + + + + + + + Request with MCP + + + + Request with Images + + + + + ```bash + curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "Tell me the top trending model on hugging face and navigate to https://lmstudio.ai", + "integrations": [ + { + "type": "ephemeral_mcp", + "server_label": "huggingface", + "server_url": "https://huggingface.co/mcp", + "allowed_tools": [ + "model_search" + ] + }, + { + "type": "plugin", + "id": "mcp/playwright", + "allowed_tools": [ + "browser_navigate" + ] + } + ], + "context_length": 8000, + "temperature": 0 + }' + ``` + + + + ```bash + # Image is a small red square encoded as a base64 data URL + curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "qwen/qwen3-vl-4b", + "input": [ + { + "type": "text", + "content": "Describe this image in two sentences" + }, + { + "type": "image", + "data_url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAFUlEQVR42mP8z8BQz0AEYBxVSF+FABJADveWkH6oAAAAAElFTkSuQmCC" + } + ], + "context_length": 2048, + "temperature": 0 + }' + ``` + + + + + +*** + + + + **Response fields** + + + + + + + + + Request with MCP + + + + Request with Images + + + + + ```json + { + "model_instance_id": "ibm/granite-4-micro", + "output": [ + { + "type": "tool_call", + "tool": "model_search", + "arguments": { + "sort": "trendingScore", + "query": "", + "limit": 1 + }, + "output": "...", + "provider_info": { + "server_label": "huggingface", + "type": "ephemeral_mcp" + } + }, + { + "type": "message", + "content": "..." + }, + { + "type": "tool_call", + "tool": "browser_navigate", + "arguments": { + "url": "https://lmstudio.ai" + }, + "output": "...", + "provider_info": { + "plugin_id": "mcp/playwright", + "type": "plugin" + } + }, + { + "type": "message", + "content": "**Top Trending Model on Hugging Face** ... Below is a quick snapshot of what’s on the landing page ... more details on the model or LM Studio itself!" + } + ], + "stats": { + "input_tokens": 646, + "total_output_tokens": 586, + "reasoning_output_tokens": 0, + "tokens_per_second": 29.753900615398926, + "time_to_first_token_seconds": 1.088, + "model_load_time_seconds": 2.656 + }, + "response_id": "resp_4ef013eba0def1ed23f19dde72b67974c579113f544086de" + } + ``` + + + + ```json + { + "model_instance_id": "qwen/qwen3-vl-4b", + "output": [ + { + "type": "message", + "content": "This image is a solid, vibrant red square that fills the entire frame, with no discernible texture, pattern, or other elements. It presents a minimalist, uniform visual field of pure red, evoking a sense of boldness or urgency." + } + ], + "stats": { + "input_tokens": 17, + "total_output_tokens": 50, + "reasoning_output_tokens": 0, + "tokens_per_second": 51.03762685242662, + "time_to_first_token_seconds": 0.814 + }, + "response_id": "resp_0182bd7c479d7451f9a35471f9c26b34de87a7255856b9a4" + } + ``` + + + + + + + + + + + `GET /api/v1/models/download/status/:job_id` + + **Path parameters** + + + + + + ```bash title="Example Request" + curl -H "Authorization: Bearer $LM_API_TOKEN" \ + http://localhost:1234/api/v1/models/download/status/job_493c7c9ded + ``` + + + + + + **Response fields** + + Returns a single download job status object. The response varies based on the download status. + + + + + + ```json title="Response" + { + "job_id": "job_493c7c9ded", + "status": "completed", + "total_size_bytes": 2279145003, + "downloaded_bytes": 2279145003, + "started_at": "2025-10-03T15:33:23.496Z", + "completed_at": "2025-10-03T15:43:12.102Z" + } + ``` + + + + + + + + + `POST /api/v1/models/download` + + **Request body** + + + + + + ```bash title="Example Request" + curl http://localhost:1234/api/v1/models/download \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro" + }' + ``` + + + + + + **Response fields** + + Returns a download job status object. The response varies based on the download status. + + + + + + ```json title="Response" + { + "job_id": "job_493c7c9ded", + "status": "downloading", + "total_size_bytes": 2279145003, + "started_at": "2025-10-03T15:33:23.496Z" + } + ``` + + + + + + + + LM Studio now has a [v1 REST API](/docs/developer/rest)! We recommend using the v1 API for new projects! + + +Requires LM Studio 0.3.6 or newer. [#requires-lm-studio-036-or-newer] + +LM Studio now has its own REST API, in addition to OpenAI-compatible endpoints ([learn more](/docs/developer/openai-compat)) and Anthropic-compatible endpoints ([learn more](/docs/developer/anthropic-compat)). + +The REST API includes enhanced stats such as Token / Second and Time To First Token (TTFT), as well as rich information about models such as loaded vs unloaded, max context, quantization, and more. + +Supported API Endpoints [#supported-api-endpoints] + +* [`GET /api/v0/models`](#get-apiv0models) - List available models +* [`GET /api/v0/models/{model}`](#get-apiv0modelsmodel) - Get info about a specific model +* [`POST /api/v0/chat/completions`](#post-apiv0chatcompletions) - Chat Completions (messages -> assistant response) +* [`POST /api/v0/completions`](#post-apiv0completions) - Text Completions (prompt -> completion) +* [`POST /api/v0/embeddings`](#post-apiv0embeddings) - Text Embeddings (text -> embedding) + +*** + +Start the REST API server [#start-the-rest-api-server] + +To start the server, run the following command: + +```bash +lms server start +``` + + + You can run LM Studio as a service and get the server to auto-start on boot without launching the GUI. [Learn about Headless Mode](/docs/developer/core/headless). + + +Endpoints [#endpoints] + +`GET /api/v0/models` [#get-apiv0models] + +List all loaded and downloaded models + +**Example request** + +```bash +curl -H "Authorization: Bearer $LM_API_TOKEN" http://localhost:1234/api/v0/models +``` + +**Response format** + +```json +{ + "object": "list", + "data": [ + { + "id": "qwen2-vl-7b-instruct", + "object": "model", + "type": "vlm", + "publisher": "mlx-community", + "arch": "qwen2_vl", + "compatibility_type": "mlx", + "quantization": "4bit", + "state": "not-loaded", + "max_context_length": 32768 + }, + { + "id": "meta-llama-3.1-8b-instruct", + "object": "model", + "type": "llm", + "publisher": "lmstudio-community", + "arch": "llama", + "compatibility_type": "gguf", + "quantization": "Q4_K_M", + "state": "not-loaded", + "max_context_length": 131072 + }, + { + "id": "text-embedding-nomic-embed-text-v1.5", + "object": "model", + "type": "embeddings", + "publisher": "nomic-ai", + "arch": "nomic-bert", + "compatibility_type": "gguf", + "quantization": "Q4_0", + "state": "not-loaded", + "max_context_length": 2048 + } + ] +} +``` + +*** + +`GET /api/v0/models/{model}` [#get-apiv0modelsmodel] + +Get info about one specific model + +**Example request** + +```bash +curl -H "Authorization: Bearer $LM_API_TOKEN" http://localhost:1234/api/v0/models/qwen2-vl-7b-instruct +``` + +**Response format** + +```json +{ + "id": "qwen2-vl-7b-instruct", + "object": "model", + "type": "vlm", + "publisher": "mlx-community", + "arch": "qwen2_vl", + "compatibility_type": "mlx", + "quantization": "4bit", + "state": "not-loaded", + "max_context_length": 32768 +} +``` + +*** + +`POST /api/v0/chat/completions` [#post-apiv0chatcompletions] + +Chat Completions API. You provide a messages array and receive the next assistant response in the chat. + +**Example request** + +```bash +curl http://localhost:1234/api/v0/chat/completions \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "granite-3.0-2b-instruct", + "messages": [ + { "role": "system", "content": "Always answer in rhymes." }, + { "role": "user", "content": "Introduce yourself." } + ], + "temperature": 0.7, + "max_tokens": -1, + "stream": false + }' +``` + +**Response format** + +```json +{ + "id": "chatcmpl-i3gkjwthhw96whukek9tz", + "object": "chat.completion", + "created": 1731990317, + "model": "granite-3.0-2b-instruct", + "choices": [ + { + "index": 0, + "logprobs": null, + "finish_reason": "stop", + "message": { + "role": "assistant", + "content": "Greetings, I'm a helpful AI, here to assist,\nIn providing answers, with no distress.\nI'll keep it short and sweet, in rhyme you'll find,\nA friendly companion, all day long you'll bind." + } + } + ], + "usage": { + "prompt_tokens": 24, + "completion_tokens": 53, + "total_tokens": 77 + }, + "stats": { + "tokens_per_second": 51.43709529007664, + "time_to_first_token": 0.111, + "generation_time": 0.954, + "stop_reason": "eosFound" + }, + "model_info": { + "arch": "granite", + "quant": "Q4_K_M", + "format": "gguf", + "context_length": 4096 + }, + "runtime": { + "name": "llama.cpp-mac-arm64-apple-metal-advsimd", + "version": "1.3.0", + "supported_formats": ["gguf"] + } +} +``` + +*** + +`POST /api/v0/completions` [#post-apiv0completions] + +Text Completions API. You provide a prompt and receive a completion. + +**Example request** + +```bash +curl http://localhost:1234/api/v0/completions \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "granite-3.0-2b-instruct", + "prompt": "the meaning of life is", + "temperature": 0.7, + "max_tokens": 10, + "stream": false, + "stop": "\n" + }' +``` + +**Response format** + +```json +{ + "id": "cmpl-p9rtxv6fky2v9k8jrd8cc", + "object": "text_completion", + "created": 1731990488, + "model": "granite-3.0-2b-instruct", + "choices": [ + { + "index": 0, + "text": " to find your purpose, and once you have", + "logprobs": null, + "finish_reason": "length" + } + ], + "usage": { + "prompt_tokens": 5, + "completion_tokens": 9, + "total_tokens": 14 + }, + "stats": { + "tokens_per_second": 57.69230769230769, + "time_to_first_token": 0.299, + "generation_time": 0.156, + "stop_reason": "maxPredictedTokensReached" + }, + "model_info": { + "arch": "granite", + "quant": "Q4_K_M", + "format": "gguf", + "context_length": 4096 + }, + "runtime": { + "name": "llama.cpp-mac-arm64-apple-metal-advsimd", + "version": "1.3.0", + "supported_formats": ["gguf"] + } +} +``` + +*** + +`POST /api/v0/embeddings` [#post-apiv0embeddings] + +Text Embeddings API. You provide a text and a representation of the text as an embedding vector is returned. + +**Example request** + +```bash +curl http://localhost:1234/api/v0/embeddings \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "text-embedding-nomic-embed-text-v1.5", + "input": "Some text to embed" + } +``` + +**Example response** + +```json +{ + "object": "list", + "data": [ + { + "object": "embedding", + "embedding": [ + -0.016731496900320053, + 0.028460891917347908, + -0.1407836228609085, + ... (truncated for brevity) ..., + 0.02505224384367466, + -0.0037634256295859814, + -0.04341062530875206 + ], + "index": 0 + } + ], + "model": "text-embedding-nomic-embed-text-v1.5@q4_k_m", + "usage": { + "prompt_tokens": 0, + "total_tokens": 0 + } +} +``` + +*** + +Please report bugs by opening an issue on [Github](https://github.com/lmstudio-ai/lmstudio-bug-tracker/issues). + + + + +LM Studio offers a powerful REST API with first-class support for local inference and model management. In addition to our native API, we provide OpenAI-compatible endpoints ([learn more](/docs/developer/openai-compat)) and Anthropic-compatible endpoints ([learn more](/docs/developer/anthropic-compat)). + +What's new [#whats-new] + +Previously, there was a [v0 REST API](/docs/developer/rest/endpoints). With LM Studio 0.4.0, we have officially released our native v1 REST API at `/api/v1/*` endpoints and recommend using it. + +The v1 REST API includes enhanced features such as: + +* [MCP via API](/docs/developer/core/mcp) +* [Stateful chats](/docs/developer/rest/stateful-chats) +* [Authentication](/docs/developer/core/authentication) configuration with API tokens +* Model [download](/docs/developer/rest/download), [load](/docs/developer/rest/load) and [unload](/docs/developer/rest/unload) endpoints + +Supported endpoints [#supported-endpoints] + +The following endpoints are available in LM Studio's v1 REST API. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Endpoint + + Method + + Docs +
+ /api/v1/chat + + + + Chat +
+ /api/v1/models + + + + List Models +
+ /api/v1/models/load + + + + Load +
+ /api/v1/models/unload + + + + Unload +
+ /api/v1/models/download + + + + Download +
+ /api/v1/models/download/status + + + + Download Status +
+ +Inference endpoint comparison [#inference-endpoint-comparison] + +The table below compares the features of LM Studio's `/api/v1/chat` endpoint with OpenAI-compatible and Anthropic-compatible inference endpoints. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Feature + + /api/v1/chat + + /v1/responses + + /v1/chat/completions + + /v1/messages +
+ Streaming + + ✅ + + ✅ + + ✅ + + ✅ +
+ Stateful chat + + ✅ + + ✅ + + ❌ + + ❌ +
+ Remote MCPs + + ✅ + + ✅ + + ❌ + + ❌ +
+ MCPs you have in LM Studio + + ✅ + + ✅ + + ❌ + + ❌ +
+ Custom tools + + ❌ + + ✅ + + ✅ + + ✅ +
+ Include assistant messages in the request + + ❌ + + ✅ + + ✅ + + ✅ +
+ Model load streaming events + + ✅ + + ❌ + + ❌ + + ❌ +
+ Prompt processing streaming events + + ✅ + + ❌ + + ❌ + + ❌ +
+ Specify context length in the request + + ✅ + + ❌ + + ❌ + + ❌ +
+ +*** + +Please report bugs by opening an issue on [Github](https://github.com/lmstudio-ai/lmstudio-bug-tracker/issues). + + + + + + + `GET /api/v1/models` + + This endpoint has no request parameters. + + + + ```bash title="Example Request" + curl http://localhost:1234/api/v1/models \ + -H "Authorization: Bearer $LM_API_TOKEN" + ``` + + + +*** + + + + **Response fields** + + + + + + ```json title="Response" + { + "models": [ + { + "type": "llm", + "publisher": "google", + "key": "google/gemma-4-26b-a4b", + "display_name": "Gemma 4 26B A4B", + "architecture": "gemma4", + "quantization": { + "name": "Q4_K_M", + "bits_per_weight": 4 + }, + "size_bytes": 17990911801, + "params_string": "26B-A4B", + "loaded_instances": [ + { + "id": "google/gemma-4-26b-a4b", + "config": { + "context_length": 4096, + "eval_batch_size": 512, + "parallel": 4, + "flash_attention": true, + "num_experts": 8, + "offload_kv_cache_to_gpu": true + } + } + ], + "max_context_length": 262144, + "format": "gguf", + "capabilities": { + "vision": true, + "trained_for_tool_use": true, + "reasoning": { + "allowed_options": [ + "off", + "on" + ], + "default": "on" + } + }, + "description": null, + "variants": [ + "google/gemma-4-26b-a4b@q4_k_m" + ], + "selected_variant": "google/gemma-4-26b-a4b@q4_k_m" + }, + { + "type": "llm", + "publisher": "deepseek", + "key": "deepseek-r1", + "display_name": "DeepSeek R1", + "architecture": "deepseek", + "quantization": { + "name": "Q4_K_M", + "bits_per_weight": 4 + }, + "size_bytes": 40492610355, + "params_string": "671B", + "loaded_instances": [], + "max_context_length": 131072, + "format": "gguf", + "capabilities": { + "vision": false, + "trained_for_tool_use": true, + "reasoning": { + "allowed_options": ["on"], + "default": "on" + } + }, + "description": null + }, + { + "type": "embedding", + "publisher": "gaianet", + "key": "text-embedding-nomic-embed-text-v1.5-embedding", + "display_name": "Nomic Embed Text v1.5", + "quantization": { + "name": "F16", + "bits_per_weight": 16 + }, + "size_bytes": 274290560, + "params_string": null, + "loaded_instances": [], + "max_context_length": 2048, + "format": "gguf" + } + ] + } + ``` + + + + + + + + + `POST /api/v1/models/load` + + **Request body** + + + + + + ```bash title="Example Request" + curl http://localhost:1234/api/v1/models/load \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "openai/gpt-oss-20b", + "context_length": 16384, + "flash_attention": true, + "echo_load_config": true + }' + ``` + + + +*** + + + + **Response fields** + + + + + + ```json title="Response" + { + "type": "llm", + "instance_id": "openai/gpt-oss-20b", + "load_time_seconds": 9.099, + "status": "loaded", + "load_config": { + "context_length": 16384, + "eval_batch_size": 512, + "flash_attention": true, + "offload_kv_cache_to_gpu": true, + "num_experts": 4 + } + } + ``` + + + + + + +Start the server [#start-the-server] + +[Install](/download) and launch LM Studio. + +Then ensure the server is running through the toggle at the top left of the Developer page, or through [lms](/docs/cli) in the terminal: + +```bash +lms server start +``` + +By default, the server is available at `http://localhost:1234`. + +If you don't have a model downloaded yet, you can download the model: + +```bash +lms get ibm/granite-4-micro +``` + +API Authentication [#api-authentication] + +By default, the LM Studio API server does **not** require authentication. You can configure the server to require authentication by API token in the [server settings](/docs/developer/core/server/settings) for added security. + +To authenticate API requests, generate an API token from the Developer page in LM Studio, and include it in the `Authorization` header of your requests as follows: `Authorization: Bearer $LM_API_TOKEN`. Read more about authentication [here](/docs/developer/core/authentication). + +Chat with a model [#chat-with-a-model] + +Use the chat endpoint to send a message to a model. By default, the model will be automatically loaded if it is not already. + +The `/api/v1/chat` endpoint is stateful, which means you do not need to pass the full history in every request. Read more about it [here](/docs/developer/rest/stateful-chats). + + + + + curl + + + + Python + + + + TypeScript + + + + + ```bash + curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "Write a short haiku about sunrise." + }' + ``` + + + + ```python + import os + import requests + import json + + response = requests.post( + "http://localhost:1234/api/v1/chat", + headers={ + "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", + "Content-Type": "application/json" + }, + json={ + "model": "ibm/granite-4-micro", + "input": "Write a short haiku about sunrise." + } + ) + print(json.dumps(response.json(), indent=2)) + ``` + + + + ```typescript + const response = await fetch("http://localhost:1234/api/v1/chat", { + method: "POST", + headers: { + "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, + "Content-Type": "application/json" + }, + body: JSON.stringify({ + model: "ibm/granite-4-micro", + input: "Write a short haiku about sunrise." + }) + }); + const data = await response.json(); + console.log(data); + ``` + + + +See the full [chat](/docs/developer/rest/chat) docs for more details. + +Use MCP servers via API [#use-mcp-servers-via-api] + +Enable the model interact with ephemeral Model Context Protocol (MCP) servers in `/api/v1/chat` by specifying servers in the `integrations` field. + + + + + curl + + + + Python + + + + TypeScript + + + + + ```bash + curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "What is the top trending model on hugging face?", + "integrations": [ + { + "type": "ephemeral_mcp", + "server_label": "huggingface", + "server_url": "https://huggingface.co/mcp", + "allowed_tools": ["model_search"] + } + ], + "context_length": 8000 + }' + ``` + + + + ```python + import os + import requests + import json + + response = requests.post( + "http://localhost:1234/api/v1/chat", + headers={ + "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", + "Content-Type": "application/json" + }, + json={ + "model": "ibm/granite-4-micro", + "input": "What is the top trending model on hugging face?", + "integrations": [ + { + "type": "ephemeral_mcp", + "server_label": "huggingface", + "server_url": "https://huggingface.co/mcp", + "allowed_tools": ["model_search"] + } + ], + "context_length": 8000 + } + ) + print(json.dumps(response.json(), indent=2)) + ``` + + + + ```typescript + const response = await fetch("http://localhost:1234/api/v1/chat", { + method: "POST", + headers: { + "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, + "Content-Type": "application/json" + }, + body: JSON.stringify({ + model: "ibm/granite-4-micro", + input: "What is the top trending model on hugging face?", + integrations: [ + { + type: "ephemeral_mcp", + server_label: "huggingface", + server_url: "https://huggingface.co/mcp", + allowed_tools: ["model_search"] + } + ], + context_length: 8000 + }) + const data = await response.json(); + console.log(data); + ``` + + + +You can also use locally configured MCP plugins (from your `mcp.json`) via the `integrations` field. Using locally run MCP plugins requires authentication via an API token passed through the `Authorization` header. Read more about authentication [here](/docs/developer/core/authentication). + + + + + curl + + + + Python + + + + TypeScript + + + + + ```bash + curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "Open lmstudio.ai", + "integrations": [ + { + "type": "plugin", + "id": "mcp/playwright", + "allowed_tools": ["browser_navigate"] + } + ], + "context_length": 8000 + }' + ``` + + + + ```python + import os + import requests + import json + + response = requests.post( + "http://localhost:1234/api/v1/chat", + headers={ + "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", + "Content-Type": "application/json" + }, + json={ + "model": "ibm/granite-4-micro", + "input": "Open lmstudio.ai", + "integrations": [ + { + "type": "plugin", + "id": "mcp/playwright", + "allowed_tools": ["browser_navigate"] + } + ], + "context_length": 8000 + } + ) + print(json.dumps(response.json(), indent=2)) + ``` + + + + ```typescript + const response = await fetch("http://localhost:1234/api/v1/chat", { + method: "POST", + headers: { + "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, + "Content-Type": "application/json" + }, + body: JSON.stringify({ + model: "ibm/granite-4-micro", + input: "Open lmstudio.ai", + integrations: [ + { + type: "plugin", + id: "mcp/playwright", + allowed_tools: ["browser_navigate"] + } + ], + context_length: 8000 + }) + }); + const data = await response.json(); + console.log(data); + ``` + + + +See the full [chat](/docs/developer/rest/chat) docs for more details. + +Download a model [#download-a-model] + +Use the download endpoint to download models by identifier from the [LM Studio model catalog](https://lmstudio.ai/models), or by Hugging Face model URL. + + + + + curl + + + + Python + + + + TypeScript + + + + + ```bash + curl http://localhost:1234/api/v1/models/download \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro" + }' + ``` + + + + ```python + import os + import requests + import json + + response = requests.post( + "http://localhost:1234/api/v1/models/download", + headers={ + "Authorization": f"Bearer {os.environ['LM_API_TOKEN']}", + "Content-Type": "application/json" + }, + json={"model": "ibm/granite-4-micro"} + ) + print(json.dumps(response.json(), indent=2)) + ``` + + + + ```typescript + const response = await fetch("http://localhost:1234/api/v1/models/download", { + method: "POST", + headers: { + "Authorization": `Bearer ${process.env.LM_API_TOKEN}`, + "Content-Type": "application/json" + }, + body: JSON.stringify({ + model: "ibm/granite-4-micro" + }) + }); + const data = await response.json(); + console.log(data); + ``` + + + +The response will return a `job_id` that you can use to track download progress. + + + + + curl + + + + Python + + + + TypeScript + + + + + ```bash + curl -H "Authorization: Bearer $LM_API_TOKEN" \ + http://localhost:1234/api/v1/models/download/status/{job_id} + ``` + + + + ```python + import os + import requests + import json + + job_id = "your-job-id" + response = requests.get( + f"http://localhost:1234/api/v1/models/download/status/{job_id}", + headers={"Authorization": f"Bearer {os.environ['LM_API_TOKEN']}"} + ) + print(json.dumps(response.json(), indent=2)) + ``` + + + + ```typescript + const jobId = "your-job-id"; + const response = await fetch( + `http://localhost:1234/api/v1/models/download/status/${jobId}`, + { + headers: { + "Authorization": `Bearer ${process.env.LM_API_TOKEN}` + } + } + ); + const data = await response.json(); + console.log(data); + ``` + + + +See the [download](/docs/developer/rest/download) and [download status](/docs/developer/rest/download-status) docs for more details. + + + + +The `/api/v1/chat` endpoint is stateful by default. This means you don't need to pass the full conversation history in every request — LM Studio automatically stores and manages the context for you. + +How it works [#how-it-works] + +When you send a chat request, LM Studio stores the conversation in a chat thread and returns a `response_id` in the response. Use this `response_id` in subsequent requests to continue the conversation. + +```bash title="Start a new conversation" +curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "My favorite color is blue." + }' +``` + +The response includes a `response_id`: + + + Every response includes an unique `response_id` that you can use to reference that specific point in the conversation for future requests. This allows you to branch conversations. + + +```json title="Response" +{ + "model_instance_id": "ibm/granite-4-micro", + "output": [ + { + "type": "message", + "content": "That's great! Blue is a beautiful color..." + } + ], + "response_id": "resp_abc123xyz..." +} +``` + +Continue a conversation [#continue-a-conversation] + +Pass the `previous_response_id` in your next request to continue the conversation. The model will remember the previous context. + +```bash title="Continue the conversation" +curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "What color did I just mention?", + "previous_response_id": "resp_abc123xyz..." + }' +``` + +The model can reference the previous message without you needing to resend it and will return a new `response_id` for further continuation. + +Disable stateful storage [#disable-stateful-storage] + +If you don't want to store the conversation, set `store` to `false`. The response will not include a `response_id`. + +```bash title="Stateless chat" +curl http://localhost:1234/api/v1/chat \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "Tell me a joke.", + "store": false + }' +``` + +This is useful for one-off requests where you don't need to maintain context. + + + + +Streaming events let you render chat responses incrementally over Server‑Sent Events (SSE). When you call `POST /api/v1/chat` with `stream: true`, the server emits a series of named events that you can consume. These events arrive in order and may include multiple deltas (for reasoning and message content), tool call boundaries and payloads, and any errors encountered. The stream always begins with `chat.start` and concludes with `chat.end`, which contains the aggregated result equivalent to a non‑streaming response. + +List of event types that can be sent in an `/api/v1/chat` response stream: + +* `chat.start` +* `model_load.start` +* `model_load.progress` +* `model_load.end` +* `prompt_processing.start` +* `prompt_processing.progress` +* `prompt_processing.end` +* `reasoning.start` +* `reasoning.delta` +* `reasoning.end` +* `tool_call.start` +* `tool_call.arguments` +* `tool_call.success` +* `tool_call.failure` +* `message.start` +* `message.delta` +* `message.end` +* `error` +* `chat.end` + +Events will be streamed out in the following raw format: + +```bash +event: +data: +``` + +`chat.start` [#chatstart] + + + + An event that is emitted at the start of a chat response stream. + + + + + + ```json title="Example Event Data" + { + "type": "chat.start", + "model_instance_id": "openai/gpt-oss-20b" + } + ``` + + + +`model_load.start` [#model_loadstart] + + + + Signals the start of a model being loaded to fulfill the chat request. Will not be emitted if the requested model is already loaded. + + + + + + ```json title="Example Event Data" + { + "type": "model_load.start", + "model_instance_id": "openai/gpt-oss-20b" + } + ``` + + + +`model_load.progress` [#model_loadprogress] + + + + Progress of the model load. + + + + + + ```json title="Example Event Data" + { + "type": "model_load.progress", + "model_instance_id": "openai/gpt-oss-20b", + "progress": 0.65 + } + ``` + + + +`model_load.end` [#model_loadend] + + + + Signals a successfully completed model load. + + + + + + ```json title="Example Event Data" + { + "type": "model_load.end", + "model_instance_id": "openai/gpt-oss-20b", + "load_time_seconds": 12.34 + } + ``` + + + +`prompt_processing.start` [#prompt_processingstart] + + + + Signals the start of the model processing a prompt. + + + + + + ```json title="Example Event Data" + { + "type": "prompt_processing.start" + } + ``` + + + +`prompt_processing.progress` [#prompt_processingprogress] + + + + Progress of the model processing a prompt. + + + + + + ```json title="Example Event Data" + { + "type": "prompt_processing.progress", + "progress": 0.5 + } + ``` + + + +`prompt_processing.end` [#prompt_processingend] + + + + Signals the end of the model processing a prompt. + + + + + + ```json title="Example Event Data" + { + "type": "prompt_processing.end" + } + ``` + + + +`reasoning.start` [#reasoningstart] + + + + Signals the model is starting to stream reasoning content. + + + + + + ```json title="Example Event Data" + { + "type": "reasoning.start" + } + ``` + + + +`reasoning.delta` [#reasoningdelta] + + + + A chunk of reasoning content. Multiple deltas may arrive. + + + + + + ```json title="Example Event Data" + { + "type": "reasoning.delta", + "content": "Need to" + } + ``` + + + +`reasoning.end` [#reasoningend] + + + + Signals the end of the reasoning stream. + + + + + + ```json title="Example Event Data" + { + "type": "reasoning.end" + } + ``` + + + +`tool_call.start` [#tool_callstart] + + + + Emitted when the model starts a tool call. + + + + + + ```json title="Example Event Data" + { + "type": "tool_call.start", + "tool": "model_search", + "provider_info": { + "type": "ephemeral_mcp", + "server_label": "huggingface" + } + } + ``` + + + +`tool_call.arguments` [#tool_callarguments] + + + + Arguments streamed for the current tool call. + + + + + + ```json title="Example Event Data" + { + "type": "tool_call.arguments", + "tool": "model_search", + "arguments": { + "sort": "trendingScore", + "limit": 1 + }, + "provider_info": { + "type": "ephemeral_mcp", + "server_label": "huggingface" + } + } + ``` + + + +`tool_call.success` [#tool_callsuccess] + + + + Result of the tool call, along with the arguments used. + + + + + + ```json title="Example Event Data" + { + "type": "tool_call.success", + "tool": "model_search", + "arguments": { + "sort": "trendingScore", + "limit": 1 + }, + "output": "[{\"type\":\"text\",\"text\":\"Showing first 1 models...\"}]", + "provider_info": { + "type": "ephemeral_mcp", + "server_label": "huggingface" + } + } + ``` + + + +`tool_call.failure` [#tool_callfailure] + + + + Indicates that the tool call failed. + + + + + + ```json title="Example Event Data" + { + "type": "tool_call.failure", + "reason": "Cannot find tool with name open_browser.", + "metadata": { + "type": "invalid_name", + "tool_name": "open_browser" + } + } + ``` + + + +`message.start` [#messagestart] + + + + Signals the model is about to stream a message. + + + + + + ```json title="Example Event Data" + { + "type": "message.start" + } + ``` + + + +`message.delta` [#messagedelta] + + + + A chunk of message content. Multiple deltas may arrive. + + + + + + ```json title="Example Event Data" + { + "type": "message.delta", + "content": "The current" + } + ``` + + + +`message.end` [#messageend] + + + + Signals the end of the message stream. + + + + + + ```json title="Example Event Data" + { + "type": "message.end" + } + ``` + + + +`error` [#error] + + + + An error occurred during streaming. The final payload will still be sent in `chat.end` with whatever was generated. + + + + + + ```json title="Example Event Data" + { + "type": "error", + "error": { + "type": "invalid_request", + "message": "\"model\" is required", + "code": "missing_required_parameter", + "param": "model" + } + } + ``` + + + +`chat.end` [#chatend] + + + + Final event containing the full aggregated response, equivalent to the non-streaming `POST /api/v1/chat` response body. + + + + + + ```json title="Example Event Data" + { + "type": "chat.end", + "result": { + "model_instance_id": "openai/gpt-oss-20b", + "output": [ + { "type": "reasoning", "content": "Need to call function." }, + { + "type": "tool_call", + "tool": "model_search", + "arguments": { "sort": "trendingScore", "limit": 1 }, + "output": "[{\"type\":\"text\",\"text\":\"Showing first 1 models...\"}]", + "provider_info": { "type": "ephemeral_mcp", "server_label": "huggingface" } + }, + { "type": "message", "content": "The current top‑trending model is..." } + ], + "stats": { + "input_tokens": 329, + "total_output_tokens": 268, + "reasoning_output_tokens": 5, + "tokens_per_second": 43.73, + "time_to_first_token_seconds": 0.781 + }, + "response_id": "resp_02b2017dbc06c12bfc353a2ed6c2b802f8cc682884bb5716" + } + } + ``` + + + + + + + + + `POST /api/v1/models/unload` + + **Request body** + + + + + + ```bash title="Example Request" + curl http://localhost:1234/api/v1/models/unload \ + -H "Authorization: Bearer $LM_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "instance_id": "openai/gpt-oss-20b" + }' + ``` + + + +*** + + + + **Response fields** + + + + + + ```json title="Response" + { + "instance_id": "openai/gpt-oss-20b" + } + ``` + + + + + + +* Method: `POST` +* Prompt template is applied automatically for chat‑tuned models +* Provide inference parameters (temperature, top\_p, etc.) in the payload +* See OpenAI docs: [https://platform.openai.com/docs/api-reference/chat](https://platform.openai.com/docs/api-reference/chat) +* Tip: keep a terminal open with [`lms log stream`](/docs/cli/serve/log-stream) to inspect model input + +Python example [#python-example] + +```python +from openai import OpenAI +client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio") + +completion = client.chat.completions.create( + model="model-identifier", + messages=[ + {"role": "system", "content": "Always answer in rhymes."}, + {"role": "user", "content": "Introduce yourself."} + ], + temperature=0.7, +) + +print(completion.choices[0].message) +``` + +Supported payload parameters [#supported-payload-parameters] + +See [https://platform.openai.com/docs/api-reference/chat/create](https://platform.openai.com/docs/api-reference/chat/create) for parameter semantics. + +```py +model +top_p +top_k +messages +temperature +max_tokens +stream +stop +presence_penalty +frequency_penalty +logit_bias +repeat_penalty +seed +``` + + + + + + This endpoint is no longer supported by OpenAI. LM Studio continues to support it. + + Using this endpoint with chat‑tuned models may produce unexpected tokens. Prefer base models. + + +* Method: `POST` +* Prompt template is not applied +* See OpenAI docs: [https://platform.openai.com/docs/api-reference/completions](https://platform.openai.com/docs/api-reference/completions) + + + + +* Method: `POST` +* See OpenAI docs: [https://platform.openai.com/docs/api-reference/embeddings](https://platform.openai.com/docs/api-reference/embeddings) + +Python example [#python-example] + +```python +from openai import OpenAI +client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio") + +def get_embedding(text, model="model-identifier"): + text = text.replace("\n", " ") + return client.embeddings.create(input=[text], model=model).data[0].embedding + +print(get_embedding("Once upon a time, there was a cat.")) +``` + + + + +Supported endpoints [#supported-endpoints] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Endpoint + + Method + + Docs +
+ /v1/models + + + + Models +
+ /v1/responses + + + + Responses +
+ /v1/chat/completions + + + + Chat Completions +
+ /v1/embeddings + + + + Embeddings +
+ /v1/completions + + + + Completions +
+ +
+ +Set the `base url` to point to LM Studio [#set-the-base-url-to-point-to-lm-studio] + +You can reuse existing OpenAI clients (in Python, JS, C#, etc) by switching up the "base URL" property to point to your LM Studio instead of OpenAI's servers. + +Note: The following examples assume the server port is `1234` + +Python Example [#python-example] + +```diff +from openai import OpenAI + +client = OpenAI( ++ base_url="http://localhost:1234/v1" +) + +# ... the rest of your code ... +``` + +Typescript Example [#typescript-example] + +```diff +import OpenAI from 'openai'; + +const client = new OpenAI({ ++ baseUrl: "http://localhost:1234/v1" +}); + +// ... the rest of your code ... +``` + +cURL Example [#curl-example] + +```diff +- curl https://api.openai.com/v1/chat/completions \ ++ curl http://localhost:1234/v1/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ +- "model": "gpt-4o-mini", ++ "model": "use the model identifier from LM Studio here", + "messages": [{"role": "user", "content": "Say this is a test!"}], + "temperature": 0.7 + }' +``` + +Using Codex with LM Studio [#using-codex-with-lm-studio] + +Codex is supported because LM Studio implements the OpenAI-compatible `POST /v1/responses` endpoint. + +See: [Use Codex with LM Studio](/docs/integrations/codex) and [Responses](/docs/developer/openai-compat/responses). + +*** + +Other OpenAI client libraries should have similar options to set the base URL. + +If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) and enter the `#🔨-developers` channel. + + + + +* Method: `GET` +* Returns the models visible to the server. The list may include all downloaded models when Just‑In‑Time loading is enabled. + +cURL [#curl] + +```bash +curl http://localhost:1234/v1/models +``` + + + + +* Method: `POST` +* See OpenAI docs: [https://platform.openai.com/docs/api-reference/responses](https://platform.openai.com/docs/api-reference/responses) + +cURL (non‑streaming) [#curl-nonstreaming] + +```bash +curl http://localhost:1234/v1/responses \ + -H "Content-Type: application/json" \ + -d '{ + "model": "openai/gpt-oss-20b", + "input": "Provide a prime number less than 50", + "reasoning": { "effort": "low" } + }' +``` + +Stateful follow‑up [#stateful-followup] + +Use the `id` from a previous response as `previous_response_id`. + +```bash +curl http://localhost:1234/v1/responses \ + -H "Content-Type: application/json" \ + -d '{ + "model": "openai/gpt-oss-20b", + "input": "Multiply it by 2", + "previous_response_id": "resp_123" + }' +``` + +Streaming [#streaming] + +```bash +curl http://localhost:1234/v1/responses \ + -H "Content-Type: application/json" \ + -d '{ + "model": "openai/gpt-oss-20b", + "input": "Hello", + "stream": true + }' +``` + +You will receive SSE events such as `response.created`, `response.output_text.delta`, and `response.completed`. + +Tools and Remote MCP (opt‑in) [#tools-and-remote-mcp-optin] + +Enable Remote MCP in the app (Developer → Settings). Example payload using an MCP server tool: + +```bash +curl http://localhost:1234/v1/responses \ + -H "Content-Type: application/json" \ + -d '{ + "model": "ibm/granite-4-micro", + "input": "What is the top trending model on hugging face?", + "tools": [ + { + "type": "mcp", + "server_label": "huggingface", + "server_url": "https://huggingface.co/mcp", + "allowed_tools": [ + "model_search" + ] + } + ] + }' +``` + + + + +You can enforce a particular response format from an LLM by providing a JSON schema to the `/v1/chat/completions` endpoint, via LM Studio's REST API (or via any OpenAI client). + +
+ +Start LM Studio as a server [#start-lm-studio-as-a-server] + +To use LM Studio programmatically from your own code, run LM Studio as a local server. + +You can turn on the server from the "Developer" tab in LM Studio, or via the `lms` CLI: + +``` +lms server start +``` + +Install `lms` by running `npx lmstudio install-cli` [#install-lms-by-running-npx-lmstudio-install-cli] + +This will allow you to interact with LM Studio via the REST API. For an intro to LM Studio's REST API, see [REST API Overview](/docs/developer/rest). + +Structured Output [#structured-output] + +The API supports structured JSON outputs through the `/v1/chat/completions` endpoint when given a [JSON schema](https://json-schema.org/overview/what-is-jsonschema). Doing this will cause the LLM to respond in valid JSON conforming to the schema provided. + +It follows the same format as OpenAI's recently announced [Structured Output](https://platform.openai.com/docs/guides/structured-outputs) API and is expected to work via the OpenAI client SDKs. + +**Example using `curl`** + +This example demonstrates a structured output request using the `curl` utility. + +To run this example on Mac or Linux, use any terminal. On Windows, use [Git Bash](https://git-scm.com/download/win). + +```bash +curl http://localhost:1234/v1/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "{{model}}", + "messages": [ + { + "role": "system", + "content": "You are a helpful jokester." + }, + { + "role": "user", + "content": "Tell me a joke." + } + ], + "response_format": { + "type": "json_schema", + "json_schema": { + "name": "joke_response", + "strict": "true", + "schema": { + "type": "object", + "properties": { + "joke": { + "type": "string" + } + }, + "required": ["joke"] + } + } + }, + "temperature": 0.7, + "max_tokens": 50, + "stream": false + }' +``` + +All parameters recognized by `/v1/chat/completions` will be honored, and the JSON schema should be provided in the `json_schema` field of `response_format`. + +The JSON object will be provided in `string` form in the typical response field, `choices[0].message.content`, and will need to be parsed into a JSON object. + +**Example using `python`** + +```python +from openai import OpenAI +import json + +# Initialize OpenAI client that points to the local LM Studio server +client = OpenAI( + base_url="http://localhost:1234/v1", + api_key="lm-studio" +) + +# Define the conversation with the AI +messages = [ + {"role": "system", "content": "You are a helpful AI assistant."}, + {"role": "user", "content": "Create 1-3 fictional characters"} +] + +# Define the expected response structure +character_schema = { + "type": "json_schema", + "json_schema": { + "name": "characters", + "schema": { + "type": "object", + "properties": { + "characters": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": {"type": "string"}, + "occupation": {"type": "string"}, + "personality": {"type": "string"}, + "background": {"type": "string"} + }, + "required": ["name", "occupation", "personality", "background"] + }, + "minItems": 1, + } + }, + "required": ["characters"] + }, + } +} + +# Get response from AI +response = client.chat.completions.create( + model="your-model", + messages=messages, + response_format=character_schema, +) + +# Parse and display the results +results = json.loads(response.choices[0].message.content) +print(json.dumps(results, indent=2)) +``` + +**Important**: Not all models are capable of structured output, particularly LLMs below 7B parameters. + +Check the model card README if you are unsure if the model supports structured output. + +Structured output engine [#structured-output-engine] + +* For `GGUF` models: utilize `llama.cpp`'s grammar-based sampling APIs. +* For `MLX` models: using [Outlines](https://github.com/dottxt-ai/outlines). + +The MLX implementation is available on Github: [lmstudio-ai/mlx-engine](https://github.com/lmstudio-ai/mlx-engine). + +
+ +Community [#community] + +Chat with other LM Studio users, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). + + + + + + +Tool use enables LLMs to request calls to external functions and APIs through the `/v1/chat/completions` and `v1/responses` endpoints ([Learn more](/docs/developer/openai-compat)), via LM Studio's REST API (or via any OpenAI client). This expands their functionality far beyond text output. + +
+ +Quick Start [#quick-start] + + + +

+ Start LM Studio as a server +

+ + To use LM Studio programmatically from your own code, run LM Studio as a local server. + + You can turn on the server from the "Developer" tab in LM Studio, or via the `lms` CLI: + + ```bash + lms server start + ``` + + **Install `lms` by running `npx lmstudio install-cli`** + + This will allow you to interact with LM Studio via the REST API. For an intro to LM Studio's REST API, see [REST API Overview](/docs/developer/rest). +
+ + +

+ Load a Model +

+ + You can load a model from the "Chat" or "Developer" tabs in LM Studio, or via the `lms` CLI: + + ```bash + lms load + ``` +
+ + +

+ Copy, Paste, and Run an Example! +

+ + * `Curl` + * [Single Turn Tool Call Request](#example-using-curl) + * `Python` + * [Single Turn Tool Call + Tool Use](#single-turn-example) + * [Multi-Turn Example](#multi-turn-example) + * [Advanced Agent Example](#advanced-agent-example) +
+
+ +Tool Use [#tool-use] + +What really is "Tool Use"? [#what-really-is-tool-use] + +Tool use describes: + +* LLMs output text requesting functions to be called (LLMs cannot directly execute code) +* Your code executes those functions +* Your code feeds the results back to the LLM. + +High-level flow [#high-level-flow] + +```xml +┌──────────────────────────┐ +│ SETUP: LLM + Tool list │ +└──────────┬───────────────┘ + ▼ +┌──────────────────────────┐ +│ Get user input │◄────┐ +└──────────┬───────────────┘ │ + ▼ │ +┌──────────────────────────┐ │ +│ LLM prompted w/messages │ │ +└──────────┬───────────────┘ │ + ▼ │ + Needs tools? │ + │ │ │ + Yes No │ + │ │ │ + ▼ └────────────┐ │ +┌─────────────┐ │ │ +│Tool Response│ │ │ +└──────┬──────┘ │ │ + ▼ │ │ +┌─────────────┐ │ │ +│Execute tools│ │ │ +└──────┬──────┘ │ │ + ▼ ▼ │ +┌─────────────┐ ┌───────────┐ +│Add results │ │ Normal │ +│to messages │ │ response │ +└──────┬──────┘ └─────┬─────┘ + │ ▲ + └───────────────────────┘ +``` + +In-depth flow [#in-depth-flow] + +LM Studio supports tool use through the `/v1/chat/completions` endpoint when given function definitions in the `tools` parameter of the request body. Tools are specified as an array of function definitions that describe their parameters and usage, like: + +It follows the same format as OpenAI's [Function Calling](https://platform.openai.com/docs/guides/function-calling) API and is expected to work via the OpenAI client SDKs. + +We will use [lmstudio-community/Qwen2.5-7B-Instruct-GGUF](https://model.lmstudio.ai/download/lmstudio-community/Qwen2.5-7B-Instruct-GGUF) as the model in this example flow. + +1. You provide a list of tools to an LLM. These are the tools that the model can *request* calls to. + For example: + +```json +// the list of tools is model-agnostic +[ + { + "type": "function", + "function": { + "name": "get_delivery_date", + "description": "Get the delivery date for a customer's order", + "parameters": { + "type": "object", + "properties": { + "order_id": { + "type": "string" + } + }, + "required": ["order_id"] + } + } + } +] +``` + +This list will be injected into the `system` prompt of the model depending on the model's chat template. For `Qwen2.5-Instruct`, this looks like: + +```json +<|im_start|>system +You are Qwen, created by Alibaba Cloud. You are a helpful assistant. + +# Tools + +You may call one or more functions to assist with the user query. + +You are provided with function signatures within XML tags: + +{"type": "function", "function": {"name": "get_delivery_date", "description": "Get the delivery date for a customer's order", "parameters": {"type": "object", "properties": {"order_id": {"type": "string"}}, "required": ["order_id"]}}} + + +For each function call, return a json object with function name and arguments within XML tags: + +{"name": , "arguments": } +<|im_end|> +``` + +**Important**: The model can only *request* calls to these tools because LLMs *cannot* directly call functions, APIs, or any other tools. They can only output text, which can then be parsed to programmatically call the functions. + +2. When prompted, the LLM can then decide to either: + + * (a) Call one or more tools + + ```xml + User: Get me the delivery date for order 123 + Model: + {"name": "get_delivery_date", "arguments": {"order_id": "123"}} + + ``` + + * (b) Respond normally + + ```xml + User: Hi + Model: Hello! How can I assist you today? + ``` + +3. LM Studio parses the text output from the model into an OpenAI-compliant `chat.completion` response object. + + * If the model was given access to `tools`, LM Studio will attempt to parse the tool calls into the `response.choices[0].message.tool_calls` field of the `chat.completion` response object. + * If LM Studio cannot parse any **correctly formatted** tool calls, it will simply return the response to the standard `response.choices[0].message.content` field. + * **Note**: Smaller models and models that were not trained for tool use may output improperly formatted tool calls, resulting in LM Studio being unable to parse them into the `tool_calls` field. This is useful for troubleshooting when you do not receive `tool_calls` as expected. Example of an improperly formatting `Qwen2.5-Instruct` tool call: + + ```xml + + ["name": "get_delivery_date", function: "date"] + + ``` + + > Note that the brackets are incorrect, and the call does not follow the `name, argument` format. + +4. Your code parses the `chat.completion` response to check for tool calls from the model, then calls the appropriate tools with the parameters specified by the model. Your code then adds both: + + 1. The model's tool call message + 2. The result of the tool call + + To the `messages` array to send back to the model + + ```python + # pseudocode, see examples for copy-paste snippets + if response.has_tool_calls: + for each tool_call: + # Extract function name & args + function_to_call = tool_call.name # e.g. "get_delivery_date" + args = tool_call.arguments # e.g. {"order_id": "123"} + + # Execute the function + result = execute_function(function_to_call, args) + + # Add result to conversation + add_to_messages([ + ASSISTANT_TOOL_CALL_MESSAGE, # The request to use the tool + TOOL_RESULT_MESSAGE # The tool's response + ]) + else: + # Normal response without tools + add_to_messages(response.content) + ``` + +5. The LLM is then prompted again with the updated messages array, but without access to tools. This is because: + * The LLM already has the tool results in the conversation history + * We want the LLM to provide a final response to the user, not call more tools + ```python + # Example messages + messages = [ + {"role": "user", "content": "When will order 123 be delivered?"}, + {"role": "assistant", "function_call": { + "name": "get_delivery_date", + "arguments": {"order_id": "123"} + }}, + {"role": "tool", "content": "2024-03-15"}, + ] + response = client.chat.completions.create( + model="lmstudio-community/qwen2.5-7b-instruct", + messages=messages + ) + ``` + The `response.choices[0].message.content` field after this call may be something like: + ```xml + Your order #123 will be delivered on March 15th, 2024 + ``` + +6. The loop continues back at step 2 of the flow + +Note: This is the `pedantic` flow for tool use. However, you can certainly experiment with this flow to best fit your use case. + +Supported Models [#supported-models] + +Through LM Studio, **all** models support at least some degree of tool use. + +However, there are currently two levels of support that may impact the quality of the experience: Native and Default. + +Models with Native tool use support will have a hammer badge in the app, and generally perform better in tool use scenarios. + +Native tool use support [#native-tool-use-support] + +"Native" tool use support means that both: + +1. The model has a chat template that supports tool use (usually means the model has been trained for tool use) + * This is what will be used to format the `tools` array into the system prompt and tell them model how to format tool calls + * Example: [Qwen2.5-Instruct chat template](https://huggingface.co/mlx-community/Qwen2.5-7B-Instruct-4bit?chat_template=default) +2. LM Studio supports that model's tool use format + * Required for LM Studio to properly input the chat history into the chat template, and parse the tool calls the model outputs into the `chat.completion` object + +Models that currently have native tool use support in LM Studio (subject to change): + +* Qwen + * `GGUF` [lmstudio-community/Qwen2.5-7B-Instruct-GGUF](https://model.lmstudio.ai/download/lmstudio-community/Qwen2.5-7B-Instruct-GGUF) (4.68 GB) + * `MLX` [mlx-community/Qwen2.5-7B-Instruct-4bit](https://model.lmstudio.ai/download/mlx-community/Qwen2.5-7B-Instruct-4bit) (4.30 GB) +* Llama-3.1, Llama-3.2 + * `GGUF` [lmstudio-community/Meta-Llama-3.1-8B-Instruct-GGUF](https://model.lmstudio.ai/download/lmstudio-community/Meta-Llama-3.1-8B-Instruct-GGUF) (4.92 GB) + * `MLX` [mlx-community/Meta-Llama-3.1-8B-Instruct-8bit](https://model.lmstudio.ai/download/mlx-community/Meta-Llama-3.1-8B-Instruct-8bit) (8.54 GB) +* Mistral + * `GGUF` [bartowski/Ministral-8B-Instruct-2410-GGUF](https://model.lmstudio.ai/download/bartowski/Ministral-8B-Instruct-2410-GGUF) (4.67 GB) + * `MLX` [mlx-community/Ministral-8B-Instruct-2410-4bit](https://model.lmstudio.ai/download/mlx-community/Ministral-8B-Instruct-2410-4bit) (4.67 GB GB) + +Default tool use support [#default-tool-use-support] + +"Default" tool use support means that **either**: + +1. The model does not have chat template that supports tool use (usually means the model has not been trained for tool use) +2. LM Studio does not currently support that model's tool use format + +Under the hood, default tool use works by: + +* Giving models a custom system prompt and a default tool call format to use +* Converting `tool` role messages to the `user` role so that chat templates without the `tool` role are compatible +* Converting `assistant` role `tool_calls` into the default tool call format + +Results will vary by model. + +You can see the default format by running `lms log stream` in your terminal, then sending a chat completion request with `tools` to a model that doesn't have Native tool use support. The default format is subject to change. + +
+ + Expand to see example of default tool use format + + + ```bash + -> % lms log stream + Streaming logs from LM Studio + + timestamp: 11/13/2024, 9:35:15 AM + type: llm.prediction.input + modelIdentifier: gemma-2-2b-it + modelPath: lmstudio-community/gemma-2-2b-it-GGUF/gemma-2-2b-it-Q4_K_M.gguf + input: "system + You are a tool-calling AI. You can request calls to available tools with this EXACT format: + [TOOL_REQUEST]{\"name\": \"tool_name\", \"arguments\": {\"param1\": \"value1\"}}[END_TOOL_REQUEST] + + AVAILABLE TOOLS: + { + \"type\": \"toolArray\", + \"tools\": [ + { + \"type\": \"function\", + \"function\": { + \"name\": \"get_delivery_date\", + \"description\": \"Get the delivery date for a customer's order\", + \"parameters\": { + \"type\": \"object\", + \"properties\": { + \"order_id\": { + \"type\": \"string\" + } + }, + \"required\": [ + \"order_id\" + ] + } + } + } + ] + } + + RULES: + - Only use tools from AVAILABLE TOOLS + - Include all required arguments + - Use one [TOOL_REQUEST] block per tool + - Never use [TOOL_RESULT] + - If you decide to call one or more tools, there should be no other text in your message + + Examples: + \"Check Paris weather\" + [TOOL_REQUEST]{\"name\": \"get_weather\", \"arguments\": {\"location\": \"Paris\"}}[END_TOOL_REQUEST] + + \"Send email to John about meeting and open browser\" + [TOOL_REQUEST]{\"name\": \"send_email\", \"arguments\": {\"to\": \"John\", \"subject\": \"meeting\"}}[END_TOOL_REQUEST] + [TOOL_REQUEST]{\"name\": \"open_browser\", \"arguments\": {}}[END_TOOL_REQUEST] + + Respond conversationally if no matching tools exist. + user + Get me delivery date for order 123 + model + " + ``` + + If the model follows this format exactly to call tools, i.e: + + ``` + [TOOL_REQUEST]{\"name\": \"get_delivery_date\", \"arguments\": {\"order_id\": \"123\"}}[END_TOOL_REQUEST] + ``` + + Then LM Studio will be able to parse those tool calls into the `chat.completions` object, just like for natively supported models. +
+ +All models that don't have native tool use support will have default tool use support. + +Example using `curl` [#example-using-curl] + +This example demonstrates a model requesting a tool call using the `curl` utility. + +To run this example on Mac or Linux, use any terminal. On Windows, use [Git Bash](https://git-scm.com/download/win). + +```bash +curl http://localhost:1234/v1/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "lmstudio-community/qwen2.5-7b-instruct", + "messages": [{"role": "user", "content": "What dell products do you have under $50 in electronics?"}], + "tools": [ + { + "type": "function", + "function": { + "name": "search_products", + "description": "Search the product catalog by various criteria. Use this whenever a customer asks about product availability, pricing, or specifications.", + "parameters": { + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "Search terms or product name" + }, + "category": { + "type": "string", + "description": "Product category to filter by", + "enum": ["electronics", "clothing", "home", "outdoor"] + }, + "max_price": { + "type": "number", + "description": "Maximum price in dollars" + } + }, + "required": ["query"], + "additionalProperties": false + } + } + } + ] + }' +``` + +All parameters recognized by `/v1/chat/completions` will be honored, and the array of available tools should be provided in the `tools` field. + +If the model decides that the user message would be best fulfilled with a tool call, an array of tool call request objects will be provided in the response field, `choices[0].message.tool_calls`. + +The `finish_reason` field of the top-level response object will also be populated with `"tool_calls"`. + +An example response to the above `curl` request will look like: + +```bash +{ + "id": "chatcmpl-gb1t1uqzefudice8ntxd9i", + "object": "chat.completion", + "created": 1730913210, + "model": "lmstudio-community/qwen2.5-7b-instruct", + "choices": [ + { + "index": 0, + "logprobs": null, + "finish_reason": "tool_calls", + "message": { + "role": "assistant", + "tool_calls": [ + { + "id": "365174485", + "type": "function", + "function": { + "name": "search_products", + "arguments": "{\"query\":\"dell\",\"category\":\"electronics\",\"max_price\":50}" + } + } + ] + } + } + ], + "usage": { + "prompt_tokens": 263, + "completion_tokens": 34, + "total_tokens": 297 + }, + "system_fingerprint": "lmstudio-community/qwen2.5-7b-instruct" +} +``` + +In plain english, the above response can be thought of as the model saying: + +> "Please call the `search_products` function, with arguments: +> +> * 'dell' for the `query` parameter, +> * 'electronics' for the `category` parameter +> * '50' for the `max_price` parameter +> +> and give me back the results" + +The `tool_calls` field will need to be parsed to call actual functions/APIs. The below examples demonstrate how. + +Examples using `python` [#examples-using-python] + +Tool use shines when paired with program languages like python, where you can implement the functions specified in the `tools` field to programmatically call them when the model requests. + +Single-turn example [#single-turn-example] + +Below is a simple single-turn (model is only called once) example of enabling a model to call a function called `say_hello` that prints a hello greeting to the console: + +`single-turn-example.py` + +```python +from openai import OpenAI + +# Connect to LM Studio +client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio") + +# Define a simple function +def say_hello(name: str) -> str: + print(f"Hello, {name}!") + +# Tell the AI about our function +tools = [ + { + "type": "function", + "function": { + "name": "say_hello", + "description": "Says hello to someone", + "parameters": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The person's name" + } + }, + "required": ["name"] + } + } + } +] + +# Ask the AI to use our function +response = client.chat.completions.create( + model="lmstudio-community/qwen2.5-7b-instruct", + messages=[{"role": "user", "content": "Can you say hello to Bob the Builder?"}], + tools=tools +) + +# Get the name the AI wants to use a tool to say hello to +# (Assumes the AI has requested a tool call and that tool call is say_hello) +tool_call = response.choices[0].message.tool_calls[0] +name = eval(tool_call.function.arguments)["name"] + +# Actually call the say_hello function +say_hello(name) # Prints: Hello, Bob the Builder! + +``` + +Running this script from the console should yield results like: + +```xml +-> % python single-turn-example.py +Hello, Bob the Builder! +``` + +Play around with the name in + +```python +messages=[{"role": "user", "content": "Can you say hello to Bob the Builder?"}] +``` + +to see the model call the `say_hello` function with different names. + +Multi-turn example [#multi-turn-example] + +Now for a slightly more complex example. + +In this example, we'll: + +1. Enable the model to call a `get_delivery_date` function +2. Hand the result of calling that function back to the model, so that it can fulfill the user's request in plain text + +
+ + multi-turn-example.py + + (click to expand) + + + ```python + from datetime import datetime, timedelta + import json + import random + from openai import OpenAI + + # Point to the local server + client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio") + model = "lmstudio-community/qwen2.5-7b-instruct" + + + def get_delivery_date(order_id: str) -> datetime: + # Generate a random delivery date between today and 14 days from now + # in a real-world scenario, this function would query a database or API + today = datetime.now() + random_days = random.randint(1, 14) + delivery_date = today + timedelta(days=random_days) + print( + f"\nget_delivery_date function returns delivery date:\n\n{delivery_date}", + flush=True, + ) + return delivery_date + + + tools = [ + { + "type": "function", + "function": { + "name": "get_delivery_date", + "description": "Get the delivery date for a customer's order. Call this whenever you need to know the delivery date, for example when a customer asks 'Where is my package'", + "parameters": { + "type": "object", + "properties": { + "order_id": { + "type": "string", + "description": "The customer's order ID.", + }, + }, + "required": ["order_id"], + "additionalProperties": False, + }, + }, + } + ] + + messages = [ + { + "role": "system", + "content": "You are a helpful customer support assistant. Use the supplied tools to assist the user.", + }, + { + "role": "user", + "content": "Give me the delivery date and time for order number 1017", + }, + ] + + # LM Studio + response = client.chat.completions.create( + model=model, + messages=messages, + tools=tools, + ) + + print("\nModel response requesting tool call:\n", flush=True) + print(response, flush=True) + + # Extract the arguments for get_delivery_date + # Note this code assumes we have already determined that the model generated a function call. + tool_call = response.choices[0].message.tool_calls[0] + arguments = json.loads(tool_call.function.arguments) + + order_id = arguments.get("order_id") + + # Call the get_delivery_date function with the extracted order_id + delivery_date = get_delivery_date(order_id) + + assistant_tool_call_request_message = { + "role": "assistant", + "tool_calls": [ + { + "id": response.choices[0].message.tool_calls[0].id, + "type": response.choices[0].message.tool_calls[0].type, + "function": response.choices[0].message.tool_calls[0].function, + } + ], + } + + # Create a message containing the result of the function call + function_call_result_message = { + "role": "tool", + "content": json.dumps( + { + "order_id": order_id, + "delivery_date": delivery_date.strftime("%Y-%m-%d %H:%M:%S"), + } + ), + "tool_call_id": response.choices[0].message.tool_calls[0].id, + } + + # Prepare the chat completion call payload + completion_messages_payload = [ + messages[0], + messages[1], + assistant_tool_call_request_message, + function_call_result_message, + ] + + # Call the OpenAI API's chat completions endpoint to send the tool call result back to the model + # LM Studio + response = client.chat.completions.create( + model=model, + messages=completion_messages_payload, + ) + + print("\nFinal model response with knowledge of the tool call result:\n", flush=True) + print(response.choices[0].message.content, flush=True) + + ``` +
+ +Running this script from the console should yield results like: + +```xml +-> % python multi-turn-example.py + +Model response requesting tool call: + +ChatCompletion(id='chatcmpl-wwpstqqu94go4hvclqnpwn', choices=[Choice(finish_reason='tool_calls', index=0, logprobs=None, message=ChatCompletionMessage(content=None, refusal=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='377278620', function=Function(arguments='{"order_id":"1017"}', name='get_delivery_date'), type='function')]))], created=1730916196, model='lmstudio-community/qwen2.5-7b-instruct', object='chat.completion', service_tier=None, system_fingerprint='lmstudio-community/qwen2.5-7b-instruct', usage=CompletionUsage(completion_tokens=24, prompt_tokens=223, total_tokens=247, completion_tokens_details=None, prompt_tokens_details=None)) + +get_delivery_date function returns delivery date: + +2024-11-19 13:03:17.773298 + +Final model response with knowledge of the tool call result: + +Your order number 1017 is scheduled for delivery on November 19, 2024, at 13:03 PM. +``` + +Advanced agent example [#advanced-agent-example] + +Building upon the principles above, we can combine LM Studio models with locally defined functions to create an "agent" - a system that pairs a language model with custom functions to understand requests and perform actions beyond basic text generation. + +The agent in the below example can: + +1. Open safe urls in your default browser +2. Check the current time +3. Analyze directories in your file system + +
+ + agent-chat-example.py + + (click to expand) + + + ```python + import json + from urllib.parse import urlparse + import webbrowser + from datetime import datetime + import os + from openai import OpenAI + + # Point to the local server + client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio") + model = "lmstudio-community/qwen2.5-7b-instruct" + + + def is_valid_url(url: str) -> bool: + + try: + result = urlparse(url) + return bool(result.netloc) # Returns True if there's a valid network location + except Exception: + return False + + + def open_safe_url(url: str) -> dict: + # List of allowed domains (expand as needed) + SAFE_DOMAINS = { + "lmstudio.ai", + "huggingface.co", + "github.com", + "google.com", + "wikipedia.org", + "weather.com", + "stackoverflow.com", + "python.org", + "docs.python.org", + } + + try: + # Add http:// if no scheme is present + if not url.startswith(('http://', 'https://')): + url = 'http://' + url + + # Validate URL format + if not is_valid_url(url): + return {"status": "error", "message": f"Invalid URL format: {url}"} + + # Parse the URL and check domain + parsed_url = urlparse(url) + domain = parsed_url.netloc.lower() + base_domain = ".".join(domain.split(".")[-2:]) + + if base_domain in SAFE_DOMAINS: + webbrowser.open(url) + return {"status": "success", "message": f"Opened {url} in browser"} + else: + return { + "status": "error", + "message": f"Domain {domain} not in allowed list", + } + } + except Exception as e: + return {"status": "error", "message": str(e)} + + + def get_current_time() -> dict: + """Get the current system time with timezone information""" + try: + current_time = datetime.now() + timezone = datetime.now().astimezone().tzinfo + formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S %Z") + return { + "status": "success", + "time": formatted_time, + "timezone": str(timezone), + "timestamp": current_time.timestamp(), + } + except Exception as e: + return {"status": "error", "message": str(e)} + + + def analyze_directory(path: str = ".") -> dict: + """Count and categorize files in a directory""" + try: + stats = { + "total_files": 0, + "total_dirs": 0, + "file_types": {}, + "total_size_bytes": 0, + } + + for entry in os.scandir(path): + if entry.is_file(): + stats["total_files"] += 1 + ext = os.path.splitext(entry.name)[1].lower() or "no_extension" + stats["file_types"][ext] = stats["file_types"].get(ext, 0) + 1 + stats["total_size_bytes"] += entry.stat().st_size + elif entry.is_dir(): + stats["total_dirs"] += 1 + # Add size of directory contents + for root, _, files in os.walk(entry.path): + for file in files: + try: + stats["total_size_bytes"] += os.path.getsize(os.path.join(root, file)) + except (OSError, FileNotFoundError): + continue + + return {"status": "success", "stats": stats, "path": os.path.abspath(path)} + except Exception as e: + return {"status": "error", "message": str(e)} + + + tools = [ + { + "type": "function", + "function": { + "name": "open_safe_url", + "description": "Open a URL in the browser if it's deemed safe", + "parameters": { + "type": "object", + "properties": { + "url": { + "type": "string", + "description": "The URL to open", + }, + }, + "required": ["url"], + }, + }, + }, + { + "type": "function", + "function": { + "name": "get_current_time", + "description": "Get the current system time with timezone information", + "parameters": { + "type": "object", + "properties": {}, + "required": [], + }, + }, + }, + { + "type": "function", + "function": { + "name": "analyze_directory", + "description": "Analyze the contents of a directory, counting files and folders", + "parameters": { + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "The directory path to analyze. Defaults to current directory if not specified.", + }, + }, + "required": [], + }, + }, + }, + ] + + + def process_tool_calls(response, messages): + """Process multiple tool calls and return the final response and updated messages""" + # Get all tool calls from the response + tool_calls = response.choices[0].message.tool_calls + + # Create the assistant message with tool calls + assistant_tool_call_message = { + "role": "assistant", + "tool_calls": [ + { + "id": tool_call.id, + "type": tool_call.type, + "function": tool_call.function, + } + for tool_call in tool_calls + ], + } + + # Add the assistant's tool call message to the history + messages.append(assistant_tool_call_message) + + # Process each tool call and collect results + tool_results = [] + for tool_call in tool_calls: + # For functions with no arguments, use empty dict + arguments = ( + json.loads(tool_call.function.arguments) + if tool_call.function.arguments.strip() + else {} + ) + + # Determine which function to call based on the tool call name + if tool_call.function.name == "open_safe_url": + result = open_safe_url(arguments["url"]) + elif tool_call.function.name == "get_current_time": + result = get_current_time() + elif tool_call.function.name == "analyze_directory": + path = arguments.get("path", ".") + result = analyze_directory(path) + else: + # llm tried to call a function that doesn't exist, skip + continue + + # Add the result message + tool_result_message = { + "role": "tool", + "content": json.dumps(result), + "tool_call_id": tool_call.id, + } + tool_results.append(tool_result_message) + messages.append(tool_result_message) + + # Get the final response + final_response = client.chat.completions.create( + model=model, + messages=messages, + ) + + return final_response + + + def chat(): + messages = [ + { + "role": "system", + "content": "You are a helpful assistant that can open safe web links, tell the current time, and analyze directory contents. Use these capabilities whenever they might be helpful.", + } + ] + + print( + "Assistant: Hello! I can help you open safe web links, tell you the current time, and analyze directory contents. What would you like me to do?" + ) + print("(Type 'quit' to exit)") + + while True: + # Get user input + user_input = input("\nYou: ").strip() + + # Check for quit command + if user_input.lower() == "quit": + print("Assistant: Goodbye!") + break + + # Add user message to conversation + messages.append({"role": "user", "content": user_input}) + + try: + # Get initial response + response = client.chat.completions.create( + model=model, + messages=messages, + tools=tools, + ) + + # Check if the response includes tool calls + if response.choices[0].message.tool_calls: + # Process all tool calls and get final response + final_response = process_tool_calls(response, messages) + print("\nAssistant:", final_response.choices[0].message.content) + + # Add assistant's final response to messages + messages.append( + { + "role": "assistant", + "content": final_response.choices[0].message.content, + } + ) + else: + # If no tool call, just print the response + print("\nAssistant:", response.choices[0].message.content) + + # Add assistant's response to messages + messages.append( + { + "role": "assistant", + "content": response.choices[0].message.content, + } + ) + + except Exception as e: + print(f"\nAn error occurred: {str(e)}") + exit(1) + + + if __name__ == "__main__": + chat() + + ``` +
+ +Running this script from the console will allow you to chat with the agent: + +```xml +-> % python agent-example.py +Assistant: Hello! I can help you open safe web links, tell you the current time, and analyze directory contents. What would you like me to do? +(Type 'quit' to exit) + +You: What time is it? + +Assistant: The current time is 14:11:40 (EST) as of November 6, 2024. + +You: What time is it now? + +Assistant: The current time is 14:13:59 (EST) as of November 6, 2024. + +You: Open lmstudio.ai + +Assistant: The link to lmstudio.ai has been opened in your default web browser. + +You: What's in my current directory? + +Assistant: Your current directory at `/Users/matt/project` contains a total of 14 files and 8 directories. Here's the breakdown: + +- Files without an extension: 3 +- `.mjs` files: 2 +- `.ts` (TypeScript) files: 3 +- Markdown (`md`) file: 1 +- JSON files: 4 +- TOML file: 1 + +The total size of these items is 1,566,990,604 bytes. + +You: Thank you! + +Assistant: You're welcome! If you have any other questions or need further assistance, feel free to ask. + +You: +``` + +Streaming [#streaming] + +When streaming through `/v1/chat/completions` (`stream=true`), tool calls are sent in chunks. Function names and arguments are sent in pieces via `chunk.choices[0].delta.tool_calls.function.name` and `chunk.choices[0].delta.tool_calls.function.arguments`. + +For example, to call `get_current_weather(location="San Francisco")`, the streamed `ChoiceDeltaToolCall` in each `chunk.choices[0].delta.tool_calls[0]` object will look like: + +```py +ChoiceDeltaToolCall(index=0, id='814890118', function=ChoiceDeltaToolCallFunction(arguments='', name='get_current_weather'), type='function') +ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='{"', name=None), type=None) +ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='location', name=None), type=None) +ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='":"', name=None), type=None) +ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='San Francisco', name=None), type=None) +ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='"}', name=None), type=None) +``` + +These chunks must be accumulated throughout the stream to form the complete function signature for execution. + +The below example shows how to create a simple tool-enhanced chatbot through the `/v1/chat/completions` streaming endpoint (`stream=true`). + +
+ + tool-streaming-chatbot.py + + (click to expand) + + + ```python + from openai import OpenAI + import time + + client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio") + MODEL = "lmstudio-community/qwen2.5-7b-instruct" + + TIME_TOOL = { + "type": "function", + "function": { + "name": "get_current_time", + "description": "Get the current time, only if asked", + "parameters": {"type": "object", "properties": {}}, + }, + } + + def get_current_time(): + return {"time": time.strftime("%H:%M:%S")} + + def process_stream(stream, add_assistant_label=True): + """Handle streaming responses from the API""" + collected_text = "" + tool_calls = [] + first_chunk = True + + for chunk in stream: + delta = chunk.choices[0].delta + + # Handle regular text output + if delta.content: + if first_chunk: + print() + if add_assistant_label: + print("Assistant:", end=" ", flush=True) + first_chunk = False + print(delta.content, end="", flush=True) + collected_text += delta.content + + # Handle tool calls + elif delta.tool_calls: + for tc in delta.tool_calls: + if len(tool_calls) <= tc.index: + tool_calls.append({ + "id": "", "type": "function", + "function": {"name": "", "arguments": ""} + }) + tool_calls[tc.index] = { + "id": (tool_calls[tc.index]["id"] + (tc.id or "")), + "type": "function", + "function": { + "name": (tool_calls[tc.index]["function"]["name"] + (tc.function.name or "")), + "arguments": (tool_calls[tc.index]["function"]["arguments"] + (tc.function.arguments or "")) + } + } + return collected_text, tool_calls + + def chat_loop(): + messages = [] + print("Assistant: Hi! I am an AI agent empowered with the ability to tell the current time (Type 'quit' to exit)") + + while True: + user_input = input("\nYou: ").strip() + if user_input.lower() == "quit": + break + + messages.append({"role": "user", "content": user_input}) + + # Get initial response + response_text, tool_calls = process_stream( + client.chat.completions.create( + model=MODEL, + messages=messages, + tools=[TIME_TOOL], + stream=True, + temperature=0.2 + ) + ) + + if not tool_calls: + print() + + text_in_first_response = len(response_text) > 0 + if text_in_first_response: + messages.append({"role": "assistant", "content": response_text}) + + # Handle tool calls if any + if tool_calls: + tool_name = tool_calls[0]["function"]["name"] + print() + if not text_in_first_response: + print("Assistant:", end=" ", flush=True) + print(f"**Calling Tool: {tool_name}**") + messages.append({"role": "assistant", "tool_calls": tool_calls}) + + # Execute tool calls + for tool_call in tool_calls: + if tool_call["function"]["name"] == "get_current_time": + result = get_current_time() + messages.append({ + "role": "tool", + "content": str(result), + "tool_call_id": tool_call["id"] + }) + + # Get final response after tool execution + final_response, _ = process_stream( + client.chat.completions.create( + model=MODEL, + messages=messages, + stream=True + ), + add_assistant_label=False + ) + + if final_response: + print() + messages.append({"role": "assistant", "content": final_response}) + + if __name__ == "__main__": + chat_loop() + ``` +
+ +You can chat with the bot by running this script from the console: + +```xml +-> % python tool-streaming-chatbot.py +Assistant: Hi! I am an AI agent empowered with the ability to tell the current time (Type 'quit' to exit) + +You: Tell me a joke, then tell me the current time + +Assistant: Sure! Here's a light joke for you: Why don't scientists trust atoms? Because they make up everything. + +Now, let me get the current time for you. + +**Calling Tool: get_current_time** + +The current time is 18:49:31. Enjoy your day! + +You: +``` + +Community [#community] + +Chat with other LM Studio users, discuss LLMs, hardware, and more on the [LM Studio Discord server](https://discord.gg/aPQfnNkxGC). + + + + +Supported endpoints [#supported-endpoints] + + + + + + + + + + + + + + + + + + + + + +
+ Endpoint + + Method + + Docs +
+ /v1/messages + + + + Messages +
+ +Using Claude Code with LM Studio [#using-claude-code-with-lm-studio] + +For a full walkthrough, see: [Use Claude Code with LM Studio](/docs/integrations/claude-code). + +```bash +export ANTHROPIC_BASE_URL=http://localhost:1234 +export ANTHROPIC_AUTH_TOKEN=lmstudio +claude --model openai/gpt-oss-20b +``` + +Authentication headers [#authentication-headers] + +When Require Authentication is enabled, LM Studio accepts both `x-api-key` and the standard `Authorization: Bearer ` header. To learn more about enabling auth in LM Studio, see [Authentication](/docs/developer/core/authentication). + +Set the base URL to point to LM Studio [#set-the-base-url-to-point-to-lm-studio] + +Point your Anthropic client, or any HTTP request, at your local LM Studio server. + +Note: The following examples assume the server port is `1234`. + +cURL example [#curl-example] + +```diff +- curl https://api.anthropic.com/v1/messages \ ++ curl http://localhost:1234/v1/messages \ + -H "Content-Type: application/json" \ ++ -H "x-api-key: $LM_API_TOKEN" \ + -d '{ +- "model": "claude-4-5-sonnet", ++ "model": "ibm/granite-4-micro", + "max_tokens": 256, + "messages": [ + {"role": "user", "content": "Write a haiku about local LLMs."} + ] + }' +``` + +Python example [#python-example] + +```python +from anthropic import Anthropic + +client = Anthropic( + base_url="http://localhost:1234", + api_key="lmstudio", +) + +message = client.messages.create( + max_tokens=1024, + messages=[ + { + "role": "user", + "content": "Hello from LM Studio", + } + ], + model="ibm/granite-4-micro", +) + +print(message.content) +``` + +If you have not enabled Require Authentication, the `x-api-key` header is optional. For the Python example, you can also omit `api_key` when authentication is disabled. + +If you're running into trouble, hop onto our [Discord](https://discord.gg/lmstudio) and enter the developers channel. + + + + +* Method: `POST` +* Endpoint: `/v1/messages` +* See Anthropic docs: [https://platform.claude.com/docs/en/api/messages/create](https://platform.claude.com/docs/en/api/messages/create) + +cURL example [#curl-example] + +```bash +curl http://localhost:1234/v1/messages \ + -H "Content-Type: application/json" \ + -H "x-api-key: $LM_API_TOKEN" \ + -d '{ + "model": "ibm/granite-4-micro", + "max_tokens": 256, + "messages": [ + {"role": "user", "content": "Say hello from LM Studio."} + ] + }' +``` + +If you have not enabled Require Authentication, the `x-api-key` header is optional. + +cURL (streaming) [#curl-streaming] + +```bash +curl http://localhost:1234/v1/messages \ + -H "Content-Type: application/json" \ + -H "x-api-key: $LM_API_TOKEN" \ + -d '{ + "model": "ibm/granite-4-micro", + "messages": [{"role": "user", "content": "Hello"}], + "max_tokens": 256, + "stream": true + }' +``` + +You will receive SSE events such as `message_start`, `content_block_start`, `content_block_delta`, `content_block_stop`, `message_delta`, and `message_stop`. + +cURL (tools) [#curl-tools] + +```bash +curl http://localhost:1234/v1/messages \ + -H "Content-Type: application/json" \ + -H "x-api-key: $LM_API_TOKEN" \ + -d '{ + "model": "ibm/granite-4-micro", + "max_tokens": 1024, + "tools": [ + { + "name": "get_weather", + "description": "Get the current weather in a given location", + "input_schema": { + "type": "object", + "properties": { + "location": { + "type": "string", + "description": "The city and state, e.g. San Francisco, CA" + } + }, + "required": ["location"] + } + } + ], + "tool_choice": {"type": "any"}, + "messages": [ + { + "role": "user", + "content": "What is the weather like in San Francisco?" + } + ] + }' +``` + + + + +Requires LM Studio 0.4.0 or newer. [#requires-lm-studio-040-or-newer] + +LM Studio supports API Tokens for authentication, providing a secure and convenient way to access the LM Studio API. + +By default, the LM Studio API runs **without enforcing authentication**. For production or shared environments, enable API Token authentication for secure access. + + + To enable API Token authentication, create tokens and control granular permissions, check [this guide](/docs/developer/core/authentication) for more details. + + +Providing the API Token [#providing-the-api-token] + +The API Token can be provided in two ways: + +1. **Environment Variable (Recommended)**: Set the `LM_API_TOKEN` environment variable, and the SDK will automatically read it. +2. **Function Argument**: Pass the token directly as the `api_token` parameter. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + # Configure the default client with an API token + lms.configure_default_client(api_token="your-token-here") + + model = lms.llm() + result = model.respond("What is the meaning of life?") + print(result) + ``` + + + + ```python + import lmstudio as lms + + # Pass api_token to the Client constructor + with lms.Client(api_token="your-token-here") as client: + model = client.llm.model() + result = model.respond("What is the meaning of life?") + print(result) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + # Pass api_token to the AsyncClient constructor + async with lms.AsyncClient(api_token="your-token-here") as client: + model = await client.llm.model() + result = await model.respond("What is the meaning of life?") + print(result) + ``` + + + + + + +`lmstudio` is a library published on PyPI that allows you to use `lmstudio-python` in your own projects. +It is open source and developed on GitHub. +You can find the source code [here](https://github.com/lmstudio-ai/lmstudio-python). + +Installing `lmstudio-python` [#installing-lmstudio-python] + +As it is published to PyPI, `lmstudio-python` may be installed using `pip` +or your preferred project dependency manager (`pdm` and `uv` are shown, but other +Python project management tools offer similar dependency addition commands). + + + + + pip + + + + pdm + + + + uv + + + + + ```bash + pip install lmstudio + ``` + + + + ```bash + pdm add lmstudio + ``` + + + + ```bash + uv add lmstudio + ``` + + + +Customizing the server API host and TCP port [#customizing-the-server-api-host-and-tcp-port] + +All of the examples in the documentation assume that the server API is running locally +on one of the default application ports (Note: in Python SDK versions prior to 1.5.0, the +SDK also required that the optional HTTP REST server be enabled). + +The network location of the server API can be overridden by +passing a `"host:port"` string when creating the client instance. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + SERVER_API_HOST = "localhost:1234" + + # This must be the *first* convenience API interaction (otherwise the SDK + # implicitly creates a client that accesses the default server API host) + lms.configure_default_client(SERVER_API_HOST) + + # Note: the dedicated configuration API was added in lmstudio-python 1.3.0 + # For compatibility with earlier SDK versions, it is still possible to use + # lms.get_default_client(SERVER_API_HOST) to configure the default client + ``` + + + + ```python + import lmstudio as lms + SERVER_API_HOST = "localhost:1234" + + # When using the scoped resource API, each client instance + # can be configured to use a specific server API host + with lms.Client(SERVER_API_HOST) as client: + model = client.llm.model() + + for fragment in model.respond_stream("What is the meaning of life?"): + print(fragment.content, end="", flush=True) + print() # Advance to a new line at the end of the response + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + SERVER_API_HOST = "localhost:1234" + + # When using the asynchronous API, each client instance + # can be configured to use a specific server API host + async with lms.AsyncClient(SERVER_API_HOST) as client: + model = await client.llm.model() + + for fragment in await model.respond_stream("What is the meaning of life?"): + print(fragment.content, end="", flush=True) + print() # Advance to a new line at the end of the response + ``` + + + +Checking a specified API server host is running [#checking-a-specified-api-server-host-is-running] + +*Required Python SDK version*: **1.5.0** + +While the most common connection pattern is to let the SDK raise an exception if it can't +connect to the specified API server host, the SDK also supports running the API check directly +without creating an SDK client instance first: + + + + + Python (synchronous API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + SERVER_API_HOST = "localhost:1234" + + if lms.Client.is_valid_api_host(SERVER_API_HOST): + print(f"An LM Studio API server instance is available at {SERVER_API_HOST}") + else: + print("No LM Studio API server instance found at {SERVER_API_HOST}") + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + SERVER_API_HOST = "localhost:1234" + + if await lms.AsyncClient.is_valid_api_host(SERVER_API_HOST): + print(f"An LM Studio API server instance is available at {SERVER_API_HOST}") + else: + print("No LM Studio API server instance found at {SERVER_API_HOST}") + ``` + + + +Determining the default local API server port [#determining-the-default-local-api-server-port] + +*Required Python SDK version*: **1.5.0** + +When no API server host is specified, the SDK queries a number of ports on the local loopback +interface for a running API server instance. This scan is repeated for each new client instance +created. Rather than letting the SDK perform this scan implicitly, the SDK also supports running +the scan explicitly, and passing in the reported API server details when creating clients: + + + + + Python (synchronous API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + api_host = lms.Client.find_default_local_api_host() + if api_host is not None: + print(f"An LM Studio API server instance is available at {api_host}") + else: + print("No LM Studio API server instance found on any of the default local ports") + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + api_host = await lms.AsyncClient.find_default_local_api_host() + if api_host is not None: + print(f"An LM Studio API server instance is available at {api_host}") + else: + print("No LM Studio API server instance found on any of the default local ports") + ``` + + + + + + +To simplify interactive use, `lmstudio-python` offers a convenience API which manages +its resources via `atexit` hooks, allowing a default synchronous client session +to be used across multiple interactive commands. + +This convenience API is shown in the examples throughout the documentation as the +`Python (convenience API)` tab (alongside the `Python (scoped resource API)` examples, +which use `with` statements to ensure deterministic cleanup of network communication +resources). + +The convenience API allows the standard Python REPL, or more flexible alternatives like +Juypter Notebooks, to be used to interact with AI models loaded into LM Studio. For +example: + +```python title="Python REPL" +>>> import lmstudio as lms +>>> loaded_models = lms.list_loaded_models() +>>> for idx, model in enumerate(loaded_models): +... print(f"{idx:>3} {model}") +... + 0 LLM(identifier='qwen2.5-7b-instruct') +>>> model = loaded_models[0] +>>> chat = lms.Chat("You answer questions concisely") +>>> chat = lms.Chat("You answer questions concisely") +>>> chat.add_user_message("Tell me three fruits") +UserMessage(content=[TextData(text='Tell me three fruits')]) +>>> print(model.respond(chat, on_message=chat.append)) +Banana, apple, orange. +>>> chat.add_user_message("Tell me three more fruits") +UserMessage(content=[TextData(text='Tell me three more fruits')]) +>>> print(model.respond(chat, on_message=chat.append)) +Mango, strawberry, avocado. +>>> chat.add_user_message("How many fruits have you told me?") +UserMessage(content=[TextData(text='How many fruits have you told me?')]) +>>> print(model.respond(chat, on_message=chat.append)) +You asked for three initial fruits and three more, so I've listed a total of six fruits. +``` + +While not primarily intended for use this way, the SDK's asynchronous structured concurrency API +is compatible with the asynchronous Python REPL that is launched by `python -m asyncio`. +For example: + +```python title="Python REPL" +# Note: assumes use of the "python -m asyncio" asynchronous REPL (or equivalent) +# Requires Python SDK version 1.5.0 or later +>>> from contextlib import AsyncExitStack +>>> import lmstudio as lms +>>> resources = AsyncExitStack() +>>> client = await resources.enter_async_context(lms.AsyncClient()) +>>> loaded_models = await client.llm.list_loaded() +>>> for idx, model in enumerate(loaded_models): +... print(f"{idx:>3} {model}") +... + 0 AsyncLLM(identifier='qwen2.5-7b-instruct-1m') +>>> model = loaded_models[0] +>>> chat = lms.Chat("You answer questions concisely") +>>> chat.add_user_message("Tell me three fruits") +UserMessage(content=[TextData(text='Tell me three fruits')]) +>>> print(await model.respond(chat, on_message=chat.append)) +Apple, banana, and orange. +>>> chat.add_user_message("Tell me three more fruits") +UserMessage(content=[TextData(text='Tell me three more fruits')]) +>>> print(await model.respond(chat, on_message=chat.append)) +Mango, strawberry, and pineapple. +>>> chat.add_user_message("How many fruits have you told me?") +UserMessage(content=[TextData(text='How many fruits have you told me?')]) +>>> print(await model.respond(chat, on_message=chat.append)) +You asked for three fruits initially, then three more, so I've listed six fruits in total. +``` + + + + +One benefit of using the streaming API is the ability to cancel the +prediction request based on criteria that can't be represented using +the `stopStrings` or `maxPredictedTokens` configuration settings. + +The following snippet illustrates cancelling the request in response +to an application specification cancellation condition (such as polling +an event set by another thread). + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + model = lms.llm() + + prediction_stream = model.respond_stream("What is the meaning of life?") + cancelled = False + for fragment in prediction_stream: + if ...: # Cancellation condition will be app specific + cancelled = True + prediction_stream.cancel() + # Note: it is recommended to let the iteration complete, + # as doing so allows the partial result to be recorded. + # Breaking the loop *is* permitted, but means the partial result + # and final prediction stats won't be available to the client + # The stream allows the prediction result to be retrieved after iteration + if not cancelled: + print(prediction_stream.result()) + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model() + + prediction_stream = model.respond_stream("What is the meaning of life?") + cancelled = False + for fragment in prediction_stream: + if ...: # Cancellation condition will be app specific + cancelled = True + prediction_stream.cancel() + # Note: it is recommended to let the iteration complete, + # as doing so allows the partial result to be recorded. + # Breaking the loop *is* permitted, but means the partial result + # and final prediction stats won't be available to the client + # The stream allows the prediction result to be retrieved after iteration + if not cancelled: + print(prediction_stream.result()) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model() + + prediction_stream = await model.respond_stream("What is the meaning of life?") + cancelled = False + async for fragment in prediction_stream: + if ...: # Cancellation condition will be app specific + cancelled = True + await prediction_stream.cancel() + # Note: it is recommended to let the iteration complete, + # as doing so allows the partial result to be recorded. + # Breaking the loop *is* permitted, but means the partial result + # and final prediction stats won't be available to the client + # The stream allows the prediction result to be retrieved after iteration + if not cancelled: + print(prediction_stream.result()) + ``` + + + + + + +Use `llm.respond(...)` to generate completions for a chat conversation. + +Quick Example: Generate a Chat Response [#quick-example-generate-a-chat-response] + +The following snippet shows how to obtain the AI's response to a quick chat prompt. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + model = lms.llm() + print(model.respond("What is the meaning of life?")) + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model() + print(model.respond("What is the meaning of life?")) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model() + print(await model.respond("What is the meaning of life?")) + ``` + + + +Streaming a Chat Response [#streaming-a-chat-response] + +The following snippet shows how to stream the AI's response to a chat prompt, +displaying text fragments as they are received (rather than waiting for the +entire response to be generated before displaying anything). + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + model = lms.llm() + + for fragment in model.respond_stream("What is the meaning of life?"): + print(fragment.content, end="", flush=True) + print() # Advance to a new line at the end of the response + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model() + + for fragment in model.respond_stream("What is the meaning of life?"): + print(fragment.content, end="", flush=True) + print() # Advance to a new line at the end of the response + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model() + + async for fragment in model.respond_stream("What is the meaning of life?"): + print(fragment.content, end="", flush=True) + print() # Advance to a new line at the end of the response + ``` + + + +Cancelling a Chat Response [#cancelling-a-chat-response] + +See the [Cancelling a Prediction](./cancelling-predictions) section for how to cancel a prediction in progress. + +Obtain a Model [#obtain-a-model] + +First, you need to get a model handle. +This can be done using the top-level `llm` convenience API, +or the `model` method in the `llm` namespace when using the scoped resource API. +For example, here is how to use Qwen2.5 7B Instruct. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + model = lms.llm("qwen2.5-7b-instruct") + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model("qwen2.5-7b-instruct") + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model("qwen2.5-7b-instruct") + ``` + + + +There are other ways to get a model handle. See [Managing Models in Memory](./../manage-models/loading) for more info. + +Manage Chat Context [#manage-chat-context] + +The input to the model is referred to as the "context". +Conceptually, the model receives a multi-turn conversation as input, +and it is asked to predict the assistant's response in that conversation. + +```python +import lmstudio as lms + +# Create a chat with an initial system prompt. +chat = lms.Chat("You are a resident AI philosopher.") + +# Build the chat context by adding messages of relevant types. +chat.add_user_message("What is the meaning of life?") +# ... continued in next example +``` + +See [Working with Chats](./working-with-chats) for more information on managing chat context. + + + +Generate a response [#generate-a-response] + +You can ask the LLM to predict the next response in the chat context using the `respond()` method. + + + + + Non-streaming (synchronous API) + + + + Streaming (synchronous API) + + + + Non-streaming (asynchronous API) + + + + Streaming (asynchronous API) + + + + + ```python + # The `chat` object is created in the previous step. + result = model.respond(chat) + + print(result) + ``` + + + + ```python + # The `chat` object is created in the previous step. + prediction_stream = model.respond_stream(chat) + + for fragment in prediction_stream: + print(fragment.content, end="", flush=True) + print() # Advance to a new line at the end of the response + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + # The `chat` object is created in the previous step. + result = await model.respond(chat) + + print(result) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + # The `chat` object is created in the previous step. + prediction_stream = await model.respond_stream(chat) + + async for fragment in prediction_stream: + print(fragment.content, end="", flush=True) + print() # Advance to a new line at the end of the response + ``` + + + +Customize Inferencing Parameters [#customize-inferencing-parameters] + +You can pass in inferencing parameters via the `config` keyword parameter on `.respond()`. + + + + + Non-streaming (synchronous API) + + + + Streaming (synchronous API) + + + + Non-streaming (asynchronous API) + + + + Streaming (asynchronous API) + + + + + ```python + result = model.respond(chat, config={ + "temperature": 0.6, + "maxTokens": 50, + }) + ``` + + + + ```python + prediction_stream = model.respond_stream(chat, config={ + "temperature": 0.6, + "maxTokens": 50, + }) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + result = await model.respond(chat, config={ + "temperature": 0.6, + "maxTokens": 50, + }) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + prediction_stream = await model.respond_stream(chat, config={ + "temperature": 0.6, + "maxTokens": 50, + }) + ``` + + + +See [Configuring the Model](./parameters) for more information on what can be configured. + +Print prediction stats [#print-prediction-stats] + +You can also print prediction metadata, such as the model used for generation, number of generated +tokens, time to first token, and stop reason. + + + + + Non-streaming + + + + Streaming + + + + + ```python + # `result` is the response from the model. + print("Model used:", result.model_info.display_name) + print("Predicted tokens:", result.stats.predicted_tokens_count) + print("Time to first token (seconds):", result.stats.time_to_first_token_sec) + print("Stop reason:", result.stats.stop_reason) + ``` + + + + ```python + # After iterating through the prediction fragments, + # the overall prediction result may be obtained from the stream + result = prediction_stream.result() + + print("Model used:", result.model_info.display_name) + print("Predicted tokens:", result.stats.predicted_tokens_count) + print("Time to first token (seconds):", result.stats.time_to_first_token_sec) + print("Stop reason:", result.stats.stop_reason) + ``` + + + +Both the non-streaming and streaming result access is consistent across the synchronous and +asynchronous APIs, as `prediction_stream.result()` is a non-blocking API that raises an exception +if no result is available (either because the prediction is still running, or because the +prediction request failed). Prediction streams also offer a blocking (synchronous API) or +awaitable (asynchronous API) `prediction_stream.wait_for_result()` method that internally handles +iterating the stream to completion before returning the result. + +Example: Multi-turn Chat [#example-multi-turn-chat] + +```python title="chatbot.py" +import lmstudio as lms + +model = lms.llm() +chat = lms.Chat("You are a task focused AI assistant") + +while True: + try: + user_input = input("You (leave blank to exit): ") + except EOFError: + print() + break + if not user_input: + break + chat.add_user_message(user_input) + prediction_stream = model.respond_stream( + chat, + on_message=chat.append, + ) + print("Bot: ", end="", flush=True) + for fragment in prediction_stream: + print(fragment.content, end="", flush=True) + print() +``` + +Progress Callbacks [#progress-callbacks] + +Long prompts will often take a long time to first token, i.e. it takes the model a long time to process your prompt. +If you want to get updates on the progress of this process, you can provide a float callback to `respond` +that receives a float from 0.0-1.0 representing prompt processing progress. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + llm = lms.llm() + + response = llm.respond( + "What is LM Studio?", + on_prompt_processing_progress = (lambda progress: print(f"{progress*100}% complete")), + ) + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + llm = client.llm.model() + + response = llm.respond( + "What is LM Studio?", + on_prompt_processing_progress = (lambda progress: print(f"{progress*100}% complete")), + ) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + llm = await client.llm.model() + + response = await llm.respond( + "What is LM Studio?", + on_prompt_processing_progress = (lambda progress: print(f"{progress*100}% complete")), + ) + ``` + + + +In addition to `on_prompt_processing_progress`, the other available progress callbacks are: + +* `on_first_token`: called after prompt processing is complete and the first token is being emitted. + Does not receive any arguments (use the streaming iteration API or `on_prediction_fragment` + to process tokens as they are emitted). +* `on_prediction_fragment`: called for each prediction fragment received by the client. + Receives the same prediction fragments as iterating over the stream iteration API. +* `on_message`: called with an assistant response message when the prediction is complete. + Intended for appending received messages to a chat history instance. + + + + + + +Use `llm.complete(...)` to generate text completions from a loaded language model. +Text completions mean sending a non-formatted string to the model with the expectation that the model will complete the text. + +This is different from multi-turn chat conversations. For more information on chat completions, see [Chat Completions](./chat-completion). + +Quickstart [#quickstart] + + + +

+ Instantiate a Model +

+ + First, you need to load a model to generate completions from. + This can be done using the top-level `llm` convenience API, + or the `model` method in the `llm` namespace when using the scoped resource API. + For example, here is how to use Qwen2.5 7B Instruct. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + model = lms.llm("qwen2.5-7b-instruct") +``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model("qwen2.5-7b-instruct") + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model("qwen2.5-7b-instruct") + ``` + + +
+ + +

+ Generate a Completion +

+ + Once you have a loaded model, you can generate completions by passing a string to the `complete` method on the `llm` handle. + + + + + Non-streaming (synchronous API) + + + + Streaming (synchronous API) + + + + Non-streaming (asynchronous API) + + + + Streaming (asynchronous API) + + + + + ```python + # The `model` object is created in the previous step. + result = model.complete("My name is", config={"maxTokens": 100}) + + print(result) + ``` + + + + ```python + # The `model` object is created in the previous step. + prediction_stream = model.complete_stream("My name is", config={"maxTokens": 100}) + + for fragment in prediction_stream: + print(fragment.content, end="", flush=True) + print() # Advance to a new line at the end of the response + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + # The `model` object is created in the previous step. + result = await model.complete("My name is", config={"maxTokens": 100}) + + print(result) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + # The `model` object is created in the previous step. + prediction_stream = await model.complete_stream("My name is", config={"maxTokens": 100}) + + async for fragment in prediction_stream: + print(fragment.content, end="", flush=True) + print() # Advance to a new line at the end of the response + ``` + + +
+ + +

+ Print Prediction Stats +

+ + You can also print prediction metadata, such as the model used for generation, number of generated tokens, time to first token, and stop reason. + + + + + Non-streaming + + + + Streaming + + + + + ```python + # `result` is the response from the model. + print("Model used:", result.model_info.display_name) + print("Predicted tokens:", result.stats.predicted_tokens_count) + print("Time to first token (seconds):", result.stats.time_to_first_token_sec) + print("Stop reason:", result.stats.stop_reason) + ``` + + + + ```python + # After iterating through the prediction fragments, + # the overall prediction result may be obtained from the stream + result = prediction_stream.result() + + print("Model used:", result.model_info.display_name) + print("Predicted tokens:", result.stats.predicted_tokens_count) + print("Time to first token (seconds):", result.stats.time_to_first_token_sec) + print("Stop reason:", result.stats.stop_reason) + ``` + + + + Both the non-streaming and streaming result access is consistent across the synchronous and + asynchronous APIs, as `prediction_stream.result()` is a non-blocking API that raises an exception + if no result is available (either because the prediction is still running, or because the + prediction request failed). Prediction streams also offer a blocking (synchronous API) or + awaitable (asynchronous API) `prediction_stream.wait_for_result()` method that internally handles + iterating the stream to completion before returning the result. +
+
+ +Example: Get an LLM to Simulate a Terminal [#example-get-an-llm-to-simulate-a-terminal] + +Here's an example of how you might use the `complete` method to simulate a terminal. + +```python title="terminal-sim.py" +import lmstudio as lms + +model = lms.llm() +console_history = [] + +while True: + try: + user_command = input("$ ") + except EOFError: + print() + break + if user_command.strip() == "exit": + break + console_history.append(f"$ {user_command}") + history_prompt = "\n".join(console_history) + prediction_stream = model.complete_stream( + history_prompt, + config={ "stopStrings": ["$"] }, + ) + for fragment in prediction_stream: + print(fragment.content, end="", flush=True) + print() + console_history.append(prediction_stream.result().content) +``` + +Customize Inferencing Parameters [#customize-inferencing-parameters] + +You can pass in inferencing parameters via the `config` keyword parameter on `.complete()`. + + + + + Non-streaming (synchronous API) + + + + Streaming (synchronous API) + + + + Non-streaming (asynchronous API) + + + + Streaming (asynchronous API) + + + + + ```python + result = model.complete(initial_text, config={ + "temperature": 0.6, + "maxTokens": 50, + }) + ``` + + + + ```python + prediction_stream = model.complete_stream(initial_text, config={ + "temperature": 0.6, + "maxTokens": 50, + }) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + result = await model.complete(initial_text, config={ + "temperature": 0.6, + "maxTokens": 50, + }) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + prediction_stream = await model.complete_stream(initial_text, config={ + "temperature": 0.6, + "maxTokens": 50, + }) + ``` + + + +See [Configuring the Model](./parameters) for more information on what can be configured. + +Progress Callbacks [#progress-callbacks] + +Long prompts will often take a long time to first token, i.e. it takes the model a long time to process your prompt. +If you want to get updates on the progress of this process, you can provide a float callback to `complete` +that receives a float from 0.0-1.0 representing prompt processing progress. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + llm = lms.llm() + + completion = llm.complete( + "My name is", + on_prompt_processing_progress = (lambda progress: print(f"{progress*100}% complete")), + ) + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + llm = client.llm.model() + + completion = llm.complete( + "My name is", + on_prompt_processing_progress = (lambda progress: print(f"{progress*100}% processed")), + ) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + llm = await client.llm.model() + + completion = await llm.complete( + "My name is", + on_prompt_processing_progress = (lambda progress: print(f"{progress*100}% processed")), + ) + ``` + + + +In addition to `on_prompt_processing_progress`, the other available progress callbacks are: + +* `on_first_token`: called after prompt processing is complete and the first token is being emitted. + Does not receive any arguments (use the streaming iteration API or `on_prediction_fragment` + to process tokens as they are emitted). +* `on_prediction_fragment`: called for each prediction fragment received by the client. + Receives the same prediction fragments as iterating over the stream iteration API. +* `on_message`: called with an assistant response message when the prediction is complete. + Intended for appending received messages to a chat history instance. + + + + + + +*Required Python SDK version*: **1.1.0** + +Some models, known as VLMs (Vision-Language Models), can accept images as input. You can pass images to the model using the `.respond()` method. + +Prerequisite: Get a VLM (Vision-Language Model) [#prerequisite-get-a-vlm-vision-language-model] + +If you don't yet have a VLM, you can download a model like `qwen2-vl-2b-instruct` using the following command: + +```bash +lms get qwen2-vl-2b-instruct +``` + + + +

+ Instantiate the Model +

+ + Connect to LM Studio and obtain a handle to the VLM (Vision-Language Model) you want to use. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + model = lms.llm("qwen2-vl-2b-instruct") + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model("qwen2-vl-2b-instruct") + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model("qwen2-vl-2b-instruct") + ``` + + +
+ + +

+ Prepare the Image +

+ + Use the `prepare_image()` function or `files` namespace method to + get a handle to the image that can subsequently be passed to the model. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + image_path = "/path/to/image.jpg" # Replace with the path to your image + image_handle = lms.prepare_image(image_path) + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + image_path = "/path/to/image.jpg" # Replace with the path to your image + image_handle = client.files.prepare_image(image_path) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + image_path = "/path/to/image.jpg" # Replace with the path to your image + image_handle = await client.files.prepare_image(image_path) + ``` + + + + If you only have the raw data of the image, you can supply the raw data directly as a bytes + object without having to write it to disk first. Due to this feature, binary filesystem + paths are *not* supported (as they will be handled as malformed image data rather than as + filesystem paths). + + Binary IO objects are also accepted as local file inputs. + + The LM Studio server supports JPEG, PNG, and WebP image formats. +
+ + +

+ Pass the Image to the Model in + + `.respond()` +

+ + Generate a prediction by passing the image to the model in the `.respond()` method. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + image_path = "/path/to/image.jpg" # Replace with the path to your image + image_handle = lms.prepare_image(image_path) + model = lms.llm("qwen2-vl-2b-instruct") + chat = lms.Chat() + chat.add_user_message("Describe this image please", images=[image_handle]) + prediction = model.respond(chat) + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + image_path = "/path/to/image.jpg" # Replace with the path to your image + image_handle = client.files.prepare_image(image_path) + model = client.llm.model("qwen2-vl-2b-instruct") + chat = lms.Chat() + chat.add_user_message("Describe this image please", images=[image_handle]) + prediction = model.respond(chat) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + image_path = "/path/to/image.jpg" # Replace with the path to your image + image_handle = client.files.prepare_image(image_path) + model = await client.llm.model("qwen2-vl-2b-instruct") + chat = lms.Chat() + chat.add_user_message("Describe this image please", images=[image_handle]) + prediction = await model.respond(chat) + ``` + + +
+
+ + + + +You can customize both inference-time and load-time parameters for your model. Inference parameters can be set on a per-request basis, while load parameters are set when loading the model. + +Inference Parameters [#inference-parameters] + +Set inference-time parameters such as `temperature`, `maxTokens`, `topP` and more. + + + + + .respond() + + + + .complete() + + + + + ```python + result = model.respond(chat, config={ + "temperature": 0.6, + "maxTokens": 50, + }) + ``` + + + + ```python + result = model.complete(chat, config={ + "temperature": 0.6, + "maxTokens": 50, + "stopStrings": ["\n\n"], + }) + ``` + + + +See [`LLMPredictionConfigInput`](./../../typescript/api-reference/llm-prediction-config-input) in the +Typescript SDK documentation for all configurable fields. + +Note that while `structured` can be set to a JSON schema definition as an inference-time configuration parameter +(Zod schemas are not supported in the Python SDK), the preferred approach is to instead set the +[dedicated `response_format` parameter](\(./structured-responses\)), which allows you to more rigorously +enforce the structure of the output using a JSON or class based schema definition. + +Load Parameters [#load-parameters] + +Set load-time parameters such as the context length, GPU offload ratio, and more. + +Set Load Parameters with `.model()` [#set-load-parameters-with-model] + +The `.model()` retrieves a handle to a model that has already been loaded, or loads a new one on demand (JIT loading). + +**Note**: if the model is already loaded, the given configuration will be **ignored**. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + model = lms.llm("qwen2.5-7b-instruct", config={ + "contextLength": 8192, + "gpu": { + "ratio": 0.5, + } + }) + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model( + "qwen2.5-7b-instruct", + config={ + "contextLength": 8192, + "gpu": { + "ratio": 0.5, + } + } + ) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model( + "qwen2.5-7b-instruct", + config={ + "contextLength": 8192, + "gpu": { + "ratio": 0.5, + } + } + ) + ``` + + + +See [`LLMLoadModelConfig`](./../../typescript/api-reference/llm-load-model-config) in the +Typescript SDK documentation for all configurable fields. + +Set Load Parameters with `.load_new_instance()` [#set-load-parameters-with-load_new_instance] + +The `.load_new_instance()` method creates a new model instance and loads it with the specified configuration. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + client = lms.get_default_client() + model = client.llm.load_new_instance("qwen2.5-7b-instruct", config={ + "contextLength": 8192, + "gpu": { + "ratio": 0.5, + } + }) + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.load_new_instance( + "qwen2.5-7b-instruct", + config={ + "contextLength": 8192, + "gpu": { + "ratio": 0.5, + } + } + ) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.load_new_instance( + "qwen2.5-7b-instruct", + config={ + "contextLength": 8192, + "gpu": { + "ratio": 0.5, + } + } + ) + ``` + + + +See [`LLMLoadModelConfig`](./../../typescript/api-reference/llm-load-model-config) in the +Typescript SDK documentation for all configurable fields. + + + + +*Required Python SDK version*: **1.2.0** + +Speculative decoding is a technique that can substantially increase the generation speed of large language models (LLMs) without reducing response quality. See [Speculative Decoding](./../../app/advanced/speculative-decoding) for more info. + +To use speculative decoding in `lmstudio-python`, simply provide a `draftModel` parameter when performing the prediction. You do not need to load the draft model separately. + + + + + Non-streaming + + + + Streaming + + + + + ```python + import lmstudio as lms + + main_model_key = "qwen2.5-7b-instruct" + draft_model_key = "qwen2.5-0.5b-instruct" + + model = lms.llm(main_model_key) + result = model.respond( + "What are the prime numbers between 0 and 100?", + config={ + "draftModel": draft_model_key, + } + ) + + print(result) + stats = result.stats + print(f"Accepted {stats.accepted_draft_tokens_count}/{stats.predicted_tokens_count} tokens") + ``` + + + + ```python + import lmstudio as lms + + main_model_key = "qwen2.5-7b-instruct" + draft_model_key = "qwen2.5-0.5b-instruct" + + model = lms.llm(main_model_key) + prediction_stream = model.respond_stream( + "What are the prime numbers between 0 and 100?", + config={ + "draftModel": draft_model_key, + } + ) + for fragment in prediction_stream: + print(fragment.content, end="", flush=True) + print() # Advance to a new line at the end of the response + + stats = prediction_stream.result().stats + print(f"Accepted {stats.accepted_draft_tokens_count}/{stats.predicted_tokens_count} tokens") + ``` + + + + + + +You can enforce a particular response format from an LLM by providing a JSON schema to the `.respond()` method. +This guarantees that the model's output conforms to the schema you provide. + +The JSON schema can either be provided directly, +or by providing an object that implements the `lmstudio.ModelSchema` protocol, +such as `pydantic.BaseModel` or `lmstudio.BaseModel`. + +The `lmstudio.ModelSchema` protocol is defined as follows: + +```python +@runtime_checkable +class ModelSchema(Protocol): + """Protocol for classes that provide a JSON schema for their model.""" + + @classmethod + def model_json_schema(cls) -> DictSchema: + """Return a JSON schema dict describing this model.""" + ... + +``` + +When a schema is provided, the prediction result's `parsed` field will contain a string-keyed dictionary that conforms +to the given schema (for unstructured results, this field is a string field containing the same value as `content`). + +Enforce Using a Class Based Schema Definition [#enforce-using-a-class-based-schema-definition] + +If you wish the model to generate JSON that satisfies a given schema, +it is recommended to provide a class based schema definition using a library +such as [`pydantic`](https://docs.pydantic.dev/) or [`msgspec`](https://jcristharif.com/msgspec/). + +Pydantic models natively implement the `lmstudio.ModelSchema` protocol, +while `lmstudio.BaseModel` is a `msgspec.Struct` subclass that implements `.model_json_schema()` appropriately. + +Define a Class Based Schema [#define-a-class-based-schema] + + + + + pydantic.BaseModel + + + + lmstudio.BaseModel + + + + + ```python + from pydantic import BaseModel + + # A class based schema for a book + class BookSchema(BaseModel): + title: str + author: str + year: int + ``` + + + + ```python + from lmstudio import BaseModel + + # A class based schema for a book + class BookSchema(BaseModel): + title: str + author: str + year: int + ``` + + + +Generate a Structured Response [#generate-a-structured-response] + + + + + Non-streaming + + + + Streaming + + + + + ```python + result = model.respond("Tell me about The Hobbit", response_format=BookSchema) + book = result.parsed + + print(book) + # ^ + # Note that `book` is correctly typed as { title: string, author: string, year: number } + ``` + + + + ```python + prediction_stream = model.respond_stream("Tell me about The Hobbit", response_format=BookSchema) + + # Optionally stream the response + # for fragment in prediction: + # print(fragment.content, end="", flush=True) + # print() + # Note that even for structured responses, the *fragment* contents are still only text + + # Get the final structured result + result = prediction_stream.result() + book = result.parsed + + print(book) + # ^ + # Note that `book` is correctly typed as { title: string, author: string, year: number } + ``` + + + +Enforce Using a JSON Schema [#enforce-using-a-json-schema] + +You can also enforce a structured response using a JSON schema. + +Define a JSON Schema [#define-a-json-schema] + +```python +# A JSON schema for a book +schema = { + "type": "object", + "properties": { + "title": { "type": "string" }, + "author": { "type": "string" }, + "year": { "type": "integer" }, + }, + "required": ["title", "author", "year"], +} +``` + +Generate a Structured Response [#generate-a-structured-response-1] + + + + + Non-streaming + + + + Streaming + + + + + ```python + result = model.respond("Tell me about The Hobbit", response_format=schema) + book = result.parsed + + print(book) + # ^ + # Note that `book` is correctly typed as { title: string, author: string, year: number } + ``` + + + + ```python + prediction_stream = model.respond_stream("Tell me about The Hobbit", response_format=schema) + + # Stream the response + for fragment in prediction: + print(fragment.content, end="", flush=True) + print() + # Note that even for structured responses, the *fragment* contents are still only text + + # Get the final structured result + result = prediction_stream.result() + book = result.parsed + + print(book) + # ^ + # Note that `book` is correctly typed as { title: string, author: string, year: number } + ``` + + + + + + + + +SDK methods such as `llm.respond()`, `llm.applyPromptTemplate()`, or `llm.act()` +take in a chat parameter as an input. +There are a few ways to represent a chat when using the SDK. + +Option 1: Input a Single String [#option-1-input-a-single-string] + +If your chat only has one single user message, you can use a single string to represent the chat. +Here is an example with the `.respond` method. + +```python +prediction = llm.respond("What is the meaning of life?") +``` + +Option 2: Using the `Chat` Helper Class [#option-2-using-the-chat-helper-class] + +For more complex tasks, it is recommended to use the `Chat` helper class. +It provides various commonly used methods to manage the chat. +Here is an example with the `Chat` class, where the initial system prompt +is supplied when initializing the chat instance, and then the initial user +message is added via the corresponding method call. + +```python +chat = Chat("You are a resident AI philosopher.") +chat.add_user_message("What is the meaning of life?") + +prediction = llm.respond(chat) +``` + +You can also quickly construct a `Chat` object using the `Chat.from_history` method. + + + + + Chat history data + + + + Single string + + + + + ```python + chat = Chat.from_history({"messages": [ + { "role": "system", "content": "You are a resident AI philosopher." }, + { "role": "user", "content": "What is the meaning of life?" }, + ]}) + ``` + + + + ```python + # This constructs a chat with a single user message + chat = Chat.from_history("What is the meaning of life?") + ``` + + + +Option 3: Providing Chat History Data Directly [#option-3-providing-chat-history-data-directly] + +As the APIs that accept chat histories use `Chat.from_history` internally, +they also accept the chat history data format as a regular dictionary: + +```python +prediction = llm.respond({"messages": [ + { "role": "system", "content": "You are a resident AI philosopher." }, + { "role": "user", "content": "What is the meaning of life?" }, +]}) +``` + + + + +Automatic tool calling [#automatic-tool-calling] + +We introduce the concept of execution "rounds" to describe the combined process of running a tool, providing its output to the LLM, and then waiting for the LLM to decide what to do next. + +**Execution Round** + +``` + • run a tool -> + ↑ • provide the result to the LLM -> + │ • wait for the LLM to generate a response + │ + └────────────────────────────────────────┘ └➔ (return) +``` + +A model might choose to run tools multiple times before returning a final result. For example, if the LLM is writing code, it might choose to compile or run the program, fix errors, and then run it again, rinse and repeat until it gets the desired result. + +With this in mind, we say that the `.act()` API is an automatic "multi-round" tool calling API. + +Quick Example [#quick-example] + +```python +import lmstudio as lms + +def multiply(a: float, b: float) -> float: + """Given two numbers a and b. Returns the product of them.""" + return a * b + +model = lms.llm("qwen2.5-7b-instruct") +model.act( + "What is the result of 12345 multiplied by 54321?", + [multiply], + on_message=print, +) +``` + +What does it mean for an LLM to "use a tool"? [#what-does-it-mean-for-an-llm-to-use-a-tool] + +LLMs are largely text-in, text-out programs. So, you may ask "how can an LLM use a tool?". The answer is that some LLMs are trained to ask the human to call the tool for them, and expect the tool output to to be provided back in some format. + +Imagine you're giving computer support to someone over the phone. You might say things like "run this command for me ... OK what did it output? ... OK now click there and tell me what it says ...". In this case you're the LLM! And you're "calling tools" vicariously through the person on the other side of the line. + +Running multiple tool calls in parallel [#running-multiple-tool-calls-in-parallel] + +By default, version 1.4.0 and later of the Python SDK will only run a single tool call request at a time, +even if the model requests multiple tool calls in a single response message. This ensures the requests will +be processed correctly even if the tool implementations do not support multiple concurrent calls. + +When the tool implementations are known to be thread-safe, and are both slow and frequent enough to be worth +running in parallel, the `max_parallel_tool_calls` option specifies the maximum number of tool call requests +that will be processed in parallel from a single model response. This value defaults to 1 (waiting for each +tool call to complete before starting the next one). Setting this value to `None` will automatically scale +the maximum number of parallel tool calls to a multiple of the number of CPU cores available to the process. + +Important: Model Selection [#important-model-selection] + +The model selected for tool use will greatly impact performance. + +Some general guidance when selecting a model: + +* Not all models are capable of intelligent tool use +* Bigger is better (i.e., a 7B parameter model will generally perform better than a 3B parameter model) +* We've observed [Qwen2.5-7B-Instruct](https://model.lmstudio.ai/download/lmstudio-community/Qwen2.5-7B-Instruct-GGUF) to perform well in a wide variety of cases +* This guidance may change + +Example: Multiple Tools [#example-multiple-tools] + +The following code demonstrates how to provide multiple tools in a single `.act()` call. + +```python +import math +import lmstudio as lms + +def add(a: int, b: int) -> int: + """Given two numbers a and b, returns the sum of them.""" + return a + b + +def is_prime(n: int) -> bool: + """Given a number n, returns True if n is a prime number.""" + if n < 2: + return False + sqrt = int(math.sqrt(n)) + for i in range(2, sqrt): + if n % i == 0: + return False + return True + +model = lms.llm("qwen2.5-7b-instruct") +model.act( + "Is the result of 12345 + 45668 a prime? Think step by step.", + [add, is_prime], + on_message=print, +) +``` + +Example: Chat Loop with Create File Tool [#example-chat-loop-with-create-file-tool] + +The following code creates a conversation loop with an LLM agent that can create files. + +```python +import readline # Enables input line editing +from pathlib import Path + +import lmstudio as lms + +def create_file(name: str, content: str): + """Create a file with the given name and content.""" + dest_path = Path(name) + if dest_path.exists(): + return "Error: File already exists." + try: + dest_path.write_text(content, encoding="utf-8") + except Exception as exc: + return "Error: {exc!r}" + return "File created." + +def print_fragment(fragment, round_index=0): + # .act() supplies the round index as the second parameter + # Setting a default value means the callback is also + # compatible with .complete() and .respond(). + print(fragment.content, end="", flush=True) + +model = lms.llm() +chat = lms.Chat("You are a task focused AI assistant") + +while True: + try: + user_input = input("You (leave blank to exit): ") + except EOFError: + print() + break + if not user_input: + break + chat.add_user_message(user_input) + print("Bot: ", end="", flush=True) + model.act( + chat, + [create_file], + on_message=chat.append, + on_prediction_fragment=print_fragment, + ) + print() +``` + +Progress Callbacks [#progress-callbacks] + +Complex interactions with a tool using agent may take some time to process. + +The regular progress callbacks for any prediction request are available, +but the expected capabilities differ from those for single round predictions. + +* `on_prompt_processing_progress`: called during prompt processing for each + prediction round. Receives the progress ratio (as a float) and the round + index as positional arguments. +* `on_first_token`: called after prompt processing is complete for each prediction round. + Receives the round index as its sole argument. +* `on_prediction_fragment`: called for each prediction fragment received by the client. + Receives the prediction fragment and the round index as positional arguments. +* `on_message`: called with an assistant response message when each prediction round is + complete, and with tool result messages as each tool call request is completed. + Intended for appending received messages to a chat history instance, and hence + does *not* receive the round index as an argument. + +The following additional callbacks are available to monitor the prediction rounds: + +* `on_round_start`: called before submitting the prediction request for each round. + Receives the round index as its sole argument. +* `on_prediction_completed`: called after the prediction for the round has been completed, + but before any requested tool calls have been initiated. Receives the round's prediction + result as its sole argument. A round prediction result is a regular prediction result + with an additional `round_index` attribute. +* `on_round_end`: called after any tool call requests for the round have been resolved. + +Finally, applications may request notifications when agents emit invalid tool requests: + +* `handle_invalid_tool_request`: called when a tool request was unable to be processed. + Receives the exception that is about to be reported, as well as the original tool + request that resulted in the problem. When no tool request is given, this is + purely a notification of an unrecoverable error before the agent interaction raises + the given exception (allowing the application to raise its own exception instead). + When a tool request is given, it indicates that rather than being raised locally, + the text description of the exception is going to be passed back to the agent + as the result of that failed tool request. In these cases, the callback may either + return `None` to indicate that the error description should be sent to the agent, + raise the given exception (or a different exception) locally, or return a text + string that should be sent to the agent instead of the error description. + +For additional details on defining tools, and an example of overriding the invalid +tool request handling to raise all exceptions locally instead of passing them to +back the agent, refer to [Tool Definition](./tools.md). + + + + +You can define tools as regular Python functions and pass them to the model in the `act()` call. +Alternatively, tools can be defined with `lmstudio.ToolFunctionDef` in order to control the +name and description passed to the language model. + +Anatomy of a Tool [#anatomy-of-a-tool] + +Follow one of the following examples to define functions as tools (the first approach +is typically going to be the most convenient): + + + + + Python function + + + + ToolFunctionDef.from_callable + + + + ToolFunctionDef + + + + + ```python + # Type hinted functions with clear names and docstrings + # may be used directly as tool definitions + def add(a: int, b: int) -> int: + """Given two numbers a and b, returns the sum of them.""" + # The SDK ensures arguments are coerced to their specified types + return a + b + + # Pass `add` directly to `act()` as a tool definition + ``` + + + + ```python + + from lmstudio import ToolFunctionDef + + def cryptic_name(a: int, b: int) -> int: + return a + b + + # Type hinted functions with cryptic names and missing or poor docstrings + # can be turned into clear tool definitions with `from_callable` + tool_def = ToolFunctionDef.from_callable( + cryptic_name, + name="add", + description="Given two numbers a and b, returns the sum of them." + ) + # Pass `tool_def` to `act()` as a tool definition + ``` + + + + ```python + from lmstudio import ToolFunctionDef + + def cryptic_name(a, b): + return a + b + + # Functions without type hints can be used without wrapping them + # at runtime by defining a tool function directly. + tool_def = ToolFunctionDef( + name="add", + description="Given two numbers a and b, returns the sum of them.", + parameters={ + "a": int, + "b": int, + }, + implementation=cryptic_name, + ) + # Pass `tool_def` to `act()` as a tool definition + ``` + + + +**Important**: The tool name, description, and the parameter definitions are all passed to the model! + +This means that your wording will affect the quality of the generation. Make sure to always provide a clear description of the tool so the model knows how to use it. + +Tools with External Effects (like Computer Use or API Calls) [#tools-with-external-effects-like-computer-use-or-api-calls] + +Tools can also have external effects, such as creating files or calling programs and even APIs. By implementing tools with external effects, you +can essentially turn your LLMs into autonomous agents that can perform tasks on your local machine. + +Example: `create_file_tool` [#example-create_file_tool] + +Tool Definition [#tool-definition] + +```python title="create_file_tool.py" +from pathlib import Path + +def create_file(name: str, content: str): + """Create a file with the given name and content.""" + dest_path = Path(name) + if dest_path.exists(): + return "Error: File already exists." + try: + dest_path.write_text(content, encoding="utf-8") + except Exception as exc: + return "Error: {exc!r}" + return "File created." +``` + +Example code using the `create_file` tool: [#example-code-using-the-create_file-tool] + +```python title="hybridai.py" +import lmstudio as lms +from create_file_tool import create_file + +model = lms.llm("qwen2.5-7b-instruct") +model.act( + "Please create a file named output.txt with your understanding of the meaning of life.", + [create_file], +) +``` + +Handling tool calling errors [#handling-tool-calling-errors] + +By default, version 1.3.0 and later of the Python SDK will automatically convert +exceptions raised by tool calls to text and report them back to the language model. +In many cases, when notified of an error in this way, a language model is able +to either adjust its request to avoid the failure, or else accept the failure as +a valid response to its request (consider a prompt like `Attempt to divide 1 by 0 +using the provided tool. Explain the result.`, where the expected +response is an explanation of the `ZeroDivisionError` exception the Python +interpreter raises when instructed to divide by zero). + +This error handling behaviour can be overridden using the `handle_invalid_tool_request` +callback. For example, the following code reverts the error handling back to raising +exceptions locally in the client: + +```python title="lmlm.py" +import lmstudio as lms + +def divide(numerator: float, denominator: float) -> float: + """Divide the given numerator by the given denominator. Return the result.""" + return numerator / denominator + +model = lms.llm("qwen2.5-7b-instruct") +chat = Chat() +chat.add_user_message( + "Attempt to divide 1 by 0 using the tool. Explain the result." +) + +def _raise_exc_in_client( + exc: LMStudioPredictionError, request: ToolCallRequest | None +) -> None: + raise exc + +act_result = llm.act( + chat, + [divide], + handle_invalid_tool_request=_raise_exc_in_client, +) +``` + +When a tool request is passed in, the callback results are processed as follows: + +* `None`: the original exception text is passed to the LLM unmodified +* a string: the returned string is passed to the LLM instead of the original + exception text +* raising an exception (whether the passed in exception or a new exception): + the raised exception is propagated locally in the client, terminating the + prediction process + +If no tool request is passed in, the callback invocation is a notification only, +and the exception cannot be converted to text for passing pack to the LLM +(although it can still be replaced with a different exception). These cases +indicate failures in the expected communication with the server API that mean +the prediction process cannot reasonably continue, so if the callback doesn't +raise an exception, the calling code will raise the original exception directly. + + + + +Generate embeddings for input text. Embeddings are vector representations of text that capture semantic meaning. Embeddings are a building block for RAG (Retrieval-Augmented Generation) and other similarity-based tasks. + +Prerequisite: Get an Embedding Model [#prerequisite-get-an-embedding-model] + +If you don't yet have an embedding model, you can download a model like `nomic-ai/nomic-embed-text-v1.5` using the following command: + +```bash +lms get nomic-ai/nomic-embed-text-v1.5 +``` + +Create Embeddings [#create-embeddings] + +To convert a string to a vector representation, pass it to the `embed` method on the corresponding embedding model handle. + +```python title="example.py" +import lmstudio as lms + +model = lms.embedding_model("nomic-embed-text-v1.5") + +embedding = model.embed("Hello, world!") +``` + + + + +Models use a tokenizer to internally convert text into "tokens" they can deal with more easily. LM Studio exposes this tokenizer for utility. + +Tokenize [#tokenize] + +You can tokenize a string with a loaded LLM or embedding model using the SDK. +In the below examples, the LLM reference can be replaced with an +embedding model reference without requiring any other changes. + +```python +import lmstudio as lms + +model = lms.llm() + +tokens = model.tokenize("Hello, world!") + +print(tokens) # Array of token IDs. +``` + +Count tokens [#count-tokens] + +If you only care about the number of tokens, simply check the length of the resulting array. + +```python +token_count = len(model.tokenize("Hello, world!")) +print("Token count:", token_count) +``` + +Example: count context [#example-count-context] + +You can determine if a given conversation fits into a model's context by doing the following: + +1. Convert the conversation to a string using the prompt template. +2. Count the number of tokens in the string. +3. Compare the token count to the model's context length. + +```python +import lmstudio as lms + +def does_chat_fit_in_context(model: lms.LLM, chat: lms.Chat) -> bool: + # Convert the conversation to a string using the prompt template. + formatted = model.apply_prompt_template(chat) + # Count the number of tokens in the string. + token_count = len(model.tokenize(formatted)) + # Get the current loaded context length of the model + context_length = model.get_context_length() + return token_count < context_length + +model = lms.llm() + +chat = lms.Chat.from_history({ + "messages": [ + { "role": "user", "content": "What is the meaning of life." }, + { "role": "assistant", "content": "The meaning of life is..." }, + # ... More messages + ] +}) + +print("Fits in context:", does_chat_fit_in_context(model, chat)) +``` + + + + +You can iterate through locally available models using the downloaded model listing methods. + +The listing results offer `.model()` and `.load_new_instance()` methods, which allow the +downloaded model reference to be converted in the full SDK handle for a loaded model. + +Available Models on the LM Studio Server [#available-models-on-the-lm-studio-server] + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + downloaded = lms.list_downloaded_models() + llm_only = lms.list_downloaded_models("llm") + embedding_only = lms.list_downloaded_models("embedding") + + for model in downloaded: + print(model) + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + downloaded = client.list_downloaded_models() + llm_only = client.llm.list_downloaded() + embedding_only = client.embedding.list_downloaded() + + for model in downloaded: + print(model) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + downloaded = await client.list_downloaded_models() + llm_only = await client.llm.list_downloaded() + embedding_only = await client.embedding.list_downloaded() + + for model in downloaded: + print(model) + ``` + + + +This will give you results equivalent to using [`lms ls`](../../cli/ls) in the CLI. + +Example output: [#example-output] + +```python +DownloadedLlm(model_key='qwen2.5-7b-instruct-1m', display_name='Qwen2.5 7B Instruct 1M', architecture='qwen2', vision=False) +DownloadedEmbeddingModel(model_key='text-embedding-nomic-embed-text-v1.5', display_name='Nomic Embed Text v1.5', architecture='nomic-bert') +``` + + + + +You can iterate through models loaded into memory using the functions and methods shown below. + +The results are full SDK model handles, allowing access to all model functionality. + +List Models Currently Loaded in Memory [#list-models-currently-loaded-in-memory] + +This will give you results equivalent to using [`lms ps`](../../cli/ps) in the CLI. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + + import lmstudio as lms + + all_loaded_models = lms.list_loaded_models() + llm_only = lms.list_loaded_models("llm") + embedding_only = lms.list_loaded_models("embedding") + + print(all_loaded_models) + ``` + + + + ```python + import lms + + with lms.Client() as client: + all_loaded_models = client.list_loaded_models() + llm_only = client.llm.list_loaded() + embedding_only = client.embedding.list_loaded() + + print(all_loaded_models) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + all_loaded_models = await client.list_loaded_models() + llm_only = await client.llm.list_loaded() + embedding_only = await client.embedding.list_loaded() + + print(all_loaded_models) + ``` + + + + + + +AI models are huge. It can take a while to load them into memory. LM Studio's SDK allows you to precisely control this process. + +**Model namespaces:** + +* LLMs are accessed through the `client.llm` namespace +* Embedding models are accessed through the `client.embedding` namespace +* `lmstudio.llm` is equivalent to `client.llm.model` on the default client +* `lmstudio.embedding_model` is equivalent to `client.embedding.model` on the default client + +**Most commonly:** + +* Use `.model()` to get any currently loaded model +* Use `.model("model-key")` to use a specific model + +**Advanced (manual model management):** + +* Use `.load_new_instance("model-key")` to load a new instance of a model +* Use `.unload("model-key")` or `model_handle.unload()` to unload a model from memory + +Get the Current Model with `.model()` [#get-the-current-model-with-model] + +If you already have a model loaded in LM Studio (either via the GUI or `lms load`), +you can use it by calling `.model()` without any arguments. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + model = lms.llm() + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model() + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model() + ``` + + + +Get a Specific Model with `.model("model-key")` [#get-a-specific-model-with-modelmodel-key] + +If you want to use a specific model, you can provide the model key as an argument to `.model()`. + +Get if Loaded, or Load if not [#get-if-loaded-or-load-if-not] + +Calling `.model("model-key")` will load the model if it's not already loaded, or return the existing instance if it is. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + model = lms.llm("qwen/qwen3-4b-2507") + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model("qwen/qwen3-4b-2507") + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model("qwen/qwen3-4b-2507") + ``` + + + +Load a New Instance of a Model with `.load_new_instance()` [#load-a-new-instance-of-a-model-with-load_new_instance] + +Use `load_new_instance()` to load a new instance of a model, even if one already exists. +This allows you to have multiple instances of the same or different models loaded at the same time. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + client = lms.get_default_client() + model = client.llm.load_new_instance("qwen/qwen3-4b-2507") + another_model = client.llm.load_new_instance("qwen/qwen3-4b-2507", "my-second-model") + ``` + + + + ```python + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.load_new_instance("qwen/qwen3-4b-2507") + another_model = client.llm.load_new_instance("qwen/qwen3-4b-2507", "my-second-model") + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.load_new_instance("qwen/qwen3-4b-2507") + another_model = await client.llm.load_new_instance("qwen/qwen3-4b-2507", "my-second-model") + ``` + + + +Note about Instance Identifiers [#note-about-instance-identifiers] + +If you provide an instance identifier that already exists, the server will throw an error. +So if you don't really care, it's safer to not provide an identifier, in which case +the server will generate one for you. You can always check in the server tab in LM Studio, too! + +Unload a Model from Memory with `.unload()` [#unload-a-model-from-memory-with-unload] + +Once you no longer need a model, you can unload it by simply calling `unload()` on its handle. + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + + ```python + import lmstudio as lms + + model = lms.llm() + model.unload() + ``` + + + +```python + + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model() + model.unload() + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model() + await model.unload() + ``` + + + +Set Custom Load Config Parameters [#set-custom-load-config-parameters] + +You can also specify the same load-time configuration options when loading a model, such as Context Length and GPU offload. + +See [load-time configuration](../llm-prediction/parameters) for more. + +Set an Auto Unload Timer (TTL) [#set-an-auto-unload-timer-ttl] + +You can specify a *time to live* for a model you load, which is the idle time (in seconds) +after the last request until the model unloads. See [Idle TTL](/docs/app/api/ttl-and-auto-evict) for more on this. + + + If you specify a TTL to `model()`, it will only apply if `model()` loads + a new instance, and will *not* retroactively change the TTL of an existing instance. + + + + + + Python (convenience API) + + + + Python (scoped resource API) + + + + Python (asynchronous API) + + + + +```python + + import lmstudio as lms + + model = lms.llm("qwen/qwen3-4b-2507", ttl=3600) + ``` + + + +```python + + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model("qwen/qwen3-4b-2507", ttl=3600) + ``` + + + + ```python + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model("qwen/qwen3-4b-2507", ttl=3600) + ``` + + + + + + +LLMs and embedding models, due to their fundamental architecture, have a property called `context length`, and more specifically a **maximum** context length. Loosely speaking, this is how many tokens the models can "keep in memory" when generating text or embeddings. Exceeding this limit will result in the model behaving erratically. + +Use the `get_context_length()` function on the model object [#use-the-get_context_length-function-on-the-model-object] + +It's useful to be able to check the context length of a model, especially as an extra check before providing potentially long input to the model. + +```python title="example.py" +context_length = model.get_context_length() +``` + +The `model` in the above code snippet is an instance of a loaded model you get from the `llm.model` method. See [Manage Models in Memory](../manage-models/loading) for more information. + +Example: Check if the input will fit in the model's context window [#example-check-if-the-input-will-fit-in-the-models-context-window] + +You can determine if a given conversation fits into a model's context by doing the following: + +1. Convert the conversation to a string using the prompt template. +2. Count the number of tokens in the string. +3. Compare the token count to the model's context length. + +```python +import lmstudio as lms + +def does_chat_fit_in_context(model: lms.LLM, chat: lms.Chat) -> bool: + # Convert the conversation to a string using the prompt template. + formatted = model.apply_prompt_template(chat) + # Count the number of tokens in the string. + token_count = len(model.tokenize(formatted)) + # Get the current loaded context length of the model + context_length = model.get_context_length() + return token_count < context_length + +model = lms.llm() + +chat = lms.Chat.from_history({ + "messages": [ + { "role": "user", "content": "What is the meaning of life." }, + { "role": "assistant", "content": "The meaning of life is..." }, + # ... More messages + ] +}) + +print("Fits in context:", does_chat_fit_in_context(model, chat)) +``` + + + + +*Required Python SDK version*: **1.2.0** + +LM Studio allows you to configure certain parameters when loading a model +[through the server UI](/docs/advanced/per-model) or [through the API](/docs/api/sdk/load-model). + +You can retrieve the config with which a given model was loaded using the SDK. + +In the below examples, the LLM reference can be replaced with an +embedding model reference without requiring any other changes. + + + Context length is a special case that [has its own method](/docs/api/sdk/get-context-length). + + + + + Python (convenience API) + + + Python (scoped resource API) + + + Python (asynchronous API) + + + +```python + + import lmstudio as lms + + model = lms.llm() + + print(model.get_load_config()) + ``` + + + +```python + + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model() + + print(model.get_load_config()) + ``` + + + +```python + + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.Client() as client: + model = await client.llm.model() + + print(await model.get_load_config()) + ``` + + + + + + +You can access general information and metadata about a model itself from a loaded +instance of that model. + +In the below examples, the LLM reference can be replaced with an +embedding model reference without requiring any other changes. + + + + + Python (convenience API) + + + Python (scoped resource API) + + + Python (asynchronous API) + + + +```python + + import lmstudio as lms + + model = lms.lmlm() + + print(model.get_info()) + ``` + + + +```python + + import lmstudio as lms + + with lms.Client() as client: + model = client.llm.model() + + print(model.get_info()) + ``` + + + ```python + + # Note: assumes use of an async function or the "python -m asyncio" asynchronous REPL + # Requires Python SDK version 1.5.0 or later + import lmstudio as lms + + async with lms.AsyncClient() as client: + model = await client.llm.model() + + print(await model.get_info()) +`` + + + +Example output [#example-output] +```python +LlmInstanceInfo.from_dict({ + "architecture": "qwen2", + "contextLength": 4096, + "displayName": "Qwen2.5 7B Instruct 1M", + "format": "gguf", + "identifier": "qwen2.5-7b-instruct", + "instanceReference": "lpFZPBQjhSZPrFevGyY6Leq8", + "maxContextLength": 1010000, + "modelKey": "qwen2.5-7b-instruct-1m", + "paramsString": "7B", + "path": "lmstudio-community/Qwen2.5-7B-Instruct-1M-GGUF/Qwen2.5-7B-Instruct-1M-Q4_K_M.gguf", + "sizeBytes": 4683073888, + "trainedForToolUse": true, + "type": "lmlm", + "vision": false +}) +``` + + + + +The `lms daemon down` command stops the running llmster. + +```shell +lms daemon down +``` + + + `lms daemon down` only works if llmster is running. It will not stop LM Studio if it is running as a GUI app. + + +Learn more [#learn-more] + +To find out more about llmster, see [Headless Mode](/docs/developer/core/headless). + + + + +The `lms daemon status` command reports whether llmster is currently running. + +Flags [#flags] + + + +Check daemon status [#check-daemon-status] + +```shell +lms daemon status +``` + +JSON output [#json-output] + +For scripting or automation: + +```shell +lms daemon status --json +``` + +Example output when running: + +```json +{ "status": "running", "pid": 12345, "isDaemon": true } +``` + +Example output when not running: + +```json +{ "status": "not-running" } +``` + +Start or stop the daemon [#start-or-stop-the-daemon] + +* [`lms daemon up`](/docs/cli/daemon/daemon-up) — start the daemon. +* [`lms daemon down`](/docs/cli/daemon/daemon-down) — stop the daemon. + +To find out more about llmster, see [Headless Mode](/docs/developer/core/headless). + + + + +The `lms daemon up` command starts llmster + +Flags [#flags] + + + +Start the daemon [#start-the-daemon] + +```shell +lms daemon up +``` + +If the daemon is not already running, this starts it and prints the PID. If it is already running, it reports the current status. + +JSON output [#json-output] + +For scripting or automation: + +```shell +lms daemon up --jsonl +``` + +Example output: + +```json +{ "status": "running", "pid": 26754, "isDaemon": true, "version": "0.4.4+1" } +``` + +Check the daemon status [#check-the-daemon-status] + +See [`lms daemon status`](/docs/cli/daemon/daemon-status) to check whether the daemon is running. + +Learn more [#learn-more] + +To find out more about llmster, see [Headless Mode](/docs/developer/core/headless). + + + + +The `lms daemon update` command fetches and installs the latest version of llmster. + +Flags [#flags] + + + +Update the daemon [#update-the-daemon] + +Stop the daemon first: + +```shell +lms daemon down +``` + +Then run the update: + +```shell +lms daemon update +``` + +Fetches the latest stable release and installs it. + +Update to the beta channel [#update-to-the-beta-channel] + +```shell +lms daemon update --beta +``` + +After updating [#after-updating] + +Start the daemon again to use the new version: + +```shell +lms daemon up +``` + +To find out more about llmster, see [Headless Mode](/docs/developer/core/headless). + + + + +Use `lms chat` to talk to a local model directly in the terminal. This is handy for quick experiments or scripting. + +Flags [#flags] + + + +Start an interactive chat [#start-an-interactive-chat] + +```shell +lms chat +``` + +You will be prompted to pick a model if one is not provided. + +Chat with a specific model [#chat-with-a-specific-model] + +```shell +lms chat my-model +``` + +Send a single prompt and exit [#send-a-single-prompt-and-exit] + +Use `-p` to print the response to stdout and exit instead of staying interactive: + +```shell +lms chat my-model -p "Summarize this release note" +``` + +Set a system prompt [#set-a-system-prompt] + +```shell +lms chat my-model -s "You are a terse assistant. Reply in two sentences." +``` + +Keep the model loaded after chatting [#keep-the-model-loaded-after-chatting] + +```shell +lms chat my-model --ttl 600 +``` + +Pipe input from another command [#pipe-input-from-another-command] + +`lms chat` reads from stdin, so you can pipe content directly into a prompt: + +```shell +cat my_file.txt | lms chat -p "Summarize this, please" +``` + + + + +The `lms get` command allows you to search and download models from online repositories. If no model is specified, it shows staff-picked recommendations. + +Models you download via `lms get` will be stored in your LM Studio model directory. + +Flags [#flags] + + + +Download a model [#download-a-model] + +Download a model by name: + +```shell +lms get llama-3.1-8b +``` + +Specify quantization [#specify-quantization] + +Download a specific model quantization: + +```shell +lms get llama-3.1-8b@q4_k_m +``` + +Filter by format [#filter-by-format] + +Show only MLX or GGUF models: + +```shell +lms get --mlx +lms get --gguf +``` + +Control search results [#control-search-results] + +Limit the number of results: + +```shell +lms get --limit 5 +``` + +Always show all options: + +```shell +lms get --always-show-all-results +lms get --always-show-download-options +``` + + + + +Use `lms import` to bring an existing model file into LM Studio without downloading it. + +Flags [#flags] + + + +Only one of `--copy`, `--hard-link`, or `--symbolic-link` can be used at a time. If none is provided, `lms import` moves the file by default. + +Import a model file [#import-a-model-file] + +```shell +lms import ~/Downloads/model.gguf +``` + +Keep the original file [#keep-the-original-file] + +```shell +lms import ~/Downloads/model.gguf --copy +``` + +Pick the target folder yourself [#pick-the-target-folder-yourself] + +Use `--user-repo` to skip prompts and place the model in the chosen namespace: + +```shell +lms import ~/Downloads/model.gguf --user-repo my-user/custom-models +``` + +Dry run before importing [#dry-run-before-importing] + +```shell +lms import ~/Downloads/model.gguf --dry-run +``` + + + + +The `lms load` command loads a model into memory. You can optionally set parameters such as context length, GPU offload, and TTL. This guide also covers unloading models with `lms unload`. + +Flags [#flags] + + + +Load a model [#load-a-model] + +Load a model into memory by running the following command: + +```shell +lms load +``` + +You can find the `model_key` by first running [`lms ls`](/docs/cli/local-models/ls) to list your locally downloaded models. + +Set a custom identifier [#set-a-custom-identifier] + +Optionally, you can assign a custom identifier to the loaded model for API reference: + +```shell +lms load --identifier "my-custom-identifier" +``` + +You will then be able to refer to this model by the identifier `my_model` in subsequent commands and API calls (`model` parameter). + +Set context length [#set-context-length] + +You can set the context length when loading a model using the `--context-length` flag: + +```shell +lms load --context-length 4096 +``` + +This determines how many tokens the model will consider as context when generating text. + +Set GPU offload [#set-gpu-offload] + +Control GPU memory usage with the `--gpu` flag: + +```shell +lms load --gpu 0.5 # Offload 50% of layers to GPU +lms load --gpu max # Offload all layers to GPU +lms load --gpu off # Disable GPU offloading +``` + +If not specified, LM Studio will automatically determine optimal GPU usage. + +Set TTL [#set-ttl] + +Set an auto-unload timer with the `--ttl` flag (in seconds): + +```shell +lms load --ttl 3600 # Unload after 1 hour of inactivity +``` + +Estimate resources without loading [#estimate-resources-without-loading] + +Preview memory requirements before loading a model using `--estimate-only`: + +```shell +lms load --estimate-only +``` + +Optional flags such as `--context-length` and `--gpu` are honored and reflected in the estimate. The estimator accounts for factors like context length, flash attention, and whether the model is vision‑enabled. + +Example: + +```bash +$ lms load --estimate-only gpt-oss-120b +Model: openai/gpt-oss-120b +Estimated GPU Memory: 65.68 GB +Estimated Total Memory: 65.68 GB + +Estimate: This model may be loaded based on your resource guardrails settings. +``` + +Unload models [#unload-models] + +Use `lms unload` to remove models from memory. + +Flags [#flags-1] + + + +Unload a specific model [#unload-a-specific-model] + +```shell +lms unload +``` + +If no model key is provided, you will be prompted to select from currently loaded models. + +Unload all models [#unload-all-models] + +```shell +lms unload --all +``` + +Unload from a remote LM Studio instance [#unload-from-a-remote-lm-studio-instance] + +```shell +lms unload --host +``` + +Operate on a remote LM Studio instance [#operate-on-a-remote-lm-studio-instance] + +`lms load` supports the `--host` flag to connect to a remote LM Studio instance. + +```shell +lms load --host +``` + +For this to work, the remote LM Studio instance must be running and accessible from your local machine, e.g. be accessible on the same subnet. + + + + +The `lms ls` command displays a list of all models downloaded to your machine, including their size, architecture, and parameters. + +Flags [#flags] + + + +List all models [#list-all-models] + +Show all downloaded models: + +```shell +lms ls +``` + +Example output: + +``` +You have 47 models, taking up 160.78 GB of disk space. + +LLMs (Large Language Models) PARAMS ARCHITECTURE SIZE +lmstudio-community/meta-llama-3.1-8b-instruct 8B Llama 4.92 GB +hugging-quants/llama-3.2-1b-instruct 1B Llama 1.32 GB +mistral-7b-instruct-v0.3 Mistral 4.08 GB +zeta 7B Qwen2 4.09 GB + +... (abbreviated in this example) ... + +Embedding Models PARAMS ARCHITECTURE SIZE +text-embedding-nomic-embed-text-v1.5@q4_k_m Nomic BERT 84.11 MB +text-embedding-bge-small-en-v1.5 33M BERT 24.81 MB +``` + +Filter by model type [#filter-by-model-type] + +List only LLM models: + +```shell +lms ls --llm +``` + +List only embedding models: + +```shell +lms ls --embedding +``` + +Additional output formats [#additional-output-formats] + +Get detailed information about models: + +```shell +lms ls --detailed +``` + +Output in JSON format: + +```shell +lms ls --json +``` + +Operate on a remote LM Studio instance [#operate-on-a-remote-lm-studio-instance] + +`lms ls` supports the `--host` flag to connect to a remote LM Studio instance: + +```shell +lms ls --host +``` + +For this to work, the remote LM Studio instance must be running and accessible from your local machine, e.g. be accessible on the same subnet. + + + + +The `lms ps` command displays information about all models currently loaded in memory. + +List loaded models [#list-loaded-models] + +Show all currently loaded models: + +```shell +lms ps +``` + +Example output: + +``` + LOADED MODELS + +Identifier: unsloth/deepseek-r1-distill-qwen-1.5b + • Type: LLM + • Path: unsloth/DeepSeek-R1-Distill-Qwen-1.5B-GGUF/DeepSeek-R1-Distill-Qwen-1.5B-Q4_K_M.gguf + • Size: 1.12 GB + • Architecture: Qwen2 +``` + +JSON output [#json-output] + +Get the list in machine-readable format: + +```shell +lms ps --json +``` + +Operate on a remote LM Studio instance [#operate-on-a-remote-lm-studio-instance] + +`lms ps` supports the `--host` flag to connect to a remote LM Studio instance: + +```shell +lms ps --host +``` + +For this to work, the remote LM Studio instance must be running and accessible from your local machine, e.g. be accessible on the same subnet. + + + + +The `lms link disable` command disables LM Link on this device. The device will no longer connect to or be visible to other devices on the link. + +Disable LM Link [#disable-lm-link] + +```shell +lms link disable +``` + +You can re-enable LM Link at any time with [`lms link enable`](/docs/cli/link/link-enable). + +Learn more [#learn-more] + +See the [LM Link documentation](/docs/lmlink) for a full overview of LM Link. + + + + +The `lms link enable` command enables LM Link on this device, allowing it to connect with other devices on the same link. + + + LM Link requires an LM Studio account. Run `lms login` first if you haven't already. + + +Enable LM Link [#enable-lm-link] + +```shell +lms link enable +``` + +After enabling, the CLI waits for a connection to be established. If there are issues, the relevant next step is printed. + +Check the connection status [#check-the-connection-status] + +See [`lms link status`](/docs/cli/link/link-status) to verify the connection and see connected peers. + +Disable LM Link [#disable-lm-link] + +See [`lms link disable`](/docs/cli/link/link-disable) to turn LM Link off. + +Learn more [#learn-more] + +See the [LM Link documentation](/docs/lmlink) for a full overview of LM Link. + + + + +The `lms link set-device-name` command sets a display name for this device, visible to other devices on the link. + +Rename this device [#rename-this-device] + +```shell +lms link set-device-name "My Mac Studio" +``` + +The new name takes effect immediately and is visible to connected peers via [`lms link status`](/docs/cli/link/link-status). + +Learn more [#learn-more] + +See the [LM Link documentation](/docs/lmlink) for a full overview of LM Link. + + + + +The `lms link set-preferred-device` command sets which device on the link is used when a model is available on multiple connected devices. + +Set a preferred device [#set-a-preferred-device] + +Run the command without arguments to pick from an interactive list of connected devices: + +```shell +lms link set-preferred-device +``` + +Or pass the device identifier directly to skip the prompt: + +```shell +lms link set-preferred-device +``` + +Device identifiers are listed in the output of [`lms link status`](/docs/cli/link/link-status). + +See [Using LM Link with the REST API](/docs/developer/core/lmlink) for more on how preferred devices affect model routing. + +Learn more [#learn-more] + +See the [LM Link documentation](/docs/lmlink) for a full overview of LM Link. + + + + +The `lms link status` command shows whether LM Link is enabled on this device, and lists connected peers and their loaded models. + +Flags [#flags] + + + +Check status [#check-status] + +```shell +lms link status +``` + +Displays this device's name, connection state, and a list of connected peers with their currently loaded models. + +JSON output [#json-output] + +For scripting or automation: + +```bash +lms link status --json +``` + +Enable or disable LM Link [#enable-or-disable-lm-link] + +* [`lms link enable`](/docs/cli/link/link-enable) — enable LM Link on this device. +* [`lms link disable`](/docs/cli/link/link-disable) — disable LM Link on this device. + +Learn more [#learn-more] + +See the [LM Link documentation](/docs/lmlink) for a full overview of LM Link. + + + + +Use `lms runtime` to list, download, switch, or remove inference runtimes without opening the app. + +Commands [#commands] + +* `lms runtime ls` — list installed runtimes. +* `lms runtime get` — download a runtime. +* `lms runtime select` — set the active runtime. +* `lms runtime remove` — uninstall a runtime. +* `lms runtime update` — update an installed runtime. + +List installed runtimes [#list-installed-runtimes] + +```shell +lms runtime ls +``` + +Download a runtime [#download-a-runtime] + +```shell +lms runtime get +``` + +Switch to a runtime [#switch-to-a-runtime] + +```shell +lms runtime select +``` + +Follow the interactive prompts to choose the version you want. + + + + +`lms log stream` lets you inspect the exact strings LM Studio sends to and receives from models, and (new in 0.3.26) stream server logs. This is useful for debugging prompt templates, model IO, and server operations. + +Flags [#flags] + + + +Quick start [#quick-start] + +Stream model IO (default): + +```shell +lms log stream +``` + +Stream server logs: + +```shell +lms log stream --source server +``` + +Filter model logs [#filter-model-logs] + +```bash +# Only the formatted user input +lms log stream --source model --filter input + +# Only the model output (emitted once the message completes) +lms log stream --source model --filter output + +# Both directions +lms log stream --source model --filter input,output +``` + +JSON output and stats [#json-output-and-stats] + +Emit JSON: + +```shell +lms log stream --source model --filter input,output --json +``` + +Include prediction stats: + +```shell +lms log stream --source model --filter output --stats +``` + + + + +The `lms server start` command launches the LM Studio local server, allowing you to interact with loaded models via HTTP API calls. + +Flags [#flags] + + + +Start the server [#start-the-server] + +Start the server with default settings: + +```shell +lms server start +``` + +Specify a custom port [#specify-a-custom-port] + +Run the server on a specific port: + +```shell +lms server start --port 3000 +``` + +Enable CORS support [#enable-cors-support] + +For usage with web applications or some VS Code extensions, you may need to enable CORS support: + +```shell +lms server start --cors +``` + +Note that enabling CORS may expose your server to security risks, so use it only when necessary. + +Check the server status [#check-the-server-status] + +See [`lms server status`](/docs/cli/serve/server-status) for more information on checking the status of the server. + + + + +The `lms server status` command displays the current status of the LM Studio local server, including whether it's running and its configuration. + +Flags [#flags] + + + +Check server status [#check-server-status] + +Get the basic status of the server: + +```shell +lms server status +``` + +Example output: + +``` +The server is running on port 1234. +``` + +Example usage [#example-usage] + +```console +➜ ~ lms server start +Starting server... +Waking up LM Studio service... +Success! Server is now running on port 1234 + +➜ ~ lms server status +The server is running on port 1234. +``` + +JSON output [#json-output] + +Get the status in machine-readable JSON format: + +```shell +lms server status --json --quiet +``` + +Example output: + +```json +{ "running": true, "port": 1234 } +``` + +Control logging output [#control-logging-output] + +Adjust logging verbosity: + +```shell +lms server status --verbose +lms server status --quiet +lms server status --log-level debug +``` + +You can only use one logging control flag at a time (`--verbose`, `--quiet`, or `--log-level`). + + + + +The `lms server stop` command gracefully stops the running LM Studio server. + +```shell +lms server stop +``` + +Example output: + +``` +Stopped the server on port 1234. +``` + +Any active request will be terminated when the server is stopped. You can restart the server using [`lms server start`](/docs/cli/serve/server-start). + + + + +Use `lms clone` to copy an artifact from LM Studio Hub onto your machine. + +Flags [#flags] + + + +If no path is provided, `lms clone owner/name` creates a folder called `name` in the current directory. The command exits if the target path already exists. + +Clone the latest revision [#clone-the-latest-revision] + +```shell +lms clone alice/sample-plugin +``` + +Clone into a specific directory [#clone-into-a-specific-directory] + +```shell +lms clone alice/sample-plugin ./my-folder +``` + + + + +Use `lms dev` inside a plugin project to run a local dev server that rebuilds and reloads on file changes. + +This feature is a part of LM Studio [Plugins](/docs/typescript/plugins), currently in private beta. + +Run the dev plugin server [#run-the-dev-plugin-server] + +```shell +lms dev +``` + +This verifies `manifest.json`, installs dependencies if needed, and starts a watcher that rebuilds the plugin on changes. Supported runners: Node/ECMAScript and Deno. + +Install the plugin instead of running dev [#install-the-plugin-instead-of-running-dev] + +```shell +lms dev --install +``` + +Flags [#flags] + + + + + + +Use `lms login` to authenticate the CLI with LM Studio Hub. + +Sign in with the browser [#sign-in-with-the-browser] + +```shell +lms login +``` + +The CLI opens a browser window for authentication. If a browser cannot be opened automatically, copy the printed URL into your browser. + +"CI style" login with pre-authenticated keys [#ci-style-login-with-pre-authenticated-keys] + +```bash +lms login --with-pre-authenticated-keys \ + --key-id \ + --public-key \ + --private-key +``` + +Advanced Flags [#advanced-flags] + + + + + + +Run `lms push` from inside a [plugin](/docs/typescript/plugins), [preset](/docs/app/presets), or [`model.yaml`](/docs/app/modelyaml) project to publish a new revision. If a `model.yaml` exists, the CLI will generate a `manifest.json` for you before pushing. + +For plugins, the CLI will ask for confirmation unless you pass `-y`. + +Publish the current folder [#publish-the-current-folder] + +```shell +lms push +``` + +Flags [#flags] + + + +Advanced [#advanced] + +Publish quietly and keep the revision in manifest.json [#publish-quietly-and-keep-the-revision-in-manifestjson] + +```shell +lms push -y --write-revision +``` + +Override metadata for this upload [#override-metadata-for-this-upload] + +```shell +lms push --description "New beta build" --overrides '{"tags": ["beta"]}' +``` + + + + +LM Studio now supports MCP with OAuth. Seamlessly connect integrations that require authentication without copying tokens or configuring headers. Simply add your integration, log in via browser, and its tools are instantly available to your models in LM Studio. + + + +How it works [#how-it-works] + +When you add an OAuth-backed MCP integration, LM Studio: + +1. Opens a browser window to the service's authorization page +2. Stores the token securely after you approve access +3. Makes the server's tools available in chat + +From that point on, your model can call tools from that service just like any other MCP server. + +*** + +Connecting with your own OAuth credentials [#connecting-with-your-own-oauth-credentials] + +Some services require you to bring your own OAuth app, either because they don't support dynamic client registration, or because they need a specific redirect URL whitelisted in their developer portal. + +In these cases, add an `auth` object to the server entry in `mcp.json`. When configuring your OAuth app, use the following callback URL: + +``` +http://127.0.0.1:33389/mcp-oauth-callback +``` + +```json +{ + "mcpServers": { + "oauth-server": { + "url": "https://api.example.com/mcp", + "auth": { + "CLIENT_ID": "TEST_CLIENT_ID", + "CLIENT_SECRET": "TEST_CLIENT_SECRET" + } + } + } +} +``` + + + + +Linear [#linear] + +Create issues, search projects, update statuses, and more in Linear, directly from LM Studio. + + + +```json +{ + "mcpServers": { + "linear": { + "url": "https://mcp.linear.app/mcp" + } + } +} +``` + +*** + +Notion [#notion] + +Search pages, create documents, and read from your Notion workspace. + + + +```json +{ + "mcpServers": { + "notion": { + "url": "https://mcp.notion.com/mcp" + } + } +} +``` + +*** + +Atlassian [#atlassian] + +Work with Jira issues and Confluence pages from within LM Studio. + + + +```json +{ + "mcpServers": { + "atlassian": { + "url": "https://mcp.atlassian.com/v1/mcp" + } + } +} +``` + +*** + +Sentry [#sentry] + +Query issues, inspect stack traces, and analyze errors from your Sentry projects. + + + +```json +{ + "mcpServers": { + "sentry": { + "url": "https://mcp.sentry.dev/mcp" + } + } +} +``` + +*** + +Many more integrations are supported. Any MCP server that uses OAuth or standard HTTP transport can be connected to LM Studio. See [Use MCP Servers](/docs/app/mcp) for how to add custom servers manually via `mcp.json`. + + + + +Add a new device [#add-a-new-device] + + + +Machines with GUI [#machines-with-gui] + +To begin using LM Link, add an additional device to the link: + +1. Download and install LM Studio on the device, at [https://lmstudio.ai/download](https://lmstudio.ai/download) +2. Click on LM Link in the sidebar and follow the steps to enable LM Link. + +Once LM Link is enabled, your devices will connect to each other automatically. + +Machines without GUI [#machines-without-gui] + +To add a headless machine, connect remotely by using llmster in the terminal: + +1. Install `llmster` on the headless machine + +```bash +curl -fsSL https://lmstudio.ai/install.sh | bash +``` + +2. Log in from the terminal + +```bash +lms login +``` + +3. Follow the instructions in your terminal output to complete login. +4. Once logged in, run the following command: + +```bash +lms link enable +``` + +Your devices will automatically discover each other over the link, and your headless machine will immediately appear on the LM Link page for your other device. Once connected, models from remote machines will appear locally for loading and inference. + +Load models on remote machines [#load-models-on-remote-machines] + + + +When using LM Link, the model loader shows both local models and remote models on linked devices. + +You can filter the model loader to display only local or remote models, or to display all available models at once. Remote models can be loaded and configured with the same familiar controls, either in the GUI or by using lms in the terminal. + +If you have the same model on multiple devices, they will show up as separate entries, with the associated device name identified. If you are loading models via API/SDK, you can [set a preferred device](/docs/lmlink/basics/preferred-device) to specify which device to load the model from when multiple options are available. + +Using LM Studio’s parallel requests, you can also serve multiple clients simultaneously across your LM Link network. + + + + +Q&A [#qa] + +Got questions about LM Link? We cover some of the most common questions below. + +Q: Does LM Link open up my computer to the public internet? [#q-does-lm-link-open-up-my-computer-to-the-public-internet] + +A: No! All your devices in the LM Link network communicate with each other using Tailscale’s internal end-to-end encrypted connections. None of your devices are ever exposed to the public Internet. + +Q: Can I use remote models with LM Studio's local server? [#q-can-i-use-remote-models-with-lm-studios-local-server] + +A: Yes. Any model in your LM Link network can be used as if they are local. This means that any tool that already connects to your local LM Studio will be able to use remote models as well, just by pointing to localhost:1234 as usual. + +Q: Can I use remote models through the LM Studio API/SDKs? [#q-can-i-use-remote-models-through-the-lm-studio-apisdks] + +A: Yes. Any model in your LM Link network can be used as if they are local. Just specify the model key as usual. If the model can be found on a remote device, it can be used through LM Link. + +Q: Will LM Link interfere with my existing Tailscale VPN? [#q-will-lm-link-interfere-with-my-existing-tailscale-vpn] + +A: No. LM Link is an entirely separate and self-contained utilization of Tailscale VPN primitives. LM Link will coexist with other Tailscale utilization on your machine or network, with no interference or interplay. + +Q: Can the LM Studio Hub see my chats? [#q-can-the-lm-studio-hub-see-my-chats] + +A: No. The LM Studio Hub is only used to facilitate discovery between LM Studio/llmster instances. All communication afterwards, including chats and model listing, happens within Tailscale’s end-to-end encrypted connection. + +Q: How can I disable LM Link? [#q-how-can-i-disable-lm-link] + +A: In the LM Studio app, go to Settings -> LM Link -> Enable LM Link - OFF. If you are using llmster (our headless daemon), run `lms link disable`. + +Q: Why does a device show up as “disconnected”? [#q-why-does-a-device-show-up-as-disconnected] + +A: LM Link uses end-to-end encrypted tunnels to connect to each other. If a device shows up as “disconnected”, it is possible that device has crashed but has not reported to the discovery server. Please make sure LM Studio/llmster is indeed running on that device. If the error persists, please report a bug at [bugs@lmstudio.ai](mailto:bugs@lmstudio.ai). + +Q: If I have the same model on multiple devices, how do I choose which one to use? [#q-if-i-have-the-same-model-on-multiple-devices-how-do-i-choose-which-one-to-use] + +A: If you are loading the model via LM Studio or `lms load`, the same model on different devices will show up as separate entries, with the device name identified. If you are loading models via API/SDK, you can set a preferred device from the in-app LM Link page, or use command `lms link set-preferred-device`. Once set, the model will always load on your preferred device. + +Q: Can linked devices do anything besides LM Studio tasks on my computer? [#q-can-linked-devices-do-anything-besides-lm-studio-tasks-on-my-computer] + +A: No. LM Link only lets LM Studio/llmster talk to each other for model and API access. It does not expose your operating system, files, or other services to linked devices. + +Q: Can I use my existing Tailscale network? [#q-can-i-use-my-existing-tailscale-network] + +A: Not at the moment. When you enable LM Link we create a dedicated network programmatically and take full control over the ACL. This will not work well with any existing Tailscale networks. If you wish, you can DIY several aspects of the LM Link feature set yourself. + + + + +Requesting Access [#requesting-access] +```html + +``` +To get started, find the LM Link icon in the LM Studio app, just above the Settings gear icon. LM Link is a network between your devices, so log-in is required to associate devices to users in order to facilitate discovery. + +A custom link is **automatically provisioned** for you the first time you access the feature. + +Once your first device has joined the link, [add another device](/docs/lmlink/basics/add-device) to experience the power of LM Link! + + + + +Choosing a preferred device [#choosing-a-preferred-device] + +When the same model is available on multiple devices in the link, LM Link uses the preferred device to load and use the model. This setting is per-machine: each device on the link independently controls which remote machine it prefers. + +This is especially relevant when accessing remote models via the SDK or [REST API](/docs/developer/core/lmlink). + +Machines with GUI [#machines-with-gui] + +In the app, head to the LM Link page, select the device and toggle the "Set as preferred device" option. + + + +Machines without GUI [#machines-without-gui] + +To set a preferred device from the terminal, use the following command: + +```bash +lms link set-preferred-device +``` + + + + + + +Sometimes you may want to halt a prediction before it finishes. For example, the user might change their mind or your UI may navigate away. `lmstudio-js` provides two simple ways to cancel a running prediction. + + + +

+ Call + + `.cancel()` + on the prediction +

+``` + Every prediction method returns an `OngoingPrediction` instance. Calling `.cancel()` stops generation and causes the final `stopReason` to be `"userStopped"`. In the example below we schedule the cancel call on a timer: + +```typescript + import { LMStudioClient } from "@lmstudio/sdk"; + + const client = new LMStudioClient(); + const model = await client.llm.model("qwen2.5-7b-instruct"); + + const prediction = model.respond("What is the meaning of life?", { + maxTokens: 50, + }); + setTimeout(() => prediction.cancel(), 1000); // cancel after 1 second + + const result = await prediction.result(); + console.info(result.stats.stopReason); // "userStopped" + ``` +
+ + +

+ Use an + + `AbortController` +

+ + If your application already uses an `AbortController` to propagate cancellation, you can pass its `signal` to the prediction method. Aborting the controller stops the prediction with the same `stopReason`: + + ```typescript + import { LMStudioClient } from "@lmstudio/sdk"; + + const client = new LMStudioClient(); + const model = await client.llm.model("qwen2.5-7b-instruct"); + + const controller = new AbortController(); + const prediction = model.respond("What is the meaning of life?", { + maxTokens: 50, + signal: controller.signal, + }); + setTimeout(() => controller.abort(), 1000); // cancel after 1 second + + const result = await prediction.result(); + console.info(result.stats.stopReason); // "userStopped" + ``` +
+
+ +Both approaches halt generation immediately, and the returned stats indicate that the prediction ended because you stopped it. + + + + +Use `llm.respond(...)` to generate completions for a chat conversation. + +Quick Example: Generate a Chat Response [#quick-example-generate-a-chat-response] + +The following snippet shows how to stream the AI's response to quick chat prompt. + +```typescript title="index.ts" +import { LMStudioClient } from "@lmstudio/sdk"; +const client = new LMStudioClient(); + +const model = await client.llm.model(); + +for await (const fragment of model.respond("What is the meaning of life?")) { + process.stdout.write(fragment.content); +} +``` + +Obtain a Model [#obtain-a-model] + +First, you need to get a model handle. This can be done using the `model` method in the `llm` namespace. For example, here is how to use Qwen2.5 7B Instruct. + +```typescript title="index.ts" +import { LMStudioClient } from "@lmstudio/sdk"; +const client = new LMStudioClient(); + +const model = await client.llm.model("qwen2.5-7b-instruct"); +``` + +There are other ways to get a model handle. See [Managing Models in Memory](./../manage-models/loading) for more info. + +Manage Chat Context [#manage-chat-context] + +The input to the model is referred to as the "context". Conceptually, the model receives a multi-turn conversation as input, and it is asked to predict the assistant's response in that conversation. + + + + + Using an array of messages + + + + Constructing a Chat object + + + + +```typescript + + import { Chat } from "@lmstudio/sdk"; + + // Create a chat object from an array of messages. + const chat = Chat.from([ + { role: "system", content: "You are a resident AI philosopher." }, + { role: "user", content: "What is the meaning of life?" }, + ]); + ``` + + + + ```typescript + + import { Chat } from "@lmstudio/sdk"; + + // Create an empty chat object. + const chat = Chat.empty(); + + // Build the chat context by appending messages. + chat.append("system", "You are a resident AI philosopher."); + chat.append("user", "What is the meaning of life?"); + ``` + + + +See [Working with Chats](./working-with-chats) for more information on managing chat context. + + + +Generate a response [#generate-a-response] + +You can ask the LLM to predict the next response in the chat context using the `respond()` method. + + + + + Streaming + + + + Non-streaming + + + + + ```typescript + // The `chat` object is created in the previous step. + const prediction = model.respond(chat); + + for await (const { content } of prediction) { + process.stdout.write(content); + } + + console.info(); // Write a new line to prevent text from being overwritten by your shell. + ``` + + + + ```typescript + + // The `chat` object is created in the previous step. + const result = await model.respond(chat); + + console.info(result.content); + ``` + + + +Customize Inferencing Parameters [#customize-inferencing-parameters] + +You can pass in inferencing parameters as the second parameter to `.respond()`. + + + + + Streaming + + + + Non-streaming + + + + + ```typescript + const prediction = model.respond(chat, { + temperature: 0.6, + maxTokens: 50, + }); + ``` + + + + ```typescript + + const result = await model.respond(chat, { + temperature: 0.6, + maxTokens: 50, + }); + ``` + + + +See [Configuring the Model](./parameters) for more information on what can be configured. + +Print prediction stats [#print-prediction-stats] + +You can also print prediction metadata, such as the model used for generation, number of generated +tokens, time to first token, and stop reason. + + + + + Streaming + + + + Non-streaming + + + + + ```typescript + + // If you have already iterated through the prediction fragments, + // doing this will not result in extra waiting. + const result = await prediction.result(); + + console.info("Model used:", result.modelInfo.displayName); + console.info("Predicted tokens:", result.stats.predictedTokensCount); + console.info("Time to first token (seconds):", result.stats.timeToFirstTokenSec); + console.info("Stop reason:", result.stats.stopReason); + ``` + + + + ```typescript + // `result` is the response from the model. + console.info("Model used:", result.modelInfo.displayName); + console.info("Predicted tokens:", result.stats.predictedTokensCount); + console.info("Time to first token (seconds):", result.stats.timeToFirstTokenSec); + console.info("Stop reason:", result.stats.stopReason); + ``` + + + +Example: Multi-turn Chat [#example-multi-turn-chat] + + + +```typescript +import { Chat, LMStudioClient } from "@lmstudio/sdk"; +import { createInterface } from "readline/promises"; + +const rl = createInterface({ input: process.stdin, output: process.stdout }); +const client = new LMStudioClient(); +const model = await client.llm.model(); +const chat = Chat.empty(); + +while (true) { + const input = await rl.question("You: "); + // Append the user input to the chat + chat.append("user", input); + + const prediction = model.respond(chat, { + // When the model finish the entire message, push it to the chat + onMessage: (message) => chat.append(message), + }); + process.stdout.write("Bot: "); + for await (const { content } of prediction) { + process.stdout.write(content); + } + process.stdout.write("\n"); +} +``` + + + + + + + + +Use `llm.complete(...)` to generate text completions from a loaded language model. Text completions mean sending an non-formatted string to the model with the expectation that the model will complete the text. + +This is different from multi-turn chat conversations. For more information on chat completions, see [Chat Completions](./chat-completion). + +Quickstart [#quickstart] + + + +

+ Instantiate a Model +

+ + First, you need to load a model to generate completions from. This can be done using the `model` method on the `llm` handle. + + ```typescript title="index.ts" + import { LMStudioClient } from "@lmstudio/sdk"; + + const client = new LMStudioClient(); + const model = await client.llm.model("qwen2.5-7b-instruct"); + ``` +
+ + +

+ Generate a Completion +

+``` + Once you have a loaded model, you can generate completions by passing a string to the `complete` method on the `llm` handle. + + + + + Streaming + + + Non-streaming + + + + + + ```typescript + const completion = model.complete("My name is", { + maxTokens: 100, + }); + + for await (const { content } of completion) { + process.stdout.write(content); + } + + console.info(); // Write a new line for cosmetic purposes + ``` + + + + ```typescript + const completion = await model.complete("My name is", { + maxTokens: 100, + }); + + console.info(completion.content); + + ``` + + +
+ + +

+ Print Prediction Stats +

+ You can also print prediction metadata, such as the model used for generation, number of generated tokens, time to first token, and stop reason. + + ```typescript title="index.ts" + console.info("Model used:", completion.modelInfo.displayName); + console.info("Predicted tokens:", completion.stats.predictedTokensCount); + console.info("Time to first token (seconds):", completion.stats.timeToFirstTokenSec); + console.info("Stop reason:", completion.stats.stopReason); + ``` +
+
+ +Example: Get an LLM to Simulate a Terminal [#example-get-an-llm-to-simulate-a-terminal] + +Here's an example of how you might use the `complete` method to simulate a terminal. + +```typescript title="terminal-sim.ts" +import { LMStudioClient } from "@lmstudio/sdk"; +import { createInterface } from "node:readline/promises"; +const rl = createInterface({ input: process.stdin, output: process.stdout }); +const client = new LMStudioClient(); +const model = await client.llm.model(); +let history = ""; + +while (true) { + const command = await rl.question("$ "); + history += "$ " + command + "\n"; + + const prediction = model.complete(history, { stopStrings: ["$"] }); + for await (const { content } of prediction) { + process.stdout.write(content); + } + process.stdout.write("\n"); + + const { content } = await prediction.result(); + history += content; +} +``` + +{/* ## Advanced Usage + + ### Prediction metadata + + Prediction responses are really returned as `PredictionResult` objects that contain additional dot-accessible metadata about the inference request. + This entails info about the model used, the configuration with which it was loaded, and the configuration for this particular prediction. It also provides + inference statistics like stop reason, time to first token, tokens per second, and number of generated tokens. + + Please consult your specific SDK to see exact syntax. + + ### Progress callbacks + + TODO: TS has onFirstToken callback which Python does not + + Long prompts will often take a long time to first token, i.e. it takes the model a long time to process your prompt. + If you want to get updates on the progress of this process, you can provide a float callback to `complete` + that receives a float from 0.0-1.0 representing prompt processing progress. + + ```python tab="Python" + import lmstudio as lm + + llm = lm.llm() + + completion = llm.complete( + "My name is", + on_progress: lambda progress: print(f"{progress*100}% complete") + ) + ``` + + ```python tab="Python (with scoped resources)" + import lmstudio + + with lmstudio.Client() as client: + llm = client.llm.model() + + completion = llm.complete( + "My name is", + on_progress: lambda progress: print(f"{progress*100}% processed") + ) + ``` + + ```typescript tab="TypeScript" + import { LMStudioClient } from "@lmstudio/sdk"; + + const client = new LMStudioClient(); + const llm = await client.llm.model(); + + const prediction = llm.complete( + "My name is", + {onPromptProcessingProgress: (progress) => process.stdout.write(`${progress*100}% processed`)}); + ``` + + ### Prediction configuration + + You can also specify the same prediction configuration options as you could in the + in-app chat window sidebar. Please consult your specific SDK to see exact syntax. */} + + + + + + +Some models, known as VLMs (Vision-Language Models), can accept images as input. You can pass images to the model using the `.respond()` method. + +Prerequisite: Get a VLM (Vision-Language Model) [#prerequisite-get-a-vlm-vision-language-model] + +If you don't yet have a VLM, you can download a model like `qwen2-vl-2b-instruct` using the following command: + +```bash +lms get qwen2-vl-2b-instruct +``` + + + +

+ Instantiate the Model +

+ + Connect to LM Studio and obtain a handle to the VLM (Vision-Language Model) you want to use. + + ```typescript + import { LMStudioClient } from "@lmstudio/sdk"; + const client = new LMStudioClient(); + + const model = await client.llm.model("qwen2-vl-2b-instruct"); + ``` +
+ + +

+ Prepare the Image +

+ +Use the `client.files.prepareImage()` method to get a handle to the image that can be subsequently passed to the model. + + ```typescript + const imagePath = "/assets/image/image.jpg"; // Replace with the path to your image + const image = await client.files.prepareImage(imagePath); + ``` + + If you only have the image in the form of a base64 string, you can use the `client.files.prepareImageBase64()` method instead. + + ```typescript + const imageBase64 = "Your base64 string here"; + const image = await client.files.prepareImageBase64(imageBase64); + ``` + + The LM Studio server supports JPEG, PNG, and WebP image formats. +
+ + +

+ Pass the Image to the Model in + + `.respond()` +

+ + Generate a prediction by passing the image to the model in the `.respond()` method. + + ```typescript + const prediction = model.respond([ + { role: "user", content: "Describe this image please", images: [image] }, + ]); + ``` +
+
+ + + + +You can customize both inference-time and load-time parameters for your model. Inference parameters can be set on a per-request basis, while load parameters are set when loading the model. + +Inference Parameters [#inference-parameters] + +Set inference-time parameters such as `temperature`, `maxTokens`, `topP` and more. + + + + + .respond() + + + + .complete() + + + + + ```typescript + const prediction = model.respond(chat, { + temperature: 0.6, + maxTokens: 50, + }); + ``` + + + + ```typescript + const prediction = model.complete(prompt, { + temperature: 0.6, + maxTokens: 50, + stop: ["\n\n"], + }); + ``` + + + +See [`LLMPredictionConfigInput`](./../api-reference/llm-prediction-config-input) for all configurable fields. + +Another useful inference-time configuration parameter is [`structured`](\(./structured-responses\)), which allows you to rigorously enforce the structure of the output using a JSON or zod schema. + +Load Parameters [#load-parameters] + +Set load-time parameters such as the context length, GPU offload ratio, and more. + +Set Load Parameters with `.model()` [#set-load-parameters-with-model] + +The `.model()` retrieves a handle to a model that has already been loaded, or loads a new one on demand (JIT loading). + +**Note**: if the model is already loaded, the configuration will be **ignored**. + +```typescript +const model = await client.llm.model("qwen2.5-7b-instruct", { + config: { + contextLength: 8192, + gpu: { + ratio: 0.5, + }, + }, +}); +``` + +See [`LLMLoadModelConfig`](./../api-reference/llm-load-model-config) for all configurable fields. + +Set Load Parameters with `.load()` [#set-load-parameters-with-load] + +The `.load()` method creates a new model instance and loads it with the specified configuration. + +```typescript +const model = await client.llm.load("qwen2.5-7b-instruct", { + config: { + contextLength: 8192, + gpu: { + ratio: 0.5, + }, + }, +}); +``` + +See [`LLMLoadModelConfig`](./../api-reference/llm-load-model-config) for all configurable fields. + + + + +Speculative decoding is a technique that can substantially increase the generation speed of large language models (LLMs) without reducing response quality. See [Speculative Decoding](./../../app/advanced/speculative-decoding) for more info. + +To use speculative decoding in `lmstudio-js`, simply provide a `draftModel` parameter when performing the prediction. You do not need to load the draft model separately. + + + + + Non-streaming + + + + Streaming + + + + + ```typescript + + import { LMStudioClient } from "@lmstudio/sdk"; + + const client = new LMStudioClient(); + + const mainModelKey = "qwen2.5-7b-instruct"; + const draftModelKey = "qwen2.5-0.5b-instruct"; + + const model = await client.llm.model(mainModelKey); + const result = await model.respond("What are the prime numbers between 0 and 100?", { + draftModel: draftModelKey, + }); + + const { content, stats } = result; + console.info(content); + console.info(`Accepted ${stats.acceptedDraftTokensCount}/${stats.predictedTokensCount} tokens`); + ``` + + + + ```typescript + import { LMStudioClient } from "@lmstudio/sdk"; + + const client = new LMStudioClient(); + + const mainModelKey = "qwen2.5-7b-instruct"; + const draftModelKey = "qwen2.5-0.5b-instruct"; + + const model = await client.llm.model(mainModelKey); + const prediction = model.respond("What are the prime numbers between 0 and 100?", { + draftModel: draftModelKey, + }); + + for await (const { content } of prediction) { + process.stdout.write(content); + } + process.stdout.write("\n"); + + const { stats } = await prediction.result(); + console.info(`Accepted ${stats.acceptedDraftTokensCount}/${stats.predictedTokensCount} tokens`); + ``` + + + + + + +You can enforce a particular response format from an LLM by providing a schema (JSON or `zod`) to the `.respond()` method. This guarantees that the model's output conforms to the schema you provide. + +Enforce Using a `zod` Schema [#enforce-using-a-zod-schema] + +If you wish the model to generate JSON that satisfies a given schema, it is recommended to provide +the schema using [`zod`](https://zod.dev/). When a `zod` schema is provided, the prediction result will contain an extra field `parsed`, which contains parsed, validated, and typed result. + +Define a `zod` Schema [#define-a-zod-schema] + +```tsx +import { z } from "zod"; + +// A zod schema for a book +const bookSchema = z.object({ + title: z.string(), + author: z.string(), + year: z.number().int(), +}); +``` + +Generate a Structured Response [#generate-a-structured-response] + + + + + Non-streaming + + + + Streaming + + + + + ```typescript + const result = await model.respond("Tell me about The Hobbit.", + { structured: bookSchema }, + maxTokens: 100, // Recommended to avoid getting stuck + ); + + const book = result.parsed; + console.info(book); + // ^ + // Note that `book` is now correctly typed as { title: string, author: string, year: number } + ``` + + + + ```typescript + + const prediction = model.respond("Tell me about The Hobbit.", + { structured: bookSchema }, + maxTokens: 100, // Recommended to avoid getting stuck + ); + + for await (const { content } of prediction) { + process.stdout.write(content); + } + process.stdout.write("\n"); + + // Get the final structured result + const result = await prediction.result(); + const book = result.parsed; + + console.info(book); + // ^ + // Note that `book` is now correctly typed as { title: string, author: string, year: number } + ``` + + + +Enforce Using a JSON Schema [#enforce-using-a-json-schema] + +You can also enforce a structured response using a JSON schema. + +Define a JSON Schema [#define-a-json-schema] + +```tsx +// A JSON schema for a book +const schema = { + type: "object", + properties: { + title: { type: "string" }, + author: { type: "string" }, + year: { type: "integer" }, + }, + required: ["title", "author", "year"], +}; +``` + +Generate a Structured Response [#generate-a-structured-response-1] + + + + + Non-streaming + + + + Streaming + + + + + ```typescript + const result = await model.respond("Tell me about The Hobbit.", { + structured: { + type: "json", + jsonSchema: schema, + }, + maxTokens: 100, // Recommended to avoid getting stuck + }); + + const book = JSON.parse(result.content); + console.info(book); + ``` + + + + ```typescript + + const prediction = model.respond("Tell me about The Hobbit.", { + structured: { + type: "json", + jsonSchema: schema, + }, + maxTokens: 100, // Recommended to avoid getting stuck + }); + + for await (const { content } of prediction) { + process.stdout.write(content); + } + process.stdout.write("\n"); + + const result = await prediction.result(); + const book = JSON.parse(result.content); + + console.info("Parsed", book); + ``` + + + + + Structured generation works by constraining the model to only generate tokens that conform to the provided schema. This ensures valid output in normal cases, but comes with two important limitations: + + 1. Models (especially smaller ones) may occasionally get stuck in an unclosed structure (like an open bracket), when they "forget" they are in such structure and cannot stop due to schema requirements. Thus, it is recommended to always include a `maxTokens` parameter to prevent infinite generation. + + 2. Schema compliance is only guaranteed for complete, successful generations. If generation is interrupted (by cancellation, reaching the `maxTokens` limit, or other reasons), the output will likely violate the schema. With `zod` schema input, this will raise an error; with JSON schema, you'll receive an invalid string that doesn't satisfy schema. + + + + + +SDK methods such as `model.respond()`, `model.applyPromptTemplate()`, or `model.act()` +takes in a chat parameter as an input. There are a few ways to represent a chat in the SDK. + +Option 1: Array of Messages [#option-1-array-of-messages] + +You can use an array of messages to represent a chat. Here is an example with the `.respond()` method. + + + + + Text-only + + + + With Images + + + + + ```typescript + const prediction = model.respond([ + { role: "system", content: "You are a resident AI philosopher." }, + { role: "user", content: "What is the meaning of life?" }, + ]); + ``` + + + + ```typescript + const image = await client.files.prepareImage("/path/to/image.jpg"); + + const prediction = model.respond([ + { role: "system", content: "You are a state-of-art object recognition system." }, + { role: "user", content: "What is this object?", images: [image] }, + ]); + ``` + + + +Option 2: Input a Single String [#option-2-input-a-single-string] + +If your chat only has one single user message, you can use a single string to represent the chat. Here is an example with the `.respond` method. + +```typescript +const prediction = model.respond("What is the meaning of life?"); +``` + +Option 3: Using the `Chat` Helper Class [#option-3-using-the-chat-helper-class] + +For more complex tasks, it is recommended to use the `Chat` helper classes. It provides various commonly used methods to manage the chat. Here is an example with the `Chat` class. + + + + + Text-only + + + + With Images + + + + + ```typescript + const chat = Chat.empty(); + chat.append("system", "You are a resident AI philosopher."); + chat.append("user", "What is the meaning of life?"); + + const prediction = model.respond(chat); + ``` + + + + ```typescript + + const image = await client.files.prepareImage("/path/to/image.jpg"); + + const chat = Chat.empty(); + chat.append("system", "You are a state-of-art object recognition system."); + chat.append("user", "What is this object?", { images: [image] }); + + const prediction = model.respond(chat); + ``` + + + +You can also quickly construct a `Chat` object using the `Chat.from` method. + + + + + Array of messages + + + + Single string + + + + + ```typescript + const chat = Chat.from([ + { role: "system", content: "You are a resident AI philosopher." }, + { role: "user", content: "What is the meaning of life?" }, + ]); + ``` + + + + ```typescript + + // This constructs a chat with a single user message + const chat = Chat.from("What is the meaning of life?"); + ``` + + + + + + +Automatic tool calling [#automatic-tool-calling] + +We introduce the concept of execution "rounds" to describe the combined process of running a tool, providing its output to the LLM, and then waiting for the LLM to decide what to do next. + +**Execution Round** + +``` + • run a tool -> + ↑ • provide the result to the LLM -> + │ • wait for the LLM to generate a response + │ + └────────────────────────────────────────┘ └➔ (return) +``` + +A model might choose to run tools multiple times before returning a final result. For example, if the LLM is writing code, it might choose to compile or run the program, fix errors, and then run it again, rinse and repeat until it gets the desired result. + +With this in mind, we say that the `.act()` API is an automatic "multi-round" tool calling API. + +Quick Example [#quick-example] + +```typescript +import { LMStudioClient, tool } from "@lmstudio/sdk"; +import { z } from "zod"; + +const client = new LMStudioClient(); + +const multiplyTool = tool({ + name: "multiply", + description: "Given two numbers a and b. Returns the product of them.", + parameters: { a: z.number(), b: z.number() }, + implementation: ({ a, b }) => a * b, +}); + +const model = await client.llm.model("qwen2.5-7b-instruct"); +await model.act("What is the result of 12345 multiplied by 54321?", [multiplyTool], { + onMessage: (message) => console.info(message.toString()), +}); +``` + +> ***NOTE:*** at this time, this code expects zod v3 + +What does it mean for an LLM to "use a tool"? [#what-does-it-mean-for-an-llm-to-use-a-tool] + +LLMs are largely text-in, text-out programs. So, you may ask "how can an LLM use a tool?". The answer is that some LLMs are trained to ask the human to call the tool for them, and expect the tool output to to be provided back in some format. + +Imagine you're giving computer support to someone over the phone. You might say things like "run this command for me ... OK what did it output? ... OK now click there and tell me what it says ...". In this case you're the LLM! And you're "calling tools" vicariously through the person on the other side of the line. + +Important: Model Selection [#important-model-selection] + +The model selected for tool use will greatly impact performance. + +Some general guidance when selecting a model: + +* Not all models are capable of intelligent tool use +* Bigger is better (i.e., a 7B parameter model will generally perform better than a 3B parameter model) +* We've observed [Qwen2.5-7B-Instruct](https://model.lmstudio.ai/download/lmstudio-community/Qwen2.5-7B-Instruct-GGUF) to perform well in a wide variety of cases +* This guidance may change + +Example: Multiple Tools [#example-multiple-tools] + +The following code demonstrates how to provide multiple tools in a single `.act()` call. + +```typescript +import { LMStudioClient, tool } from "@lmstudio/sdk"; +import { z } from "zod"; + +const client = new LMStudioClient(); + +const additionTool = tool({ + name: "add", + description: "Given two numbers a and b. Returns the sum of them.", + parameters: { a: z.number(), b: z.number() }, + implementation: ({ a, b }) => a + b, +}); + +const isPrimeTool = tool({ + name: "isPrime", + description: "Given a number n. Returns true if n is a prime number.", + parameters: { n: z.number() }, + implementation: ({ n }) => { + if (n < 2) return false; + const sqrt = Math.sqrt(n); + for (let i = 2; i <= sqrt; i++) { + if (n % i === 0) return false; + } + return true; + }, +}); + +const model = await client.llm.model("qwen2.5-7b-instruct"); +await model.act( + "Is the result of 12345 + 45668 a prime? Think step by step.", + [additionTool, isPrimeTool], + { onMessage: (message) => console.info(message.toString()) }, +); +``` + +Example: Chat Loop with Create File Tool [#example-chat-loop-with-create-file-tool] + +The following code creates a conversation loop with an LLM agent that can create files. + +```typescript +import { Chat, LMStudioClient, tool } from "@lmstudio/sdk"; +import { existsSync } from "fs"; +import { writeFile } from "fs/promises"; +import { createInterface } from "readline/promises"; +import { z } from "zod"; + +const rl = createInterface({ input: process.stdin, output: process.stdout }); +const client = new LMStudioClient(); +const model = await client.llm.model(); +const chat = Chat.empty(); + +const createFileTool = tool({ + name: "createFile", + description: "Create a file with the given name and content.", + parameters: { name: z.string(), content: z.string() }, + implementation: async ({ name, content }) => { + if (existsSync(name)) { + return "Error: File already exists."; + } + await writeFile(name, content, "utf-8"); + return "File created."; + }, +}); + +while (true) { + const input = await rl.question("You: "); + // Append the user input to the chat + chat.append("user", input); + + process.stdout.write("Bot: "); + await model.act(chat, [createFileTool], { + // When the model finish the entire message, push it to the chat + onMessage: (message) => chat.append(message), + onPredictionFragment: ({ content }) => { + process.stdout.write(content); + }, + }); + process.stdout.write("\n"); +} +``` + + + + +You can define tools with the `tool()` function and pass them to the model in the `act()` call. + +Anatomy of a Tool [#anatomy-of-a-tool] + +Follow this standard format to define functions as tools: + +```typescript title="index.ts" +import { tool } from "@lmstudio/sdk"; +import { z } from "zod"; + +const exampleTool = tool({ + // The name of the tool + name: "add", + + // A description of the tool + description: "Given two numbers a and b. Returns the sum of them.", + + // zod schema of the parameters + parameters: { a: z.number(), b: z.number() }, + + // The implementation of the tool. Just a regular function. + implementation: ({ a, b }) => a + b, +}); +``` + +**Important**: The tool name, description, and the parameter definitions are all passed to the model! + +This means that your wording will affect the quality of the generation. Make sure to always provide a clear description of the tool so the model knows how to use it. + +Tools with External Effects (like Computer Use or API Calls) [#tools-with-external-effects-like-computer-use-or-api-calls] + +Tools can also have external effects, such as creating files or calling programs and even APIs. By implementing tools with external effects, you +can essentially turn your LLMs into autonomous agents that can perform tasks on your local machine. + +Example: `createFileTool` [#example-createfiletool] + +Tool Definition [#tool-definition] + +```typescript title="createFileTool.ts" +import { tool } from "@lmstudio/sdk"; +import { existsSync } from "fs"; +import { writeFile } from "fs/promises"; +import { z } from "zod"; + +const createFileTool = tool({ + name: "createFile", + description: "Create a file with the given name and content.", + parameters: { name: z.string(), content: z.string() }, + implementation: async ({ name, content }) => { + if (existsSync(name)) { + return "Error: File already exists."; + } + await writeFile(name, content, "utf-8"); + return "File created."; + }, +}); +``` + +Example code using the `createFile` tool: [#example-code-using-the-createfile-tool] + +```typescript title="index.ts" +import { LMStudioClient } from "@lmstudio/sdk"; +import { createFileTool } from "./createFileTool"; + +const client = new LMStudioClient(); + +const model = await client.llm.model("qwen2.5-7b-instruct"); +await model.act( + "Please create a file named output.txt with your understanding of the meaning of life.", + [createFileTool], +); +``` + + + + +Add dependencies to your plugin with `npm` [#add-dependencies-to-your-plugin-with-npm] + +LM Studio plugins supports `npm` packages. You can just install them using `npm install`. + +When the plugin is installed, LM Studio will automatically download all the required dependencies that are declared in `package.json` and `package-lock.json`. (The user does not need to have Node.js/npm installed.) + +`postinstall` scripts [#postinstall-scripts] + +For safety reasons, we do **not** run `postinstall` scripts. Thus please make sure you are not using any npm packages that require postinstall scripts to work. + +Using Other Package Managers [#using-other-package-managers] + +Since we rely on `package-lock.json`, lock files produced by other package managers will not work. Thus we recommend only using `npm` when developing LM Studio plugins. + + + + +Plugins extend LM Studio's functionality by providing "hook functions" that execute at specific points during operation. + +Plugins are currently written in JavaScript/TypeScript and run on Node.js v22.21.1. Python support is in development. + +Getting Started [#getting-started] + +LM Studio includes Node.js, so no separate installation is required. + +Create a new plugin [#create-a-new-plugin] + +To create a new plugin, navigate to LM Studio... \[TO BE CONTINUED] + +Run a plugin in development mode [#run-a-plugin-in-development-mode] + +Once you've created a plugin, run this command in the plugin directory to start development mode: + +```bash +lms dev +``` + +Your plugin will appear in LM Studio's plugin list. Development mode automatically rebuilds and reloads your plugin when you make code changes. + +You only need `lms dev` during development. When the plugin is installed, LM Studio automatically runs them as needed. Learn more about distributing and installing plugins in the [Sharing Plugins](./plugins/publish-plugins) section. + +Next Steps [#next-steps] + +* [Tools Providers](./plugins/tools-provider) + + Give models extra capabilities by creating tools they can use during generation, like accessing external APIs or performing calculations. + +* [Prompt Preprocessors](./plugins/prompt-preprocessor) + + Modify user input before it reaches the model - handle file uploads, inject context, or transform queries. + +* [Generators](./plugins/generator) + + Create custom text generation sources that replace the local model, perfect for online model adapters. + +* [Custom Configurations](./plugins/custom-configuration) + + Add configuration UIs so users can customize your plugin's behavior. + +* [Third-Party Dependencies](./plugins/dependencies) + + Use npm packages to leverage existing libraries in your plugins. + +* [Sharing Plugins](./plugins/publish-plugins) + + Package and share your plugins with the community. + + + + +Generate embeddings for input text. Embeddings are vector representations of text that capture semantic meaning. Embeddings are a building block for RAG (Retrieval-Augmented Generation) and other similarity-based tasks. + +Prerequisite: Get an Embedding Model [#prerequisite-get-an-embedding-model] + +If you don't yet have an embedding model, you can download a model like `nomic-ai/nomic-embed-text-v1.5` using the following command: + +```bash +lms get nomic-ai/nomic-embed-text-v1.5 +``` + +Create Embeddings [#create-embeddings] + +To convert a string to a vector representation, pass it to the `embed` method on the corresponding embedding model handle. + +```typescript title="index.ts" +import { LMStudioClient } from "@lmstudio/sdk"; +const client = new LMStudioClient(); + +const model = await client.embedding.model("nomic-embed-text-v1.5"); + +const { embedding } = await model.embed("Hello, world!"); +``` + + + + +Models use a tokenizer to internally convert text into "tokens" they can deal with more easily. LM Studio exposes this tokenizer for utility. + +Tokenize [#tokenize] + +You can tokenize a string with a loaded LLM or embedding model using the SDK. In the below examples, `llm` can be replaced with an embedding model `emb`. + +```typescript +import { LMStudioClient } from "@lmstudio/sdk"; + +const client = new LMStudioClient(); +const model = await client.llm.model(); + +const tokens = await model.tokenize("Hello, world!"); + +console.info(tokens); // Array of token IDs. +``` + +Count tokens [#count-tokens] + +If you only care about the number of tokens, you can use the `.countTokens` method instead. + +```typescript +const tokenCount = await model.countTokens("Hello, world!"); +console.info("Token count:", tokenCount); +``` + +Example: Count Context [#example-count-context] + +You can determine if a given conversation fits into a model's context by doing the following: + +1. Convert the conversation to a string using the prompt template. +2. Count the number of tokens in the string. +3. Compare the token count to the model's context length. + +```typescript +import { Chat, type LLM, LMStudioClient } from "@lmstudio/sdk"; + +async function doesChatFitInContext(model: LLM, chat: Chat) { + // Convert the conversation to a string using the prompt template. + const formatted = await model.applyPromptTemplate(chat); + // Count the number of tokens in the string. + const tokenCount = await model.countTokens(formatted); + // Get the current loaded context length of the model + const contextLength = await model.getContextLength(); + return tokenCount < contextLength; +} + +const client = new LMStudioClient(); +const model = await client.llm.model(); + +const chat = Chat.from([ + { role: "user", content: "What is the meaning of life." }, + { role: "assistant", content: "The meaning of life is..." }, + // ... More messages +]); + +console.info("Fits in context:", await doesChatFitInContext(model, chat)); +``` + + + + + + +You can iterate through locally available models using the `listLocalModels` method. + +Available Model on the Local Machine [#available-model-on-the-local-machine] + +`listLocalModels` lives under the `system` namespace of the `LMStudioClient` object. + +```typescript +import { LMStudioClient } from "@lmstudio/sdk"; +const client = new LMStudioClient(); + +console.info(await client.system.listDownloadedModels()); +``` + +This will give you results equivalent to using [`lms ls`](../../cli/ls) in the CLI. + +Example output: [#example-output] + +```jsonl +[ + { + "type": "llm", + "modelKey": "qwen2.5-7b-instruct", + "format": "gguf", + "displayName": "Qwen2.5 7B Instruct", + "path": "lmstudio-community/Qwen2.5-7B-Instruct-GGUF/Qwen2.5-7B-Instruct-Q4_K_M.gguf", + "sizeBytes": 4683073952, + "paramsString": "7B", + "architecture": "qwen2", + "vision": false, + "trainedForToolUse": true, + "maxContextLength": 32768 + }, + { + "type": "embedding", + "modelKey": "text-embedding-nomic-embed-text-v1.5@q4_k_m", + "format": "gguf", + "displayName": "Nomic Embed Text v1.5", + "path": "nomic-ai/nomic-embed-text-v1.5-GGUF/nomic-embed-text-v1.5.Q4_K_M.gguf", + "sizeBytes": 84106624, + "architecture": "nomic-bert", + "maxContextLength": 2048 + } +] +``` + + + + + + +You can iterate through models loaded into memory using the `listLoaded` method. This method lives under the `llm` and `embedding` namespaces of the `LMStudioClient` object. + +List Models Currently Loaded in Memory [#list-models-currently-loaded-in-memory] + +This will give you results equivalent to using [`lms ps`](../../cli/ps) in the CLI. + +```typescript +import { LMStudioClient } from "@lmstudio/sdk"; + +const client = new LMStudioClient(); + +const llmOnly = await client.llm.listLoaded(); +const embeddingOnly = await client.embedding.listLoaded(); +``` + + + + + + +AI models are huge. It can take a while to load them into memory. LM Studio's SDK allows you to precisely control this process. + +**Most commonly:** + +* Use `.model()` to get any currently loaded model +* Use `.model("model-key")` to use a specific model + +**Advanced (manual model management):** + +* Use `.load("model-key")` to load a new instance of a model +* Use `model.unload()` to unload a model from memory + +Get the Current Model with `.model()` [#get-the-current-model-with-model] + +If you already have a model loaded in LM Studio (either via the GUI or `lms load`), you can use it by calling `.model()` without any arguments. + +```typescript +import { LMStudioClient } from "@lmstudio/sdk"; +const client = new LMStudioClient(); + +const model = await client.llm.model(); +``` + +Get a Specific Model with `.model("model-key")` [#get-a-specific-model-with-modelmodel-key] + +If you want to use a specific model, you can provide the model key as an argument to `.model()`. + +Get if Loaded, or Load if not [#get-if-loaded-or-load-if-not] + +Calling `.model("model-key")` will load the model if it's not already loaded, or return the existing instance if it is. + +```typescript +import { LMStudioClient } from "@lmstudio/sdk"; +const client = new LMStudioClient(); + +const model = await client.llm.model("qwen/qwen3-4b-2507"); +``` + + + +Load a New Instance of a Model with `.load()` [#load-a-new-instance-of-a-model-with-load] + +Use `load()` to load a new instance of a model, even if one already exists. This allows you to have multiple instances of the same or different models loaded at the same time. + +```typescript +import { LMStudioClient } from "@lmstudio/sdk"; +const client = new LMStudioClient(); + +const llama = await client.llm.load("qwen/qwen3-4b-2507"); +const another_llama = await client.llm.load("qwen/qwen3-4b-2507", { + identifier: "second-llama" +}); +``` + + + +Note about Instance Identifiers [#note-about-instance-identifiers] + +If you provide an instance identifier that already exists, the server will throw an error. +So if you don't really care, it's safer to not provide an identifier, in which case +the server will generate one for you. You can always check in the server tab in LM Studio, too! + +Unload a Model from Memory with `.unload()` [#unload-a-model-from-memory-with-unload] + +Once you no longer need a model, you can unload it by simply calling `unload()` on its handle. + +```typescript +import { LMStudioClient } from "@lmstudio/sdk"; + +const client = new LMStudioClient(); + +const model = await client.llm.model(); +await model.unload(); +``` + +Set Custom Load Config Parameters [#set-custom-load-config-parameters] + +You can also specify the same load-time configuration options when loading a model, such as Context Length and GPU offload. + +See [load-time configuration](../llm-prediction/parameters) for more. + +Set an Auto Unload Timer (TTL) [#set-an-auto-unload-timer-ttl] + +You can specify a *time to live* for a model you load, which is the idle time (in seconds) +after the last request until the model unloads. See [Idle TTL](/docs/api/ttl-and-auto-evict) for more on this. + + + + + Using .load + + + + Using .model + + + + + ```typescript + import { LMStudioClient } from "@lmstudio/sdk"; + + const client = new LMStudioClient(); + + const model = await client.llm.load("qwen/qwen3-4b-2507", { + ttl: 300, // 300 seconds + }); + ``` + + + + ```typescript + import { LMStudioClient } from "@lmstudio/sdk"; + + const client = new LMStudioClient(); + + const model = await client.llm.model("qwen/qwen3-4b-2507", { + // Note: specifying ttl in `.model` will only set the TTL for the model if the model is + // loaded from this call. If the model was already loaded, the TTL will not be updated. + ttl: 300, // 300 seconds + }); + ``` + + + + + + +Parameters [#parameters]() + + + + +Fields [#fields]() + + + + +LLMs and embedding models, due to their fundamental architecture, have a property called `context length`, and more specifically a **maximum** context length. Loosely speaking, this is how many tokens the models can "keep in memory" when generating text or embeddings. Exceeding this limit will result in the model behaving erratically. + +Use the `getContextLength()` Function on the Model Object [#use-the-getcontextlength-function-on-the-model-object] + +It's useful to be able to check the context length of a model, especially as an extra check before providing potentially long input to the model. + +```typescript title="index.ts" +const contextLength = await model.getContextLength(); +``` + +The `model` in the above code snippet is an instance of a loaded model you get from the `llm.model` method. See [Manage Models in Memory](../manage-models/loading) for more information. + +Example: Check if the input will fit in the model's context window [#example-check-if-the-input-will-fit-in-the-models-context-window] + +You can determine if a given conversation fits into a model's context by doing the following: + +1. Convert the conversation to a string using the prompt template. +2. Count the number of tokens in the string. +3. Compare the token count to the model's context length. + +```typescript +import { Chat, type LLM, LMStudioClient } from "@lmstudio/sdk"; + +async function doesChatFitInContext(model: LLM, chat: Chat) { + // Convert the conversation to a string using the prompt template. + const formatted = await model.applyPromptTemplate(chat); + // Count the number of tokens in the string. + const tokenCount = await model.countTokens(formatted); + // Get the current loaded context length of the model + const contextLength = await model.getContextLength(); + return tokenCount < contextLength; +} + +const client = new LMStudioClient(); +const model = await client.llm.model(); + +const chat = Chat.from([ + { role: "user", content: "What is the meaning of life." }, + { role: "assistant", content: "The meaning of life is..." }, + // ... More messages +]); + +console.info("Fits in context:", await doesChatFitInContext(model, chat)); +``` + + + + +You can access information about a loaded model using the `getInfo` method. + + + + + LLM + + + + Embedding Model + + + + + ```typescript + + import { LMStudioClient } from "@lmstudio/sdk"; + + const client = new LMStudioClient(); + const model = await client.llm.model(); + + const modelInfo = await model.getInfo(); + + console.info("Model Key", modelInfo.modelKey); + console.info("Current Context Length", model.contextLength); + console.info("Model Trained for Tool Use", modelInfo.trainedForToolUse); + // etc. + ``` + + + + ```typescript + import { LMStudioClient } from "@lmstudio/sdk"; + + const client = new LMStudioClient(); + const model = await client.embedding.model(); + + const modelInfo = await model.getInfo(); + + console.info("Model Key", modelInfo.modelKey); + console.info("Current Context Length", modelInfo.contextLength); + // etc. + ``` + + + + + + +You can serve local LLMs from LM Studio's Developer tab, either on `localhost` or on the network. + +LM Studio's APIs can be used through [REST API](/docs/developer/rest), client libraries like [lmstudio-js](/docs/typescript) and [lmstudio-python](/docs/python), and compatibility endpoints like [OpenAI-compatible](/docs/developer/openai-compat) and [Anthropic-compatible](/docs/developer/anthropic-compat). + + + +Running the server [#running-the-server] + +To run the server, go to the Developer tab in LM Studio, and toggle the "Start server" switch to start the API server. + + + +Alternatively, you can use `lms` ([LM Studio's CLI](/docs/cli)) to start the server from your terminal: + +```bash +lms server start +``` + +API options [#api-options] + +* [LM Studio REST API](/docs/developer/rest) +* [TypeScript SDK](/docs/typescript) - `lmstudio-js` +* [Python SDK](/docs/python) - `lmstudio-python` +* [OpenAI-compatible endpoints](/docs/developer/openai-compat) +* [Anthropic-compatible endpoints](/docs/developer/anthropic-compat) + + + + +Enabling the "Serve on Local Network" option allows the LM Studio API server running on your machine to be accessible by other devices connected to the same local network. + +This is useful for scenarios where you want to: + +* Use a local LLM on your other less powerful devices by connecting them to a more powerful machine running LM Studio. +* Let multiple people use a single LM Studio instance on the network. +* Use the API from IoT devices, edge computing units, or other services in your local setup. + +Once enabled, the server will bind to your local network IP address instead of localhost. The API access URL will be updated accordingly which you can use in your applications. + + + + + + +You can configure server settings, such as the port number, whether to allow other API clients to access the server and MCP features. + + + +Settings information [#settings-information]( + +) + + + +You can access custom configurations via `ctl.getPluginConfig` and `ctl.getGlobalPluginConfig`. See [Custom Configurations](./configurations) for more details. + +The following is an example of how you can make the `specialInstructions` and `triggerWord` configurable: + +First, add the config field to `config.ts`: + +```typescript title="src/config.ts" +import { createConfigSchematics } from "@lmstudio/sdk"; +export const configSchematics = createConfigSchematics() + .field( + "specialInstructions", + "string", + { + displayName: "Special Instructions", + subtitle: "Special instructions to be injected when the trigger word is found.", + }, + "Here is some default special instructions.", + ) + .field( + "triggerWord", + "string", + { + displayName: "Trigger Word", + subtitle: "The word that will trigger the special instructions.", + }, + "@init", + ) + .build(); +``` + + + In this example, we added the field to `configSchematics`, which is the "per-chat" configuration. If you want to add a global configuration field that is shared across different chats, you should add it under the section `globalConfigSchematics` in the same file. + + Learn more about configurations in [Custom Configurations](../plugins/configurations). + + +Then, modify the prompt preprocessor to use the configuration: + +```typescript title="src/promptPreprocessor.ts" +import { type PromptPreprocessorController, type ChatMessage } from "@lmstudio/sdk"; +import { configSchematics } from "./config"; + +export async function preprocess(ctl: PromptPreprocessorController, userMessage: ChatMessage) { + const textContent = userMessage.getText(); + const pluginConfig = ctl.getPluginConfig(configSchematics); + + const triggerWord = pluginConfig.get("triggerWord"); + const specialInstructions = pluginConfig.get("specialInstructions"); + + const transformed = textContent.replaceAll(triggerWord, specialInstructions); + return transformed; +} +``` + + + + +Depending on the task, the prompt preprocessor may take some time to complete, for example, it may need to fetch some data from the internet or perform some heavy computation. In such cases, you can report the status of the preprocessing using `ctl.setStatus`. + +```typescript title="src/promptPreprocessor.ts" +const status = ctl.createStatus({ + status: "loading", + text: "Preprocessing.", +}); +``` + +You can update the status at any time by calling `status.setState`. + +```typescript title="src/promptPreprocessor.ts" +status.setState({ + status: "done", + text: "Preprocessing done.", +}) +``` + +You can even add sub status to the status: + +```typescript title="src/promptPreprocessor.ts" +const subStatus = status.addSubStatus({ + status: "loading", + text: "I am a sub status." +}); +``` + + + + +Example: Inject Current Time [#example-inject-current-time] + +The following is an example preprocessor that injects the current time before each user message. + +```typescript title="src/promptPreprocessor.ts" +import { type PromptPreprocessorController, type ChatMessage } from "@lmstudio/sdk"; +export async function preprocess(ctl: PromptPreprocessorController, userMessage: ChatMessage) { + const textContent = userMessage.getText(); + const transformed = `Current time: ${new Date().toString()}\n\n${textContent}`; + return transformed; +} +``` + +Example: Replace Trigger Words [#example-replace-trigger-words] + +Another example you can do it with simple text only processing is by replacing certain trigger words. For example, you can replace a `@init` trigger with a special initialization message. + +```typescript title="src/promptPreprocessor.ts" +import { type PromptPreprocessorController, type ChatMessage, text } from "@lmstudio/sdk"; + +const mySpecialInstructions = text` + Here are some special instructions... +`; + +export async function preprocess(ctl: PromptPreprocessorController, userMessage: ChatMessage) { + const textContent = userMessage.getText(); + const transformed = textContent.replaceAll("@init", mySpecialInstructions); + return transformed; +} +``` + + + + +A prediction may be aborted by the user while your generator is still running. In such cases, you should handle the abort gracefully by handling the `ctl.abortSignal`. + +You can learn more about `AbortSignal` in the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal). + + + + +Prompt Preprocessor is a function that is called upon the user hitting the "Send" button. It receives the user input and can modify it before it reaches the model. If multiple prompt preprocessors are registered, they will be chained together, with each one receiving the output of the previous one. + +The modified result will be saved in the chat history, meaning that even if your plugin is disabled afterwards, the modified input will still be used. + +Prompt preprocessors will only be triggered for the current user input. It will not be triggered for previous messages in the chat history even if they were not preprocessed. + +Prompt preprocessors takes in a `ctl` object for controlling the preprocessing and a `userMessage` it needs to preprocess. It returns either a string or a message object which will replace the user message. + +Examples [#examples] + +The following are some plugins that make use of prompt preprocessors: + +* [lmstudio/rag-v1](https://lmstudio.ai/lmstudio/rag-v1) + + Retrieval Augmented Generation (RAG) for LM Studio. This is the plugin that gives document handling capabilities to LM Studio. + + + + +You can add custom configuration options to your tools provider, so the user of plugin can customize the behavior without modifying the code. + +In the example below, we will ask the user to specify a folder name, and we will create files inside that folder within the working directory. + +First, add the config field to `config.ts`: + +```typescript title="src/config.ts" +export const configSchematics = createConfigSchematics() + .field( + "folderName", // Key of the configuration field + "string", // Type of the configuration field + { + displayName: "Folder Name", + subtitle: "The name of the folder where files will be created.", + }, + "default_folder", // Default value + ) + .build(); +``` + + + In this example, we added the field to `configSchematics`, which is the "per-chat" configuration. If you want to add a global configuration field that is shared across different chats, you should add it under the section `globalConfigSchematics` in the same file. + + Learn more about configurations in [Custom Configurations](../plugins/configurations). + + +Then, modify the tools provider to use the configuration value: + +```typescript title="src/toolsProvider.ts" +import { tool, Tool, ToolsProviderController } from "@lmstudio/sdk"; +import { existsSync } from "fs"; +import { mkdir, writeFile } from "fs/promises"; +import { join } from "path"; +import { z } from "zod"; +import { configSchematics } from "./config"; + +export async function toolsProvider(ctl: ToolsProviderController) { + const tools: Tool[] = []; + + const createFileTool = tool({ + name: `create_file`, + description: "Create a file with the given name and content.", + parameters: { file_name: z.string(), content: z.string() }, + implementation: async ({ file_name, content }) => { + // Read the config field + const folderName = ctl.getPluginConfig(configSchematics).get("folderName"); + const folderPath = join(ctl.getWorkingDirectory(), folderName); + + // Ensure the folder exists + await mkdir(folderPath, { recursive: true }); + + // Create the file + const filePath = join(folderPath, file_name); + if (existsSync(filePath)) { + return "Error: File already exists."; + } + await writeFile(filePath, content, "utf-8"); + return "File created."; + }, + }); + tools.push(createFileTool); // First tool + + return tools; // Return the tools array +} +``` + + + + +A prediction may be aborted by the user while your tool is still running. In such cases, you should handle the abort gracefully by handling the `AbortSignal` object passed as the second parameter to the tool's implementation function. + +```typescript title="src/toolsProvider.ts" +import { tool, Tool, ToolsProviderController } from "@lmstudio/sdk"; +import { z } from "zod"; + +export async function toolsProvider(ctl: ToolsProviderController) { + const tools: Tool[] = []; + + const fetchTool = tool({ + name: `fetch`, + description: "Fetch a URL using GET method.", + parameters: { url: z.string() }, + implementation: async ({ url }, { signal }) => { + const response = await fetch(url, { + method: "GET", + signal, // <-- Here, we pass the signal to fetch to allow cancellation + }); + if (!response.ok) { + return `Error: Failed to fetch ${url}: ${response.statusText}`; + } + const data = await response.text(); + return { + status: response.status, + headers: Object.fromEntries(response.headers.entries()), + data: data.substring(0, 1000), // Limit to 1000 characters + }; + }, + }); + tools.push(fetchTool); + + return tools; +} +``` + +You can learn more about `AbortSignal` in the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal). + + + + +Tools provider is a function that returns an array of tools that the model can use during generation. + +Examples [#examples] + +The following are some plugins that make use of tools providers: + +* [lmstudio/wikipedia](https://lmstudio.ai/lmstudio/wikipedia) + + Gives the LLM tools to search and read Wikipedia articles. + +* [lmstudio/js-code-sandbox](https://lmstudio.ai/lmstudio/js-code-sandbox) + + Gives the LLM tools to run JavaScript/TypeScript code in a sandbox environment using [deno](https://deno.com/). + +* [lmstudio/dice](https://lmstudio.ai/lmstudio/dice) + + Allows the LLM to generate random numbers using "dice". + + + + +A tools provider can define multiple tools for the model to use. Simply create additional tool instances and add them to the tools array. + +In the example below, we add a second tool to read the content of a file: + +```typescript title="src/toolsProvider.ts" +import { tool, Tool, ToolsProviderController } from "@lmstudio/sdk"; +import { z } from "zod"; +import { existsSync } from "fs"; +import { readFile, writeFile } from "fs/promises"; +import { join } from "path"; + +export async function toolsProvider(ctl: ToolsProviderController) { + const tools: Tool[] = []; + + const createFileTool = tool({ + name: `create_file`, + description: "Create a file with the given name and content.", + parameters: { file_name: z.string(), content: z.string() }, + implementation: async ({ file_name, content }) => { + const filePath = join(ctl.getWorkingDirectory(), file_name); + if (existsSync(filePath)) { + return "Error: File already exists."; + } + await writeFile(filePath, content, "utf-8"); + return "File created."; + }, + }); + tools.push(createFileTool); // First tool + + const readFileTool = tool({ + name: `read_file`, + description: "Read the content of a file with the given name.", + parameters: { file_name: z.string() }, + implementation: async ({ file_name }) => { + const filePath = join(ctl.getWorkingDirectory(), file_name); + if (!existsSync(filePath)) { + return "Error: File does not exist."; + } + const content = await readFile(filePath, "utf-8"); + return content; + }, + }); + tools.push(readFileTool); // Second tool + + return tools; // Return the tools array +} +``` + + + + +To setup a tools provider, first create the a file `toolsProvider.ts` in your plugin's `src` directory: + +```typescript title="src/toolsProvider.ts" +import { tool, Tool, ToolsProviderController } from "@lmstudio/sdk"; +import { z } from "zod"; +import { existsSync } from "fs"; +import { writeFile } from "fs/promises"; +import { join } from "path"; + +export async function toolsProvider(ctl: ToolsProviderController) { + const tools: Tool[] = []; + + const createFileTool = tool({ + // Name of the tool, this will be passed to the model. Aim for concise, descriptive names + name: `create_file`, + // Your description here, more details will help the model to understand when to use the tool + description: "Create a file with the given name and content.", + parameters: { file_name: z.string(), content: z.string() }, + implementation: async ({ file_name, content }) => { + const filePath = join(ctl.getWorkingDirectory(), file_name); + if (existsSync(filePath)) { + return "Error: File already exists."; + } + await writeFile(filePath, content, "utf-8"); + return "File created."; + }, + }); + tools.push(createFileTool); + + return tools; +} +``` + +The above tools provider defines a single tool called `create_file` that allows the model to create a file with a specified name and content inside the working directory. You can learn more about defining tools in [Tool Definition](../agent/tools). + +Then register the tools provider in your plugin's `index.ts`: + +```typescript title="src/index.ts" +// ... other imports ... +import { toolsProvider } from "./toolsProvider"; + +export async function main(context: PluginContext) { + // ... other plugin setup code ... + + // Register the tools provider. + context.withToolsProvider(toolsProvider); // <-- Register the tools provider + + // ... other plugin setup code ... +} +``` + +Now, you can try to ask the LLM to create a file, and it should be able to do so using the tool you just created. + +Tips [#tips] + +* **Use Descriptive Names and Descriptions**: When defining tools, use descriptive names and detailed descriptions. This helps the model understand when and how to use each tool effectively. +* **Return Errors as Strings**: Sometimes, the model may make a mistake when calling a tool. In such cases, you can return an error message as a string. In most cases, the model will try to correct itself and call the tool again with the correct parameters. + + + + +Sometimes, a tool may take a long time to execute. In such cases, it will be helpful to provide status updates, so the user knows what is happening. In order times, you may want to warn the user about potential issues. + +You can use `status` and `warn` methods on the second parameter of the tool's implementation function to send status updates and warnings. + +The following example shows how to implement a tool that waits for a specified number of seconds, providing status updates and warnings if the wait time exceeds 10 seconds: + +```typescript title="src/toolsProvider.ts" +import { tool, Tool, ToolsProviderController } from "@lmstudio/sdk"; +import { z } from "zod"; + +export async function toolsProvider(ctl: ToolsProviderController) { + const tools: Tool[] = []; + + const waitTool = tool({ + name: `wait`, + description: "Wait for a specified number of seconds.", + parameters: { seconds: z.number().min(1) }, + implementation: async ({ seconds }, { status, warn }) => { + if (seconds > 10) { + warn("The model asks to wait for more than 10 seconds."); + } + for (let i = 0; i < seconds; i++) { + status(`Waiting... ${i + 1}/${seconds} seconds`); + await new Promise((resolve) => setTimeout(resolve, 1000)); + } + }, + }); + tools.push(waitTool); + + return tools; // Return the tools array +} +``` + +Note status updates and warnings are only visible to the user. If you want the model to also see those messages, you should return them as part of the tool's return value. + +Handling Aborts [#handling-aborts] + +A prediction may be aborted by the user while your tool is still running. In such cases, you should handle the abort gracefully by handling the `AbortSignal` object passed as the second parameter to the tool's implementation function. + +```typescript title="src/toolsProvider.ts" +import { tool, Tool, ToolsProviderController } from "@lmstudio/sdk"; +import { z } from "zod"; + +export async function toolsProvider(ctl: ToolsProviderController) { + const tools: Tool[] = []; + + const fetchTool = tool({ + name: `fetch`, + description: "Fetch a URL using GET method.", + parameters: { url: z.string() }, + implementation: async ({ url }, { signal }) => { + const response = await fetch(url, { + method: "GET", + signal, // <-- Here, we pass the signal to fetch to allow cancellation + }); + if (!response.ok) { + return `Error: Failed to fetch ${url}: ${response.statusText}`; + } + const data = await response.text(); + return { + status: response.status, + headers: Object.fromEntries(response.headers.entries()), + data: data.substring(0, 1000), // Limit to 1000 characters + }; + }, + }); + tools.push(fetchTool); + + return tools; +} +``` + +You can learn more about `AbortSignal` in the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal). + + + + +Generators are replacement for local LLMs. They act like a token source. When a plugin with a generator is used, LM Studio will no longer use the local model to generate text. The generator will be used instead. + +Generators are useful for implementing adapters for external models, such as using a remote LM Studio instance or other online models. + +If a plugin contains a generator, it will no longer show up in the plugins list. Instead, it will show up in the model dropdown and act as a model. If your plugins contains [Tools Provider](./tools-providers.md) or [Prompt Preprocessor](./prompt-preprocessors.md), they will be used when your generator is being selected. + +Examples [#examples] + +The following are some plugins that make use of generators: + +* [lmstudio/remote-lmstudio](https://lmstudio.ai/lmstudio/remote-lmstudio) + + Basic support for using a remote LM Studio instance to generate text. + +* [lmstudio/openai-compat-endpoint](https://lmstudio.ai/lmstudio/openai-compat-endpoint) + + Use any OpenAI-compatible API in LM Studio. + + + + +Generators take in the the generator controller and the current conversation state, start the generation, and then report the generated text using the `ctl.fragmentGenerated` method. + +The following is an example of a simple generator that echos back the last user message with 200 ms delay between each word: + +```typescript title="src/toolsProvider.ts" +import { Chat, GeneratorController } from "@lmstudio/sdk"; + +export async function generate(ctl: GeneratorController, chat: Chat) { + // Just echo back the last message + const lastMessage = chat.at(-1).getText(); + // Split the last message into words + const words = lastMessage.split(/(?= )/); + for (const word of words) { + ctl.fragmentGenerated(word); // Send each word as a fragment + ctl.abortSignal.throwIfAborted(); // Allow for cancellation + await new Promise((resolve) => setTimeout(resolve, 200)); // Simulate some processing time + } +} +``` + +Custom Configurations [#custom-configurations] + +You can access custom configurations via `ctl.getPluginConfig` and `ctl.getGlobalPluginConfig`. See [Custom Configurations](./configurations) for more details. + +Handling Aborts [#handling-aborts] + +A prediction may be aborted by the user while your generator is still running. In such cases, you should handle the abort gracefully by handling the `ctl.abortSignal`. + +You can learn more about `AbortSignal` in the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal). + + + + +To enable tool use, it is slightly more involved. To see a comprehensive example that adapts OpenAI API, see the [openai-compat-endpoint plugin](https://lmstudio.ai/lmstudio/openai-compat-endpoint). + +You can read the definition of tools available using `ctl.getToolDefinitions()`. For example, if you are making an online model adapter, you need to pass the tool definition to the model. + +Once the model starts to make tool calls, you need to tell LM Studio about those calls. + +Use `ctl.toolCallGenerationStarted` to report the start of a tool call generation (i.e. the model starts to generate a tool call). + +Use `ctl.toolCallGenerationEnded` to report a successful generation of a tool call or use `ctl.toolCallGenerationFailed` to report a failed generation of a tool call. + +Optionally, you can also `ctl.toolCallGenerationNameReceived` to eagerly report the name of the tool being called once that is available. You can also use `ctl.toolCallGenerationArgumentFragmentGenerated` to report fragments of the tool call arguments as they are generated. These two methods are useful for providing better user experience, but are not strictly necessary. + +Overall, your generator must call these ctl methods in the following order: + +1. 0 - N calls to `ctl.fragmentGenerated` to report the generated non-tool-call text fragments. +2. For each tool call: + 1. Call `ctl.toolCallGenerationStarted` to indicate the start of a tool call generation. + 2. (Optionally) Call `ctl.toolCallGenerationNameReceived` to report the name of the tool being called. + 3. (Optionally) Call any times of `ctl.toolCallGenerationArgumentFragmentGenerated` to report the generated fragments of the tool call arguments. + 4. Call either `ctl.toolCallGenerationEnded` to report a successful generation of the tool call or `ctl.toolCallGenerationFailed` to report a failed generation of the tool call. + 5. If the model generates more text between/after the tool call, 0 - N calls to `ctl.fragmentGenerated` to report the generated non-tool-call text fragments. (This should not happen normally, but it is technically possible for some smaller models to do this. **Critically: this is not the same as model receiving the tool results and continuing the conversation. This is just model refusing to stop talking after made a tool request - the tool result is not available to the model yet.** When multi-round prediction happens, i.e. the model actually receives the tool call, your generator function will be called again with the updated conversation state.) + +Some API formats may report the tool name together with the beginning of the tool call generation, in which case you can call `ctl.toolCallGenerationNameReceived` immediately after `ctl.toolCallGenerationStarted`. + +Some API formats may not have incremental tool call updates (i.e. the entire tool call request is given at once), in which case you can just call `ctl.toolCallGenerationStarted` then immediately `ctl.toolCallGenerationEnded`. + + + + +To share publish your LM Studio plugin, open the plugin directory in a terminal and run: + +```bash +lms push +``` + +This command will package your plugin and upload it to the LM Studio Hub. You can use this command to create new plugins or update existing ones. + +Changing Plugin Names [#changing-plugin-names] + +If you wish to change the name of the plugin, you can do so by editing the `manifest.json` file in the root of your plugin directory. Look for the `name` field and update it to your desired plugin name. Note the `name` must be kebab-case. + +When you `lms push` the plugin, it will be treated as a new plugin if the name has changed. You can delete the old plugin from the LM Studio Hub if you no longer need it. + +Publishing Plugins to an Organization [#publishing-plugins-to-an-organization] + +If you are in an organization and wish to publish the plugin to the organization, you can do so by editing the `manifest.json` file in the root of your plugin directory. Look for the `owner` field and set it to the name of your organization. When you run `lms push`, the plugin will be published to the organization instead of your personal account. + +Private Plugins [#private-plugins] + +If your account supports private plugins, you can publish your plugins privately by using the `--private` flag when running `lms push`: + +```bash +lms push --private +``` + +Private artifact is in test. Get in touch if you are interested. + + + + +You can access the configuration using the method `ctl.getPluginConfig(configSchematics)` and `ctl.getGlobalConfig(globalConfigSchematics)` respectively. + +For example, here is how to access the config within the promptPreprocessor: + +```typescript title="src/promptPreprocessor.ts" +import { type PreprocessorController, type ChatMessage } from "@lmstudio/sdk"; +import { configSchematics } from "./config"; + +export async function preprocess(ctl: PreprocessorController, userMessage: ChatMessage) { + const pluginConfig = ctl.getPluginConfig(configSchematics); + const myCustomField = pluginConfig.get("myCustomField"); + + const globalPluginConfig = ctl.getGlobalPluginConfig(configSchematics); + const globalMyCustomField = globalPluginConfig.get("myCustomField"); + + return ( + `${userMessage.getText()},` + + `myCustomField: ${myCustomField}, ` + + `globalMyCustomField: ${globalMyCustomField}` + ); +} +``` + + + + +By default, the plugin scaffold will create a `config.ts` file in the `src/` directory which will contain the schematics of the configurations. If the files does not exist, you can create it manually: + +```typescript title="src/toolsProvider.ts" +import { createConfigSchematics } from "@lmstudio/sdk"; + +export const configSchematics = createConfigSchematics() + .field( + "myCustomField", // The key of the field. + "numeric", // Type of the field. + // Options for the field. Different field types will have different options. + { + displayName: "My Custom Field", + hint: "This is my custom field. Doesn't do anything special.", + slider: { min: 0, max: 100, step: 1 }, // Add a slider to the field. + }, + 80, // Default Value + ) + // You can add more fields by chaining the field method. + // For example: + // .field("anotherField", ...) + .build(); + +export const globalConfigSchematics = createConfigSchematics() + .field( + "myGlobalCustomField", // The key of the field. + "string", + { + displayName: "lmlm", + hint: "This is my global custom field. Doesn't do anything special.", + }, + "default value", // Default Value + ) + // You can add more fields by chaining the field method. + // For example: + // .field("anotherGlobalField", ...) + .build(); +``` + +If you've added your config schematics manual, you will also need to register the configurations in your plugin's `index.ts` file. + +This is done by calling `context.withConfigSchematics(configSchematics)` and `context.withGlobalConfigSchematics(globalConfigSchematics)` in the `main` function of your plugin. + +```typescript title="src/index.ts" +// ... other imports ... +import { toolsProvider } from "./toolsProvider"; + +export async function main(context: PluginContext) { + // ... other plugin setup code ... + + // Register the configuration schematics. + context.withConfigSchematics(configSchematics); + // Register the global configuration schematics. + context.withGlobalConfigSchematics(globalConfigSchematics); + + // ... other plugin setup code ... +} +``` + + + + +We support the following field types: + +* `string`: A text input field. + + ```typescript + // ... other fields ... + .field( + "stringField", // The key of the field. + "string", // Type of the field. + { + displayName: "A string field", + subtitle: "Subtitle", // Optional subtitle for the field. (Show below the field) + hint: "Hint", // Optional hint for the field. (Show on hover) + isParagraph: false, // Whether to show a large text input area for this field. + isProtected: false, // Whether the value should be obscured in the UI (e.g., for passwords). + placeholder: "Placeholder text", // Optional placeholder text for the field. + }, + "default value", // Default Value + ) + // ... other fields ... + ``` + +* `numeric`: A number input field with optional validation and slider UI. + + ```typescript + // ... other fields ... + .field( + "numberField", // The key of the field. + "numeric", // Type of the field. + { + displayName: "A number field", + subtitle: "Subtitle for", // Optional subtitle for the field. (Show below the field) + hint: "Hint for number field", // Optional hint for the field. (Show on hover) + int: false, // Whether the field should accept only integer values. + min: 0, // Minimum value for the field. + max: 100, // Maximum value for the field. + slider: { + // If present, configurations for the slider UI + min: 0, // Minimum value for the slider. + max: 100, // Maximum value for the slider. + step: 1, // Step value for the slider. + }, + }, + 42, // Default Value + ) + // ... other fields ... + ``` + +* `boolean`: A checkbox or toggle input field. + + ```typescript + // ... other fields ... + .field( + "booleanField", // The key of the field. + "boolean", // Type of the field. + { + displayName: "A boolean field", + subtitle: "Subtitle", // Optional subtitle for the field. (Show below the field) + hint: "Hint", // Optional hint for the field. (Show on hover) + }, + true, // Default Value + ) + // ... other fields ... + ``` + +* `stringArray`: An array of string values with configurable constraints. + + ```typescript + // ... other fields ... + .field( + "stringArrayField", + "stringArray", + { + displayName: "A string array field", + subtitle: "Subtitle", // Optional subtitle for the field. (Show below the field) + hint: "Hint", // Optional hint for the field. (Show on hover) + allowEmptyStrings: true, // Whether to allow empty strings in the array. + maxNumItems: 5, // Maximum number of items in the array. + }, + ["default", "values"], // Default Value + ) + // ... other fields ... + ``` + +* `select`: A dropdown selection field with predefined options. + + ```typescript + // ... other fields ... + .field( + "selectField", + "select", + { + displayName: "A select field", + options: [ + { value: "option1", displayName: "Option 1" }, + { value: "option2", displayName: "Option 2" }, + { value: "option3", displayName: "Option 3" }, + ], + subtitle: "Subtitle", // Optional subtitle for the field. (Show below the field) + hint: "Hint", // Optional hint for the field. (Show on hover) + }, + "option1", // Default Value + ) + // ... other fields ... + ``` + + + + +LM Studio plugins support custom configurations. That is, you can define a configuration schema and LM Studio will present a UI to the user so they can configure your plugin without having to edit any code. + +There are two types of configurations: + +* **Per-chat configuration**: tied to a specific chat. Different chats can have different configurations. Most configurations that affects the behavior of the plugin should be of this type. +* **Global configuration**: apply to *all* chats and are shared across the application. This is useful for global settings such as API keys. + +Types of Configurations [#types-of-configurations] + +You can define configurations in TypeScript using the `createConfigSchematics` function from the `@lmstudio/sdk` package. This function allows you to define fields with various types and options. + +Supported types include: + +* `string`: A text input field. +* `numeric`: A number input field with optional validation and slider UI. +* `boolean`: A checkbox or toggle input field. +* `stringArray`: An array of string values with configurable constraints. +* `select`: A dropdown selection field with predefined options. + +See the [Defining New Fields](./custom-configuration/defining-new-fields) section for more details on how to define these fields. + +Examples [#examples](https://127.0.0.1/8000/https://127.0.0.1/3000/https://127.0.0.1/0000) +The following are some plugins that make use of custom configurations + +* [lmstudio/wikipedia](https://lmstudio.ai/lmstudio/wikipedia) + + Gives the LLM tools to search and read Wikipedia articles. + +* [lmstudio/openai-compat-endpoint](https://lmstudio.ai/lmstudio/openai-compat-endpoint) + + Use any OpenAI-compatible API in LM Studio. From 2713c1a5f80dd6bbaba7279b229241a1bffe819f Mon Sep 17 00:00:00 2001 From: Seriki yakub <167559384+Web4application@users.noreply.github.com> Date: Sun, 10 May 2026 19:46:02 +0100 Subject: [PATCH 30/30] Rename Docs/readme.mdx to docs/rb-us/web/Index.md --- Docs/readme.mdx => docs/rb-us/web/Index.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Docs/readme.mdx => docs/rb-us/web/Index.md (100%) diff --git a/Docs/readme.mdx b/docs/rb-us/web/Index.md similarity index 100% rename from Docs/readme.mdx rename to docs/rb-us/web/Index.md