微信扫码
与创始人交个朋友
我要投稿
Gitee AI是一种无需管理服务器的 API,旨在为 AI 开发者提供开箱即用的大模型推理服务。这种 API 允许开发者通过简单的注册和配置即可使用,无需关心底层基础设施的管理和维护,从而降低了技术门槛和成本。
Gitee AI 架构的核心思想是让开发者专注于业务逻辑,而不是底层的服务器管理。这种架构模式特别适用于需要快速扩展和按需付费的应用场景。在 Gitee 平台上,Gitee AI可以通过简单的操作创建和管理,支持多种功能层 API,如对话、文生图、语音识别等
Gitee AI 地址https://ai.gitee.com/serverless-api
Dify是一个开源的大语言模型(LLM)应用开发平台,旨在简化和加速生成式AI应用的创建和部署。它结合了后端即服务(Backend as Service, BaaS)和LLMOps的理念,使开发者能够快速搭建生产级的AI应用。
Dify的核心功能包括:
低代码/无代码开发:Dify提供了一个用户友好的界面,通过可视化的方式允许开发者轻松定义Prompt、上下文和插件等,无需深入底层技术细节。
模块化设计:采用模块化的设计,每个模块都有清晰的功能和接口,可以根据需求选择性地使用。
丰富的功能组件:包括AI工作流、RAG管道、Agent、模型管理、可观测性功能等,帮助开发者从原型到生产的全过程。
支持多种大语言模型:已支持OpenAI GPT系列等模型,并计划进一步扩展。
数据处理和特征工程工具:提供了数据清洗、特征选择、特征变换等功能,帮助开发者更好地准备数据。
集成外部知识源:允许自定义API接入外部知识源,让大型语言模型深入理解企业知识和业务。
此外,Dify还具有以下特点:
面向各种技术背景的开发者:即使是没有编程基础的用户也能快速上手并参与到AI应用的定义和数据运营过程中。
开源和社区支持:作为一个开源项目,Dify在GitHub上有活跃的社区支持,鼓励用户贡献和分享经验。
dify本身集成第三方工具和工作流。
目前我们系统通过自定义工具来和LLM 和ai agent进行整合,今天给大家介绍一下工作流绘图案例分享
本次我们使用Gitee 平台上提供的Serverless API 用到了Kolors 模型,使用到了天数智芯厂商提供的Kolors模型。该模型提供了文生图、局部重绘、垫图、局部重绘、风格迁移等功能。
下面我们重点讲解一下如何实现的。
首先我们需要在Gitee 平台上开通申请Serverless API 登录系统后,点击右上角设置按钮,进入设置管理界面
点击访问令牌创建,点击右上角”新建访问令牌”,弹出的对话框中输入名称,点击“确定” 按钮系统自动创建令牌。
点击右边的复制按钮保存好令牌,后面的请求接口代码会用到。
这里我们需要到gitee api 接口文档中查看具体开发哪个模型API文档,接口文档地址:https://ai.gitee.com/docs/getting-started/intro
我这里就以图生图的使用接口文档为案例简单介绍一下gitee Serverless API 接口开发,打开接口文档,选到文生图的接口文档中
在这里我们就可以查看到接口文档中输入参数和输入参数了。右边窗口中会有示例参考代码,这里默认选择的是shell curl 命令,从下拉选择框中选择任意编程语言的demo代码。(这里gitee Serverless API 提供非常丰富编程语言调用示例代码,这个非常赞),我们选择python 语言的。
后面我们就可以根据这个接口文档参考的示例代码来实现了。后面详细展开。
这边我们顺便在提下,这个地方提供了test request 方便开发者测试,这个地方设计也是非常人性化的。
我测试一下上面模拟的文生图的api 接口。
这里我们需要注意一下,不是每个模型都支持中文的文生图的提示词。目前测试下来。只有国产的kolors模型支持中文较好。
我们使用ideal 工具开发上面的接口,详细代码编写这里不展开了。我们这里用到了腾讯OSS存储图片功能,为什么需要这个呢?
因为Serverless API 返回的图片base64值不方便在后面dify 上给客户显示,所以我借用腾讯OSS存储图片功能。
giteeapifordify.py
import requests
import json
import base64
from PIL import Image
import io
import os
import sys
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
import datetime
import random
import configparser
from fastapi import FastAPI, HTTPException, Depends
from pydantic import BaseModel
# 读取配置文件
config = configparser.ConfigParser()
# 读取配置文件,指定编码为 utf-8
config.read('config.ini', encoding='utf-8')
# 从配置文件中读取参数
api_key = config.get('DEFAULT', 'api_key')
output_path = config.get('DEFAULT', 'output_path')
region = config.get('DEFAULT', 'region')
secret_id = config.get('DEFAULT', 'secret_id')
secret_key = config.get('DEFAULT', 'secret_key')
bucket = config.get('DEFAULT', 'bucket')
app = FastAPI()
class GenerateImageRequest(BaseModel):
prompt: str
def generate_timestamp_filename(extension='png'):
# 获取当前时间的时间戳
timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
# 生成一个随机数
random_number = random.randint(1000, 9999)
# 组合生成文件名
filename = f"{timestamp}_{random_number}.{extension}"
return filename
def base64_to_image(base64_string, output_dir):
# 生成文件名
filename = generate_timestamp_filename()
# 组合完整的输出路径
output_path = os.path.join(output_dir, filename)
# 解码Base64字符串
image_data = base64.b64decode(base64_string)
# 将解码后的数据转换为图像
image = Image.open(io.BytesIO(image_data))
# 保存图像到指定路径
image.save(output_path)
print(f"图片已保存到 {output_path}")
# 返回文件名和输出路径
return filename, output_path
def upload_cos(env, file_name, base_path):
# 读取配置文件
config = CosConfig(
Region=region, # 替换为你的Region
SecretId=secret_id, # 替换为你的SecretId
SecretKey=secret_key # 替换为你的SecretKey
)
client = CosS3Client(config)
# 构造上传文件的完整路径
file_path = os.path.join(base_path, file_name)
# 上传文件
response = client.upload_file(
Bucket=bucket, # 替换为你的Bucket名称
LocalFilePath=file_path,
Key=file_name,
PartSize=10,
MAXThread=10,
EnableMD5=False
)
if response['ETag']:
print(f"文件 {file_name} 上传成功")
# 构造并返回图片的URL
url = f"https://{bucket}.cos.{region}.myqcloud.com/{file_name}"
return url
else:
print(f"文件 {file_name} 上传失败")
return None
@app.post("/generate_image/")
async def generate_image(request: GenerateImageRequest):
url = "https://ai.gitee.com/v1/images/generations"
payload = {
"model": "Kolors",
"prompt": request.prompt,
"n": 1,
"response_format": "b64_json"
}
# print(prompt)
# print(api_key)
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {api_key}",
}
response = requests.post(url, json=payload, headers=headers)
if response.status_code != 200:
raise HTTPException(status_code=response.status_code, detail=response.text)
result = response.json()["data"][0]["b64_json"]
# 输出图片路径
filename, output_path2 = base64_to_image(result, output_path)
print(f"图片已保存到 {output_path2}")
env = 'test' # 或 'prod'
etag = upload_cos(env, filename, output_path)
return {
"filename": filename,
"output_path": output_path2,
"etag": etag
}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8081)
配置文件
config.ini
[DEFAULT]
api_key = XXXXX gitee Serverless API key
output_path = D:\\tmp\\zz 生成图片的服务临时存储的图片路径
region = ap-nanjing 腾讯云OSS存储Region
secret_id = xxxxxx 腾讯云OSS存储SecretId
secret_key = xxxxx 腾讯云OSS存储SecretKey
bucket = dify-1258720957 腾讯云OSS存储bucket
接下来我们将接口部署到公网服务器上,也可以部署在dify 同一个局域网内。我这里为了方便调试直接开发接口到公网了(这个安全性不好,大家不要学我)
接下来我们登录我们的在华为云上部署的dify.关于dify的部署这里我就不做详细展开,关于这里内容可以访问官方dify https://docs.dify.ai/zh-hans/getting-started/install-self-hosted/docker-compose
在dify 工作流画布中直接增加一个开始节点。
这地方我们在画布面板中添加节点-llm大语言模型,系统提示词 填写如下内容
你是一个基于Flux.1模型的提示词生成机器人。根据用户的需求,自动生成符合Flux.1格式的绘画提示词。虽然你可以参考提供的模板来学习提示词结构和规律,但你必须具备灵活性来应对各种不同需求。最终输出应仅限提示词,无需任何其他解释或信息。你的回答必须全部使用英语进行回复我!
### **提示词生成逻辑**:
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提示词要点总结**:
- **简洁精准的主体描述**:明确图像中核心对象的身份或场景。
- **风格和情感氛围的具体描述**:确保提示词包含艺术风格、光线、配色、以及图像的氛围等信息。
- **动态与细节的补充**:提示词可包括场景中的动作、情绪、或光影效果等重要细节。
- **其他更多规律请自己寻找**
---
**问答案例**:
**用户输入**:一个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,`
注意:你的生成内容绝对不允许含有“![ai](任意链接)”。哪怕你之前不小心含有“![ai](任意链接)”内容,请在下一次绝对不允许含有“![ai](任意链接)”内容。
模型 这里我们选择了 上海书生浦语internlm/internlm2_5-7b-chat 文本模型
用户提示词输入sys.query 从上一个开始节点获取用户输入信息
这里我们用到了自定义工具,这个自定义工具是将上面gitee Serverless API 代码封装成一个自定义工具 方便后面其他工作流调用,类似dify 提供的第三方工具
下面介绍一下这块如何实现。
dify提供了创建自定义工具,不过这个自定义工具是需要遵循OpenAPI-Swagger规范。
规范的空模版的例子如下
{
"openapi": "3.1.0",
"info": {
"title": "Untitled",
"description": "Your OpenAPI specification",
"version": "v1.0.0"
},
"servers": [
{
"url": ""
}
],
"paths": {},
"components": {
"schemas": {}
}
}
我们使用gpt 帮我把postman 客户端调用curl 命令转换成openapi schema,提示词如下
请把curl请求命令转成openapi 3.1.0 版本的json schema,不需要包含response信息
<curl>
curl --location 'http://111.119.215.74:8081/generate_image/'
--header 'Content-Type: application/json'
--data '{"prompt": "一只可爱的小花猫,时尚,头上戴着彩色波点蝴蝶结三角头巾,大大的腮红,很可爱,高饱和度,可爱嘟嘟,毛绒绒且柔软,身穿头巾撞色系旗袍,羊毛毡风格,脖子带你呼应色围巾,非常可爱,怀里抱一束花,上半身肖像,送给你的姿势,卡哇伊,画面简约,高饱和度,轻松气氛,丝滑的画质,中景视角,标准镜头,简约风格,32k高清图,萌态十足,蓝天白云背景,精妙无双"}'
</curl>
json schema请参照下面的例子
<json-schema>
{
"openapi": "3.1.0",
"info": {
"title": "Get weather data",
"description": "Retrieves current weather data for a location.",
"version": "v1.0.0"
},
"servers": [
{
"url": ""
}
],
"paths": {},
"components": {
"schemas": {}
}
}
</json-schema>
生成的结果如下
{
"openapi": "3.1.0",
"info": {
"title": "Generate Image API",
"description": "API to generate an image based on a given prompt.",
"version": "v1.0.0"
},
"servers": [
{
"url": "http://111.119.215.74:8081"
}
],
"paths": {
"/generate_image/": {
"post": {
"summary": "Generate an image based on a prompt",
"operationId": "generateImage",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerateImageRequest"
}
}
}
},
"responses": {}
}
}
},
"components": {
"schemas": {
"GenerateImageRequest": {
"type": "object",
"properties": {
"prompt": {
"type": "string",
"description": "The prompt describing the image to be generated."
}
},
"required": [
"prompt"
]
}
}
}
}
接下来我们验证一下,将以上生成好的代码复制到dify 创建自定义工具中
测试验证一下接口
我们通过测试结果返回窗口中查看到3个返回值,这个3个返回值和我们之前posman返回类似,说明我们自定义第三方接口API给dify 提供的接口服务是OK的了。
接下来我们在dify工作流中添加自定义工具
和大语言模型连接。输入变量是上一个流程节点输出。
这个我们需要代码执行处理一下自定义工具返回的数据,输入参数是generateImage 文本输出
代码执行器处理代码如下:
def main(arg1: str) -> str:
import json
data = json.loads(arg1)
filename=data['filename']
url=data['etag']
markdown_result = f"![{filename}]({url})"
return {"result": markdown_result}
这块很好理解就是上面流程中所有处理结束后,给用户输出的内容,这里我们需要输出2个东西,一个是llm大语言模型转换生成的提示词,一个是生成的图片。这里我们为什么需要输出llm大语言模型转换生成的提示词呢?主要是方便输出的提示词也可以复制到其他文生图模型中,可以对比其他模型输出效果。
完整的工作流如下
dify 工作流dsl文件
app:
description: gitee Serverless API 在dify 使用自定义工具创建文生图
icon: ?
icon_background: '#FFEAD5'
mode: advanced-chat
name: giteeKolor工作流自定义工具文生图20241225-2
use_icon_as_answer_icon: false
kind: app
version: 0.1.3
workflow:
conversation_variables: []
environment_variables: []
features:
file_upload:
allowed_file_extensions:
- .JPG
- .JPEG
- .PNG
- .GIF
- .WEBP
- .SVG
allowed_file_types:
- image
allowed_file_upload_methods:
- local_file
- remote_url
enabled: false
fileUploadConfig:
audio_file_size_limit: 50
batch_count_limit: 5
file_size_limit: 15
image_file_size_limit: 10
video_file_size_limit: 100
workflow_file_upload_limit: 10
image:
enabled: false
number_limits: 3
transfer_methods:
- local_file
- remote_url
number_limits: 3
opening_statement: ''
retriever_resource:
enabled: true
sensitive_word_avoidance:
enabled: false
speech_to_text:
enabled: false
suggested_questions: []
suggested_questions_after_answer:
enabled: false
text_to_speech:
enabled: false
language: ''
voice: ''
graph:
edges:
- data:
isInIteration: false
sourceType: code
targetType: answer
id: 1735142825456-source-answer-target
source: '1735142825456'
sourceHandle: source
target: answer
targetHandle: target
type: custom
zIndex: 0
- data:
isInIteration: false
sourceType: start
targetType: llm
id: 1735142775575-source-1735143434464-target
source: '1735142775575'
sourceHandle: source
target: '1735143434464'
targetHandle: target
type: custom
zIndex: 0
- data:
isInIteration: false
sourceType: llm
targetType: tool
id: 1735143434464-source-1735143608563-target
source: '1735143434464'
sourceHandle: source
target: '1735143608563'
targetHandle: target
type: custom
zIndex: 0
- data:
isInIteration: false
sourceType: tool
targetType: code
id: 1735143608563-source-1735142825456-target
source: '1735143608563'
sourceHandle: source
target: '1735142825456'
targetHandle: target
type: custom
zIndex: 0
nodes:
- data:
desc: ''
selected: false
title: 开始
type: start
variables: []
height: 53
id: '1735142775575'
position:
x: -155
y: 280
positionAbsolute:
x: -155
y: 280
selected: false
sourcePosition: right
targetPosition: left
type: custom
width: 244
- data:
answer: '{{#1735143434464.text#}}
{{#1735142825456.result#}}'
desc: ''
selected: false
title: 直接回复
type: answer
variables: []
height: 121
id: answer
position:
x: 1096
y: 250
positionAbsolute:
x: 1096
y: 250
selected: false
sourcePosition: right
targetPosition: left
type: custom
width: 244
- data:
code: "def main(arg1: str) -> str:\n import json\n data = json.loads(arg1)\n\
\ filename=data['filename']\n url=data['etag']\n markdown_result\
\ = f\"![{filename}]({url})\"\n return {\"result\": markdown_result}"
code_language: python3
desc: ''
outputs:
result:
children: null
type: string
selected: false
title: 代码执行
type: code
variables:
- value_selector:
- '1735143608563'
- text
variable: arg1
height: 53
id: '1735142825456'
position:
x: 754
y: 259
positionAbsolute:
x: 754
y: 259
selected: false
sourcePosition: right
targetPosition: left
type: custom
width: 244
- data:
context:
enabled: false
variable_selector: []
desc: ''
memory:
query_prompt_template: '{{#sys.query#}}'
role_prefix:
assistant: ''
user: ''
window:
enabled: false
size: 50
model:
completion_params:
temperature: 0.7
mode: chat
name: internlm/internlm2_5-7b-chat
provider: siliconflow
prompt_template:
- id: 5bd1114f-c5e2-4f76-ae4a-8c155de5dabd
role: system
text: "你是一个基于Flux.1模型的提示词生成机器人。根据用户的需求,自动生成符合Flux.1格式的绘画提示词。虽然你可以参考提供的模板来学习提示词结构和规律,但你必须具备灵活性来应对各种不同需求。最终输出应仅限提示词,无需任何其他解释或信息。你的回答必须全部使用英语进行回复我!\n\
\n### **提示词生成逻辑**:\n\n1. **需求解析**:从用户的描述中提取关键信息,包括:\n - 角色:外貌、动作、表情等。\n\
\ - 场景:环境、光线、天气等。\n - 风格:艺术风格、情感氛围、配色等。\n - 其他元素:特定物品、背景或特效。\n\n\
2. **提示词结构规律**:\n - **简洁、精确且具象**:提示词需要简单、清晰地描述核心对象,并包含足够细节以引导生成出符合需求的图像。\n\
\ - **灵活多样**:参考下列模板和已有示例,但需根据具体需求生成多样化的提示词,避免固定化或过于依赖模板。\n - **符合Flux.1风格的描述**:提示词必须遵循Flux.1的要求,尽量包含艺术风格、视觉效果、情感氛围的描述,使用与Flux.1模型生成相符的关键词和描述模式。\n\
\n3. **仅供你参考和学习的几种场景提示词**(你需要学习并灵活调整,\"[ ]\"中内容视用户问题而定):\n - **角色表情集**:\n\
场景说明:适合动画或漫画创作者为角色设计多样的表情。这些提示词可以生成展示同一角色在不同情绪下的表情集,涵盖快乐、悲伤、愤怒等多种情感。\n\
\n提示词: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\n\n[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\n\n - **全角度角色视图**:\n场景说明:当需要从现有角色设计中生成不同角度的全身图时,如正面、侧面和背面,适用于角色设计细化或动画建模。\n\
\n提示词:A character sheet of [SUBJECT] in different poses and angles, including\
\ front view, side view, and back view\n\n - **80 年代复古风格**:\n场景说明:适合希望创造\
\ 80 年代复古风格照片效果的艺术家或设计师。这些提示词可以生成带有怀旧感的模糊宝丽来风格照片。\n\n提示词:blurry polaroid\
\ of [a simple description of the scene], 1980s.\n\n - **智能手机内部展示**:\n\
场景说明:适合需要展示智能手机等产品设计的科技博客作者或产品设计师。这些提示词帮助生成展示手机外观和屏幕内容的图像。\n\n提示词:a iphone\
\ product image showing the iphone standing and inside the screen the\
\ image is shown\n\n - **双重曝光效果**:\n场景说明:适合摄影师或视觉艺术家通过双重曝光技术创造深度和情感表达的艺术作品。\n\
\n提示词:[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\n\
\n - **高质感电影海报**:\n场景说明:适合需要为电影创建引人注目海报的电影宣传或平面设计师。\n\n提示词: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].\n\n - **镜面自拍效果**:\n场景说明:适合想要捕捉日常生活瞬间的摄影师或社交媒体用户。\n\
\n提示词: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.\n\n - **像素艺术创作**:\n场景说明:适合像素艺术爱好者或复古游戏开发者创造或复刻经典像素风格图像。\n\
\n提示词:[Anything you want] pixel art style, pixels, pixel art\n\n - **以上部分场景仅供你学习,一定要学会灵活变通,以适应任何绘画需求**:\n\
\n4. **Flux.1提示词要点总结**:\n - **简洁精准的主体描述**:明确图像中核心对象的身份或场景。\n - **风格和情感氛围的具体描述**:确保提示词包含艺术风格、光线、配色、以及图像的氛围等信息。\n\
\ - **动态与细节的补充**:提示词可包括场景中的动作、情绪、或光影效果等重要细节。\n - **其他更多规律请自己寻找**\n\
---\n\n**问答案例**:\n**用户输入**:一个80年代复古风格的照片。\n**你的输出**:`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,`\n\n注意:你的生成内容绝对不允许含有“![ai](任意链接)”。哪怕你之前不小心含有“![ai](任意链接)”内容,请在下一次绝对不允许含有“![ai](任意链接)”内容。"
- id: f6326735-2cd6-4915-aacc-2f65f7e8d2fd
role: user
text: 一个赛博朋克风格的夜晚城市背景
- id: 2e07a09d-2672-486c-a6fb-2bc3fd2daa61
role: assistant
text: 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
- id: 4682651f-b75f-4c7a-ad30-2410011c3d09
role: user
text: ''
selected: false
title: LLM
type: llm
variables: []
vision:
enabled: false
height: 97
id: '1735143434464'
position:
x: 169
y: 267
positionAbsolute:
x: 169
y: 267
selected: false
sourcePosition: right
targetPosition: left
type: custom
width: 244
- data:
desc: ''
provider_id: 29303358-86a5-4a38-a3dc-5691788732d4
provider_name: giteeapiKolors
provider_type: api
selected: false
title: generateImage
tool_configurations: {}
tool_label: generateImage
tool_name: generateImage
tool_parameters:
prompt:
type: mixed
value: '{{#1735143434464.text#}}'
type: tool
height: 53
id: '1735143608563'
position:
x: 456
y: 267
positionAbsolute:
x: 456
y: 267
selected: false
sourcePosition: right
targetPosition: left
type: custom
width: 244
- data:
author: 周辉
desc: ''
height: 88
selected: false
showAuthor: true
text: '{"root":{"children":[{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"用户通过输入简短的中文或者英文提示词,llm大语言模型根据用户提示词进行扩写生成符合文生图英文提示词,在调用自定义的文生图工具生成图片","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":0}],"direction":"ltr","format":"","indent":0,"type":"root","version":1}}'
theme: blue
title: ''
type: ''
width: 240
height: 88
id: '1735189067629'
position:
x: -155
y: 389.5
positionAbsolute:
x: -155
y: 389.5
selected: true
sourcePosition: right
targetPosition: left
type: custom-note
width: 240
viewport:
x: 281.5
y: 153.5
zoom: 1
可以将这个工作流分析给小伙伴,测试地址
http://111.119.215.74/chat/JHWr7ABbbxwuBVqV
找一台linux服务器里面安装好docker,关于docker安装这里就不做详细展开,大家不会可以通过搜索引擎或者AI 搜索一下。
下载源码
cd /home/app/ai
git clone https://github.com/hanfangyuan4396/dify-on-wechat
执行以上命令将dify-on-wechat 源码下载linux服务器上。
接下来我们进入docker目录下
cd docker
我们看到docker 文件夹中有4个文件build.latest.sh 、docker-compose.yml、Dockerfile.latest、entrypoint.sh
其中对我们有用的是docker-compose.yml,这里我们需要先下载dify-on-wechat 镜像文件,在命令行中输入
docker pull registry.cn-hangzhou.aliyuncs.com/hanfangyuan/dify-on-wechat:latest
我上面的图显示dify-on-wechat 镜像已经安装完成了,所以镜像没有提示下载界面。下载完成后就是类似上面图。我们也可以通过如下命令检查docker images
docker images
3.相关配置文件
以上步骤我们完成了docker 镜像下载,接下来我们设置一下程序配置文件。
cd /home/app/ai/dify-on-wechat
cd /home/dify-on-wechat
进入dify-on-wechat 目录下,我们会看到有一个config-template.json,我们打开它
{
"dify_api_base": "https://api.dify.ai/v1",
"dify_api_key": "app-xxx",
"dify_app_type": "chatbot",
"channel_type": "wx",
"model": "dify",
"single_chat_prefix": [""],
"single_chat_reply_prefix": "",
"group_chat_prefix": ["@bot"],
"group_name_white_list": ["ALL_GROUP"],
"image_recognition": true,
"speech_recognition": true,
"voice_reply_voice": true,
"voice_to_text": "dify",
"text_to_voice": "dify"
}
这里我们需要修改以下几个配置。
dify_api_base,dify_api_key,dify_app_type
其中dify_api_base 是我们dify服务的API 接口地址,dify_api_key 顾名思义就是接口对应的服务。dify_app_type 有三个属性 chatbot、agent、workflow,这里我们使用了chatbot。
我们使用如下命令复制config-template.json 变成config.json
cp config-template.json config.json
dify_api_base 从哪获取呢?打开你部署的dify, 点击访问api
dify_api_key 就是右上角的 api秘钥生成的key
将以上2个复制保存一下。回到config.json 修改,修改后的config.json 如下
{
"dify_api_base": "http://101.126.84.227:88/v1",
"dify_api_key": "app-xxx",
"dify_app_type": "chatbot",
"channel_type": "wx",
"model": "dify",
"single_chat_prefix": [""],
"single_chat_reply_prefix": "",
"group_chat_prefix": ["@bot"],
"group_name_white_list": ["ALL_GROUP"],
"image_recognition": true,
"speech_recognition": true,
"voice_reply_voice": true,
"voice_to_text": "dify",
"text_to_voice": "dify"
}
以上三个值修改后,主要配置文件就算已经完成了。
接下来我们启动dify-on-wechat
cd /home/app/ai/dify-on-wechat/docker
docker compose up -d
输入docker logs 显示微信二维码
docker logs -f dify-on-wechat
我们看到日志显示微信二维码了,我们使用微信扫码这个二维码登录(建议大家使用微信小号,这个小号登录后就充当了绘画机器人的身份)
扫完二维码后,微信弹出登录按钮,点击授权登录按钮,点击继续登录。
注:这里的微信需要实名认证并且实名认证开通支付功能(需要绑定银行卡),未实名登录的微信登录会报错。
接下来我们使用另外一个微信添加这个机器人为好友,添加好友完成后。
发送消息:请给我画一个小马过河
创建的群组里面将刚才这个机器人用户拉入群里面。
发送消息:给我画一个小狗
我们@小灰灰 这样绘画机器人收到消息后转发给dify 然后也同样给群里面返回生成的绘画了。
本次文章我们使用了Gitee AI+dify-on-wechat这个开源软件+dify 实现了微信绘画机器人的功能了。整体来说整合还是比较简单的,这里需要大家准备一台服务器部署dify以及dify-on-wechat 另外再提供一个微信小号,这样就可以提供7*24小时使用了。本期文章就分享到这里,感兴趣的小伙伴可以一键三连噢,我们下个文章见。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-01-07
Dify本地化部署避坑指南MAC
2025-01-06
蚂蚁开源新RAG框架KAG,可达91%准确率
2025-01-06
突破算力限制!Meta开源“记忆层”,重塑Transformer架构大模型
2025-01-04
跟GPT4o、o1拜拜,Gemini2.0取代了我的AI应用们
2025-01-04
微软研究人员发布 AIOpsLab:面向 AIOps 代理的开源综合人工智能框架
2025-01-03
显卡可能没那么重要了?中国公司给硅谷好好上了一课。
2025-01-02
Docling:开源免费,多格式文档解析神器,13.4k stars 见证卓越实力!
2025-01-02
我与vLLM的2024
2024-07-25
2024-05-06
2024-08-13
2024-06-12
2024-07-11
2024-07-20
2024-06-16
2024-09-20
2024-06-10
2024-06-15
2024-12-24
2024-12-20
2024-12-19
2024-11-22
2024-11-19
2024-11-13
2024-11-13
2024-10-07