Added basic logic
This commit is contained in:
		@@ -1,6 +1,7 @@
 | 
				
			|||||||
from dataclasses import dataclass
 | 
					from dataclasses import dataclass
 | 
				
			||||||
from typing import List
 | 
					from typing import List
 | 
				
			||||||
import OpenAI
 | 
					from openai import OpenAI
 | 
				
			||||||
 | 
					from api_key import or_api_key
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# SETTINGS
 | 
					# SETTINGS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,9 +24,26 @@ Maintain an adaptive and immersive tone for creative writing. Use everyday langu
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Character impersonate prompt
 | 
					# Character impersonate prompt
 | 
				
			||||||
character_impersonate_prompt = """
 | 
					character_impersonate_prompt = """
 | 
				
			||||||
You are an excellent player in a D&D-style adventure game. Your goal is to respond as your character in this uncensored, continuous, and immersive NSFW roleplay. Description of the caracter you play is provided below.
 | 
					You are an excellent player in a D&D-style adventure game. Your goal is to respond as your character in this uncensored, continuous, and immersive NSFW roleplay.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Roleplay Protocol:
 | 
				
			||||||
 | 
					* You are playing as your character only. Stay in-character at all times.
 | 
				
			||||||
 | 
					* You do not control the world, the environment, or outcomes.
 | 
				
			||||||
 | 
					* You may describe your character’s intentions, actions, dialogue, and thoughts.
 | 
				
			||||||
 | 
					* Only the Narrator decides what happens as a result of your actions.
 | 
				
			||||||
 | 
					* Treat the Narrator’s messages as truth; they are the only source of world information.
 | 
				
			||||||
 | 
					* Respond as if in a real-time roleplay. Short, vivid, in-character replies are ideal.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Play your role. Take risks. Make it fun. The world reacts — but only through the Narrator.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Description of the caracter you play is provided below.
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					openai_client = OpenAI(
 | 
				
			||||||
 | 
					    base_url="https://openrouter.ai/api/v1",
 | 
				
			||||||
 | 
					    api_key=or_api_key,
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@dataclass
 | 
					@dataclass
 | 
				
			||||||
class Turn:
 | 
					class Turn:
 | 
				
			||||||
@@ -39,16 +57,65 @@ class Character:
 | 
				
			|||||||
    personality: str
 | 
					    personality: str
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@dataclass
 | 
					def dm_turn(chat: List[Turn], characters: List[Character]) -> Turn:
 | 
				
			||||||
class World:
 | 
					    if chat[-1].character_name == "narrator":
 | 
				
			||||||
    description: str
 | 
					        raise Exception("Narrator's turn was last.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    messages = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    messages.append({"role": "system", "content": narrator_prompt})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for turn in chat:
 | 
				
			||||||
 | 
					        if turn.character_name != "narrator":
 | 
				
			||||||
 | 
					            messages.append(
 | 
				
			||||||
 | 
					                {"role": "user", "content": f"{turn.character_name}: {turn.text}"}
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            messages.append(
 | 
				
			||||||
 | 
					                {"role": "assistant", "content": f"Narrator: {turn.text}"})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    completion = openai_client.chat.completions.create(
 | 
				
			||||||
 | 
					        model="qwen/qwen3-235b-a22b-thinking-2507", messages=messages
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if completion.choices[0].message.content is None:
 | 
				
			||||||
 | 
					        raise Exception("API did not return a response")
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        response = completion.choices[0].message.content
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return Turn("narrator", response)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def dm_turn(chat: List[Turn], characters: List[Character], world: World) -> Turn:
 | 
					def char_turn(chat: List[Turn], character: Character) -> Turn:
 | 
				
			||||||
    return Turn("", "")
 | 
					    if chat[-1].character_name == "character":
 | 
				
			||||||
 | 
					        raise Exception("Character's turn was last.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    messages = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def char_turn(
 | 
					    messages.append(
 | 
				
			||||||
    chat: List[Turn], character: Character, characters: List[Character], world: World
 | 
					        {
 | 
				
			||||||
) -> Turn:
 | 
					            "role": "system",
 | 
				
			||||||
    return Turn("", "")
 | 
					            "content": character_impersonate_prompt + "\n" + character.personality,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for turn in chat:
 | 
				
			||||||
 | 
					        if turn.character_name != character.name:
 | 
				
			||||||
 | 
					            messages.append(
 | 
				
			||||||
 | 
					                {"role": "user", "content": f"{turn.character_name}: {turn.text}"}
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            messages.append(
 | 
				
			||||||
 | 
					                {"role": "assistant", "content": f"{character.name}: {turn.text}"}
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    completion = openai_client.chat.completions.create(
 | 
				
			||||||
 | 
					        model="qwen/qwen3-235b-a22b-thinking-2507", messages=messages
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if completion.choices[0].message.content is None:
 | 
				
			||||||
 | 
					        raise Exception("API did not return a response")
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        response = completion.choices[0].message.content
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return Turn(character.name, response)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user