跳转到主要内容
cover

SimpleLLMFunc 是什么?

SimpleLLMFunc 是一个轻量级的大语言模型(Large Language Model, LLM)应用开发框架,旨在简化 LLM 在应用中的集成过程。本框架的设计理念是“LLM as Function, Prompt as Code”,提供类型安全的装饰器,让开发者能以一种自然、直观的方式利用大语言模型的能力。

LLM as Function

用 Python 函数签名和返回类型组织 LLM 能力,而不是手写大量样板调用代码。

Prompt as Code

让 DocString 成为 Prompt 本身,减少 prompt 与业务代码分离带来的维护成本。

类型安全 + 工具能力

同时支持结构化返回、工具调用、多模态输入输出和事件流。

为什么需要 SimpleLLMFunc?

在开发基于大语言模型的应用时,我们常常面临以下挑战:
  • 需要不断编写重复的 API 调用代码
  • Prompt 作为字符串变量存在于代码中,不够直观
  • 流程编排受到框架约束,缺乏灵活性
  • 调试和监控 LLM 调用过程困难
SimpleLLMFunc 旨在解决这些问题,使得开发者可以:
  • 装饰器驱动:提供 @llm_function@llm_chat 等装饰器,所有装饰器仅支持异步函数 (async def) 并原生适配异步调用。
  • Prompt 即逻辑:Prompt 就是代码,是这个函数的逻辑实现。
  • 类型安全:支持 Python 类型注解和 Pydantic 模型,确保数据结构正确。
  • 多模态支持:支持文本、图片 URL 和本地图片路径的混合输入,创新性地支持工具的多模态返回。
  • 通用模型接口:同时支持 OpenAI-compatible chat/completions 接口与 OpenAI Responses API 适配,易于扩展。
  • API 密钥管理:智能负载均衡多个 API 密钥。
  • 流量控制:集成令牌桶算法,实现智能流量平滑。
  • 工具系统:支持 LLM 工具使用,具有简单易用的工具定义和调用机制,支持多模态工具返回。
  • 日志完备:支持 trace_id 跟踪和搜索,方便调试和监控。
如果你关心的是“如何最快跑起来”,建议下一步直接去看 快速开始。如果你关心的是“这个框架适合我做什么”,继续阅读本页的核心特性和架构部分。
特性SimpleLLMFuncLangChainDify
易用性(学习曲线)
直观性⭕️
灵活性⭕️
开发速度
调试性
异步支持⭕️
多模态支持⭕️⭕️
流量控制⭕️⭕️
类型安全⭕️
工具集成✅🌟
社区与生态系统⭕️

样例展示

下面是一个简单的示例,展示了 SimpleLLMFunc 的基本用法:
SimpleLLMFunc 中的 @llm_function@llm_chat@tool 等装饰器只能装饰 async def 定义的函数,请在异步上下文中通过 await 调用。
import asyncio
from typing import List

from pydantic import BaseModel, Field

from SimpleLLMFunc import llm_function, OpenAICompatible

# 定义返回类型
class ProductAnalysis(BaseModel):
    pros: List[str] = Field(..., description="产品优点")
    cons: List[str] = Field(..., description="产品缺点")
    rating: int = Field(..., description="评分(1-5分)")

# 配置 LLM 接口
models = OpenAICompatible.load_from_json_file("provider.json")
llm_interface = models["openai"]["gpt-3.5-turbo"]

# 创建 LLM 函数
@llm_function(llm_interface=llm_interface)
async def analyze_product(product_name: str, review: str) -> ProductAnalysis:
    """
    分析产品评论,提取优缺点并给出评分。
    
    Args:
        product_name: 产品名称
        review: 用户评论
        
    Returns:
        产品分析结果
    """
    pass  # Prompt as Code, Code as Doc

# 使用函数


async def main():
    result = await analyze_product("无线耳机", "音质不错但连接不稳定")
    print(f"优点: {result.pros}")
    print(f"缺点: {result.cons}")
    print(f"评分: {result.rating}/5")


asyncio.run(main())
如果你要接 OpenAI Responses API 端点,也可以直接改用 OpenAIResponsesCompatible;装饰器层的写法保持不变,adapter 会把 system prompt 映射到 Responses instructions

异步支持示例

import asyncio

from SimpleLLMFunc import llm_function


