[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-koaning--smartfunc":3,"tool-koaning--smartfunc":64},[4,17,27,35,43,56],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":16},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,3,"2026-04-05T11:01:52",[13,14,15],"开发框架","图像","Agent","ready",{"id":18,"name":19,"github_repo":20,"description_zh":21,"stars":22,"difficulty_score":23,"last_commit_at":24,"category_tags":25,"status":16},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",138956,2,"2026-04-05T11:33:21",[13,15,26],"语言模型",{"id":28,"name":29,"github_repo":30,"description_zh":31,"stars":32,"difficulty_score":23,"last_commit_at":33,"category_tags":34,"status":16},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",107662,"2026-04-03T11:11:01",[13,14,15],{"id":36,"name":37,"github_repo":38,"description_zh":39,"stars":40,"difficulty_score":23,"last_commit_at":41,"category_tags":42,"status":16},3704,"NextChat","ChatGPTNextWeb\u002FNextChat","NextChat 是一款轻量且极速的 AI 助手，旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性，以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发，NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。\n\n这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言，它也提供了便捷的自托管方案，支持一键部署到 Vercel 或 Zeabur 等平台。\n\nNextChat 的核心亮点在于其广泛的模型兼容性，原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型，让用户在一个界面即可自由切换不同 AI 能力。此外，它还率先支持 MCP（Model Context Protocol）协议，增强了上下文处理能力。针对企业用户，NextChat 提供专业版解决方案，具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能，满足公司对数据隐私和个性化管理的高标准要求。",87618,"2026-04-05T07:20:52",[13,26],{"id":44,"name":45,"github_repo":46,"description_zh":47,"stars":48,"difficulty_score":23,"last_commit_at":49,"category_tags":50,"status":16},2268,"ML-For-Beginners","microsoft\u002FML-For-Beginners","ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程，旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周，包含 26 节精炼课程和 52 道配套测验，内容涵盖从基础概念到实际应用的完整流程，有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。\n\n无论是希望转型的开发者、需要补充算法背景的研究人员，还是对人工智能充满好奇的普通爱好者，都能从中受益。课程不仅提供了清晰的理论讲解，还强调动手实践，让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持，通过自动化机制提供了包括简体中文在内的 50 多种语言版本，极大地降低了全球不同背景用户的学习门槛。此外，项目采用开源协作模式，社区活跃且内容持续更新，确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路，ML-For-Beginners 将是理想的起点。",84991,"2026-04-05T10:45:23",[14,51,52,53,15,54,26,13,55],"数据工具","视频","插件","其他","音频",{"id":57,"name":58,"github_repo":59,"description_zh":60,"stars":61,"difficulty_score":10,"last_commit_at":62,"category_tags":63,"status":16},3128,"ragflow","infiniflow\u002Fragflow","RAGFlow 是一款领先的开源检索增强生成（RAG）引擎，旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体（Agent）能力相结合，不仅支持从各类文档中高效提取知识，还能让模型基于这些知识进行逻辑推理和任务执行。\n\n在大模型应用中，幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构（如表格、图表及混合排版），显著提升了信息检索的准确度，从而有效减少模型“胡编乱造”的现象，确保回答既有据可依又具备时效性。其内置的智能体机制更进一步，使系统不仅能回答问题，还能自主规划步骤解决复杂问题。\n\n这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统，还是致力于探索大模型在垂直领域落地的创新者，都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口，既降低了非算法背景用户的上手门槛，也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目，它正成为连接通用大模型与行业专有知识之间的重要桥梁。",77062,"2026-04-04T04:44:48",[15,14,13,26,54],{"id":65,"github_repo":66,"name":67,"description_en":68,"description_zh":69,"ai_summary_zh":70,"readme_en":71,"readme_zh":72,"quickstart_zh":73,"use_case_zh":74,"hero_image_url":75,"owner_login":76,"owner_name":77,"owner_avatar_url":78,"owner_bio":79,"owner_company":80,"owner_location":81,"owner_email":82,"owner_twitter":83,"owner_website":84,"owner_url":85,"languages":86,"stars":95,"forks":96,"last_commit_at":97,"license":98,"difficulty_score":23,"env_os":99,"env_gpu":100,"env_ram":101,"env_deps":102,"category_tags":108,"github_topics":82,"view_count":23,"oss_zip_url":82,"oss_zip_packed_at":82,"status":16,"created_at":109,"updated_at":110,"faqs":111,"releases":131},2641,"koaning\u002Fsmartfunc","smartfunc","Turn docstrings into LLM-functions","smartfunc 是一个轻量级 Python 库，旨在让开发者通过简单的函数装饰器，将普通的 Python 函数直接转化为由大语言模型（LLM）驱动的智能接口。它解决了传统 AI 集成中提示词模板管理复杂、响应解析繁琐以及缺乏类型安全等痛点，让你无需学习复杂的模板语法，仅用原生 Python 代码即可构建强大的 AI 应用。\n\n这款工具特别适合 Python 开发者和技术研究人员使用。其核心亮点在于极致的简洁性与灵活性：只需在函数定义上添加 `@backend` 装饰器，函数体内的返回字符串即自动变为发送给模型的提示词，而函数的返回值则自动解析为模型生成的回答。smartfunc 全面兼容 OpenAI SDK 标准，这意味着你不仅可以调用 OpenAI 的服务，还能无缝切换至 Ollama 本地模型或 OpenRouter 等多种提供商。\n\n此外，smartfunc 支持结合 Pydantic 模型实现结构化输出，确保返回数据经过严格验证且类型安全；同时内置异步（async\u002Fawait）支持以提升并发性能，并具备处理多轮对话历史及图像、音频等多模态输入的能力。如果你希望以最小的代码","smartfunc 是一个轻量级 Python 库，旨在让开发者通过简单的函数装饰器，将普通的 Python 函数直接转化为由大语言模型（LLM）驱动的智能接口。它解决了传统 AI 集成中提示词模板管理复杂、响应解析繁琐以及缺乏类型安全等痛点，让你无需学习复杂的模板语法，仅用原生 Python 代码即可构建强大的 AI 应用。\n\n这款工具特别适合 Python 开发者和技术研究人员使用。其核心亮点在于极致的简洁性与灵活性：只需在函数定义上添加 `@backend` 装饰器，函数体内的返回字符串即自动变为发送给模型的提示词，而函数的返回值则自动解析为模型生成的回答。smartfunc 全面兼容 OpenAI SDK 标准，这意味着你不仅可以调用 OpenAI 的服务，还能无缝切换至 Ollama 本地模型或 OpenRouter 等多种提供商。\n\n此外，smartfunc 支持结合 Pydantic 模型实现结构化输出，确保返回数据经过严格验证且类型安全；同时内置异步（async\u002Fawait）支持以提升并发性能，并具备处理多轮对话历史及图像、音频等多模态输入的能力。如果你希望以最小的代码改动，快速将业务逻辑与大模型能力相结合，smartfunc 是一个高效且优雅的选择。","\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fkoaning_smartfunc_readme_feac3dfb6bec.png\" width=\"125\" height=\"125\" align=\"right\" \u002F>\n\n### smartfunc\n\n> Turn functions into LLM-powered endpoints using OpenAI SDK\n\n## Installation\n\n```bash\nuv pip install smartfunc\n```\n\n## What is this?\n\nHere is a nice example of what is possible with this library:\n\n```python\nfrom smartfunc import backend\nfrom openai import OpenAI\n\nclient = OpenAI()\n\n@backend(client, model=\"gpt-4o-mini\")\ndef generate_summary(text: str) -> str:\n    return f\"Generate a summary of the following text: {text}\"\n```\n\nThe `generate_summary` function will now return a string with the summary of the text that you give it.\n\n### Other providers \n\nNote that we're using the OpenAI SDK here but that doesn't mean that you have to use their LLM service. The OpenAI SDK is a standard these days that has support for *many* (if not *most*) providers these days. These include services like [Ollama](https:\u002F\u002Follama.com\u002F) for local models or to many cloud hosting providers like [OpenRouter](https:\u002F\u002Fopenrouter.ai\u002F). Just make sure you set the `api_key` and the `base_url` parameters manually when you call `OpenAI()`.\n\n```python\nOpenAI(\n    api_key=os.getenv(\"OPENROUTER_API_KEY\"),\n    base_url=\"https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\"\n)\n```\n\n\n## How does it work?\n\nThis library uses the OpenAI SDK to interact with LLMs. Your function can return either a string (which becomes the prompt) or a list of message dictionaries (for full conversation control). The decorator handles calling the LLM and parsing the response.\n\nThe key benefits of this approach:\n\n- **Works with any OpenAI SDK-compatible provider**: Use OpenAI, OpenRouter, or any provider with OpenAI-compatible APIs\n- **Full Python control**: Build prompts using Python (no template syntax to learn)\n- **Type-safe structured outputs**: Use Pydantic models for validated responses\n- **Async support**: Built-in async\u002Fawait support for concurrent operations\n- **Conversation history**: Pass message lists for multi-turn conversations\n- **Multimodal support**: Include images, audio, and video via base64 encoding\n- **Simple and focused**: Does one thing well - turn functions into LLM calls\n\n## Features\n\n### Basic Usage\n\nThe simplest way to use `smartfunc`:\n\n```python\nfrom smartfunc import backend\nfrom openai import OpenAI\n\nclient = OpenAI()\n\n@backend(client, model=\"gpt-4o-mini\")\ndef write_poem(topic: str) -> str:\n    return f\"Write a short poem about {topic}\"\n\nprint(write_poem(\"summer\"))\n```\n\n### Structured Outputs\n\nUse Pydantic models to get validated, structured responses:\n\n```python\nfrom smartfunc import backend\nfrom openai import OpenAI\nfrom pydantic import BaseModel\n\nclient = OpenAI()\n\nclass Summary(BaseModel):\n    summary: str\n    pros: list[str]\n    cons: list[str]\n\n@backend(client, model=\"gpt-4o-mini\", response_format=Summary)\ndef analyze_pokemon(name: str) -> str:\n    return f\"Describe the following pokemon: {name}\"\n\nresult = analyze_pokemon(\"pikachu\")\nprint(result.summary)\nprint(result.pros)\nprint(result.cons)\n```\n\nThis will return a Pydantic model that might look like this: \n\n```python\nSummary(\n    summary='Pikachu is a small, electric-type Pokémon...',\n    pros=['Iconic mascot', 'Strong electric attacks', 'Cute appearance'],\n    cons=['Weak against ground-type moves', 'Limited evolution options']\n)\n```\n\n### System Prompts and Parameters\n\nYou can confirm anything you like upfront in the client. \n\n```python\n@backend(\n    client,\n    model=\"gpt-4o-mini\",\n    response_format=Summary,\n    system=\"You are a Pokemon expert with 20 years of experience\",\n    temperature=0.7,\n    max_tokens=500\n)\ndef expert_analysis(pokemon: str) -> Summary:\n    return f\"Provide an expert analysis of {pokemon}\"\n```\n\n### Async Support\n\nIf you like working asynchronously, you can use `async_backend` for non-blocking operations. Beware that you may get throttled by the LLM provider if you send too many requests too quickly.\n\n```python\nimport asyncio\nfrom smartfunc import async_backend\nfrom openai import AsyncOpenAI\n\nclient = AsyncOpenAI()\n\n@async_backend(client, model=\"gpt-4o-mini\", response_format=Summary)\nasync def analyze_async(pokemon: str) -> Summary:\n    return f\"Describe: {pokemon}\"\n\nresult = asyncio.run(analyze_async(\"charizard\"))\nprint(result)\n```\n\n### Complex Prompt Logic\n\nSince prompts are built with Python, you can use any logic you want:\n\n```python\n@backend(client, model=\"gpt-4o-mini\")\ndef custom_prompt(items: list[str], style: str, include_summary: bool) -> str:\n    \"\"\"Generate with custom logic.\"\"\"\n    prompt = f\"Write in {style} style:\\n\\n\"\n\n    for i, item in enumerate(items, 1):\n        prompt += f\"{i}. {item}\\n\"\n\n    if include_summary:\n        prompt += \"\\nProvide a brief summary at the end.\"\n\n    return prompt\n\nresult = custom_prompt(\n    items=[\"First point\", \"Second point\", \"Third point\"],\n    style=\"formal\",\n    include_summary=True\n)\n```\n\n### Conversation History\n\nInstead of returning a string, you can return a list of message dictionaries to have full control over the conversation:\n\n```python\n@backend(client, model=\"gpt-4o-mini\")\ndef chat_with_history(user_message: str, conversation_history: list) -> list:\n    \"\"\"Chat with conversation context.\"\"\"\n    messages = [\n        {\"role\": \"system\", \"content\": \"You are a helpful assistant.\"},\n    ]\n\n    # Add previous conversation\n    messages.extend(conversation_history)\n\n    # Add new user message\n    messages.append({\"role\": \"user\", \"content\": user_message})\n\n    return messages\n\n# Use it with conversation history\nhistory = [\n    {\"role\": \"user\", \"content\": \"What's your name?\"},\n    {\"role\": \"assistant\", \"content\": \"I'm Claude, an AI assistant.\"},\n]\n\nresponse = chat_with_history(\"What can you help me with?\", history)\nprint(response)\n```\n\nNote: When you return a message list, the `system` parameter in the decorator is ignored.\n\n### Multimodal Content (Images, Audio, Video)\n\nYou can include images, audio, or video by passing them as base64-encoded content in your messages:\n\n```python\nimport base64\n\n@backend(client, model=\"gpt-4o-mini\")\ndef analyze_image(image_path: str, question: str) -> list:\n    \"\"\"Analyze an image with a question.\"\"\"\n    # Read and encode image\n    with open(image_path, \"rb\") as f:\n        image_data = base64.b64encode(f.read()).decode(\"utf-8\")\n\n    return [\n        {\n            \"role\": \"user\",\n            \"content\": [\n                {\"type\": \"text\", \"text\": question},\n                {\n                    \"type\": \"image_url\",\n                    \"image_url\": {\n                        \"url\": f\"data:image\u002Fjpeg;base64,{image_data}\"\n                    },\n                },\n            ],\n        }\n    ]\n\nresult = analyze_image(\"photo.jpg\", \"What's in this image?\")\nprint(result)\n```\n\nYou can also mix multiple media types:\n\n```python\n@backend(client, model=\"gpt-4o-mini\")\ndef analyze_multiple_media(image1_path: str, image2_path: str) -> list:\n    \"\"\"Compare two images.\"\"\"\n    # Encode images\n    with open(image1_path, \"rb\") as f:\n        img1 = base64.b64encode(f.read()).decode(\"utf-8\")\n    with open(image2_path, \"rb\") as f:\n        img2 = base64.b64encode(f.read()).decode(\"utf-8\")\n\n    return [\n        {\n            \"role\": \"user\",\n            \"content\": [\n                {\"type\": \"text\", \"text\": \"Compare these images:\"},\n                {\n                    \"type\": \"image_url\",\n                    \"image_url\": {\"url\": f\"data:image\u002Fjpeg;base64,{img1}\"},\n                },\n                {\n                    \"type\": \"image_url\",\n                    \"image_url\": {\"url\": f\"data:image\u002Fjpeg;base64,{img2}\"},\n                },\n            ],\n        }\n    ]\n\nresult = analyze_multiple_media(\"image1.jpg\", \"image2.jpg\")\n```\n\nFor audio content:\n\n```python\n@backend(client, model=\"gpt-4o-mini\")\ndef transcribe_audio(audio_path: str) -> list:\n    \"\"\"Transcribe audio content.\"\"\"\n    with open(audio_path, \"rb\") as f:\n        audio_data = base64.b64encode(f.read()).decode(\"utf-8\")\n\n    return [\n        {\n            \"role\": \"user\",\n            \"content\": [\n                {\"type\": \"text\", \"text\": \"Transcribe this audio:\"},\n                {\n                    \"type\": \"input_audio\",\n                    \"input_audio\": {\n                        \"data\": audio_data,\n                        \"format\": \"wav\"  # or \"mp3\", \"flac\", etc.\n                    },\n                },\n            ],\n        }\n    ]\n```\n\n### Using OpenRouter\n\nOpenRouter provides access to hundreds of models through an OpenAI-compatible API:\n\n```python\nfrom openai import OpenAI\nimport os\n\n# OpenRouter client\nopenrouter_client = OpenAI(\n    api_key=os.getenv(\"OPENROUTER_API_KEY\"),\n    base_url=\"https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\"\n)\n\n# Use Llama via OpenRouter\n@backend(openrouter_client, model=\"meta-llama\u002Fllama-3.1-70b\", response_format=Summary)\ndef analyze_with_llama(pokemon: str) -> Summary:\n    return f\"Analyze {pokemon}\"\n```\n\n### Reusable Backend Configurations\n\nYou can create reusable backend configurations:\n\n```python\nfrom smartfunc import backend\nfrom openai import OpenAI\n\nclient = OpenAI()\n\n# Create a configured backend\ngpt_mini = lambda **kwargs: backend(\n    client,\n    model=\"gpt-4o-mini\",\n    system=\"You are a helpful assistant\",\n    temperature=0.7,\n    **kwargs\n)\n\n# Use it multiple times\n@gpt_mini(response_format=Summary)\ndef summarize(text: str) -> Summary:\n    return f\"Summarize: {text}\"\n\n@gpt_mini()\ndef translate(text: str, language: str) -> str:\n    return f\"Translate '{text}' to {language}\"\n```\n\n## Migration from v0.2.0\n\n\u003Cdetails>\n\u003Csummary>If you're upgrading from v0.2.0, here are the key changes:\u003C\u002Fsummary>\n\n### What Changed\n\n1. **Client injection required**: You now pass an OpenAI client instance instead of a model name string\n2. **Functions return prompts**: Your function should return a string (the prompt), not use docstrings as templates\n3. **`response_format` parameter**: Structured output is specified via `response_format=` instead of return type annotations\n4. **No more Jinja2**: Prompts are built with Python, not templates\n\n### Before (v0.2.0)\n\n```python\nfrom smartfunc import backend\n\n@backend(\"gpt-4o-mini\")\ndef summarize(text: str) -> Summary:\n    \"\"\"Summarize: {{ text }}\"\"\"\n    pass\n```\n\n### After (v1.0.0)\n\n```python\nfrom smartfunc import backend\nfrom openai import OpenAI\n\nclient = OpenAI()\n\n@backend(client, model=\"gpt-4o-mini\", response_format=Summary)\ndef summarize(text: str) -> Summary:\n    \"\"\"This is now actual documentation.\"\"\"\n    return f\"Summarize: {text}\"\n```\n\n### Why the Changes?\n\n- **Better type checking**: The `response_format` parameter doesn't interfere with type checkers\n- **More flexibility**: Full Python for prompt generation instead of Jinja2 templates\n- **Multi-provider support**: Works with any OpenAI SDK-compatible provider (OpenRouter, etc.)\n- **Explicit dependencies**: Client injection makes it clear what's being used\n- **Simpler codebase**: Removed magic template parsing\n\n\u003C\u002Fdetails>\n\n## Development\n\nRun tests:\n\n```bash\nmake check\n```\n\nOr:\n\n```bash\nuv run pytest tests\n```\n","\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fkoaning_smartfunc_readme_feac3dfb6bec.png\" width=\"125\" height=\"125\" align=\"right\" \u002F>\n\n### smartfunc\n\n> 使用 OpenAI SDK 将函数转换为由大语言模型驱动的端点\n\n## 安装\n\n```bash\nuv pip install smartfunc\n```\n\n## 这是什么？\n\n以下是一个使用该库可以实现的示例：\n\n```python\nfrom smartfunc import backend\nfrom openai import OpenAI\n\nclient = OpenAI()\n\n@backend(client, model=\"gpt-4o-mini\")\ndef generate_summary(text: str) -> str:\n    return f\"Generate a summary of the following text: {text}\"\n```\n\n现在，`generate_summary` 函数将返回您提供的文本摘要。\n\n### 其他提供商\n\n请注意，我们在这里使用的是 OpenAI SDK，但这并不意味着您必须使用他们的 LLM 服务。如今，OpenAI SDK 已成为一种标准，支持*许多*（如果不是*大多数*）提供商，包括用于本地模型的 [Ollama](https:\u002F\u002Follama.com\u002F)，以及许多云托管提供商，如 [OpenRouter](https:\u002F\u002Fopenrouter.ai\u002F)。只需在调用 `OpenAI()` 时手动设置 `api_key` 和 `base_url` 参数即可。\n\n```python\nOpenAI(\n    api_key=os.getenv(\"OPENROUTER_API_KEY\"),\n    base_url=\"https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\"\n)\n```\n\n\n## 工作原理是什么？\n\n该库使用 OpenAI SDK 与 LLM 进行交互。您的函数可以返回字符串（作为提示）或消息字典列表（以实现完全的对话控制）。装饰器负责调用 LLM 并解析响应。\n\n这种方法的主要优势：\n\n- **适用于任何兼容 OpenAI SDK 的提供商**：可使用 OpenAI、OpenRouter 或任何具有 OpenAI 兼容 API 的提供商\n- **完全的 Python 控制**：使用 Python 构建提示（无需学习模板语法）\n- **类型安全的结构化输出**：使用 Pydantic 模型获取经过验证的响应\n- **异步支持**：内置 async\u002Fawait 支持，并发操作\n- **对话历史记录**：传递消息列表以进行多轮对话\n- **多模态支持**：通过 base64 编码包含图像、音频和视频\n- **简单而专注**：专注于一件事——将函数转换为 LLM 调用\n\n## 功能\n\n### 基本用法\n\n使用 `smartfunc` 的最简单方式：\n\n```python\nfrom smartfunc import backend\nfrom openai import OpenAI\n\nclient = OpenAI()\n\n@backend(client, model=\"gpt-4o-mini\")\ndef write_poem(topic: str) -> str:\n    return f\"Write a short poem about {topic}\"\n\nprint(write_poem(\"summer\"))\n```\n\n### 结构化输出\n\n使用 Pydantic 模型获取经过验证的结构化响应：\n\n```python\nfrom smartfunc import backend\nfrom openai import OpenAI\nfrom pydantic import BaseModel\n\nclient = OpenAI()\n\nclass Summary(BaseModel):\n    summary: str\n    pros: list[str]\n    cons: list[str]\n\n@backend(client, model=\"gpt-4o-mini\", response_format=Summary)\ndef analyze_pokemon(name: str) -> str:\n    return f\"Describe the following pokemon: {name}\"\n\nresult = analyze_pokemon(\"pikachu\")\nprint(result.summary)\nprint(result.pros)\nprint(result.cons)\n```\n\n这将返回一个 Pydantic 模型，可能如下所示：\n\n```python\nSummary(\n    summary='Pikachu is a small, electric-type Pokémon...',\n    pros=['Iconic mascot', 'Strong electric attacks', 'Cute appearance'],\n    cons=['Weak against ground-type moves', 'Limited evolution options']\n)\n```\n\n### 系统提示和参数\n\n您可以在客户端提前确认任何内容。\n\n```python\n@backend(\n    client,\n    model=\"gpt-4o-mini\",\n    response_format=Summary,\n    system=\"You are a Pokemon expert with 20 years of experience\",\n    temperature=0.7,\n    max_tokens=500\n)\ndef expert_analysis(pokemon: str) -> Summary:\n    return f\"Provide an expert analysis of {pokemon}\"\n```\n\n### 异步支持\n\n如果您喜欢异步工作，可以使用 `async_backend` 进行非阻塞操作。请注意，如果发送请求过快，可能会被 LLM 提供商限流。\n\n```python\nimport asyncio\nfrom smartfunc import async_backend\nfrom openai import AsyncOpenAI\n\nclient = AsyncOpenAI()\n\n@async_backend(client, model=\"gpt-4o-mini\", response_format=Summary)\nasync def analyze_async(pokemon: str) -> Summary:\n    return f\"Describe: {pokemon}\"\n\nresult = asyncio.run(analyze_async(\"charizard\"))\nprint(result)\n```\n\n### 复杂的提示逻辑\n\n由于提示是用 Python 构建的，您可以使用任何逻辑：\n\n```python\n@backend(client, model=\"gpt-4o-mini\")\ndef custom_prompt(items: list[str], style: str, include_summary: bool) -> str:\n    \"\"\"Generate with custom logic.\"\"\"\n    prompt = f\"Write in {style} style:\\n\\n\"\n\n    for i, item in enumerate(items, 1):\n        prompt += f\"{i}. {item}\\n\"\n\n    if include_summary:\n        prompt += \"\\nProvide a brief summary at the end.\"\n\n    return prompt\n\nresult = custom_prompt(\n    items=[\"First point\", \"Second point\", \"Third point\"],\n    style=\"formal\",\n    include_summary=True\n)\n```\n\n### 对话历史\n\n除了返回字符串外，您还可以返回消息字典列表，以完全控制对话：\n\n```python\n@backend(client, model=\"gpt-4o-mini\")\ndef chat_with_history(user_message: str, conversation_history: list) -> list:\n    \"\"\"Chat with conversation context.\"\"\"\n    messages = [\n        {\"role\": \"system\", \"content\": \"You are a helpful assistant.\"},\n    ]\n\n    # Add previous conversation\n    messages.extend(conversation_history)\n\n    # Add new user message\n    messages.append({\"role\": \"user\", \"content\": user_message})\n\n    return messages\n\n# Use it with conversation history\nhistory = [\n    {\"role\": \"user\", \"content\": \"What's your name?\"},\n    {\"role\": \"assistant\", \"content\": \"I'm Claude, an AI assistant.\"},\n]\n\nresponse = chat_with_history(\"What can you help me with?\", history)\nprint(response)\n```\n\n注意：当您返回消息列表时，装饰器中的 `system` 参数将被忽略。\n\n### 多模态内容（图像、音频、视频）\n\n您可以通过在消息中以 base64 编码的形式传递图像、音频或视频来包含这些内容：\n\n```python\nimport base64\n\n@backend(client, model=\"gpt-4o-mini\")\ndef analyze_image(image_path: str, question: str) -> list:\n    \"\"\"用问题分析一张图像。\"\"\"\n    # 读取并编码图像\n    with open(image_path, \"rb\") as f:\n        image_data = base64.b64encode(f.read()).decode(\"utf-8\")\n\n    return [\n        {\n            \"role\": \"user\",\n            \"content\": [\n                {\"type\": \"text\", \"text\": question},\n                {\n                    \"type\": \"image_url\",\n                    \"image_url\": {\n                        \"url\": f\"data:image\u002Fjpeg;base64,{image_data}\"\n                    },\n                },\n            ],\n        }\n    ]\n\nresult = analyze_image(\"photo.jpg\", \"这张图里有什么？\")\nprint(result)\n```\n\n您还可以混合使用多种媒体类型：\n\n```python\n@backend(client, model=\"gpt-4o-mini\")\ndef analyze_multiple_media(image1_path: str, image2_path: str) -> list:\n    \"\"\"比较两张图像。\"\"\"\n    # 编码图像\n    with open(image1_path, \"rb\") as f:\n        img1 = base64.b64encode(f.read()).decode(\"utf-8\")\n    with open(image2_path, \"rb\") as f:\n        img2 = base64.b64encode(f.read()).decode(\"utf-8\")\n\n    return [\n        {\n            \"role\": \"user\",\n            \"content\": [\n                {\"type\": \"text\", \"text\": \"比较这两张图像：\"},\n                {\n                    \"type\": \"image_url\",\n                    \"image_url\": {\"url\": f\"data:image\u002Fjpeg;base64,{img1}\"},\n                },\n                {\n                    \"type\": \"image_url\",\n                    \"image_url\": {\"url\": f\"data:image\u002Fjpeg;base64,{img2}\"},\n                },\n            ],\n        }\n    ]\n\nresult = analyze_multiple_media(\"image1.jpg\", \"image2.jpg\")\n```\n\n对于音频内容：\n\n```python\n@backend(client, model=\"gpt-4o-mini\")\ndef transcribe_audio(audio_path: str) -> list:\n    \"\"\"转录音频内容。\"\"\"\n    with open(audio_path, \"rb\") as f:\n        audio_data = base64.b64encode(f.read()).decode(\"utf-8\")\n\n    return [\n        {\n            \"role\": \"user\",\n            \"content\": [\n                {\"type\": \"text\", \"text\": \"请转录这段音频：\"},\n                {\n                    \"type\": \"input_audio\",\n                    \"input_audio\": {\n                        \"data\": audio_data,\n                        \"format\": \"wav\"  # 或 \"mp3\"、\"flac\" 等\n                    },\n                },\n            ],\n        }\n    ]\n```\n\n### 使用 OpenRouter\n\nOpenRouter 提供了一个与 OpenAI 兼容的 API，可访问数百种模型：\n\n```python\nfrom openai import OpenAI\nimport os\n\n# OpenRouter 客户端\nopenrouter_client = OpenAI(\n    api_key=os.getenv(\"OPENROUTER_API_KEY\"),\n    base_url=\"https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\"\n)\n\n# 通过 OpenRouter 使用 Llama 模型\n@backend(openrouter_client, model=\"meta-llama\u002Fllama-3.1-70b\", response_format=Summary)\ndef analyze_with_llama(pokemon: str) -> Summary:\n    return f\"分析 {pokemon}\"\n```\n\n### 可重用的后端配置\n\n您可以创建可重用的后端配置：\n\n```python\nfrom smartfunc import backend\nfrom openai import OpenAI\n\nclient = OpenAI()\n\n# 创建一个配置好的后端\ngpt_mini = lambda **kwargs: backend(\n    client,\n    model=\"gpt-4o-mini\",\n    system=\"你是一位乐于助人的助手\",\n    temperature=0.7,\n    **kwargs\n)\n\n# 多次使用\n@gpt_mini(response_format=Summary)\ndef summarize(text: str) -> Summary:\n    return f\"总结：{text}\"\n\n@gpt_mini()\ndef translate(text: str, language: str) -> str:\n    return f\"将 '{text}' 翻译成 {language}\"\n```\n\n## 从 v0.2.0 迁移\n\n\u003Cdetails>\n\u003Csummary>如果您正在从 v0.2.0 升级，以下是主要变更：\u003C\u002Fsummary>\n\n### 变更内容\n\n1. **必须注入客户端**：现在需要传入 OpenAI 客户端实例，而不是模型名称字符串。\n2. **函数返回提示**：您的函数应返回字符串（即提示），而不是使用文档字符串作为模板。\n3. **`response_format` 参数**：结构化输出通过 `response_format=` 指定，而非返回类型注解。\n4. **不再支持 Jinja2**：提示现由 Python 构建，而非模板。\n\n### 之前（v0.2.0）\n\n```python\nfrom smartfunc import backend\n\n@backend(\"gpt-4o-mini\")\ndef summarize(text: str) -> Summary:\n    \"\"\"总结：{{ text }}\"\"\"\n    pass\n```\n\n### 之后（v1.0.0）\n\n```python\nfrom smartfunc import backend\nfrom openai import OpenAI\n\nclient = OpenAI()\n\n@backend(client, model=\"gpt-4o-mini\", response_format=Summary)\ndef summarize(text: str) -> Summary:\n    \"\"\"这现在是实际的文档说明。\"\"\"\n    return f\"总结：{text}\"\n```\n\n### 为何进行这些更改？\n\n- **更好的类型检查**：`response_format` 参数不会干扰类型检查器。\n- **更高的灵活性**：完全使用 Python 生成提示，而非 Jinja2 模板。\n- **多提供商支持**：可与任何兼容 OpenAI SDK 的提供商（如 OpenRouter 等）配合使用。\n- **明确的依赖关系**：通过注入客户端，可以清楚地了解所使用的资源。\n- **更简洁的代码库**：移除了模板解析的“魔法”机制。\n\n\u003C\u002Fdetails>\n\n## 开发\n\n运行测试：\n\n```bash\nmake check\n```\n\n或者：\n\n```bash\nuv run pytest tests\n```","# smartfunc 快速上手指南\n\n`smartfunc` 是一个轻量级 Python 库，旨在通过装饰器将普通 Python 函数直接转换为由大语言模型（LLM）驱动的智能端点。它基于 OpenAI SDK 构建，支持所有兼容该标准的提供商（如 OpenAI、OpenRouter、Ollama 等）。\n\n## 环境准备\n\n- **Python 版本**：建议 Python 3.9+\n- **前置依赖**：\n  - `openai` SDK（用于连接 LLM 服务）\n  - `pydantic`（可选，用于结构化输出验证）\n- **API Key**：需准备对应 LLM 服务商的 API Key（如 OpenAI Key 或 OpenRouter Key）\n\n> **国内开发者提示**：若使用 OpenAI 官方服务可能需要网络代理。推荐尝试使用 [OpenRouter](https:\u002F\u002Fopenrouter.ai\u002F) 或本地部署的 [Ollama](https:\u002F\u002Follama.com\u002F)，它们均兼容 OpenAI SDK 接口，配置更灵活。\n\n## 安装步骤\n\n推荐使用 `uv` 进行快速安装（也可使用 `pip`）：\n\n```bash\nuv pip install smartfunc\n```\n\n或者使用标准 pip 安装：\n\n```bash\npip install smartfunc\n```\n\n确保同时安装了必要的依赖库：\n\n```bash\npip install openai pydantic\n```\n\n## 基本使用\n\n### 1. 初始化客户端\n\n首先导入 `OpenAI` 客户端并配置 API Key。\n\n```python\nfrom smartfunc import backend\nfrom openai import OpenAI\nimport os\n\n# 配置 OpenAI 客户端\nclient = OpenAI(\n    api_key=os.getenv(\"OPENAI_API_KEY\") # 请确保环境变量中已设置 KEY\n)\n```\n\n> **多提供商支持**：若使用 OpenRouter 或其他兼容服务，只需修改 `base_url` 和 `api_key`：\n> ```python\n> client = OpenAI(\n>     api_key=os.getenv(\"OPENROUTER_API_KEY\"),\n>     base_url=\"https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\"\n> )\n> ```\n\n### 2. 定义智能函数\n\n使用 `@backend` 装饰器包裹普通函数。函数返回值将作为 Prompt 发送给 LLM，装饰器会自动处理调用并返回结果。\n\n```python\n@backend(client, model=\"gpt-4o-mini\")\ndef write_poem(topic: str) -> str:\n    return f\"Write a short poem about {topic}\"\n\n# 调用函数\nresult = write_poem(\"summer\")\nprint(result)\n```\n\n### 3. 结构化输出（进阶）\n\n结合 `Pydantic` 模型，可强制 LLM 返回格式严格的 JSON 数据，并自动转换为 Python 对象。\n\n```python\nfrom pydantic import BaseModel\n\nclass Analysis(BaseModel):\n    summary: str\n    keywords: list[str]\n\n@backend(client, model=\"gpt-4o-mini\", response_format=Analysis)\ndef analyze_text(text: str) -> Analysis:\n    return f\"Analyze the following text and extract keywords: {text}\"\n\nresult = analyze_text(\"Artificial Intelligence is transforming the world.\")\nprint(result.summary)\nprint(result.keywords)\n```\n\n### 4. 异步支持\n\n如需高并发场景，可使用 `async_backend` 和 `AsyncOpenAI` 客户端。\n\n```python\nimport asyncio\nfrom smartfunc import async_backend\nfrom openai import AsyncOpenAI\n\nasync_client = AsyncOpenAI()\n\n@async_backend(async_client, model=\"gpt-4o-mini\")\nasync def quick_summarize(text: str) -> str:\n    return f\"Summarize: {text}\"\n\n# 运行异步函数\nresult = asyncio.run(quick_summarize(\"Hello world\"))\nprint(result)\n```","某电商初创团队的数据工程师需要快速构建一个自动化模块，将每日数百条用户商品评论转化为结构化的分析报告，以便产品团队即时优化策略。\n\n### 没有 smartfunc 时\n- **模板维护繁琐**：开发者需手动拼接复杂的 Prompt 字符串，一旦业务逻辑变更（如增加分析维度），必须逐行修改代码中的长字符串，极易出错且难以阅读。\n- **数据清洗成本高**：大模型返回的通常是纯文本或非标准 JSON，团队不得不编写大量正则表达式或额外的解析逻辑来提取关键信息，经常因格式微调导致程序崩溃。\n- **类型安全缺失**：下游服务无法直接信任上游返回的数据结构，缺乏编译期检查，往往要等到运行时才发现字段缺失或类型错误，调试周期漫长。\n- **多模型切换困难**：若想从 OpenAI 切换到本地 Ollama 模型以降低成本，需要重构整个 HTTP 请求层和鉴权逻辑，迁移成本极高。\n\n### 使用 smartfunc 后\n- **原生函数即提示词**：只需在普通 Python 函数上添加 `@backend` 装饰器，函数体内的返回语句直接作为 Prompt 逻辑，代码清晰直观，修改业务规则如同修改普通函数一样简单。\n- **自动结构化输出**：结合 Pydantic 模型定义 `response_format`，smartfunc 自动强制大模型输出符合定义的 JSON 并转换为 Python 对象，彻底省去了手动解析和校验数据的步骤。\n- **端到端类型安全**：IDE 能直接识别返回对象的属性和类型，开发阶段即可发现潜在错误，确保流入数据库的数据格式永远符合预期。\n- **无缝兼容多后端**：仅需调整初始化 `OpenAI` 客户端时的 `base_url` 和 `api_key`，即可在不改动任何业务函数代码的情况下，灵活切换至 OpenRouter 或本地部署的大模型。\n\nsmartfunc 通过将自然语言处理逻辑“函数化”，让开发者能用写普通 Python 代码的方式轻松驾驭大模型能力，极大降低了 AI 应用的开发与维护门槛。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fkoaning_smartfunc_7e6e6d88.png","koaning","vincent d warmerdam ","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fkoaning_4705094b.jpg","Solving problems involving data. AskMeAnything[tm]. ","@marimo-team","Amsterdam",null,"fishnets88","https:\u002F\u002Fkoaning.io","https:\u002F\u002Fgithub.com\u002Fkoaning",[87,91],{"name":88,"color":89,"percentage":90},"Python","#3572A5",99.4,{"name":92,"color":93,"percentage":94},"Makefile","#427819",0.6,518,15,"2026-03-07T22:30:05","MIT","Linux, macOS, Windows","未说明 (该工具为客户端库，通过 API 调用远程或本地 LLM 服务，自身不直接占用 GPU。若配合本地模型如 Ollama 使用，则取决于具体模型的需求)","未说明",{"notes":103,"python":104,"dependencies":105},"该工具是一个轻量级包装库，用于将 Python 函数转换为 LLM 调用。它不包含内置模型，因此没有本地的显存或大内存需求。使用时需配置 OpenAI 兼容的 API Key（支持 OpenAI 官方、OpenRouter 或本地部署如 Ollama）。安装推荐使用 'uv' 包管理器。支持异步操作和多模态输入（图片\u002F音频需自行转为 base64）。","未说明 (需支持 uv pip 及 OpenAI SDK，通常建议 Python 3.8+)",[106,107],"openai","pydantic",[26,13],"2026-03-27T02:49:30.150509","2026-04-06T05:15:53.728551",[112,117,121,126],{"id":113,"question_zh":114,"answer_zh":115,"source_url":116},12232,"smartfunc 是否支持向 LLM 发送文件附件（如图片）？","目前不支持。该项目计划仅保持文本处理功能。维护者明确表示暂无添加附件支持的计划，相关说明也可参考其介绍视频。","https:\u002F\u002Fgithub.com\u002Fkoaning\u002Fsmartfunc\u002Fissues\u002F6",{"id":118,"question_zh":119,"answer_zh":120,"source_url":116},12233,"能否在类的方法上使用 `@backend()` 装饰器？","虽然用户在提问中推测应该可以，但鉴于该项目定位为个人项目且仅支持文本输入，建议参考官方文档或最新示例确认对类方法的具体支持情况。目前主要关注点在于基础函数的文本处理。",{"id":122,"question_zh":123,"answer_zh":124,"source_url":125},12231,"代码示例中的函数末尾是否需要添加 `pass` 语句？","不需要。虽然示例中显式添加了 `pass` 语句以强调函数体为空是有意为之，但实际上省略该语句代码也能正常运行。您可以直接定义带有文档字符串的函数而无需 `pass`。","https:\u002F\u002Fgithub.com\u002Fkoaning\u002Fsmartfunc\u002Fissues\u002F9",{"id":127,"question_zh":128,"answer_zh":129,"source_url":130},12234,"使用 `@backend` 装饰异步函数时出现 \"coroutine was never awaited\" 警告怎么办？","这是一个文档示例错误。对于异步函数，不应使用 `@backend` 装饰器，而应使用 `@async_backend` 装饰器。请检查您的代码并将装饰器更正为 `async_backend` 即可消除警告并正常运行。","https:\u002F\u002Fgithub.com\u002Fkoaning\u002Fsmartfunc\u002Fissues\u002F5",[]]