mirror of
https://github.com/snailyp/gemini-balance.git
synced 2026-09-07 00:36:36 +08:00
feat: 支持在图片生成提示词中通过标记控制参数
This commit is contained in:
@@ -247,12 +247,34 @@ uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
|
|||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"model": "dall-e-3",
|
"model": "dall-e-3",
|
||||||
"prompt": "汉服美女",
|
"prompt": "{n:2} {ratio:16:9} 汉服美女",
|
||||||
"n": 1,
|
"n": 1,
|
||||||
"size": "1024x1024"
|
"size": "1024x1024"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Prompt参数说明:**
|
||||||
|
|
||||||
|
prompt支持通过特殊标记来控制生成参数:
|
||||||
|
|
||||||
|
1. 图片数量控制:
|
||||||
|
- 格式: `{n:数量}`
|
||||||
|
- 示例: `{n:2} 一只可爱的猫` - 生成2张图片
|
||||||
|
- 取值范围: 1-4
|
||||||
|
- 说明: 如果在prompt中指定了n,将覆盖请求body中的n参数
|
||||||
|
|
||||||
|
2. 图片比例控制:
|
||||||
|
- 格式: `{ratio:宽:高}`
|
||||||
|
- 示例: `{ratio:16:9} 一片森林` - 生成16:9比例的图片
|
||||||
|
- 支持的比例: "1:1"、"3:4"、"4:3"、"9:16"、"16:9"
|
||||||
|
- 说明: 如果指定了size参数,将优先使用size对应的比例
|
||||||
|
|
||||||
|
3. 参数组合:
|
||||||
|
- 示例: `{n:2} {ratio:16:9} 一片美丽的森林` - 生成2张16:9比例的图片
|
||||||
|
- 说明: 这些参数标记会自动从prompt中移除,不会影响实际的图片生成提示词
|
||||||
|
|
||||||
|
> 注意:n的取值范围[1,4], ratio取值范围"1:1"、"3:4"、"4:3"、"9:16" 和 "16:9"
|
||||||
|
|
||||||
## 📚 代码结构
|
## 📚 代码结构
|
||||||
|
|
||||||
```plaintext
|
```plaintext
|
||||||
@@ -328,6 +350,7 @@ A: 请检查以下几点:
|
|||||||
A: 在请求的 Body 中,将 `stream` 参数设置为 `true` 即可。
|
A: 在请求的 Body 中,将 `stream` 参数设置为 `true` 即可。
|
||||||
|
|
||||||
**Q: 如何启用代码执行工具?**
|
**Q: 如何启用代码执行工具?**
|
||||||
|
|
||||||
A: 在 `.env` 文件的 `TOOLS_CODE_EXECUTION_ENABLED` 变量中, 设置为 `true` 即可。
|
A: 在 `.env` 文件的 `TOOLS_CODE_EXECUTION_ENABLED` 变量中, 设置为 `true` 即可。
|
||||||
|
|
||||||
## 📄 许可证
|
## 📄 许可证
|
||||||
|
|||||||
@@ -19,8 +19,42 @@ class ImageCreateService:
|
|||||||
self.paid_key = settings.PAID_KEY
|
self.paid_key = settings.PAID_KEY
|
||||||
self.aspect_ratio = aspect_ratio
|
self.aspect_ratio = aspect_ratio
|
||||||
|
|
||||||
|
def parse_prompt_parameters(self, prompt: str) -> tuple:
|
||||||
|
"""从prompt中解析参数
|
||||||
|
支持的格式:
|
||||||
|
- {n:数量} 例如: {n:2} 生成2张图片
|
||||||
|
- {ratio:比例} 例如: {ratio:16:9} 使用16:9比例
|
||||||
|
"""
|
||||||
|
import re
|
||||||
|
|
||||||
|
# 默认值
|
||||||
|
n = 1
|
||||||
|
aspect_ratio = self.aspect_ratio
|
||||||
|
|
||||||
|
# 解析n参数
|
||||||
|
n_match = re.search(r'{n:(\d+)}', prompt)
|
||||||
|
if n_match:
|
||||||
|
n = int(n_match.group(1))
|
||||||
|
if n < 1 or n > 4:
|
||||||
|
raise ValueError(f"Invalid n value: {n}. Must be between 1 and 4.")
|
||||||
|
prompt = prompt.replace(n_match.group(0), '').strip()
|
||||||
|
|
||||||
|
# 解析ratio参数
|
||||||
|
ratio_match = re.search(r'{ratio:(\d+:\d+)}', prompt)
|
||||||
|
if ratio_match:
|
||||||
|
aspect_ratio = ratio_match.group(1)
|
||||||
|
valid_ratios = ["1:1", "3:4", "4:3", "9:16", "16:9"]
|
||||||
|
if aspect_ratio not in valid_ratios:
|
||||||
|
raise ValueError(
|
||||||
|
f"Invalid ratio: {aspect_ratio}. Must be one of: {', '.join(valid_ratios)}"
|
||||||
|
)
|
||||||
|
prompt = prompt.replace(ratio_match.group(0), '').strip()
|
||||||
|
|
||||||
|
return prompt, n, aspect_ratio
|
||||||
|
|
||||||
def generate_images(self, request: ImageGenerationRequest):
|
def generate_images(self, request: ImageGenerationRequest):
|
||||||
client = genai.Client(api_key=self.paid_key)
|
client = genai.Client(api_key=self.paid_key)
|
||||||
|
|
||||||
if request.size == "1024x1024":
|
if request.size == "1024x1024":
|
||||||
self.aspect_ratio = "1:1"
|
self.aspect_ratio = "1:1"
|
||||||
elif request.size == "1792x1024":
|
elif request.size == "1792x1024":
|
||||||
@@ -32,6 +66,18 @@ class ImageCreateService:
|
|||||||
f"Invalid size: {request.size}. Supported sizes are 1024x1024, 1792x1024, and 1024x1792."
|
f"Invalid size: {request.size}. Supported sizes are 1024x1024, 1792x1024, and 1024x1792."
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# 解析prompt中的参数
|
||||||
|
cleaned_prompt, prompt_n, prompt_ratio = self.parse_prompt_parameters(request.prompt)
|
||||||
|
request.prompt = cleaned_prompt
|
||||||
|
|
||||||
|
# 如果prompt中指定了n,则覆盖请求中的n
|
||||||
|
if prompt_n > 1:
|
||||||
|
request.n = prompt_n
|
||||||
|
|
||||||
|
# 如果prompt中指定了ratio,则覆盖默认的aspect_ratio
|
||||||
|
if prompt_ratio != self.aspect_ratio:
|
||||||
|
self.aspect_ratio = prompt_ratio
|
||||||
|
|
||||||
response = client.models.generate_images(
|
response = client.models.generate_images(
|
||||||
model=self.image_model,
|
model=self.image_model,
|
||||||
prompt=request.prompt,
|
prompt=request.prompt,
|
||||||
|
|||||||
Reference in New Issue
Block a user