@llm_function(llm_interface=llm_interface)
async def async_translate(text: str, target_language: str) -> str:
    """
    将输入文本翻译为目标语言。

    Args:
        text: 要翻译的文本
        target_language: 目标语言

    Returns:
        翻译结果
    """
    pass


async def main():
    result = await async_translate("Hello world", "中文")
    print(result)


asyncio.run(main())

多模态支持示例

import asyncio

from SimpleLLMFunc import llm_function
from SimpleLLMFunc.type import Text, ImgPath

@llm_function(llm_interface=llm_interface)
async def analyze_image(description: Text, image: ImgPath) -> str:
    """
    分析图像内容
    
    Args:
        description: 分析要求描述
        image: 本地图片路径
        
    Returns:
        图像分析结果
    """
    pass

# 使用多模态输入
async def run():
    result = await analyze_image(
        description=Text("描述这张图片中的主要内容"),
        image=ImgPath("./photo.jpg")
    )
    print(result)


asyncio.run(run())

动态模板参数示例

import asyncio

from SimpleLLMFunc import llm_function

# 万能的代码分析函数
@llm_function(llm_interface=llm_interface)
async def analyze_code(code: str) -> str:
    """以{style}的方式分析{language}代码,重点关注{focus}。"""
    pass


# 万能的文本处理函数
@llm_function(llm_interface=llm_interface)
async def process_text(text: str) -> str:
    """作为{role},请{action}以下文本,输出风格为{style}。"""
    pass


async def main():
    # 不同的调用方式,适应不同场景
    performance_analysis = await analyze_code(
        python_code,
        _template_params={
            'style': '详细',
            'language': 'Python',
            'focus': '性能优化'
        }
    )

    code_review = await analyze_code(
        js_code,
        _template_params={
            'style': '简洁',
            'language': 'JavaScript',
            'focus': '代码规范'
        }
    )

    # 同一个函数,不同角色
    edited_text = await process_text(
        text,
        _template_params={
            'role': '专业编辑',
            'action': '润色',
            'style': '学术'
        }
    )

    translated_text = await process_text(
        text,
        _template_params={
            'role': '翻译专家',
            'action': '翻译成英文',
            'style': '商务'
        }
    )

    print(performance_analysis, code_review, edited_text, translated_text)


asyncio.run(main())

核心特性

  • 装饰器驱动: 使用 @llm_function@llm_chat 构建 LLM 驱动的功能,均为原生异步实现。
  • DocString 即 Prompt: 直接在函数文档中定义 Prompt,提高代码可读性。
  • 动态模板参数: 支持通过 _template_params 在函数调用时动态设置 DocString 模板参数,让一个函数适应多种场景。
  • 类型安全: 支持 Python 类型注解和 Pydantic 模型,确保数据结构正确。
  • 异步支持: @llm_function@llm_chat 原生支持异步调用,无需额外别名。
  • 多模态支持: 支持文本、图片 URL、本地图片路径的多模态输入,同时支持工具多模态返回。
  • 事件流与可观测性: 通过 enable_event=True 获取完整 ReAct 事件流与 origin 元数据,便于 UI 路由与性能统计。
  • SelfReference + PyRepl 运行时: 提供内置 PyRepl 与 selfref primitives,支持持久记忆、fork/spawn/wait 等自分叉能力。
  • 步骤化装饰器流水线: llm_decorator/steps 将 Prompt 构建、签名解析、ReAct 和响应解析拆分为可组合步骤。
  • 基础引擎模块化: base/messagesbase/tool_callbase/type_resolve 独立演进,类型解析与多模态处理更稳健。
  • 通用模型接口: 同时支持 OpenAI-compatible chat/completions 接口与 OpenAI Responses API 适配,便于扩展。
  • API 密钥管理: 智能负载均衡多个 API 密钥。
  • 流量控制: 集成令牌桶算法,实现智能流量平滑。
  • 工具系统: 支持工具调用、参数校验、最佳实践注入与多模态返回。
  • 开箱即用终端 TUI: 提供 @tui 装饰器,可将 @llm_chat Agent 包装为 Textual 终端聊天界面。
  • 日志可追踪: 支持 trace_id 关联日志,便于调试与排障。

项目架构

