- Refactor prompt generation to separate location description functionality - Update user prompt generation for DALL-E 3 - Improve AI service's response handling This change enhances the AiService by creating a more modular approach to generating prompts. The introduction of a `generate_location_desc` method improves the detail and context provided in the generated prompts. Furthermore, the `ask_ai` method centralizes AI request logic, allowing for cleaner and more organized code. These adjustments should improve the overall robustness and readability of the prompt generation process.
92 lines
2.9 KiB
Ruby
92 lines
2.9 KiB
Ruby
class AiService
|
|
def initialize
|
|
@client = OpenAI::Client.new(
|
|
access_token: Rails.application.credentials.openai.token,
|
|
uri_base: Rails.application.credentials.openai.uri,
|
|
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",
|
|
n: 1
|
|
}
|
|
)
|
|
|
|
response.dig("data", 0, "url")
|
|
end
|
|
|
|
private
|
|
|
|
def ask_ai(system_message, user_message)
|
|
response = @client.chat(
|
|
parameters: {
|
|
model: "gpt-4",
|
|
message:
|
|
[ {
|
|
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
|
|
- Atmospheric and artistic composition
|
|
|
|
Generate a detailed, creative prompt that will produce a beautiful and realistic image.
|
|
PROMPT
|
|
end
|
|
end
|