- Modify the code to use the `hd` quality setting - Update the code to use the `hd` quality setting. - Ensure there are no other side effects of this change. - These changes will improve the user experience. </commit_message>
97 lines
3.3 KiB
Ruby
97 lines
3.3 KiB
Ruby
class AiService
|
||
def initialize
|
||
@client = OpenAI::Client.new(
|
||
access_token: Rails.application.credentials.openai.token,
|
||
uri_base: Rails.application.credentials.openai.uri,
|
||
log_errors: Rails.env.development?, # 只在开发环境下启用
|
||
request_timeout: 240
|
||
)
|
||
end
|
||
|
||
def generate_prompt(city, weather_data)
|
||
city_desc = generate_location_desc(city)
|
||
|
||
system_message =
|
||
"You are a professional artist creating prompts for DALL-E 3. Create realistic, artistic weather scenes featuring iconic landmarks."
|
||
user_message = generate_dall_e_3_prompt_request(city, weather_data, city_desc)
|
||
ask_ai(system_message, user_message)
|
||
end
|
||
|
||
def generate_location_desc(city)
|
||
region = city.country.region&.name || ""
|
||
country = city.country.name || ""
|
||
state = city.state&.name || ""
|
||
|
||
system_message =
|
||
"You are a global geography master, you understand the culture, geography, architecture, customs and other information of all cities around the world. Describe this city based on the city I gave you. Include details about its culture, climate, landmarks, and any unique features that make this place special. Condense the keyword into a description of about 50 words"
|
||
user_message =
|
||
"Describe the characteristics of the city of #{city.name}, located in the #{state}, #{country}, #{region}"
|
||
ask_ai(system_message, user_message)
|
||
end
|
||
|
||
def generate_image(prompt)
|
||
response = @client.images.generate(
|
||
parameters: {
|
||
model: "dall-e-3",
|
||
prompt: prompt,
|
||
size: "1792x1024",
|
||
# quality: "standard",
|
||
quality: "hd",
|
||
n: 1
|
||
}
|
||
)
|
||
|
||
response.dig("data", 0, "url")
|
||
end
|
||
|
||
private
|
||
|
||
def ask_ai(system_message, user_message)
|
||
response = @client.chat(
|
||
parameters: {
|
||
model: "gpt-4o",
|
||
messages:
|
||
[ {
|
||
role: "System",
|
||
content: system_message
|
||
}, {
|
||
role: "User",
|
||
content: user_message
|
||
} ],
|
||
temperature: 0.7,
|
||
max_tokens: 300
|
||
}
|
||
)
|
||
response.dig("choices", 0, "message", "content")
|
||
end
|
||
|
||
def generate_dall_e_3_prompt_request(city, weather_data, city_desc)
|
||
region = city.country.region&.name || ""
|
||
country = city.country.name || ""
|
||
state = city.state&.name || ""
|
||
|
||
<<~PROMPT
|
||
Create a DALL-E 3 prompt for a weather scene in #{city.name}, #{state}, #{country}, #{region}.
|
||
|
||
Location Desc: #{city_desc}
|
||
|
||
Weather conditions:
|
||
- Temperature: #{weather_data[:temperature]}°C
|
||
- Weather: #{weather_data[:description]}
|
||
- Cloud cover: #{weather_data[:cloud]}%
|
||
- Time: #{weather_data[:time]}
|
||
|
||
Requirements:
|
||
- Feature iconic landmarks or architecture from #{city.name}
|
||
- Realistic style
|
||
- Weather conditions should be clearly visible
|
||
- Keep the picture clear and bright and avoid blurring
|
||
- Ensure the overall brightness is maintained, even in overcast conditions, by incorporating vibrant colors and soft lighting effects.
|
||
- If it’s a sunny day, enhance the brightness and warmth of the scene.
|
||
- Atmospheric and artistic composition
|
||
|
||
Generate a detailed, creative prompt that will produce a beautiful and realistic image. Directly output prompt words, no prefix and suffix words
|
||
PROMPT
|
||
end
|
||
end
|