| 
									
										
										
										
											2023-08-09 16:01:48 +10:00
										 |  |  | #frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | RSpec.describe DiscourseAi::AiBot::Commands::ImageCommand do | 
					
						
							| 
									
										
										
										
											2023-10-23 17:00:58 +11:00
										 |  |  |   let(:bot_user) { User.find(DiscourseAi::AiBot::EntryPoint::GPT3_5_TURBO_ID) } | 
					
						
							| 
									
										
											  
											
												FEATURE: UI to update ai personas on admin page (#290)
Introduces a UI to manage customizable personas (admin only feature)
Part of the change was some extensive internal refactoring:
- AIBot now has a persona set in the constructor, once set it never changes
- Command now takes in bot as a constructor param, so it has the correct persona and is not generating AIBot objects on the fly
- Added a .prettierignore file, due to the way ALE is configured in nvim it is a pre-req for prettier to work
- Adds a bunch of validations on the AIPersona model, system personas (artist/creative etc...) are all seeded. We now ensure
- name uniqueness, and only allow certain properties to be touched for system personas.
- (JS note) the client side design takes advantage of nested routes, the parent route for personas gets all the personas via this.store.findAll("ai-persona") then child routes simply reach into this model to find a particular persona.
- (JS note) data is sideloaded into the ai-persona model the meta property supplied from the controller, resultSetMeta
- This removes ai_bot_enabled_personas and ai_bot_enabled_chat_commands, both should be controlled from the UI on a per persona basis
- Fixes a long standing bug in token accounting ... we were doing to_json.length instead of to_json.to_s.length
- Amended it so {commands} are always inserted at the end unconditionally, no need to add it to the template of the system message as it just confuses things
- Adds a concept of required_commands to stock personas, these are commands that must be configured for this stock persona to show up.
- Refactored tests so we stop requiring inference_stubs, it was very confusing to need it, added to plugin.rb for now which at least is clearer
- Migrates the persona selector to gjs
---------
Co-authored-by: Joffrey JAFFEUX <j.jaffeux@gmail.com>
Co-authored-by: Martin Brennan <martin@discourse.org>
											
										 
											2023-11-21 16:56:43 +11:00
										 |  |  |   let(:bot) { DiscourseAi::AiBot::OpenAiBot.new(bot_user) } | 
					
						
							| 
									
										
										
										
											2023-10-23 17:00:58 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  |   before { SiteSetting.ai_bot_enabled = true } | 
					
						
							| 
									
										
										
										
											2023-08-09 16:01:48 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  |   describe "#process" do | 
					
						
							|  |  |  |     it "can generate correct info" do | 
					
						
							|  |  |  |       post = Fabricate(:post) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       SiteSetting.ai_stability_api_url = "https://api.stability.dev" | 
					
						
							|  |  |  |       SiteSetting.ai_stability_api_key = "abc" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       image = | 
					
						
							|  |  |  |         "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-27 14:48:12 +11:00
										 |  |  |       artifacts = [{ base64: image, seed: 99 }] | 
					
						
							|  |  |  |       prompts = ["a pink cow", "a red cow"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       WebMock | 
					
						
							|  |  |  |         .stub_request( | 
					
						
							|  |  |  |           :post, | 
					
						
							|  |  |  |           "https://api.stability.dev/v1/generation/#{SiteSetting.ai_stability_engine}/text-to-image", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         .with do |request| | 
					
						
							|  |  |  |           json = JSON.parse(request.body, symbolize_names: true) | 
					
						
							|  |  |  |           expect(prompts).to include(json[:text_prompts][0][:text]) | 
					
						
							|  |  |  |           true | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |         .to_return(status: 200, body: { artifacts: artifacts }.to_json) | 
					
						
							| 
									
										
										
										
											2023-08-09 16:01:48 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												FEATURE: UI to update ai personas on admin page (#290)
Introduces a UI to manage customizable personas (admin only feature)
Part of the change was some extensive internal refactoring:
- AIBot now has a persona set in the constructor, once set it never changes
- Command now takes in bot as a constructor param, so it has the correct persona and is not generating AIBot objects on the fly
- Added a .prettierignore file, due to the way ALE is configured in nvim it is a pre-req for prettier to work
- Adds a bunch of validations on the AIPersona model, system personas (artist/creative etc...) are all seeded. We now ensure
- name uniqueness, and only allow certain properties to be touched for system personas.
- (JS note) the client side design takes advantage of nested routes, the parent route for personas gets all the personas via this.store.findAll("ai-persona") then child routes simply reach into this model to find a particular persona.
- (JS note) data is sideloaded into the ai-persona model the meta property supplied from the controller, resultSetMeta
- This removes ai_bot_enabled_personas and ai_bot_enabled_chat_commands, both should be controlled from the UI on a per persona basis
- Fixes a long standing bug in token accounting ... we were doing to_json.length instead of to_json.to_s.length
- Amended it so {commands} are always inserted at the end unconditionally, no need to add it to the template of the system message as it just confuses things
- Adds a concept of required_commands to stock personas, these are commands that must be configured for this stock persona to show up.
- Refactored tests so we stop requiring inference_stubs, it was very confusing to need it, added to plugin.rb for now which at least is clearer
- Migrates the persona selector to gjs
---------
Co-authored-by: Joffrey JAFFEUX <j.jaffeux@gmail.com>
Co-authored-by: Martin Brennan <martin@discourse.org>
											
										 
											2023-11-21 16:56:43 +11:00
										 |  |  |       image = described_class.new(bot: bot, post: post, args: nil) | 
					
						
							| 
									
										
										
										
											2023-08-14 16:30:12 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-27 14:48:12 +11:00
										 |  |  |       info = image.process(prompts: prompts).to_json | 
					
						
							| 
									
										
										
										
											2023-08-09 16:01:48 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-31 19:12:25 +11:00
										 |  |  |       expect(JSON.parse(info)).to eq("prompts" => ["a pink cow", "a red cow"], "seeds" => [99, 99]) | 
					
						
							| 
									
										
										
										
											2023-08-09 16:01:48 +10:00
										 |  |  |       expect(image.custom_raw).to include("upload://") | 
					
						
							|  |  |  |       expect(image.custom_raw).to include("[grid]") | 
					
						
							|  |  |  |       expect(image.custom_raw).to include("a pink cow") | 
					
						
							| 
									
										
										
										
											2023-10-27 14:48:12 +11:00
										 |  |  |       expect(image.custom_raw).to include("a red cow") | 
					
						
							| 
									
										
										
										
											2023-08-09 16:01:48 +10:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |