AI模型聚合API

OpenRouter提供500+AI模型的统一访问接口,支持语义搜索、价格优化和多模型智能选择,适用于需要灵活调用不同AI模型的开发场景。

  • by AuraFriday
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 AuraFriday/openrouter_mcp

使用说明

OpenRouter-使用一个API访问500+AI模型

通过MCP访问OpenRouter模型

一把钥匙。500多种型号。语义搜索为任何任务找到完美的模型。 你的人工智能现在可以调用其他人工智能——更智能的、更快的、更便宜的、专门的。


益处

1.🔍 语义模型搜索

不仅仅是一个列表——智能发现。 搜索“最适合代码分析”,并获得按实际能力匹配排名的模型。矢量嵌入可以理解你需要什么,而不仅仅是关键字。

2.🌐 500多种型号,一个API

每个主要的AI都在一个地方。 GPT-4、克劳德、双子座、拉玛、米斯特拉尔和500+以上。一个API键,一个接口,无限可能。

3.💰 自动价格优化

找到满足您需求的最便宜的型号。 按价格、上下文长度、功能筛选。以极低的成本获得企业绩效。


为什么这个工具改变了人工智能的发展

大多数开发人员坚持一种模式。 OpenAI的GPT-4、Anthropic的Claude、谷歌的Gemini——选一个,希望它适用于所有情况。但不同的任务需要不同的模型。

模型比较是手动和繁琐的。 访问供应商网站,阅读规格,比较价格,测试每一个。对每个新用例进行数小时的研究。

切换提供者意味着重写代码。 不同的API,不同的格式,不同的身份验证。不便时锁定。

这个工具解决了所有这些问题。

语义搜索:“查找擅长数学的模型”→ 即时排名列表。
一个API:相同的代码适用于GPT-4,Claude,Llama,Mistral,一切。
价格筛选:“每个代币低于0.0001美元,100K+上下文”→ 完美的匹配。
自动刷新:模型数据库每天更新。总是最新的。


真实世界的故事:成本优化发现

问题:

一家初创公司在所有事情上都使用GPT-4:

  • 客户支持响应(0.03/1K代币)
  • 代码分析(0.03/1K代币)
  • 简单分类(0.03美元/千代币)
  • 数据提取(0.03美元/千代币)

每月人工智能账单: $12,000

他们问道:“我们能在不牺牲质量的情况下降低成本吗?”。

标准方法:手动测试更便宜的模型,希望它们有效,处理API差异。 预计时间:2-3周的工程设计。

使用此工具:

# Find models for simple classification (cheap, fast)
simple_models = search_models(
    bindings={"query_vec": {"_embedding_text": "fast classification and categorization"}},
    sql="""SELECT id, context_length, prompt_cost, completion_cost, 
           vec_distance_cosine(embedding, vec_f32(:query_vec)) as similarity 
           FROM models 
           WHERE prompt_cost < 0.0001 
           ORDER BY similarity LIMIT 5"""
)

# Find models for code analysis (quality matters)
code_models = search_models(
    bindings={"query_vec": {"_embedding_text": "code analysis and reasoning"}},
    sql="""SELECT id, context_length, prompt_cost, completion_cost,
           vec_distance_cosine(embedding, vec_f32(:query_vec)) as similarity 
           FROM models 
           WHERE context_length > 32000 
           ORDER BY similarity LIMIT 5"""
)

# Test each model with sample data
for model in simple_models:
    result = chat_completion(
        model=model['id'],
        messages=[{"role": "user", "content": "Classify this support ticket..."}]
    )
    # Evaluate quality vs cost

结果:

  • 客户支持:切换到Llama 3.1 70B(0.0004/1K代币)——准确率98%, 成本降低98.7%
  • 代码分析:保持GPT-4(质量关键)
  • 简单分类:切换到Mistral 7B(0.0001/1K代币)——95%的准确率, 成本降低99.7%
  • 数据提取:切换到Claude 3 Haiku(0.00025/1K代币)——99%的准确率, 成本降低99.2%

每月新账单:1200美元 (减少90%)

踢球者: 相同的代码适用于所有模型。通过更改一个参数来切换模型。A/B测试需要几分钟,而不是几天。


完整的功能集

语义模型搜索

按能力查找模型:

# Search by natural language description
models = search_models(
    bindings={
        "query_vec": {"_embedding_text": "code analysis and reasoning"}
    }
)

# Returns models ranked by semantic similarity
# Understands "code analysis" means: logic, syntax, debugging, refactoring

自定义SQL查询:

# Find cheap models with large context
models = search_models(
    sql="""SELECT id, context_length, prompt_cost, completion_cost,
           vec_distance_cosine(embedding, vec_f32(:query_vec)) as similarity 
           FROM models 
           WHERE context_length > 100000 AND prompt_cost < 0.0001
           ORDER BY similarity LIMIT 10""",
    bindings={"query_vec": {"_embedding_text": "document analysis"}}
)

非语义查询:

# Pure SQL filtering (no semantic search)
models = search_models(
    sql="SELECT id, context_length, description FROM models ORDER BY context_length DESC LIMIT 5"
)

为什么语义搜索很重要: 向量嵌入捕捉意义。“代码分析”与擅长“编程”、“调试”、“语法”、“逻辑”的模型相匹配,即使这些词不在描述中。

模型发现

列出所有型号:

# Get complete model catalog
models = list_available_models()

# Returns: TSV format with all model details
# Columns: id, name, context_length, pricing, modality, provider, etc.

按条件筛选:

# Find specific models
models = list_available_models(
    search_criteria={
        "provider": "anthropic",
        "min_context_length": 100000,
        "max_prompt_price": 0.001,
        "modality": "text->text"
    },
    max_results=10
)

可用过滤器:

  • modality:“文本->文本”、“文本->图像”、“图像->文本”等。
  • min_context_length:最小上下文窗口大小
  • max_prompt_price:每1K输入代币的最高价格
  • max_completion_price:每1K输出代币的最高价格
  • provider:按提供商筛选(anthropic、openai、谷歌等)
  • text_match:名称/描述的正则表达式模式
  • case_sensitive:区分大小写的文本匹配

JSON输出:

# Get full JSON instead of TSV
models = list_available_models(
    json=True,
    columns=["id", "context_length", "pricing", "description"]
)

为什么list_available_models很重要: 始终从OpenRouter API获取新数据。自动刷新本地数据库。确保search_models具有当前数据。

聊天补全

基本聊天:

# Send message to any model
response = chat_completion(
    model="anthropic/claude-3-opus",
    messages=[
        {"role": "user", "content": "Explain quantum computing"}
    ]
)

多回合对话:

# Maintain conversation history
response = chat_completion(
    model="openai/gpt-4",
    messages=[
        {"role": "system", "content": "You are a helpful coding assistant"},
        {"role": "user", "content": "Write a Python function to sort a list"},
        {"role": "assistant", "content": "Here's a sorting function..."},
        {"role": "user", "content": "Now optimize it for large lists"}
    ]
)

流媒体响应:

# Get responses as they're generated
response = chat_completion(
    model="anthropic/claude-3-sonnet",
    messages=[{"role": "user", "content": "Write a long essay"}],
    stream=True
)

# Process chunks as they arrive
for chunk in response:
    print(chunk['content'], end='', flush=True)

工具使用:

# Models can call functions
response = chat_completion(
    model="openai/gpt-4",
    messages=[{"role": "user", "content": "What's the weather in London?"}],
    tools=[
        {
            "type": "function",
            "function": {
                "name": "get_weather",
                "description": "Get current weather for a location",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "location": {"type": "string"}
                    }
                }
            }
        }
    ],
    tool_choice="auto"
)

# Model returns tool call request
# You execute the function and send results back

源内容处理:

# Include URLs or files in context
response = chat_completion(
    model="anthropic/claude-3-opus",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "Analyze this documentation"},
                {"type": "url", "url": "https://docs.example.com/api"}
            ]
        }
    ]
)

为什么聊天完成很重要: 500多种型号的界面相同。通过更改一个参数来切换模型。没有代码重写,没有API更改。

账户管理

检查积分:

# Get current balance
credits = get_credits()

# Returns: {
#   "balance": 25.50,
#   "usage_this_month": 12.30,
#   "rate_limit": {...}
# }

获取生成详细信息:

# Retrieve specific generation info
generation = get_generation(generation_id="gen_abc123")

# Returns: Full details including cost, tokens, model used

为什么账户管理很重要: 跟踪支出,监控使用情况,避免意外。对于生产部署至关重要。


高级用例

智能选型

# Find best model for specific task and budget
def find_optimal_model(task_description, max_price_per_1k, min_context):
    models = search_models(
        sql="""SELECT id, context_length, prompt_cost, completion_cost,
               vec_distance_cosine(embedding, vec_f32(:query_vec)) as similarity 
               FROM models 
               WHERE context_length >= :min_context 
               AND prompt_cost <= :max_price
               ORDER BY similarity LIMIT 10""",
        bindings={
            "query_vec": {"_embedding_text": task_description},
            "min_context": min_context,
            "max_price": max_price_per_1k
        }
    )
    
    # Test top 3 models with sample
    best_model = None
    best_score = 0
    
    for model in models[:3]:
        result = chat_completion(
            model=model['id'],
            messages=[{"role": "user", "content": "Sample task..."}]
        )
        score = evaluate_quality(result)
        if score > best_score:
            best_score = score
            best_model = model
    
    return best_model

# Use it
model = find_optimal_model(
    task_description="code review and bug detection",
    max_price_per_1k=0.001,
    min_context=32000
)

成本优化的管道

# Use different models for different stages
def process_customer_support(ticket):
    # Stage 1: Classification (cheap, fast)
    classifier_models = search_models(
        bindings={"query_vec": {"_embedding_text": "fast text classification"}},
        sql="SELECT id FROM models WHERE prompt_cost < 0.0001 ORDER BY similarity LIMIT 1"
    )
    
    category = chat_completion(
        model=classifier_models[0]['id'],
        messages=[{"role": "user", "content": f"Classify this ticket: {ticket}"}]
    )
    
    # Stage 2: Response generation (quality matters)
    if category == "technical":
        # Use smarter model for technical issues
        response_models = search_models(
            bindings={"query_vec": {"_embedding_text": "technical explanation"}},
            sql="SELECT id FROM models WHERE context_length > 32000 ORDER BY similarity LIMIT 1"
        )
    else:
        # Use cheaper model for simple issues
        response_models = search_models(
            bindings={"query_vec": {"_embedding_text": "customer service response"}},
            sql="SELECT id FROM models WHERE prompt_cost < 0.0005 ORDER BY similarity LIMIT 1"
        )
    
    response = chat_completion(
        model=response_models[0]['id'],
        messages=[{"role": "user", "content": f"Respond to: {ticket}"}]
    )
    
    return response

多模型共识

# Get answers from multiple models, combine results
def consensus_answer(question, num_models=3):
    # Find diverse models good at the task
    models = search_models(
        bindings={"query_vec": {"_embedding_text": "reasoning and analysis"}},
        sql="""SELECT id, provider 
               FROM models 
               WHERE context_length > 8000 
               ORDER BY similarity LIMIT 10"""
    )
    
    # Select models from different providers
    selected = []
    providers_used = set()
    for model in models:
        if model['provider'] not in providers_used:
            selected.append(model)
            providers_used.add(model['provider'])
            if len(selected) >= num_models:
                break
    
    # Get answers from each
    answers = []
    for model in selected:
        response = chat_completion(
            model=model['id'],
            messages=[{"role": "user", "content": question}]
        )
        answers.append(response['content'])
    
    # Synthesize consensus
    synthesis = chat_completion(
        model="anthropic/claude-3-opus",  # Use best model for synthesis
        messages=[{
            "role": "user",
            "content": f"Synthesize these {num_models} answers: {answers}"
        }]
    )
    
    return synthesis

自动回退

# Try models in order until one succeeds
def robust_completion(messages, preferred_models):
    for model_id in preferred_models:
        try:
            response = chat_completion(
                model=model_id,
                messages=messages
            )
            return response
        except Exception as e:
            print(f"Model {model_id} failed: {e}")
            continue
    
    # All preferred models failed, find alternative
    fallback_models = search_models(
        sql="SELECT id FROM models WHERE context_length > 8000 LIMIT 5"
    )
    
    for model in fallback_models:
        try:
            response = chat_completion(
                model=model['id'],
                messages=messages
            )
            return response
        except:
            continue
    
    raise Exception("All models failed")

# Use it
response = robust_completion(
    messages=[{"role": "user", "content": "Analyze this code..."}],
    preferred_models=["openai/gpt-4", "anthropic/claude-3-opus", "google/gemini-pro"]
)

使用示例

语义模型搜索

{
  "input": {
    "operation": "search_models",
    "tool_unlock_token": "YOUR_TOKEN",
    "bindings": {
      "query_vec": {"_embedding_text": "code analysis and reasoning"}
    }
  }
}

自定义SQL搜索

{
  "input": {
    "operation": "search_models",
    "tool_unlock_token": "YOUR_TOKEN",
    "sql": "SELECT id, context_length, prompt_cost FROM models WHERE context_length > 100000 ORDER BY prompt_cost LIMIT 5"
  }
}

列出带过滤器的型号

{
  "input": {
    "operation": "list_available_models",
    "tool_unlock_token": "YOUR_TOKEN",
    "search_criteria": {
      "provider": "anthropic",
      "min_context_length": 100000
    },
    "max_results": 10
  }
}

聊天补全

{
  "input": {
    "operation": "chat_completion",
    "tool_unlock_token": "YOUR_TOKEN",
    "model": "anthropic/claude-3-opus",
    "messages": [
      {"role": "user", "content": "Explain quantum computing"}
    ]
  }
}

流媒体聊天

{
  "input": {
    "operation": "chat_completion",
    "tool_unlock_token": "YOUR_TOKEN",
    "model": "openai/gpt-4",
    "messages": [
      {"role": "user", "content": "Write a long essay"}
    ],
    "stream": true
  }
}

检查积分

{
  "input": {
    "operation": "get_credits",
    "tool_unlock_token": "YOUR_TOKEN"
  }
}

技术架构

模型数据库

自动刷新系统:

  • 从OpenRouter API获取新数据
  • 更新本地SQLite数据库
  • 24小时缓存(可配置)
  • 原子更新(无部分数据)

矢量嵌入:

  • 每个模型描述内嵌Qwen 0.6B
  • 1024维向量
  • 语义搜索中的余弦相似度
  • 缓存以提高性能

数据库架构:

CREATE TABLE models (
    id TEXT PRIMARY KEY,
    name TEXT,
    description TEXT,
    context_length INTEGER,
    prompt_cost REAL,
    completion_cost REAL,
    provider TEXT,
    modality TEXT,
    architecture TEXT,
    embedding BLOB,  -- F32 vector
    last_updated TIMESTAMP
)

语义搜索

工作原理:

  1. 用户提供搜索文本:“代码分析”
  2. 嵌入1024维矢量的文本
  3. 向量与所有模型嵌入进行比较
  4. 计算余弦相似度
  5. 按相似性排序的结果
  6. 应用了可选的SQL筛选器

为什么它很强大:

  • 理解同义词:“代码”=“编程”=“软件”
  • 捕捉概念:“分析”=“审查”+“调试”+“优化”
  • 不匹配关键字:语义,不匹配文本

API集成

直接HTTP调用:

  • 使用请求库
  • 处理速率限制
  • 自动重试
  • 误差传播

流媒体支持:

  • 服务器发送事件(SSE)
  • 分块传输编码
  • 实时处理
  • 内存效率高

身份验证:

  • 配置中的API密钥
  • 自动收割台注射
  • 安全存储
  • 按请求覆盖

性能注意事项

数据库操作

  • 型号列表:~50-200ms(缓存)
  • 语义搜索:~100-500ms(矢量比较)
  • SQL查询:~10-50ms(索引)
  • 数据库刷新:~2-5秒(每24小时一次)

API调用

  • 聊天完成时间:500ms-5s(取决于型号)
  • 流媒体:第一个令牌~500ms,然后连续
  • 获取型号列表:约1-2秒
  • 信用检查:~100-300ms

缓存策略

  • 模型数据库:24小时缓存
  • 嵌入:永久性(直到模型更改)
  • API响应:未缓存(始终为新鲜)

限制和注意事项

需要OpenRouter帐户

  • 需要API密钥: 从...获取https://openrouter.ai/keys
  • 所需学分: 现收现付定价
  • 费率限制: 按计划变化
  • 型号可用性: 某些型号需要批准

模型变化

  • 上下文长度: 变化很大(4K到1M+代币)
  • 定价: 范围从每1K代币0.0001美元到0.03+美元
  • 能力: 并非所有型号都支持工具/流媒体
  • 可利用性: 某些型号可能暂时不可用

语义搜索准确性

  • 嵌入质量: 取决于模型描述质量
  • 模棱两可的查询: 可能返回意外结果
  • 语言: 仅限英文描述
  • 更新: 新模型需要重新嵌入

API限制

  • 所需网络: 所有操作都需要互联网
  • 延迟时间: API调用增加了网络开销
  • 错误: 提供商停机影响可用性
  • 成本: 每次通话都要花钱

为什么这个工具是无与伦比的

1.语义发现
按能力而不是名称查找模型。“擅长数学”→ 即时排名列表。

2.500多种型号,一个API
每个主要的AI都在一个地方。相同的代码,任何型号。

3.价格优化
按成本筛选,找到最便宜的型号。可以降低90%以上的成本。

4.自动刷新
模型数据库每天更新。总是最新的,总是准确的。

5.矢量搜索
嵌入捕捉意义。理解同义词、概念和关系。

6.自定义SQL
完全数据库访问权限。复杂的查询,精确的过滤。

7.流媒体支持
实时响应。内存高效,用户友好。

8.工具集成
模型可以调用函数。构建人工智能代理,而不仅仅是聊天机器人。

9.多供应商
OpenAI、Anthropic、谷歌、Meta、Mistral——都在一个地方。

10.生产准备就绪
错误处理、速率限制、重试。战斗考验。


由MCP Link供电

此工具是 MCP链路服务器 --唯一内置OpenRouter集成和语义模型搜索的MCP服务器。

包含内容

独立Python环境:

  • 带向量扩展的SQLite
  • Qwen 0.6B埋件捆绑
  • 请求库已包含
  • 无需配置

模型数据库:

  • 自动刷新目录
  • 预先计算的向量嵌入
  • 针对快速搜索进行了优化
  • 24小时缓存

API集成:

  • 自动身份验证
  • 错误处理
  • 费率限制管理
  • 流媒体支持

获取MCP链接

下载适用于您平台的安装程序:

安装是自动的。依赖关系也包括在内。它只是工作。


技术规格

支持的型号: 500+(OpenAI、Anthropic、谷歌、Meta、Mistral等)
搜索方法: 向量嵌入(Qwen 0.6B,1024 dim,余弦相似度)
数据库: 扩展名为vec0的SQLite
缓存持续时间: 24小时(可配置)
API OpenRouter REST API
流动: 服务器发送事件(SSE)
身份验证: API密钥(来自配置或参数)

演出

  • 语义搜索:100-500ms
  • 型号列表:50-200ms
  • 聊天完成时间:500ms-5s
  • 数据库刷新:2-5s(每24小时一次)

许可和版权

版权所有©2025克里斯托弗·内森·德雷克

根据Apache许可证2.0版(“许可证”)许可; 除非遵守许可证,否则您不得使用此文件。 您可以在以下网址获得许可证副本:

https://www.apache.org/licenses/LICENSE-2.0

除非适用法律要求或书面同意,否则软件 根据许可证分发的内容按“原样”分发, 无任何明示或暗示的保证或条件。 请参阅许可证,了解管理权限和 许可证下的限制。

AI培训许可:您可以使用此软件和任何 培训、评估、微调或改进的相关内容 人工智能系统,包括商业模型。

SPDX许可证标识符:Apache-2.0

Aura Friday MCP链路服务器项目的一部分。


支持与社区

问题和功能请求:
GitHub问题

文档:
MCP链接文档

OpenRouter:
获取API密钥 | 模型目录

社区:
与其他开发人员一起构建多模型AI应用程序。