SimpleLLMFunc 的目录结构如下:
SimpleLLMFunc/
├── __init__.py                  # 包初始化
├── config.py                    # 全局配置
├── base/                        # 核心执行引擎
│   ├── messages/                # 消息构建与多模态内容生成
│   ├── tool_call/               # 工具调用参数转换、执行与校验
│   ├── type_resolve/            # 类型描述、示例与多模态类型解析
│   ├── post_process.py          # 响应解析与类型转换
│   └── ReAct.py                 # ReAct 协调器
├── builtin/                     # 内置工具
│   ├── pyrepl.py                # Python REPL 工具集
│   └── self_reference.py        # SelfReference 内存实现
├── hooks/                       # 事件流系统
│   ├── events.py                # 事件类型定义
│   ├── stream.py                # 事件/响应流封装
│   ├── event_emitter.py         # 工具自定义事件发射器
│   ├── event_bus.py             # 事件总线
│   └── input_stream.py          # 交互式输入路由
├── interface/                   # LLM 接口层
│   ├── llm_interface.py         # 抽象基类
│   ├── openai_compatible.py     # OpenAI 兼容实现
│   ├── key_pool.py              # API 密钥负载均衡
│   └── token_bucket.py          # 令牌桶流量控制
├── llm_decorator/               # 装饰器与步骤化流水线
│   ├── llm_function_decorator.py
│   ├── llm_chat_decorator.py
│   ├── steps/                   # Prompt/签名/执行/响应拆分
│   │   ├── common/
│   │   ├── function/
│   │   └── chat/
│   └── utils/
│       └── tools.py
├── runtime/                     # 运行时原语与 worker 代理
│   ├── primitives.py
│   ├── builtin_self_reference.py
│   └── worker_proxy.py
├── self_reference.py            # SelfReference 对外接口
├── utils/                       # 通用工具与 TUI 组件
│   └── tui/
├── tool/                        # 工具定义与序列化
│   └── tool.py
├── type/                        # 类型与多模态辅助
│   ├── hooks.py
│   ├── llm.py
│   ├── message.py
│   ├── multimodal.py            # Text / ImgUrl / ImgPath 等
│   └── tool_call.py
├── logger/                      # 日志系统
├── observability/               # Langfuse 等集成
└── py.typed

模块介绍

LLM 接口模块

interface 模块提供与 LLM 服务通信的标准接口,支持 OpenAI-compatible 服务,并提供 OpenAI Responses API 适配。OpenAICompatibleOpenAIResponsesCompatible 都可通过 provider.json(提供商 -> 模型配置列表)加载多个模型实例;token_bucket.py 负责流量控制,key_pool.py 负责密钥负载均衡。

LLM 装饰器模块

llm_decorator 模块是框架的核心,提供 @llm_function@llm_chat,并在 steps/ 中将 Prompt 构建、签名解析、ReAct 执行、响应解析等环节拆分为可组合步骤。多模态类型定义位于 type/multimodal.pyTextImgUrlImgPath)。

类型定义模块

type 模块导出消息、工具调用、多模态与事件流相关的类型定义,方便在签名与工具中直接使用 Text/ImgUrl/ImgPath 等类型。

日志系统

logger 模块提供结构化日志记录与 trace_id 关联,默认输出控制台日志并在 LOG_DIR/application.log 中记录 JSON 日志,便于排障和观测。

工具系统

tool 模块允许 LLM 调用外部工具和服务。工具通过 @tool 装饰器标记(仅支持 async def),并支持多模态返回(文本、图片或组合),同时可注入工具最佳实践提示。

事件系统与终端 TUI

hooks 模块提供统一事件流(LLM 调用、工具调用、自定义事件)与 origin 元数据,用于稳定路由主会话与 fork 子会话。utils/tui 基于事件流实现 @tui 装饰器,可直接把 @llm_chat Agent 包装为可交互终端界面;builtin/pyrepl.py 提供默认可用的代码执行工具集。

适用人群

SimpleLLMFunc 特别适合以下朋友:
  • LLM应用开发的入门创客玩家: 学习曲线平缓,内容简单,快速上手,直观易懂。
  • 快速原型开发的创业者: 需要快速验证 LLM 应用想法,缩短开发周期和迭代时间。
  • 会Python的PM: 需要快速实现 LLM 应用原型,验证产品想法。
当然我们也欢迎任何一位对 LLM 应用开发感兴趣的小白,老手或者专家加入我们的社区,一起探索 LLM 应用的无限可能!