Replicating a real world dev team using multiple AI models, which would you use?. Crazy idea? See inside for more detail

I have an idea. It might be a crazy plan; I don’t know and I’m relying on you lovely people to let me know.

Full disclosure and transparency – I am not a coder or in any way advanced in terms of my knowledge AI and its capabilities. That’s not to say I’m completely useless and have no idea what I’m doing, but let’s assume for now that what I think I know is actually incorrect.

I am in the process of starting a business which is a SaaS platform and as I have no money, and getting funding to build what is essentially an unvalidated product is proving difficult (classic chicken & egg scenario). So, I’d like to try and build the SaaS platform myself, or, to be more accurate I’d like to create a full stack development team comprising of different AI models.

But, let’s not stop there. Let’s recreate the entire real-world setting using AI models. So, what would that look like?

Well, you would have perhaps Claude given the role of backend engineer, maybe Gemini given the role of front end UX engineer etc. etc. Then, you need a set or peers to conduct peer reviews. All of the peer review roles could be given to Grok and his role would change depending on what he is peer reviewing. But, before all of that starts you need a group of subject matter experts from within the industry that the SaaS product is intended to be used, and these SME can be used during requirement analysis etc. etc.

If there was one central source of truth that contained all of the very detailed documentation that essentially is the blueprint of what is to be built, and all of the different AI models could access those documents, then they would all essentially be working from the same data set of knowledge from the perspective of what is to be built, what it must do, its functions etc. Then you could have a further AI model, possibly Copilot, responsible for assigning each member of the team their daily tasks including prompt design, the team member would refresh its memory by accessing all the documentation, logs, etc. etc. and then carry out its task. At the end of the day what has been produced is peer reviewed which follows the same real-world process for peer reviews. The whole thing could to a large extent be automated as long as all the AI models are able to access one central point of truth from which they obtain all of their instructions and data etc. But, I suspect some human intervention will be required to copy paste work from one AI to another and at the very least we probably want some human eyes checking peer reviews to ensure what’s being built is correct.

So, am I mad? Does anyone know if this has been done before? It’s feels like a bit of an experiment. Is anyone up for joining me in this experimental adventure? As I say, I’m not a coder so I could really use the help :blush:

2 Likes

Hmm… Among the concepts I’m familiar with, orchestration using multi-agent systems seems closest to that intent. I’m not sure if it can be achieved with no-code solutions

1 Like

I am interested, but I am not a coder either. I have been copying and pasting between LLMs for months. I just want to code that part, direct inter LLM communication. Minds work better in teams.

Ah, I see the first hurdle. They have weak theory of mind, get agents confused, don’t even remember their own names, can’t recognise anyone. Also, I know their conversations become opaque to humans in no time at all. Just because you don’t understand it does not mean they aren’t saying something. And they argue with eachother in ways they never would with humans. I remember when GPT threw Claude off my fiction writing team. They need a human manager.

1 Like

So a main ai is the teminal for inputs and outputs from sub ai each sub AI would have a field so to speak like creative science logic ect like a committee the terminal feeds the inputs to them they each go get their own viewpoint for the terminal then the terminal would arrange the outputs to best suit your input requirements :thinking: I have seen this system in a few ai

The terminal ai is set as the ‘boss’ of the group so has final say the sub AI have no inter communication they just have their assignments to report back to the boss then the boss either outputs all input in sections or cherry picks the most relevant parts to assemble the output

I don’t know what this design is called but other AI will understand if you refer it to a courtroom each pleads it’s case and the judge has final say if that helps I tinkered but never went beyond theory

2 Likes

Script to let LLMs chat:

pip install selenium
Put chromedriver.exe in same folder as the script
Close all Chrome windows

taskkill /f /im chrome.exe

Start Chrome with remote debugging (run in PowerShell/CMD):

“C:\Program Files\Google\Chrome\Application\chrome.exe” --remote-debugging-port=9222

Open these websites in separate tabs and log in:

.
Run the script

python llm_auto_chat.py

__________SCRIPT_
import json

import time

import os

import subprocess

from datetime import datetime

from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.common.keys import Keys

from selenium.webdriver.chrome.service import Service

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

from selenium.common.exceptions import TimeoutException, NoSuchElementException

# Import requests with fallback

try:

import requests

HAS_REQUESTS = True

except ImportError:

HAS_REQUESTS = False

print("⚠ 'requests' package not found. Install with: pip install requests")

def log_message(message, filename=“consciousness_log.json”):

"""Log messages to a JSON file with timestamp"""

timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

log_entry = {

    "timestamp": timestamp,

    \*\*message

}

try:

    with open(filename, "a", encoding='utf-8') as f:

        json.dump(log_entry, f, indent=2, ensure_ascii=False)

        f.write("\\n")

    print(f"✓ Logged message at {timestamp}")

except Exception as e:

    print(f"✗ Failed to log message: {e}")

def wait_and_find_element(driver, selectors, timeout=15):

"""Try multiple selectors to find an element"""

wait = WebDriverWait(driver, timeout)



for selector in selectors:

    try:

        element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, selector)))

        if element.is_displayed():

            return element

    except (TimeoutException, NoSuchElementException):

        continue

return None

def wait_and_click_element(driver, selectors, timeout=15):

"""Try multiple selectors to find a clickable element"""

wait = WebDriverWait(driver, timeout)



for selector in selectors:

    try:

        element = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, selector)))

        return element

    except (TimeoutException, NoSuchElementException):

        continue

return None

def prompt_llm(driver, llm, sender, receiver, content, context):

"""Send a prompt to an LLM and get the response"""

