Skip to main content

my-llm-py

PyPI Python License Discord QQ群

通用的 LLM Provider 协议适配器

my-llm-py 是一个 Python 异步 LLM 协议适配库,支持 OpenAI Chat、OpenAI Responses、Anthropic、Gemini 和 Ollama 五种协议自由组合。

用一种协议请求另一种协议的 API,按输入协议返回结果。标准协议直接转换,非标准协议通过配置兼容。

OpenAI Chat 格式输入 → 任意协议 API → OpenAI Chat 格式输出

消息、工具和流事件一并转换。更换上游 API,业务层继续使用原有协议收发数据。

主要功能与亮点

功能 说明
跨协议调用 标准协议直接转换,输入输出协议与上游 API 独立选择。
轮次恢复 保留未知字段、原生签名与密文,未修改的转换结果可恢复原生轮次;请求前过滤不支持字段。
统一工具调用 转换工具定义、调用和结果;流式参数自动组装,响应成功结束后交付完整调用。工具由应用执行。
流式与完整回复 支持文本、可见思考增量;流结束后通过 stream.result 获取完整消息。
多模态转换 按协议与模型能力转换图片、音频、视频和文件等内容。
配置兼容 非标准协议通过配置兼容,适配服务与模型的参数、字段路径及思考内容等差异,配置可拓展。
独立格式转换 无需调用模型,即可转换消息、工具和完整流事件列表;标准模式下支持同协议无损往返。
异步并发 复用官方 SDK 客户端,请求状态独立;支持取消、提前退出和资源清理。
协议扩展 实现四个抽象基类并注册,即可接入现有调用与转换流程。

输入接受标准字典或可转为字典的官方 SDK 对象,输出为所选输入协议的标准字典。 跨协议转换受目标协议的表达能力限制,详见兼容边界。 新增协议通过 MyCodec.register(codec) 在启动时注册,协议默认值随 Codec 声明; 无需修改公共入口或协议枚举,详见接入指南。

安装

需要 Python 3.12+。

pip install my-llm-py
# 或 uv add my-llm-py

快速开始

以下示例使用 OpenAI Chat 格式调用 Anthropic Messages API,返回 Chat assistant 消息。 设置 ANTHROPIC_API_KEY 和 LLM_MODEL 环境变量后运行,模型 ID 填写服务支持的值。

import asyncio
import os

from my_llm import ModelProfile, MyLLM, ProviderProfile


async def main():
    async with MyLLM(
        provider=ProviderProfile(
            protocol="anthropic",  # 实际请求的 API 协议
            api_key=os.environ["ANTHROPIC_API_KEY"],
        ),
        model=ModelProfile(model=os.environ["LLM_MODEL"], max_tokens=4096),
        stdio_protocol="openai_chat",  # 输入和输出均使用 Chat 协议
    ) as llm:
        message = await llm.generate(messages=[{"role": "user", "content": "你好"}])
        print(message["content"])


asyncio.run(main())

更换 provider.protocol 及对应连接、模型配置,即可切换上游 API;stdio_protocol 决定业务层使用的格式。 建议像示例一样显式指定 stdio_protocol。省略时仅在消息与工具整批唯一匹配一种协议时自动绑定; 零匹配或多种协议都匹配时抛出 MessageValidationError。普通 role/content 文本存在协议歧义,需要显式指定。

流式调用

在上例的 async with MyLLM(stdio_protocol="openai_chat", ...) 内调用下面的函数,流事件也按 Chat (openai_chat) 协议返回:

async def print_answer(llm):
    stream = await llm.generate(
        messages=[{"role": "user", "content": "你好"}],
        stream=True,
    )
    async with stream:
        async for event in stream:
            for choice in event.get("choices", []):
                print(choice["delta"].get("content", ""), end="", flush=True)
    return stream.result

使用 async with 管理实例和流。传入工具前,在 ModelProfile 中设置 supports_function_calling=True。

独立格式转换

MyCodec 可离线转换协议格式,无需 API 密钥:

from my_llm import MyCodec

converted = MyCodec().convert(
    [{"role": "user", "content": "你好"}],
    input_format="openai_chat",
    target_format="gemini",
)
print(converted["messages"])
# [{"role": "user", "parts": [{"text": "你好"}]}]

支持的协议

以下标识均可用于 ProviderProfile.protocol 和 stdio_protocol:

协议标识 对应 API
openai_chat OpenAI Chat Completions 及兼容服务
openai_responses OpenAI Responses 及兼容服务
anthropic Anthropic Messages
gemini Gemini GenerateContent
ollama Ollama Chat

同一实例的消息与工具使用同一种输入输出协议。

安装最新的开发版本 (main 分支)

git clone https://github.com/JJJJSTIYYYY/my-llm.git
cd ./my-llm
uv sync --group dev --locked
uv run pytest -q
uv run ruff check src tests examples
uv run ruff format --check src tests examples
uv run python examples/local_demo.py
uv build

文档

项目采用 Apache License 2.0。

Metadata

Release files for my-llm-py 1.0.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for my-llm-py 1.0.4
File Size Uploaded Provenance
my_llm_py-1.0.4.tar.gz 373.0 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for my-llm-py 1.0.4
File Interpreter ABI Platform
my_llm_py-1.0.4-py3-none-any.whl Python 3 none any Details

Total release size: 479.6 kB

Release files / my_llm_py-1.0.4.tar.gz

Download URL my_llm_py-1.0.4.tar.gz
Size 373.0 kB
Tags Source
SHA-256 checksum
How to use checksums
34628998a4ffdaf493fc67add53e400f20ef729081a48ad81c7a2cb5032c84c5
BLAKE2b-256 checksum
How to use checksums
257aecd58ef13a5f2b4213797c847cceb5e99abf1e9bc37886412bfc741e4598
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.12

Release files / my_llm_py-1.0.4-py3-none-any.whl

Download URL my_llm_py-1.0.4-py3-none-any.whl
Size 106.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
85aa5ab425cd72567dfde4b3d914f39c13943dabd109c9be1432ed70944897f3
BLAKE2b-256 checksum
How to use checksums
bbf0e3b0f80abf520e76d5c58cea2b91754ae9ca3d449338153c30cfb745c4d4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.12

Security for my-llm-py 1.0.4

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page