diff --git a/core/migrations/0036_openaiagent_merge_system_prompt.py b/core/migrations/0036_openaiagent_merge_system_prompt.py new file mode 100644 index 0000000..cb5d56c --- /dev/null +++ b/core/migrations/0036_openaiagent_merge_system_prompt.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.5 on 2025-12-11 09:22 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0035_alter_openaiagent_max_tokens_digest'), + ] + + operations = [ + migrations.AddField( + model_name='openaiagent', + name='merge_system_prompt', + field=models.BooleanField(default=False, help_text="Enable for models that don't support system system instructions (e.g., Gemma 3)", verbose_name='Merge System Prompt to User Message'), + ), + ] diff --git a/core/models/agent.py b/core/models/agent.py index 6d0a7d8..013b37d 100644 --- a/core/models/agent.py +++ b/core/models/agent.py @@ -93,6 +93,11 @@ class OpenAIAgent(Agent): default=0, help_text=_("Maximum requests per minute (0 = no limit)"), ) + merge_system_prompt = models.BooleanField( + _("Merge System Prompt to User Message"), + default=False, + help_text=_("Enable for models that don't support system system instructions (e.g., Gemma 3)") + ) EXTRA_HEADERS = { "HTTP-Referer": "https://www.rssbox.app", "X-Title": "RSSBox", @@ -260,9 +265,28 @@ def completions( # 应用速率限制 self._wait_for_rate_limit() - + + if self.merge_system_prompt: + merged_content = f"{system_prompt}\n\n{text}" + messages = [ + {"role": "user", "content": merged_content} + ] + system_prompt_tokens = 0 + input_tokens = get_token_count(merged_content) + else: + messages = [ + { + "role": "system", + "content": system_prompt, + }, + { + "role": "user", + "content": text + } + ] # 计算系统提示的token占用 - system_prompt_tokens = get_token_count(system_prompt) + system_prompt_tokens = get_token_count(system_prompt) + input_tokens = get_token_count(system_prompt) + get_token_count(text) # 获取最大可用token数(保留buffer) if self.max_tokens == 0: task_manager.submit_task( @@ -328,10 +352,7 @@ def completions( res = client.with_options(max_retries=3).chat.completions.create( extra_headers=self.EXTRA_HEADERS, model=self.model, - messages=[ - {"role": "system", "content": system_prompt}, - {"role": "user", "content": text}, - ], + messages=messages, **call_kwargs, ) if (