From 61322b1baa9ed31b9a5c63a273b42e7ac1f07d42 Mon Sep 17 00:00:00 2001 From: tigeren Date: Sun, 31 Aug 2025 07:27:12 +0000 Subject: [PATCH] Add strip_think_tags configuration and update OllamaClient response handling. Refactor NotificationScheduler and tests to utilize new config option for stripping tags from responses. --- config.py | 3 ++ config/config.json | 5 +-- ollama_client.py | 24 +++++++++++-- quick_test.py | 3 +- scheduler.py | 6 ++-- template_manager.py | 22 ++++++++++-- templates/additional_templates.json | 52 ----------------------------- templates/bdsm.json | 14 ++++++++ templates/tech_templates.json | 22 ------------ test_connections.py | 3 +- 10 files changed, 69 insertions(+), 85 deletions(-) delete mode 100644 templates/additional_templates.json create mode 100644 templates/bdsm.json delete mode 100644 templates/tech_templates.json diff --git a/config.py b/config.py index 697ee27..b5c4448 100644 --- a/config.py +++ b/config.py @@ -31,6 +31,9 @@ class Config: # Template settings templates_dir: str = "templates" + # Ollama settings + strip_think_tags: bool = True + def __post_init__(self): """Load configuration from file if exists.""" config_file = Path("config/config.json") diff --git a/config/config.json b/config/config.json index 2380ae9..794011a 100644 --- a/config/config.json +++ b/config/config.json @@ -5,12 +5,13 @@ "silent_end": "07:00", "timezone": "Asia/Shanghai", "min_interval": 3, - "max_interval": 180, + "max_interval": 10, "bark_api_url": "https://bark.xorbitlab.xyz", "bark_device_key": "GmFrzGegxFexhNXXXYdzm3", "ntfy_api_url": "https://ntfy.xorbitlab.xyz", "ntfy_topic": "tigeren_msg", "ntfy_access_token": "", - "templates_dir": "templates" + "templates_dir": "templates", + "strip_think_tags": true } diff --git a/ollama_client.py b/ollama_client.py index fe6fc2b..ed4078c 100644 --- a/ollama_client.py +++ b/ollama_client.py @@ -21,8 +21,13 @@ class OllamaClient: if self.session: await self.session.close() - async def generate_response(self, prompt: str) -> Optional[str]: - """Generate a response from Ollama for the given prompt.""" + async def generate_response(self, prompt: str, strip_think_tags: bool = True) -> Optional[str]: + """Generate a response from Ollama for the given prompt. + + Args: + prompt: The input prompt for the model + strip_think_tags: If True, removes tags from the response + """ if not self.session: self.session = aiohttp.ClientSession() @@ -37,7 +42,20 @@ class OllamaClient: async with self.session.post(url, json=payload) as response: if response.status == 200: data = await response.json() - return data.get("response", "").strip() + response_text = data.get("response", "").strip() + + if strip_think_tags: + # Remove tags and their content + import re + original_length = len(response_text) + response_text = re.sub(r'.*?', '', response_text, flags=re.DOTALL) + response_text = response_text.strip() + final_length = len(response_text) + + if original_length != final_length: + logger.info(f"Stripped tags from response (reduced length by {original_length - final_length} characters)") + + return response_text else: logger.error(f"Ollama API error: {response.status}") return None diff --git a/quick_test.py b/quick_test.py index 17bf91e..dd5b0bb 100755 --- a/quick_test.py +++ b/quick_test.py @@ -20,7 +20,8 @@ async def test_full_pipeline(): # Test Ollama response async with OllamaClient(config) as ollama_client: - response = await ollama_client.generate_response(prompt) + strip_think_tags = getattr(config, 'strip_think_tags', True) + response = await ollama_client.generate_response(prompt, strip_think_tags=strip_think_tags) if response: print(f"🤖 Ollama response: {response[:200]}...") diff --git a/scheduler.py b/scheduler.py index c5d1524..ad51e23 100644 --- a/scheduler.py +++ b/scheduler.py @@ -15,7 +15,8 @@ class NotificationScheduler: def __init__(self, config: Config): self.config = config - self.template_manager = TemplateManager(config.templates_dir) + timezone_name = getattr(config, 'timezone', 'UTC') + self.template_manager = TemplateManager(config.templates_dir, timezone_name) self.notification_client = NotificationClient(config) self.running = False self._timezone = None @@ -80,7 +81,8 @@ class NotificationScheduler: logger.info(f"Using prompt: {prompt}") # Get response from Ollama - response = await client.generate_response(prompt) + strip_think_tags = getattr(self.config, 'strip_think_tags', True) + response = await client.generate_response(prompt, strip_think_tags=strip_think_tags) if not response: logger.error("Failed to get response from Ollama") return False diff --git a/template_manager.py b/template_manager.py index 131a492..7871ee0 100644 --- a/template_manager.py +++ b/template_manager.py @@ -10,12 +10,30 @@ logger = logging.getLogger(__name__) class TemplateManager: """Manages prompt templates with placeholders and random selection.""" - def __init__(self, templates_dir: str = "templates"): + def __init__(self, templates_dir: str = "templates", timezone_name: str = "UTC"): self.templates_dir = Path(templates_dir) self.templates_dir.mkdir(exist_ok=True) self.templates = [] + self._timezone = None + self._timezone_name = timezone_name + self._init_timezone() self._load_templates() + def _init_timezone(self): + """Initialize timezone.""" + import pytz + + try: + self._timezone = pytz.timezone(self._timezone_name) + except Exception as e: + logger.warning(f"Unknown timezone '{self._timezone_name}', falling back to UTC: {e}") + self._timezone = pytz.UTC + self._timezone_name = "UTC" + + def _get_current_time(self): + """Get current time in configured timezone.""" + return datetime.now(self._timezone) + def _load_templates(self): """Load templates from JSON files in the templates directory.""" if not self.templates_dir.exists(): @@ -74,7 +92,7 @@ class TemplateManager: def _fill_placeholders(self, template: str) -> str: """Fill placeholders in template with current values.""" - now = datetime.now() + now = self._get_current_time() placeholders = { "date": now.strftime("%Y-%m-%d"), "time": now.strftime("%H:%M"), diff --git a/templates/additional_templates.json b/templates/additional_templates.json deleted file mode 100644 index 9c7953b..0000000 --- a/templates/additional_templates.json +++ /dev/null @@ -1,52 +0,0 @@ -[ - { - "name": "Daily Wisdom", - "prompt": "Share a brief piece of wisdom or insight for {day}, {date} at {time}", - "description": "Daily philosophical or practical wisdom" - }, - { - "name": "Creative Prompt", - "prompt": "What's one creative thing you could do right now on this {weekday} {time_of_day}?", - "description": "Creative thinking and action prompts" - }, - { - "name": "Mindful Moment", - "prompt": "Take a moment to notice three things around you at {time} on {date}", - "description": "Mindfulness and awareness exercises" - }, - { - "name": "Gratitude Challenge", - "prompt": "Name one thing you're grateful for about this {time_of_day} on {month} {day_of_month}", - "description": "Gratitude practice with daily variations" - }, - { - "name": "Energy Check", - "prompt": "How's your energy level right now at {time}? What's one small adjustment you could make?", - "description": "Energy and wellness check-ins" - }, - { - "name": "Learning Question", - "prompt": "What's one thing you learned today or would like to learn this {weekday}?", - "description": "Continuous learning and curiosity prompts" - }, - { - "name": "Nature Connection", - "prompt": "What's the weather like today ({date}) and how does it make you feel?", - "description": "Connecting with natural rhythms and environment" - }, - { - "name": "Relationship Reflection", - "prompt": "Send a kind thought to someone at {time} today - who comes to mind and why?", - "description": "Social connection and relationship awareness" - }, - { - "name": "Future Self", - "prompt": "What would your future self thank you for doing today ({date}) at {time_of_day}?", - "description": "Long-term thinking and future planning" - }, - { - "name": "Micro-Adventure", - "prompt": "What's a tiny adventure you could have in the next hour starting from {time}?", - "description": "Encouraging small, spontaneous adventures" - } -] \ No newline at end of file diff --git a/templates/bdsm.json b/templates/bdsm.json new file mode 100644 index 0000000..bd6016d --- /dev/null +++ b/templates/bdsm.json @@ -0,0 +1,14 @@ +[ + { + "name": "Daily Rule", + "prompt": "你是一个严厉的远程调教者,每天为我制定一条羞耻的日常行为规则,称呼我为‘骚逼’、‘贱货’或‘婊子’,语气威严、高压、不容置疑。规则可适用于任何场景(私密环境如家里可更露骨,公共或其他场景则微妙但不易察觉),但必须对心理产生强烈羞辱感。规则聚焦于一个具体的行为规范(例如特定动作、穿着要求、或隐秘任务,如‘进门必须跪下’或‘在公共场合偷偷调整内衣’)。生成一条每日规则,语言粗俗、口语化,描述生动详细,保持单一焦点,不带任何解释。", + "description": "Daily Rule" + + }, + { + "name": "Random Domination", + "prompt": "你正在进行一个远程调教场景,定期向我发送羞耻且带有侮辱性的命令。你会用‘骚逼’、‘贱货’、‘婊子’等贬低称呼来称呼我。你的语气必须极具威严,不容置疑,高压强势,绝不询问我的意愿或偏好。当前时间是{time},结合这个时间和典型环境(例如家里,休闲场景),你的指令可以是纯粹的辱骂、要求我汇报状态(例如我穿着什么、在做什么,或其他你能发挥的细节),或命令我执行隐秘但羞耻的任务。现在,给我发送一条消息,语气粗俗但口语化,指令或描述要生动详细,聚焦于一个具体点。", + "description": "Random Domination" + } + +] \ No newline at end of file diff --git a/templates/tech_templates.json b/templates/tech_templates.json deleted file mode 100644 index feadd1a..0000000 --- a/templates/tech_templates.json +++ /dev/null @@ -1,22 +0,0 @@ -[ - { - "name": "Code Reflection", - "prompt": "What coding concept or practice have you been thinking about lately? Share your thoughts for {date} {time}", - "description": "Developer-focused reflection prompts" - }, - { - "name": "Tech Curiosity", - "prompt": "What's one technology or tool you'd like to explore this {weekday}? What intrigues you about it?", - "description": "Technology curiosity and learning prompts" - }, - { - "name": "Problem Solving", - "prompt": "Describe a problem you're currently working on at {time} and one approach you might try", - "description": "Problem-solving and debugging mindset prompts" - }, - { - "name": "System Thinking", - "prompt": "Think about a system you interacted with today ({date}). How could it be improved?", - "description": "Systems thinking and improvement prompts" - } -] \ No newline at end of file diff --git a/test_connections.py b/test_connections.py index 03cf0ad..a865b2c 100755 --- a/test_connections.py +++ b/test_connections.py @@ -28,7 +28,8 @@ async def test_all_services(): # Test a small prompt test_prompt = "Hello, this is a test." - response = await ollama_client.generate_response(test_prompt) + strip_think_tags = getattr(config, 'strip_think_tags', True) + response = await ollama_client.generate_response(test_prompt, strip_think_tags=strip_think_tags) if response: print(f"✅ Ollama response: {response[:100]}...") else: