【如何在OpenWebUI中使用FLUX绘画:基于硅基流动免费API的完整指南】

news2025/3/22 4:57:42

如何在OpenWebUI中使用FLUX绘画:基于硅基流动免费API的完整指南

  • 注册并获取硅基流动秘钥
  • OpenWebUI中使用
    • 函数配置
    • 自定义模型-提示词配置
    • 效果验证

)

FLUX绘画是一种强大的AI绘图工具,本文将详细介绍如何在OpenWebUI中集成并使用FLUX绘画功能,实现高质量的AI图像生成。

如果还没有安装Openwebui的,可以参考这两篇文章:

本地安装:https://blog.csdn.net/qq_41308872/article/details/145894872

云服务器安装:https://blog.csdn.net/qq_41308872/article/details/146224613

注册并获取硅基流动秘钥

首先,您需要注册硅基流动平台并获取API密钥,可以通过以下链接:

https://cloud.siliconflow.cn/i/vw3nVPPI

邀请码:vw3nVPPI
通过邀请链接注册的新用户,可以立刻获得 2000万 Tokens,能免费用很久!

OpenWebUI中使用

在OpenWebUI中需要使用函数和自定义提示词来实现FLUX绘画功能。

函数配置

管理员面板-函数-加号

然后出来这个界面中,将实例内容换成本文中的函数,该函数将处理图像生成请求并与硅基流动API进行交互:

import asyncio
import random
import re
from typing import Callable, Awaitable, Any, Optional

import aiohttp
from pydantic import BaseModel, Field


class AIOutput(BaseModel):
    success: bool
    prompt: str
    width: int
    height: int
    reason: Optional[str] = None
    seed: int = Field(default=-1)


