This commit is contained in:
Jun Siang Cheah committed 2025-04-16 23:28:05 +01:00
1 parent 3adb4426dc
commit ebf7c21835
3 files changed
+174 -111

No files matched your search

+73 -17
View File
@@ -11,10 +11,44 @@ This lists various services that provide free access or credits towards API-base
> [!WARNING]
> This list explicitly excludes any services that are not legitimate (eg reverse engineers an existing chatbot)
- [Free Providers](#free-providers)
- [OpenRouter](#openrouter)
- [Google AI Studio](#google-ai-studio)
- [NVIDIA NIM](#nvidia-nim)
- [Mistral (La Plateforme)](#mistral-la-plateforme)
- [Mistral (Codestral)](#mistral-codestral)
- [HuggingFace Inference Providers](#huggingface-inference-providers)
- [Cerebras](#cerebras)
- [Groq](#groq)
- [OVH AI Endpoints (Free Beta)](#ovh-ai-endpoints-free-beta)
- [Together (Free)](#together-free)
- [Cohere](#cohere)
- [GitHub Models](#github-models)
- [Chutes](#chutes)
- [Cloudflare Workers AI](#cloudflare-workers-ai)
- [Google Cloud Vertex AI](#google-cloud-vertex-ai)
- [Providers with trial credits](#providers-with-trial-credits)
- [Together](#together)
- [Fireworks](#fireworks)
- [Unify](#unify)
- [Baseten](#baseten)
- [Nebius](#nebius)
- [Novita](#novita)
- [AI21](#ai21)
- [Upstage](#upstage)
- [NLP Cloud](#nlp-cloud)
- [Alibaba Cloud (International) Model Studio](#alibaba-cloud-international-model-studio)
- [Modal](#modal)
- [Hyperbolic](#hyperbolic)
- [SambaNova Cloud](#sambanova-cloud)
- [Scaleway Generative APIs](#scaleway-generative-apis)
## Free Providers
### [OpenRouter](https://openrouter.ai)
**Limits:**
[20 requests/minute<br>50 requests/day<br>1000 requests/day with $10 credit balance](https://openrouter.ai/docs/api-reference/limits)
Models share a common quota.
@@ -98,27 +132,39 @@ Data is used for training when used outside of the UK/CH/EEA/EU.
### [NVIDIA NIM](https://build.nvidia.com/explore/discover)
Phone number verification required. Models tend to be context window limited.
Phone number verification required.
Models tend to be context window limited.
- [Various open models](https://build.nvidia.com/models) (40 requests/minute)
**Limits:** 40 requests/minute
- [Various open models](https://build.nvidia.com/models)
### [Mistral (La Plateforme)](https://console.mistral.ai/)
Free tier (Experiment plan) requires opting into data training, requires phone number verification.
* Free tier (Experiment plan) requires opting into data training
* Requires phone number verification.
- [Open and Proprietary Mistral models](https://docs.mistral.ai/getting-started/models/models_overview/) (1 request/second, 500,000 tokens/minute, 1,000,000,000 tokens/month)
**Limits (per-model):** 1 request/second, 500,000 tokens/minute, 1,000,000,000 tokens/month
- [Open and Proprietary Mistral models](https://docs.mistral.ai/getting-started/models/models_overview/)
### [Mistral (Codestral)](https://codestral.mistral.ai/)
Currently free to use, monthly subscription based, requires phone number verification.
* Currently free to use
* Monthly subscription based
* Requires phone number verification
- Codestral (30 requests/minute, 2,000 requests/day)
**Limits:** 30 requests/minute, 2,000 requests/day
### [HuggingFace Serverless Inference](https://huggingface.co/docs/api-inference/en/index)
- Codestral
Limited to models smaller than 10GB. Some popular models are supported even if they exceed 10GB.
### [HuggingFace Inference Providers](https://huggingface.co/docs/inference-providers/en/index)
- Various open models ([Variable credits per month, currently $0.10](https://huggingface.co/docs/api-inference/pricing))
HuggingFace Serverless Inference limited to models smaller than 10GB. Some popular models are supported even if they exceed 10GB.
**Limits:** [$0.10/month in credits](https://huggingface.co/docs/inference-providers/en/pricing)
- Various open models across supported providers
### [Cerebras](https://cloud.cerebras.ai/)
@@ -168,9 +214,9 @@ Free tier restricted to 8K context.
<tr><td>Qwen2.5 Coder 32B Instruct</td><td>12 requests/minute</td></tr>
</tbody></table>
### [Together](https://together.ai)
### [Together (Free)](https://together.ai)
Up to 60 requests/minute.
**Limits:** Up to 60 requests/minute
- [Llama 3.2 11B Vision Instruct](https://together.ai/llama-3-2-11b-free)
- [Llama 3.3 70B Instruct](https://together.ai/llama-3-3-70b-free)
@@ -178,6 +224,8 @@ Up to 60 requests/minute.
### [Cohere](https://cohere.com)
**Limits:**
[20 requests/minute<br>1,000 requests/month](https://docs.cohere.com/docs/rate-limits)
Models share a common quota.
@@ -193,15 +241,19 @@ Models share a common quota.
### [GitHub Models](https://github.com/marketplace/models)
Extremely restrictive input/output token limits. [Rate limits dependent on Copilot subscription tier (Free/Pro/Business/Enterprise)](https://docs.github.com/en/github-models/prototyping-with-ai-models#rate-limits)
Extremely restrictive input/output token limits.
**Limits:** [Dependent on Copilot subscription tier (Free/Pro/Pro+/Business/Enterprise)](https://docs.github.com/en/github-models/prototyping-with-ai-models#rate-limits)
- AI21 Jamba 1.5 Large
- AI21 Jamba 1.5 Mini
- Codestral 25.01
- Cohere Command A
- Cohere Command R
- Cohere Command R 08-2024
- Cohere Command R+
- Cohere Command R+ 08-2024
- Cohere Embed 4
- Cohere Embed v3 English
- Cohere Embed v3 Multilingual
- DeepSeek-R1
@@ -218,7 +270,6 @@ Extremely restrictive input/output token limits. [Rate limits dependent on Copil
- Meta-Llama-3.1-70B-Instruct
- Meta-Llama-3.1-8B-Instruct
- Ministral 3B
- Mistral Large
- Mistral Large (2407)
- Mistral Large 24.11
- Mistral Nemo
@@ -250,7 +301,8 @@ Extremely restrictive input/output token limits. [Rate limits dependent on Copil
### [Chutes](https://chutes.ai/)
Distributed, decentralized crypto-based compute. Data is sent to individual hosts.
Distributed, decentralized crypto-based compute.
Data is sent to individual hosts.
- DeepCoder 14B Preview
- DeepHermes 3 Llama 3 8B Preview
@@ -280,7 +332,7 @@ Distributed, decentralized crypto-based compute. Data is sent to individual host
### [Cloudflare Workers AI](https://developers.cloudflare.com/workers-ai)
[10,000 neurons/day](https://developers.cloudflare.com/workers-ai/platform/pricing/#free-allocation)
**Limits:** [10,000 neurons/day](https://developers.cloudflare.com/workers-ai/platform/pricing/#free-allocation)
- DeepSeek R1 Distill Qwen 32B
- Deepseek Coder 6.7B Base (AWQ)
@@ -449,8 +501,8 @@ Very stringent payment verification for Google Cloud.
**Credits:** $5 for 3 months
**Models:**
- E5-Mistral-7B-Instruct
- Llama 3.1 405B
- Llama 3.1 70B
- Llama 3.1 8B
- Llama 3.2 11B Vision
- Llama 3.2 1B
@@ -463,10 +515,14 @@ Very stringent payment verification for Google Cloud.
- Llama-Guard-3-8B
- Qwen/QwQ-32B
- Qwen/QwQ-32B-Preview
- Qwen/Qwen2-Audio-7B-Instruct
- Qwen/Qwen2.5-72B-Instruct
- Qwen/Qwen2.5-Coder-32B-Instruct
- allenai/Llama-3.1-Tulu-3-405B
- deepseek-ai/DeepSeek-R1
- deepseek-ai/DeepSeek-R1-Distill-Llama-70B
- deepseek-ai/DeepSeek-V3-0324
- tokyotech-llm/Llama-3.1-Swallow-70B-Instruct-v0.3
- tokyotech-llm/Llama-3.1-Swallow-8B-Instruct-v0.3
### [Scaleway Generative APIs](https://console.scaleway.com/generative-api/models)
+2
View File
@@ -8,6 +8,8 @@ This lists various services that provide free access or credits towards API-base
> [!WARNING]
> This list explicitly excludes any services that are not legitimate (eg reverse engineers an existing chatbot)
{{TOC}}
## Free Providers
{{MODEL_LIST}}
+99 -94
View File
@@ -11,6 +11,7 @@ from google.cloud import cloudquotas_v1
from mistralai import Mistral
from concurrent.futures import ThreadPoolExecutor
import time
import re
from data import (
MODEL_TO_NAME_MAPPING,
@@ -412,56 +413,6 @@ def fetch_scaleway_models(logger):
}
)
ret_models = sorted(ret_models, key=lambda x: x["name"])
logger.info("Fetching Scaleway rate limits")
r = requests.get(
"https://www.scaleway.com/en/docs/generative-apis/reference-content/rate-limits/"
)
r.raise_for_status()
# Extract <main> content
soup = BeautifulSoup(r.text, "html.parser")
body = str(soup.find("main"))
prompt = f"""
Here is the web page to extract data from:
```html
{body}
```
"""
logger.info("Extracting model rate limits from the provided web page...")
chat_response = rate_limited_mistral_chat(
mistral_client,
model="mistral-large-latest",
messages=[
{
"role": "system",
"content": """Extract the model rate limits as only integers from the provided web page into JSON of the following format:
```json
{
"model name here": {
"requests/minute": 10,
"tokens/minute": 100
}
}
```
ONLY OUTPUT JSON!""",
},
{
"role": "user",
"content": prompt,
},
],
response_format={
"type": "json_object",
},
temperature=0,
)
logger.info(chat_response.choices[0].message.content)
extracted_data = json.loads(chat_response.choices[0].message.content)
for model in extracted_data:
for m in ret_models:
if m["id"] == model:
m["limits"] = extracted_data[model]
break
return ret_models
@@ -496,11 +447,29 @@ def fetch_chutes_models(logger):
return sorted(free_models, key=lambda x: x["name"])
def get_human_limits(model):
def get_human_limits(model, seperator="<br>"):
if "limits" not in model:
return ""
limits = model["limits"]
return "<br>".join([f"{value:,} {key}" for key, value in limits.items()])
return seperator.join([f"{value:,} {key}" for key, value in limits.items()])
def generate_toc(markdown):
toc_lines = []
# Find all ## and ### headings, but skip the main title (# ...)
headings = re.findall(r"^(#{2,3}) +(.+)", markdown, re.MULTILINE)
for hashes, title in headings:
# Remove markdown links for anchor text, keep display text
display = re.sub(r"\[(.*?)\]\([^)]*\)", r"\1", title)
# Build anchor (GitHub style)
anchor = display.lower()
anchor = re.sub(r"[^a-z0-9 \-_]", "", anchor)
anchor = anchor.replace(" ", "-")
anchor = anchor.replace("--", "-")
anchor = anchor.strip("-")
indent = " " if len(hashes) == 3 else ""
toc_lines.append(f"{indent}- [{display}](#{anchor})")
return "\n".join(toc_lines)
def main():
@@ -565,17 +534,23 @@ def main():
# --- OpenRouter ---
model_list_markdown += "### [OpenRouter](https://openrouter.ai)\n\n"
if openrouter_models:
provider_limits = get_human_limits(openrouter_models[0]) # Limits are the same for all free models here
provider_limits = get_human_limits(
openrouter_models[0]
)
model_list_markdown += "**Limits:**\n\n"
model_list_markdown += f"[{provider_limits}<br>1000 requests/day with $10 credit balance](https://openrouter.ai/docs/api-reference/limits)\n\n"
model_list_markdown += "Models share a common quota.\n\n"
for model in openrouter_models:
model_list_markdown += f"- [{model['name']}](https://openrouter.ai/{model['id']})\n"
model_list_markdown += (
f"- [{model['name']}](https://openrouter.ai/{model['id']})\n"
)
model_list_markdown += "\n"
# --- Google AI Studio ---
model_list_markdown += "### [Google AI Studio](https://aistudio.google.com)\n\n"
model_list_markdown += "Data is used for training when used outside of the UK/CH/EEA/EU.\n\n"
model_list_markdown += (
"Data is used for training when used outside of the UK/CH/EEA/EU.\n\n"
)
model_list_markdown += "<table><thead><tr><th>Model Name</th><th>Model Limits</th></tr></thead><tbody>\n"
gemini_text_models = [
@@ -661,7 +636,9 @@ def main():
# Write text models to table
for model in gemini_text_models:
limits_str = get_human_limits(model)
model_list_markdown += f"<tr><td>{model['name']}</td><td>{limits_str}</td></tr>\n"
model_list_markdown += (
f"<tr><td>{model['name']}</td><td>{limits_str}</td></tr>\n"
)
# Write embedding models to table
first_embedding = True
@@ -669,34 +646,48 @@ def main():
limits_str = get_human_limits(model)
model_list_markdown += f"<tr><td>{model['name']}</td>"
if first_embedding:
model_list_markdown += f'<td rowspan="{len(gemini_embedding_models)}">{limits_str}<br>100 content/batch<br>Shared Quota</td>'
first_embedding = False
model_list_markdown += f'<td rowspan="{len(gemini_embedding_models)}">{limits_str}<br>100 content/batch<br>Shared Quota</td>'
first_embedding = False
model_list_markdown += "</tr>\n"
model_list_markdown += "</tbody></table>\n\n"
# --- NVIDIA NIM ---
model_list_markdown += "### [NVIDIA NIM](https://build.nvidia.com/explore/discover)\n\n"
model_list_markdown += "Phone number verification required. Models tend to be context window limited.\n\n"
model_list_markdown += "- [Various open models](https://build.nvidia.com/models) (40 requests/minute)\n"
model_list_markdown += (
"### [NVIDIA NIM](https://build.nvidia.com/explore/discover)\n\n"
)
model_list_markdown += "Phone number verification required.\n"
model_list_markdown += "Models tend to be context window limited.\n\n"
model_list_markdown += "**Limits:** 40 requests/minute\n\n"
model_list_markdown += "- [Various open models](https://build.nvidia.com/models)\n"
model_list_markdown += "\n"
# --- Mistral (La Plateforme) ---
model_list_markdown += "### [Mistral (La Plateforme)](https://console.mistral.ai/)\n\n"
model_list_markdown += "Free tier (Experiment plan) requires opting into data training, requires phone number verification.\n\n"
model_list_markdown += "- [Open and Proprietary Mistral models](https://docs.mistral.ai/getting-started/models/models_overview/) (1 request/second, 500,000 tokens/minute, 1,000,000,000 tokens/month)\n"
model_list_markdown += (
"### [Mistral (La Plateforme)](https://console.mistral.ai/)\n\n"
)
model_list_markdown += "* Free tier (Experiment plan) requires opting into data training\n"
model_list_markdown += "* Requires phone number verification.\n\n"
model_list_markdown += "**Limits (per-model):** 1 request/second, 500,000 tokens/minute, 1,000,000,000 tokens/month\n\n"
model_list_markdown += "- [Open and Proprietary Mistral models](https://docs.mistral.ai/getting-started/models/models_overview/)\n"
model_list_markdown += "\n"
# --- Mistral (Codestral) ---
model_list_markdown += "### [Mistral (Codestral)](https://codestral.mistral.ai/)\n\n"
model_list_markdown += "Currently free to use, monthly subscription based, requires phone number verification.\n\n"
model_list_markdown += "- Codestral (30 requests/minute, 2,000 requests/day)\n"
model_list_markdown += (
"### [Mistral (Codestral)](https://codestral.mistral.ai/)\n\n"
)
model_list_markdown += "* Currently free to use\n"
model_list_markdown += "* Monthly subscription based\n"
model_list_markdown += "* Requires phone number verification\n\n"
model_list_markdown += "**Limits:** 30 requests/minute, 2,000 requests/day\n\n"
model_list_markdown += "- Codestral\n"
model_list_markdown += "\n"
# --- HuggingFace Serverless Inference ---
model_list_markdown += "### [HuggingFace Serverless Inference](https://huggingface.co/docs/api-inference/en/index)\n\n"
model_list_markdown += "Limited to models smaller than 10GB. Some popular models are supported even if they exceed 10GB.\n\n"
model_list_markdown += "- Various open models ([Variable credits per month, currently $0.10](https://huggingface.co/docs/api-inference/pricing))\n"
model_list_markdown += "### [HuggingFace Inference Providers](https://huggingface.co/docs/inference-providers/en/index)\n\n"
model_list_markdown += "HuggingFace Serverless Inference limited to models smaller than 10GB. Some popular models are supported even if they exceed 10GB.\n\n"
model_list_markdown += "**Limits:** [$0.10/month in credits](https://huggingface.co/docs/inference-providers/en/pricing)\n\n"
model_list_markdown += "- Various open models across supported providers\n"
model_list_markdown += "\n"
# --- Cerebras ---
@@ -710,7 +701,9 @@ def main():
{"name": "Llama 3.3 70B", "limits_text": cerebras_limit_text},
]
for model in cerebras_models:
model_list_markdown += f"<tr><td>{model['name']}</td><td>{model['limits_text']}</td></tr>\n"
model_list_markdown += (
f"<tr><td>{model['name']}</td><td>{model['limits_text']}</td></tr>\n"
)
model_list_markdown += "</tbody></table>\n\n"
# --- Groq ---
@@ -719,17 +712,23 @@ def main():
model_list_markdown += "<table><thead><tr><th>Model Name</th><th>Model Limits</th></tr></thead><tbody>\n"
for model in groq_models:
limits_str = get_human_limits(model)
model_list_markdown += f"<tr><td>{model['name']}</td><td>{limits_str}</td></tr>\n"
model_list_markdown += (
f"<tr><td>{model['name']}</td><td>{limits_str}</td></tr>\n"
)
model_list_markdown += "</tbody></table>\n"
model_list_markdown += "\n"
# --- OVH AI Endpoints ---
model_list_markdown += "### [OVH AI Endpoints (Free Beta)](https://endpoints.ai.cloud.ovh.net/)\n\n"
model_list_markdown += (
"### [OVH AI Endpoints (Free Beta)](https://endpoints.ai.cloud.ovh.net/)\n\n"
)
if ovh_models:
model_list_markdown += "<table><thead><tr><th>Model Name</th><th>Model Limits</th></tr></thead><tbody>\n"
for model in ovh_models:
limits_str = get_human_limits(model)
model_list_markdown += f"<tr><td>{model['name']}</td><td>{limits_str}</td></tr>\n"
model_list_markdown += (
f"<tr><td>{model['name']}</td><td>{limits_str}</td></tr>\n"
)
model_list_markdown += "</tbody></table>\n"
model_list_markdown += "\n"
@@ -751,14 +750,15 @@ def main():
"urlId": "deepseek-r1-distilled-llama-70b-free",
},
]
model_list_markdown += "### [Together](https://together.ai)\n\n"
model_list_markdown += "Up to 60 requests/minute.\n\n"
model_list_markdown += "### [Together (Free)](https://together.ai)\n\n"
model_list_markdown += "**Limits:** Up to 60 requests/minute\n\n"
if together_models:
for model in together_models:
model_list_markdown += f"- [{model['name']}](https://together.ai/{model['urlId']})\n"
model_list_markdown += (
f"- [{model['name']}](https://together.ai/{model['urlId']})\n"
)
model_list_markdown += "\n"
# --- Cohere ---
cohere_models = [
{"id": "command-a-03-2025", "name": "Command-A"},
@@ -771,6 +771,7 @@ def main():
{"id": "c4ai-aya-vision-32b", "name": "Aya Vision 32B"},
]
model_list_markdown += "### [Cohere](https://cohere.com)\n\n"
model_list_markdown += "**Limits:**\n\n"
model_list_markdown += "[20 requests/minute<br>1,000 requests/month](https://docs.cohere.com/docs/rate-limits)\n\n"
model_list_markdown += "Models share a common quota.\n\n"
if cohere_models:
@@ -779,8 +780,11 @@ def main():
model_list_markdown += "\n"
# --- GitHub Models ---
model_list_markdown += "### [GitHub Models](https://github.com/marketplace/models)\n\n"
model_list_markdown += "Extremely restrictive input/output token limits. [Rate limits dependent on Copilot subscription tier (Free/Pro/Business/Enterprise)](https://docs.github.com/en/github-models/prototyping-with-ai-models#rate-limits)\n\n"
model_list_markdown += (
"### [GitHub Models](https://github.com/marketplace/models)\n\n"
)
model_list_markdown += "Extremely restrictive input/output token limits.\n\n"
model_list_markdown += "**Limits:** [Dependent on Copilot subscription tier (Free/Pro/Pro+/Business/Enterprise)](https://docs.github.com/en/github-models/prototyping-with-ai-models#rate-limits)\n\n"
if github_models:
for model in github_models:
model_list_markdown += f"- {model['name']}\n"
@@ -788,21 +792,23 @@ def main():
# --- Chutes ---
model_list_markdown += "### [Chutes](https://chutes.ai/)\n\n"
model_list_markdown += "Distributed, decentralized crypto-based compute. Data is sent to individual hosts.\n\n"
model_list_markdown += "Distributed, decentralized crypto-based compute.\n"
model_list_markdown += "Data is sent to individual hosts.\n\n"
if chutes_models:
for model in chutes_models:
model_list_markdown += f"- {model['name']}\n"
model_list_markdown += "\n"
# --- Cloudflare Workers AI ---
model_list_markdown += "### [Cloudflare Workers AI](https://developers.cloudflare.com/workers-ai)\n\n"
model_list_markdown += "[10,000 neurons/day](https://developers.cloudflare.com/workers-ai/platform/pricing/#free-allocation)\n\n"
model_list_markdown += (
"### [Cloudflare Workers AI](https://developers.cloudflare.com/workers-ai)\n\n"
)
model_list_markdown += "**Limits:** [10,000 neurons/day](https://developers.cloudflare.com/workers-ai/platform/pricing/#free-allocation)\n\n"
if cloudflare_models:
for model in cloudflare_models:
model_list_markdown += f"- {model['name']}\n"
model_list_markdown += "\n"
# --- Google Cloud Vertex AI ---
vertex_llama_models = [
{
@@ -881,13 +887,12 @@ def main():
# Write Llama models to table
if vertex_llama_models:
for model in vertex_llama_models:
for model in vertex_llama_models:
limits_str = get_human_limits(model)
model_list_markdown += f'<tr><td><a href="https://console.cloud.google.com/vertex-ai/publishers/meta/model-garden/{model['urlId']}" target="_blank">{model['name']}</a></td><td>{limits_str}<br>Free during preview</td></tr>\n'
model_list_markdown += "</tbody></table>\n\n"
# --- Trial Providers Section Generation ---
trial_list_markdown = ""
@@ -1006,26 +1011,26 @@ def main():
trial_list_markdown += f"- {model['name']}\n"
trial_list_markdown += "\n"
if MISSING_MODELS:
logger.warning("Missing models:")
logger.warning(
"\n" + "\n".join([f'"{model}": "{model}",' for model in MISSING_MODELS])
)
script_dir = os.path.dirname(os.path.abspath(__file__))
with open(os.path.join(script_dir, "README_template.md"), "r") as f:
readme = f.read()
warning = """<!---
WARNING: DO NOT EDIT THIS FILE DIRECTLY. IT IS GENERATED BY src/pull_available_models.py
--->
"""
initial_templated = (
(warning + readme)
.replace("{{MODEL_LIST}}", model_list_markdown)
.replace("{{TRIAL_LIST_MARKDOWN}}", trial_list_markdown)
)
toc_markdown = generate_toc(initial_templated)
with open(os.path.join(script_dir, "..", "README.md"), "w") as f:
f.write(
(warning + readme)
.replace("{{MODEL_LIST}}", model_list_markdown)
.replace("{{TRIAL_LIST_MARKDOWN}}", trial_list_markdown)
)
f.write(initial_templated.replace("{{TOC}}", toc_markdown))
logger.info("Wrote models to README.md")