|
5 | 5 | from typing import Optional, List |
6 | 6 |
|
7 | 7 | from jinja2 import StrictUndefined, Template |
8 | | -from smolagents import OpenAIServerModel |
9 | 8 |
|
10 | | -from consts.const import LANGUAGE, MESSAGE_ROLE, THINK_END_PATTERN, THINK_START_PATTERN |
| 9 | +from consts.const import LANGUAGE |
11 | 10 | from consts.model import AgentInfoRequest |
12 | 11 | from database.agent_db import update_agent, search_agent_info_by_agent_id, query_all_agent_info_by_tenant_id, \ |
13 | 12 | query_sub_agents_id_list |
14 | | -from database.model_management_db import get_model_by_model_id |
15 | 13 | from database.tool_db import query_tools_by_ids |
16 | 14 | from services.agent_service import ( |
17 | 15 | get_enable_tool_id_by_agent_id, |
|
22 | 20 | _generate_unique_agent_name_with_suffix, |
23 | 21 | _generate_unique_display_name_with_suffix |
24 | 22 | ) |
25 | | -from utils.config_utils import get_model_name_from_config |
| 23 | +from utils.llm_utils import call_llm_for_system_prompt |
26 | 24 | from utils.prompt_template_utils import get_prompt_generate_prompt_template |
27 | 25 |
|
28 | 26 | # Configure logging |
29 | 27 | logger = logging.getLogger("prompt_service") |
30 | 28 |
|
31 | 29 |
|
32 | | -def _process_thinking_tokens(new_token: str, is_thinking: bool, token_join: list, callback=None) -> bool: |
33 | | - """ |
34 | | - Process tokens to filter out thinking content between <think> and </think> tags |
35 | | -
|
36 | | - Args: |
37 | | - new_token: Current token from LLM stream |
38 | | - is_thinking: Current thinking state |
39 | | - token_join: List to accumulate non-thinking tokens |
40 | | - callback: Callback function for streaming output |
41 | | -
|
42 | | - Returns: |
43 | | - bool: updated_is_thinking |
44 | | - """ |
45 | | - # Handle thinking mode |
46 | | - if is_thinking: |
47 | | - return THINK_END_PATTERN not in new_token |
48 | | - |
49 | | - # Handle start of thinking |
50 | | - if THINK_START_PATTERN in new_token: |
51 | | - return True |
52 | | - |
53 | | - # Normal token processing |
54 | | - token_join.append(new_token) |
55 | | - if callback: |
56 | | - callback("".join(token_join)) |
57 | | - |
58 | | - return False |
59 | | - |
60 | | - |
61 | | -def call_llm_for_system_prompt(model_id: int, user_prompt: str, system_prompt: str, callback=None, tenant_id: str = None) -> str: |
62 | | - """ |
63 | | - Call LLM to generate system prompt |
64 | | -
|
65 | | - Args: |
66 | | - model_id: select model for generate prompt |
67 | | - user_prompt: description of the current task |
68 | | - system_prompt: system prompt for the LLM |
69 | | - callback: callback function |
70 | | - tenant_id: tenant id |
71 | | -
|
72 | | - Returns: |
73 | | - str: Generated system prompt |
74 | | - """ |
75 | | - |
76 | | - llm_model_config = get_model_by_model_id(model_id=model_id, tenant_id=tenant_id) |
77 | | - |
78 | | - llm = OpenAIServerModel( |
79 | | - model_id=get_model_name_from_config( |
80 | | - llm_model_config) if llm_model_config else "", |
81 | | - api_base=llm_model_config.get("base_url", ""), |
82 | | - api_key=llm_model_config.get("api_key", ""), |
83 | | - temperature=0.3, |
84 | | - top_p=0.95 |
85 | | - ) |
86 | | - messages = [{"role": MESSAGE_ROLE["SYSTEM"], "content": system_prompt}, |
87 | | - {"role": MESSAGE_ROLE["USER"], "content": user_prompt}] |
88 | | - try: |
89 | | - completion_kwargs = llm._prepare_completion_kwargs( |
90 | | - messages=messages, |
91 | | - model=llm.model_id, |
92 | | - temperature=0.3, |
93 | | - top_p=0.95 |
94 | | - ) |
95 | | - current_request = llm.client.chat.completions.create( |
96 | | - stream=True, **completion_kwargs) |
97 | | - token_join = [] |
98 | | - is_thinking = False |
99 | | - for chunk in current_request: |
100 | | - new_token = chunk.choices[0].delta.content |
101 | | - if new_token is not None: |
102 | | - is_thinking = _process_thinking_tokens( |
103 | | - new_token, is_thinking, token_join, callback |
104 | | - ) |
105 | | - return "".join(token_join) |
106 | | - except Exception as e: |
107 | | - logger.error(f"Failed to generate prompt from LLM: {str(e)}") |
108 | | - raise e |
109 | | - |
110 | | - |
111 | 30 | def gen_system_prompt_streamable(agent_id: int, model_id: int, task_description: str, user_id: str, tenant_id: str, language: str, tool_ids: Optional[List[int]] = None, sub_agent_ids: Optional[List[int]] = None): |
112 | 31 | for system_prompt in generate_and_save_system_prompt_impl( |
113 | 32 | agent_id=agent_id, |
|
0 commit comments