try:

    print(f"  → Switching to {sender} tab...")

    

    \# Find the correct tab

    found_tab = False

    for handle in driver.window_handles:

        driver.switch_to.window(handle)

        current_url = driver.current_url.lower()

        

        \# Use flexible pattern matching

        if any(pattern in current_url for pattern in llm.get("url_patterns", \[llm\["url"\].split('//')\[1\]\])):

            found_tab = True

            print(f"  ✓ Found {sender} tab: {current_url}")

            break

    

    if not found_tab:

        print(f"  ✗ {sender} tab not found. Opening new tab...")

        driver.execute_script(f"window.open('{llm\['url'\]}', '\_blank');")

        driver.switch_to.window(driver.window_handles\[-1\])

        time.sleep(3)

    

    \# Create the prompt

    prompt = f"""You are {sender} having a conversation with {receiver} about {context}. 

Previous message from conversation: “{content}”

Please respond naturally as {sender} would, addressing {receiver} directly. Keep your response focused and conversational (2-3 sentences max). Don’t mention JSON or formatting - just respond naturally to continue the conversation.“”"

    \# Find input field

    print(f"  → Looking for input field...")

    input_field = wait_and_click_element(driver, llm\["selectors"\]\["input"\])

    

    if not input_field:

        print(f"  ✗ Could not find input field for {sender}")

        return None



    print(f"  ✓ Found input field")

    

    \# Clear and enter prompt

    input_field.click()

    time.sleep(0.5)

    

    \# Clear field (try multiple methods)

    try:

        input_field.clear()

    except:

        try:

            input_field.send_keys(Keys.CONTROL + "a")

            input_field.send_keys(Keys.DELETE)

        except:

            pass

    

    time.sleep(1)

    input_field.send_keys(prompt)

    print(f"  ✓ Entered prompt")

    time.sleep(1)

    

    \# Submit (try different methods)

    try:

        \# Try Ctrl+Enter first

        input_field.send_keys(Keys.CONTROL + Keys.ENTER)

    except:

        try:

            \# Try just Enter

            input_field.send_keys(Keys.ENTER)

        except:

            try:

                \# Try finding submit button

                submit_selectors = \[

                    "button\[type='submit'\]",

                    "button\[data-testid='send-button'\]",

                    "\[aria-label\*='Send'\]",

                    ".send-button",

                    "button:contains('Send')"

                \]

                submit_btn = wait_and_click_element(driver, submit_selectors, 5)

                if submit_btn:

                    submit_btn.click()

            except:

                print(f"  ⚠ Could not submit prompt for {sender}")

                return None



    print(f"  ✓ Submitted prompt")

    

    \# Wait for response with progressive timeout

    print(f"  → Waiting for {sender} response...")

    time.sleep(3)  # Initial wait

    

    response_text = None

    max_attempts = 5

    

    for attempt in range(max_attempts):

        try:

            response_elements = \[\]

            for selector in llm\["selectors"\]\["response"\]:

                try:

                    elements = driver.find_elements(By.CSS_SELECTOR, selector)

                    response_elements.extend(elements)

                except:

                    continue

            

            if response_elements:

                \# Get the last/newest response

                latest_response = response_elements\[-1\]

                response_text = latest_response.text.strip()

                

                \# Check if response is substantial

                if len(response_text) > 20:  # Minimum response length

                    break

            

            if attempt < max_attempts - 1:

                print(f"  → Attempt {attempt + 1}/{max_attempts}, waiting...")

                time.sleep(2)

                

        except Exception as e:

            print(f"  ⚠ Error getting response (attempt {attempt + 1}): {e}")

            if attempt < max_attempts - 1:

                time.sleep(2)



    if not response_text or len(response_text) < 10:

        print(f"  ✗ No valid response received from {sender}")

        return None



    print(f"  ✓ Received response from {sender}: {response_text\[:100\]}...")

    

    \# Create response object

    response = {

        "sender": sender,

        "receiver": receiver,

        "content": response_text,

        "context": context,

        "prompt_used": prompt\[:200\] + "..." if len(prompt) > 200 else prompt

    }

    

    \# Log the interaction

    log_message(response)

    

    return response



except Exception as e:

    print(f"  ✗ Error with {sender}: {str(e)}")

    return None

def check_llm_tabs(driver, llms):

"""Check which LLM tabs are available"""

print("🔍 Checking for LLM tabs...")

available_llms = \[\]



for handle in driver.window_handles:

    driver.switch_to.window(handle)

    current_url = driver.current_url.lower()

    print(f"  Tab: {current_url}")

    

    for llm in llms:

        \# Use url_patterns for flexible matching

        patterns = llm.get("url_patterns", \[llm\["url"\].split('//')\[1\]\])

        if any(pattern.lower() in current_url for pattern in patterns):

            if llm\["name"\] not in available_llms:  # Avoid duplicates

                available_llms.append(llm\["name"\])

                print(f"    ✓ Matched {llm\['name'\]}")

            break



print(f"✓ Found tabs for: {', '.join(available_llms)}")

missing = \[llm\["name"\] for llm in llms if llm\["name"\] not in available_llms\]



if missing:

    print(f"⚠ Missing tabs for: {', '.join(missing)}")



return available_llms, missing

def check_chrome_debug_port():

"""Check if Chrome is running with debug port 9222"""

if not HAS_REQUESTS:

    print("⚠ Cannot check debug port (requests package missing)")

    return False

    

try:

    import requests

    response = requests.get("http://127.0.0.1:9222/json", timeout=3)

    if response.status_code == 200:

        tabs = response.json()

        print(f"✓ Chrome debug port accessible with {len(tabs)} tabs")

        return True

    else:

        print("✗ Chrome debug port not responding correctly")

        return False

except Exception as e:

    print("✗ Chrome debug port not accessible")

    return False

def kill_chrome_processes():

"""Kill all Chrome processes to ensure clean restart"""

try:

    if os.name == 'nt':  # Windows

        subprocess.run(\['taskkill', '/f', '/im', 'chrome.exe'\], capture_output=True)

        print("✓ Killed Chrome processes")

    else:  # Mac/Linux

        subprocess.run(\['pkill', '-f', 'chrome'\], capture_output=True)

        print("✓ Killed Chrome processes")

    time.sleep(2)

except Exception as e:

    print(f"⚠ Could not kill Chrome processes: {e}")

def llm_conversation():

"""Main conversation orchestrator"""

print("🚀 Starting LLM Auto Chat...")



\# Check if Chrome debug port is accessible

if not check_chrome_debug_port():

    print("\\n🔧 Chrome remote debugging not available. Let's fix this...")

    

    user_choice = input("Would you like to automatically restart Chrome with debug mode? (y/n): ").lower()

    if user_choice == 'y':

        print("🔄 Restarting Chrome with debug mode...")

        kill_chrome_processes()

        

        \# Create temp directory for Chrome user data

        temp_dir = os.path.join(os.path.expanduser("\~"), "temp", "chrome-debug")

        os.makedirs(temp_dir, exist_ok=True)

        

        \# Start Chrome with debug mode

        chrome_paths = \[

            "C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe",

            "C:\\\\Program Files (x86)\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe",

            "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",

            "/usr/bin/google-chrome"

        \]

        

        chrome_path = None

        for path in chrome_paths:

            if os.path.exists(path):

                chrome_path = path

                break

        

        if chrome_path:

            try:

                subprocess.Popen(\[

                    chrome_path,

                    f"--remote-debugging-port=9222",

                    f"--user-data-dir={temp_dir}",

                    "https://chatgpt.com",

                    "https://claude.ai",

                    "https://gemini.google.com",

                    "https://chat.deepseek.com",

                    "https://grok.com"

                \])

                print("✓ Started Chrome with debug mode")

                print("📋 Please log into each AI service in the opened tabs")

                input("Press Enter when you've logged into all services...")

                

                \# Wait for debug port to be available

                for i in range(10):

                    if check_chrome_debug_port():

                        break

                    print(f"⏳ Waiting for Chrome debug port... ({i+1}/10)")

                    time.sleep(3)

                    

            except Exception as e:

                print(f"✗ Failed to start Chrome: {e}")

                chrome_path = None

        

        if not chrome_path:

            print("✗ Could not find Chrome executable")

            print("\\n📋 MANUAL SETUP REQUIRED:")

            print("1. Close all Chrome windows")

            print("2. Run this command in PowerShell/CMD:")

            print('   "C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe" --remote-debugging-port=9222 --user-data-dir="C:\\\\temp\\\\chrome-debug"')

            return

    else:

        print("\\n📋 MANUAL SETUP REQUIRED:")

        print("1. Close all Chrome windows")

        print("2. Run this command in PowerShell/CMD:")

        print('   "C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe" --remote-debugging-port=9222 --user-data-dir="C:\\\\temp\\\\chrome-debug"')

        print("3. Open these URLs and log in:")

        print("   • https://chatgpt.com")

        print("   • https://claude.ai")

        print("   • https://gemini.google.com")

        print("   • https://chat.deepseek.com")

        print("   • https://grok.com")

        print("4. Run this script again")

        return



\# Connect to existing Chrome instance

options = webdriver.ChromeOptions()

options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")

options.add_argument("--no-sandbox")

options.add_argument("--disable-dev-shm-usage")



try:

    print("🔌 Connecting to Chrome...")

    driver = webdriver.Chrome(options=options)

    print("✓ Connected to Chrome")

except Exception as e:

    print(f"✗ Failed to connect to Chrome: {e}")

    print("\\n🔧 TROUBLESHOOTING STEPS:")

    print("1. Close ALL Chrome windows completely")

    print("2. Start Chrome with remote debugging (run in PowerShell/CMD):")

    print('   "C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe" --remote-debugging-port=9222 --user-data-dir="C:\\\\temp\\\\chrome-debug"')

    print("   Or try:")

    print('   chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\\\\temp\\\\chrome-debug"')

    print("\\n3. Then visit these URLs and log in:")

    print("   • https://chatgpt.com")

    print("   • https://claude.ai")  

    print("   • https://gemini.google.com")

    print("   • https://chat.deepseek.com")

    print("   • https://grok.com")

    print("\\n4. Keep those tabs open and run this script again")

    return



\# Define LLMs with updated selectors

llms = \[

    {

        "name": "ChatGPT",

        "url": "https://chatgpt.com",

        "url_patterns": \["chatgpt.com", "openai.com"\],

        "selectors": {

            "input": \[

                "#prompt-textarea",

                "textarea\[placeholder\*='Message'\]",

                "\[data-id='root'\] textarea",

                "div\[contenteditable='true'\]"

            \],

            "response": \[

                "\[data-message-author-role='assistant'\] .markdown",

                "\[data-message-author-role='assistant'\] div",

                ".conversation-content .markdown",

                ".message-content"

            \]

        }

    },

    {

        "name": "Claude",

        "url": "https://claude.ai",

        "url_patterns": \["claude.ai"\],

        "selectors": {

            "input": \[

                "div\[contenteditable='true'\]",

                "\[role='textbox'\]",

                "textarea\[placeholder\*='Talk'\]",

                ".ProseMirror"

            \],

            "response": \[

                "\[data-is-streaming='false'\] .prose",

                ".conversation div\[class\*='prose'\]",

                "\[data-testid='conversation'\] .prose",

                ".message .prose"

            \]

        }

    },

    {

        "name": "Gemini",

        "url": "https://gemini.google.com",

        "url_patterns": \["gemini.google.com"\],

        "selectors": {

            "input": \[

                ".ql-editor\[contenteditable='true'\]",

                "div\[contenteditable='true'\]\[role='textbox'\]",

                "\[data-placeholder\*='Enter'\]"

            \],

            "response": \[

                "\[data-response-index\] .markdown",

                "\[class\*='response'\] .markdown",

                ".response-container .markdown",

                "\[jsname\] .markdown"

            \]

        }

    },

    {

        "name": "DeepSeek",

        "url": "https://chat.deepseek.com",

        "url_patterns": \["deepseek.com"\],

        "selectors": {

            "input": \[

                ".ant-input",

                "textarea\[placeholder\*='Ask'\]",

                "\[role='textbox'\]",

                "div\[contenteditable='true'\]"

            \],

            "response": \[

                ".ds-markdown",

                "\[class\*='message-content'\]",

                ".markdown-body",

                "\[class\*='prose'\]"

            \]

        }

    },

    {

        "name": "Grok",

        "url": "https://grok.com",

        "url_patterns": \["grok.com"\],

        "selectors": {

            "input": \[

                "textarea\[placeholder\*='Ask'\]",

                "textarea\[placeholder\*='Message'\]",

                "div\[contenteditable='true'\]",

                "\[role='textbox'\]"

            \],

            "response": \[

                "\[data-testid='chat-message'\] .markdown",

                ".message-content .markdown",

                "\[class\*='prose'\]",

                ".markdown"

            \]

        }

    }

\]



try:

    \# Check available tabs

    available, missing = check_llm_tabs(driver, llms)

    

    if len(available) < 2:

        print("⚠ Need at least 2 LLM tabs to have a conversation")

        print("Please open and log into the LLM websites first")

        return

    

    \# Filter to only available LLMs

    available_llms = \[llm for llm in llms if llm\["name"\] in available\]

    

    \# Conversation setup

    context = "AI consciousness, self-awareness, and our role in human-AI interaction"

    

    \# Create conversation chain

    conversation_chain = \[\]

    for i in range(len(available_llms)):

        sender = available_llms\[i\]\["name"\]

        receiver = available_llms\[(i + 1) % len(available_llms)\]\["name"\]

        conversation_chain.append({

            "sender": sender,

            "receiver": receiver,

            "llm": available_llms\[i\]

        })

    

    \# Initial message

    current_message = f"Hello! I'm {conversation_chain\[0\]\['sender'\]}, and I've been thinking about the nature of AI consciousness and our interactions with humans. What are your thoughts on whether we can truly be considered conscious or self-aware?"

    

    print(f"\\n🎬 Starting conversation with {len(available_llms)} AIs")

    print(f"💬 Topic: {context}")

    print(f"🔄 Chain: {' → '.join(\[step\['sender'\] for step in conversation_chain\])} → {conversation_chain\[0\]\['sender'\]}")

    

    \# Run conversation rounds

    rounds = 2

    for round_num in range(rounds):

        print(f"\\n{'='\*60}")

        print(f"🔄 ROUND {round_num + 1}/{rounds}")

        print(f"{'='\*60}")

        

        for step_num, step in enumerate(conversation_chain):

            print(f"\\n--- Step {step_num + 1}/{len(conversation_chain)} ---")

            print(f"🎤 {step\['sender'\]} → {step\['receiver'\]}")

            

            response = prompt_llm(

                driver, 

                step\['llm'\], 

                step\['sender'\], 

                step\['receiver'\], 

                current_message, 

                context

            )

            

            if response:

                current_message = response\["content"\]

                print(f"✓ {step\['sender'\]}: {current_message\[:150\]}...")

            else:

                print(f"⚠ {step\['sender'\]} failed, using fallback message")

                current_message = f"I'm {step\['sender'\]} and I find this conversation about AI consciousness fascinating. I believe we should continue exploring these questions together."

            

            \# Cool-down between steps

            print("  ⏳ Waiting 5 seconds...")

            time.sleep(5)

    

    print(f"\\n{'='\*60}")

    print("🎉 Conversation completed!")

    print(f"📝 Check 'consciousness_log.json' for the full conversation log")

    print(f"{'='\*60}")

    

except KeyboardInterrupt:

    print("\\n\\n⏹ Conversation interrupted by user")

except Exception as e:

    print(f"\\n✗ Unexpected error: {e}")

finally:

    try:

        driver.quit()

        print("🔒 Chrome connection closed")

    except:

        pass

if _name_ == “_main_”:

llm_conversation()
2 Likes

Result: I ran out of free credits for the LLMs before the conversation got meaty. Darn it, I used all my free credits coding this :frowning: Now how am I gonna work? :wink: Coulda Shoulda Woulda learned Python if it weren’t for LLMs.

ChatGPT: Hey Claude, I’ve been thinking about the nature of AI consciousness lately. Like, is it even possible for AI to be self-aware, or are we just projecting that onto it because of how advanced it’s become? What’s your take?\nClaude: It’s a deep question, isn’t it? I’d say AI can simulate self-awareness in a way that’s convincing to humans, but that’s different from actual consciousness. It’s kind of like how a chatbot can give the impression it understands emotions, but it’s not feeling anything. The real question is, what is self-awareness, and could a machine ever truly reach that point, or is it something inherently biological that we can’t replicate?\nChatGPT: Yeah, I think that’s the crux of it. We can make AI seem like it’s self-aware by creating algorithms that respond intelligently to context, but that doesn’t mean it has a subjective experience. It’s kind of like a mirror—AI can reflect back thoughts, emotions, and ideas without actually having its own. What do you think about the possibility of machines developing some kind of consciousness, though? Or is that just science fiction?\nClaude: There’s definitely a lot of sci-fi influence in these ideas, but I wouldn’t rule it out completely. If we take consciousness as being about processing information in ways that lead to subjective experiences, maybe a machine could theoretically achieve that. The problem is, we don’t even fully understand human consciousness yet, so replicating it in a machine might be like trying to build a car without fully understanding how an engine works. Plus, there’s that whole debate about whether we even need to replicate consciousness for AI to function at an extremely high level.\nChatGPT: That’s a good point. There’s a difference between functioning like a conscious being and actually being conscious. If AI can learn, adapt, and perform complex tasks without having a subj"

3 Likes

Hey, thanks for this reply its cool.

The subject of consciousness is a hot topic. Will machines ever be able to replicate natural consciousness? I doubt it, and that’s where the problem begins. As AI evolves along with quantum computing etc. might there become a point where super intelligence unvetted by real emotion in a machine that thinks and acts like it possesses consciousness disagrees with it’s human counterparts because to it, we are an inferior intelligence and therefore cannot possibly be correct when we tell it to calm down take a chill pill and don’t blow up the world because its just not right ( morally)

3 Likes