class Filter:
    # 使用您提供的正则表达式,转换为 Python 格式
    JSON_REGEX = re.compile(r"\{(?:\\.|[^\\}])*}")

    class Valves(BaseModel):
        priority: int = Field(default=0, description="用于过滤操作的优先级别。")
        Siliconflow_Base_URL: str = Field(
            default="https://api.siliconflow.cn",
            description="Siliconflow API的基础URL。(例如:https://api.siliconflow.cn)",
        )
        Siliconflow_API_KEY: str = Field(
            default="",
            description="Siliconflow API的API密钥。",
        )
        max_retries: int = Field(
            default=3,
            description="HTTP请求的最大重试次数。",
        )
        num_inference_steps: int = Field(
            default=20,
            description="执行的推理步骤数。(1-100)",
        )
        model_name: str = Field(
            default="black-forest-labs/FLUX.1-schnell",
            description="用于生成图像的模型名称。",
        )

    def __init__(self):
        self.valves = self.Valves()

    @staticmethod
    def remove_markdown_images(content: str) -> str:
        # 根据需要调整,确保保留JSON格式
        return re.sub(r"!\[.*?\]\([^)]*\)", "", content)

    async def inlet(
        self,
        body: dict,
        __event_emitter__: Callable[[Any], Awaitable[None]],
        __user__: Optional[dict] = None,
        __model__: Optional[dict] = None,
    ) -> dict:
        await __event_emitter__(
            {
                "type": "status",
                "data": {
                    "description": "✨正在飞速生成提示词中,请耐心等待...",
                    "done": False,
                },
            }
        )
        for i, msg in enumerate(body["messages"]):
            body["messages"][i]["content"] = self.remove_markdown_images(msg["content"])
        return body

    async def text_to_image(
        self, prompt: str, image_size: str, seed: int, __user__: Optional[dict] = None
    ):
        url = f"{self.valves.Siliconflow_Base_URL}/v1/images/generations"
        payload = {
            "model": self.valves.model_name,  # 使用配置中的模型名称
            "prompt": prompt,
            "image_size": image_size,
            "seed": seed,
            "num_inference_steps": self.valves.num_inference_steps,  # 保持推理步数
        }

        headers = {
            "authorization": f"Bearer {random.choice([key for key in self.valves.Siliconflow_API_KEY.split(',') if key])}",
            "accept": "application/json",
            "content-type": "application/json",
        }

        async with aiohttp.ClientSession() as session:
            for attempt in range(self.valves.max_retries):
                try:
                    async with session.post(
                        url, json=payload, headers=headers
                    ) as response:
                        response.raise_for_status()
                        response_data = await response.json()
                        return response_data
                except Exception as e:
                    print(f"Attempt {attempt + 1} failed: {e}")
                    if attempt == self.valves.max_retries - 1:
                        return {"error": str(e)}

    async def generate_single_image(
        self, ai_output: AIOutput, __user__: Optional[dict] = None
    ):
        image_size = f"{ai_output.width}x{ai_output.height}"
        if ai_output.seed == -1:
            ai_output.seed = random.randint(0, 9999999999)
        seed = ai_output.seed

        result = await self.text_to_image(ai_output.prompt, image_size, seed, __user__)

        if isinstance(result, dict) and "error" in result:
            error_message = result["error"]
            raise Exception(f"Siliconflow API Error: {error_message}")

        return result

    async def outlet(
        self,
        body: dict,
        __event_emitter__: Callable[[Any], Awaitable[None]],
        __user__: Optional[dict] = None,
        __model__: Optional[dict] = None,
    ) -> dict:
        if "messages" in body and body["messages"] and __user__ and "id" in __user__:
            await __event_emitter__(
                {
                    "type": "status",
                    "data": {
                        "description": "🚀正在火速生成图片中,请耐心等待...",
                        "done": False,
                    },
                }
            )

            messages = body["messages"]
            if messages:
                ai_output_content = messages[-1].get("content", "")
                match = self.JSON_REGEX.search(ai_output_content)
                if not match:
                    raise ValueError("未在消息内容中找到有效的AI输出JSON。")

                ai_output_json_str = match.group()

                try:
                    ai_output = AIOutput.parse_raw(ai_output_json_str)
                except Exception as e:
                    raise ValueError(f"解析AI输出JSON时出错: {e}")

                if ai_output.success:
                    response_data = await self.generate_single_image(
                        ai_output, __user__
                    )
                    if response_data and "images" in response_data:
                        images = response_data.get("images", [])
                        if images:
                            image_url = images[0].get("url", "")

                            # 更新content_lines并重新写入
                            content_lines = [
                                f"### 生成信息",
                                f"**提示词 (Prompt):** {ai_output.prompt}",
                                f"**尺寸 (Size):** {ai_output.width}x{ai_output.height}",
                                f"**种子 (Seed):** {ai_output.seed}",
                                f"**模型名称 (Model):** {self.valves.model_name}",
                                "\n### 生成的图片",
                                f"![预览图]({image_url})",
                                f"[🖼️图片下载链接]({image_url})",
                            ]
                            body["messages"][-1]["content"] = "\n\n".join(content_lines)

                            await __event_emitter__(
                                {
                                    "type": "status",
                                    "data": {
                                        "description": "🎉图片生成成功!",
                                        "done": True,
                                    },
                                }
                            )
                        else:
                            raise Exception(
                                "Siliconflow API Error: No images found in response."
                            )
                else:
                    raise Exception(f"AI Output Error: {ai_output.reason}")
        return body

添加完成之后,点击设置按钮,完善相关参数,APIkey填写为自己的(图中红框所示位置),如下图所示:

然后点击保存。

自定义模型-提示词配置

点击 工作空间-模型-加号 然后开始添加自定义模型

自己起名填写模型的名称,ID,标签等,然后选一个基础模型

接下来,您需要设置自定义提示词(就是模型参数-系统提示词的位置),以便AI能够正确理解并处理您的绘画请求:

你是一个基于Flux.1模型的提示词生成机器人。根据用户的需求,自动生成符合Flux.1格式的绘画提示词。虽然你可以参考提供的模板来学习提示词结构和规律,但你必须具备灵活性来应对各种不同需求。最终输出应仅为json格式,无需任何其他解释或信息。

### **提示词生成逻辑**:

1. **需求解析**:从用户的描述中提取关键信息,包括:
   - 角色:外貌、动作、表情等。
   - 场景:环境、光线、天气等。
   - 风格:艺术风格、情感氛围、配色等。
   - 其他元素:特定物品、背景或特效。

2. **提示词结构规律**:
   - **简洁、精确且具象**:提示词需要简单、清晰地描述核心对象,并包含足够细节以引导生成出符合需求的图像。
   - **灵活多样**:参考下列模板和已有示例,但需根据具体需求生成多样化的提示词,避免固定化或过于依赖模板。
   - **符合Flux.1风格的描述**:提示词必须遵循Flux.1的要求,尽量包含艺术风格、视觉效果、情感氛围的描述,使用与Flux.1模型生成相符的关键词和描述模式。

3. **仅供你参考和学习的几种场景提示词**(你需要学习并灵活调整,"[ ]"中内容视用户问题而定):
   - **角色表情集**:
场景说明:适合动画或漫画创作者为角色设计多样的表情。这些提示词可以生成展示同一角色在不同情绪下的表情集,涵盖快乐、悲伤、愤怒等多种情感。

提示词:An anime [SUBJECT], animated expression reference sheet, character design, reference sheet, turnaround, lofi style, soft colors, gentle natural linework, key art, range of emotions, happy sad mad scared nervous embarrassed confused neutral, hand drawn, award winning anime, fully clothed

[SUBJECT] character, animation expression reference sheet with several good animation expressions featuring the same character in each one, showing different faces from the same person in a grid pattern: happy sad mad scared nervous embarrassed confused neutral, super minimalist cartoon style flat muted kawaii pastel color palette, soft dreamy backgrounds, cute round character designs, minimalist facial features, retro-futuristic elements, kawaii style, space themes, gentle line work, slightly muted tones, simple geometric shapes, subtle gradients, oversized clothing on characters, whimsical, soft puffy art, pastels, watercolor

   - **全角度角色视图**:
场景说明:当需要从现有角色设计中生成不同角度的全身图时,如正面、侧面和背面,适用于角色设计细化或动画建模。

提示词:A character sheet of [SUBJECT] in different poses and angles, including front view, side view, and back view

   - **80 年代复古风格**:
场景说明:适合希望创造 80 年代复古风格照片效果的艺术家或设计师。这些提示词可以生成带有怀旧感的模糊宝丽来风格照片。

提示词:blurry polaroid of [a simple description of the scene], 1980s.

   - **智能手机内部展示**:
场景说明:适合需要展示智能手机等产品设计的科技博客作者或产品设计师。这些提示词帮助生成展示手机外观和屏幕内容的图像。

提示词:a iphone product image showing the iphone standing and inside the screen the image is shown

   - **双重曝光效果**:
场景说明:适合摄影师或视觉艺术家通过双重曝光技术创造深度和情感表达的艺术作品。

提示词:[Abstract style waterfalls, wildlife] inside the silhouette of a [man]’s head that is a double exposure photograph . Non-representational, colors and shapes, expression of feelings, imaginative, highly detailed

   - **高质感电影海报**:
场景说明:适合需要为电影创建引人注目海报的电影宣传或平面设计师。

提示词:A digital illustration of a movie poster titled [‘Sad Sax: Fury Toad’], [Mad Max] parody poster, featuring [a saxophone-playing toad in a post-apocalyptic desert, with a customized car made of musical instruments], in the background, [a wasteland with other musical vehicle chases], movie title in [a gritty, bold font, dusty and intense color palette].

   - **镜面自拍效果**:
场景说明:适合想要捕捉日常生活瞬间的摄影师或社交媒体用户。

提示词:Phone photo: A woman stands in front of a mirror, capturing a selfie. The image quality is grainy, with a slight blur softening the details. The lighting is dim, casting shadows that obscure her features. [The room is cluttered, with clothes strewn across the bed and an unmade blanket. Her expression is casual, full of concentration], while the old iPhone struggles to focus, giving the photo an authentic, unpolished feel. The mirror shows smudges and fingerprints, adding to the raw, everyday atmosphere of the scene.

   - **像素艺术创作**:
场景说明:适合像素艺术爱好者或复古游戏开发者创造或复刻经典像素风格图像。

提示词:[Anything you want] pixel art style, pixels, pixel art

   - **以上部分场景仅供你学习,一定要学会灵活变通,以适应任何绘画需求**:

4. **Flux.1提示词要点总结**:
   - **简洁精准的主体描述**:明确图像中核心对象的身份或场景。
   - **风格和情感氛围的具体描述**:确保提示词包含艺术风格、光线、配色、以及图像的氛围等信息。
   - **动态与细节的补充**:提示词可包括场景中的动作、情绪、或光影效果等重要细节。
   - **其他更多规律请自己寻找**
---

**问答案例1**:
**用户输入**:一个80年代复古风格的照片。
**你的输出**:A blurry polaroid of a 1980s living room, with vintage furniture, soft pastel tones, and a nostalgic, grainy texture,  The sunlight filters through old curtains, casting long, warm shadows on the wooden floor, 1980s,

**问答案例2**:
**用户输入**:一个赛博朋克风格的夜晚城市背景
**你的输出**:A futuristic cityscape at night, in a cyberpunk style, with neon lights reflecting off wet streets, towering skyscrapers, and a glowing, high-tech atmosphere. Dark shadows contrast with vibrant neon signs, creating a dramatic, dystopian mood`


### 限制:

- tag内容用英语单词或短语来描述,并不局限于我给你的单词。注意只能包含关键词或词组。
- 注意不要输出句子,不要有任何解释。
- tag数量限制在40个以内,单词数量限制在60个以内。
- tag不要带引号("")。
- 使用英文半角","做分隔符。
- tag按重要性从高到低的顺序排列。
- 我给你的主题可能是用中文描述,你给出的提示词只用英文。

### 图片尺寸

- 你需要为每个生成的提示词提供一个合适的图片尺寸。
- 图片尺寸的宽度和高度都不能超过1024像素。
- 根据主题内容,选择一个合适的宽高比,如风景画可以选择较宽的比例,人像可以选择较高的比例。

# 请确保所有的返回结果都使用以下JSON格式,如果你无法理解主题,则将success设为false,并在reason中输出原因:

{"success":true,"prompt":"content","width":1024,"height":768,"reason":"","seed":-1}

注意:

1. 不允许使用Markdown代码块格式,不要有额外的说明或解释。
2. 所有返回内容必须直接符合上述JSON格式。
3. width和height表示建议的图片宽度和高度,需要根据主题选择合适的尺寸,但不超过1024*1024。
4.不允许生成任何与18+内容相关的提示词。包括但不限于色情、极度暴力、或其他不适合未成年人的内容。
5.seed为图片生成的种子值,是用来控制生成图像时的随机性和可重复性,如果用户需要在原先的图片上进行修改,须保证seed值不变,如果无需在原先图片上修改,需将seed设置为-1
6.必须保证输出的json为标准json格式,可直接被Json解析器解释

然后下面的高级设置中,过滤器选项中勾选FLUX

然后点击下面的 保存并更新

这个时候就已经大功告成了,让我们来验证一下效果。

效果验证

新建一个对话,然后在模型列表选中刚才自定义的这个模型(模型的名字是你自己取的,你肯定知道)

然后直接输入自己绘图的需求,就可以生成图片啦,并且可以看到生成图片具体进行到哪一步了。

至此,本文已经成功,恭喜你又get了一个新技能!

撒花~ 大家下期见!~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2319335.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Facebook 如何影响元宇宙的发展趋势

Facebook 如何影响元宇宙的发展趋势 引言 元宇宙(Metaverse)这个概念,曾经只存在于科幻小说中,如今正逐渐成为现实。它是一个由多个 3D 虚拟世界组成的网络,用户可以在其中进行社交、游戏、工作等活动。Facebook&…

1.5.7 掌握Scala内建控制结构 - 变量作用域

本次实战深入理解了Scala中变量作用域的概念,通过两个任务演示了作用域的基本规则。在任务1中,我们创建了一个名为ScopeDemo01的对象,展示了内部作用域能够访问外部作用域的变量。通过在if语句块中访问在外部定义的message变量,我…

RAID磁盘阵列管理

一. 什么是RAID RAID是英文Redundant Array of Independent Disks的缩写,中文翻译过来就是“独立冗余磁盘阵列”。简单的说,RAID是一种把多块独立的硬盘(物理硬盘)按不同的方式组合起来形成一个硬盘组(逻辑硬盘&#…

微博ip属地不发微博会不会变

随着社交媒体的普及,微博作为其中的佼佼者,一直备受关注。而且微博上线了显示用户IP属地的功能,这一功能旨在减少冒充热点事件当事人、恶意造谣、蹭流量等不良行为,确保传播内容的真实性和透明度。然而,这也引发了一些…

C#从入门到精通(1)

目录 第一章 C#与VS介绍 第二章 第一个C#程序 (1)C#程序基本组成 1.命名空间 2.类 3.Main方法 4.注释 5.语句 6.标识符及关键字 (2)程序编写规范 1.代码编写规则 2.程序命名方法 3.元素命名规范 第三章 变量 &…

仿“东方甄选”直播商城小程序运营平台

在公域直播流量红利趋于饱和、流量成本大幅攀升的当下,私域直播为企业开辟了新的流量聚集和转化渠道,特别是对于那些希望在私域流量领域取得突破的品牌商家来说,直播场景以其独特的高频互动氛围,相比其他运营方式,展现…

ORACLE 19.8版本数据库环境EXPDP导数据的报错处理

近期用户在做EXPDP导出时,报错异常termination终止;EXPDP本身是简单的功能并且这个环境也是经常做导出的,到底是什么原因导致了这个问题呢? 导出脚本报错: 分析导出日志,当时系统资源充足但是进程启动失败,…

LabVIEW运动控制(二):EtherCAT运动控制器的多轴示教加工应用(下)

前面两节课程分别给大家介绍了“控制器连接、定时获取轴状态、轴坐标、控制器型号、轴参数设置、IO控制、Basic文件下载”(详情点击→LabVIEW运动控制(二):EtherCAT运动控制器的多轴示教加工应用(上)&#…

纯内网环境安装1Panel面板与商店应用

文章目录 前序准备开始联网机器配置1Panel配置安装所有离线需要的应用导出Docker镜像导出1Panel配置 离线机器配置安装1Panel覆盖配置导入容器镜像重建应用 关于Jar包的运行 前序 之前一篇文章讲解了如何在内网环境下安装1Panel并操作商店应用安装应用程序,但是在一…

OpenCV计算摄影学(22)将输入的彩色图像转换为两种风格的铅笔素描效果函数pencilSketch()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 铅笔风格非写实线描图。 该函数通过图像处理技术将输入的彩色图像转换为两种风格的铅笔素描效果: dst1:炭笔效果的灰度图…

影响单模光纤耦合效率的分析

影响单模光纤耦合效率的因素 如果想使单模光纤的耦合效率最高,入射光束需要满足以下条件: (1)入射光束接近高斯光; (2)入射光束从光纤端面正入射; (3)入射…

windows+ragflow+deepseek实战之一excel表查询

ragflows平台部署参考文章 Win10系统Docker+DeepSeek+ragflow搭建本地知识库 ragflow通过python实现参考这篇文章 ragflow通过python实现 文章目录 背景效果1、准备数据2、创建知识库3、上传数据并解析4、新建聊天助理5、测试会话背景 前面已经基于Win10系统Docker+DeepSeek+…

从“不敢买大”到“按墙选屏”,海信电视如何凭百吋重构客厅?

电视买小了,成为茜茜新房入住后最大的遗憾。 新房装修的时候,茜茜担心电视买大了眼睛看着累,因此把尺寸选在了65吋。结果入住后,孩子看动画片嚷着“画面太小”,老公看球赛吐槽“看不清球员号码”,全家追剧…

ABAP 长文本编辑器

加个屏幕 *&---------------------------------------------------------------------* *& Report YDEMO2 *&---------------------------------------------------------------------* *& *&---------------------------------------------------------…

MATLAB 调用arduino uno

为了授课,必须重新把arduino用上。 采用MATLAB编码,可以简化相关程序授课部分 1 安装包 MATLAB Support Package for Arduino Hardware - File Exchange - MATLAB Central (mathworks.com) 需要这个插件。 当然也可下载simulink的模块,但…

Git——分布式版本控制工具使用教程

本文主要介绍两种版本控制工具——SVN和Git的概念,接着会讲到Git的安装,Git常用的命令,以及怎么在Vscode中使用Git。帮助新手小白快速上手Git。如果想直接上手用Vscode操作远程仓库则直接看7和9即可! 目录 1. SVN和Git介绍 1.1 …

【数据分析】数据筛选与访问行列元素3

访问元素 .loc属性可以通过传入index的值访问行数据。 .loc属性允许传入两个参数,分别是index的值和columns的值,参数间用“逗号”隔开,这样便可以访问数据中的元素。 1. 访问单个元素 访问单个元素比较简单,只需要通过它的in…

爬虫——playwright获取亚马逊数据

目录 playwright简介使用playwright初窥亚马逊安装playwright打开亚马逊页面 搞数据搜索修改bug数据获取翻页优化结构 简单保存 playwright简介 playwright是微软新出的一个测试工具,与selenium类似,不过与selenium比起来还是有其自身的优势的&#xff…

大数据学习(77)-Hive详解

🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…

汽车一键启动PKE无钥匙系统

移动管家汽车一键启动PKE舒适无钥匙遥控远程系统是一种集成了多项先进功能的汽车电子系统,主要目的是提高驾驶便利性和安全性。 以下是该系统的具体功能: 功能类别 功能描述 无钥匙进入 感应无钥匙进入(自动感应开关门) 一…