Skip to content

Commit 39e0476

Browse files
committed
feat: fix
1 parent 869b90f commit 39e0476

16 files changed

+299
-409
lines changed

aperag/api/components/schemas/prompt.yaml

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,6 @@ promptDetail:
1515
description:
1616
type: string
1717
description: Optional description
18-
language:
19-
type: string
20-
enum: [zh-CN, en-US]
21-
description: Language of the prompt
2218

2319
userPromptsResponse:
2420
type: object
@@ -38,13 +34,8 @@ userPromptsResponse:
3834
updateUserPromptsRequest:
3935
type: object
4036
required:
41-
- language
4237
- prompts
4338
properties:
44-
language:
45-
type: string
46-
enum: [zh-CN, en-US]
47-
default: zh-CN
4839
prompts:
4940
type: object
5041
description: Prompts to update (all fields are optional, only provided fields will be updated)
@@ -80,13 +71,7 @@ updateUserPromptsResponse:
8071

8172
resetPromptsRequest:
8273
type: object
83-
required:
84-
- language
8574
properties:
86-
language:
87-
type: string
88-
enum: [zh-CN, en-US]
89-
default: zh-CN
9075
types:
9176
type: array
9277
items:
@@ -123,8 +108,6 @@ systemPromptDetail:
123108
type: string
124109
content:
125110
type: string
126-
language:
127-
type: string
128111
description:
129112
type: string
130113

@@ -138,8 +121,6 @@ systemPromptsResponse:
138121
type: string
139122
description:
140123
type: string
141-
language:
142-
type: string
143124

144125
previewRequest:
145126
type: object

aperag/db/models.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1139,7 +1139,6 @@ class PromptTemplate(Base):
11391139
prompt_type = Column(String(50), nullable=False, index=True)
11401140
scope = Column(String(20), nullable=False, index=True)
11411141
user_id = Column(String(256), nullable=True, index=True)
1142-
language = Column(String(10), nullable=False, default="en-US")
11431142
content = Column(Text, nullable=False)
11441143
description = Column(Text, nullable=True)
11451144
gmt_created = Column(DateTime(timezone=True), default=utc_now, nullable=False)

aperag/db/repositories/prompt_template.py

Lines changed: 18 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,15 @@ class AsyncPromptTemplateRepositoryMixin(AsyncRepositoryProtocol):
2525
"""Prompt Template Repository for managing user and system default prompts"""
2626

2727
async def query_prompt_template(
28-
self, prompt_type: str, scope: str, user_id: Optional[str], language: str
28+
self, prompt_type: str, scope: str, user_id: Optional[str]
2929
) -> Optional[PromptTemplate]:
3030
"""
31-
Query a single prompt template by type, scope, user_id and language.
31+
Query a single prompt template by type, scope, and user_id.
3232
3333
Args:
3434
prompt_type: Type of prompt (agent_system, agent_query, index_graph, etc.)
3535
scope: 'user' or 'system'
3636
user_id: User ID (required for scope='user', None for scope='system')
37-
language: Language code (en-US, zh-CN)
3837
3938
Returns:
4039
PromptTemplate instance or None
@@ -44,7 +43,6 @@ async def _query(session):
4443
stmt = select(PromptTemplate).where(
4544
PromptTemplate.prompt_type == prompt_type,
4645
PromptTemplate.scope == scope,
47-
PromptTemplate.language == language,
4846
PromptTemplate.gmt_deleted.is_(None),
4947
)
5048

@@ -58,51 +56,47 @@ async def _query(session):
5856

5957
return await self._execute_query(_query)
6058

61-
async def query_user_prompt_templates(self, user_id: str, language: Optional[str] = None) -> List[PromptTemplate]:
59+
async def query_user_prompt_templates(self, user_id: str) -> List[PromptTemplate]:
6260
"""
6361
Query all prompt templates for a specific user.
6462
6563
Args:
6664
user_id: User ID
67-
language: Optional language filter
6865
6966
Returns:
7067
List of PromptTemplate instances
7168
"""
7269

7370
async def _query(session):
74-
stmt = select(PromptTemplate).where(
75-
PromptTemplate.scope == "user", PromptTemplate.user_id == user_id, PromptTemplate.gmt_deleted.is_(None)
71+
stmt = (
72+
select(PromptTemplate)
73+
.where(
74+
PromptTemplate.scope == "user",
75+
PromptTemplate.user_id == user_id,
76+
PromptTemplate.gmt_deleted.is_(None),
77+
)
78+
.order_by(PromptTemplate.prompt_type)
7679
)
7780

78-
if language:
79-
stmt = stmt.where(PromptTemplate.language == language)
80-
81-
stmt = stmt.order_by(PromptTemplate.prompt_type, PromptTemplate.language)
82-
8381
result = await session.execute(stmt)
8482
return result.scalars().all()
8583

8684
return await self._execute_query(_query)
8785

88-
async def query_system_prompt_templates(self, language: Optional[str] = None) -> List[PromptTemplate]:
86+
async def query_system_prompt_templates(self) -> List[PromptTemplate]:
8987
"""
9088
Query all system default prompt templates.
9189
92-
Args:
93-
language: Optional language filter
94-
9590
Returns:
9691
List of PromptTemplate instances
9792
"""
9893

9994
async def _query(session):
100-
stmt = select(PromptTemplate).where(PromptTemplate.scope == "system", PromptTemplate.gmt_deleted.is_(None))
101-
102-
if language:
103-
stmt = stmt.where(PromptTemplate.language == language)
104-
105-
stmt = stmt.order_by(PromptTemplate.prompt_type, PromptTemplate.language)
95+
stmt = (
96+
select(PromptTemplate)
97+
.where(PromptTemplate.scope == "system", PromptTemplate.gmt_deleted.is_(None))
98+
.order_by(PromptTemplate.prompt_type)
99+
)
106100

107101
result = await session.execute(stmt)
108102
return result.scalars().all()
@@ -114,7 +108,6 @@ async def create_or_update_prompt_template(
114108
prompt_type: str,
115109
scope: str,
116110
user_id: Optional[str],
117-
language: str,
118111
content: str,
119112
description: Optional[str] = None,
120113
) -> PromptTemplate:
@@ -125,7 +118,6 @@ async def create_or_update_prompt_template(
125118
prompt_type: Type of prompt
126119
scope: 'user' or 'system'
127120
user_id: User ID (required for scope='user')
128-
language: Language code
129121
content: Prompt content
130122
description: Optional description
131123
@@ -134,11 +126,9 @@ async def create_or_update_prompt_template(
134126
"""
135127

136128
async def _operation(session):
137-
# Try to find existing template
138129
stmt = select(PromptTemplate).where(
139130
PromptTemplate.prompt_type == prompt_type,
140131
PromptTemplate.scope == scope,
141-
PromptTemplate.language == language,
142132
PromptTemplate.gmt_deleted.is_(None),
143133
)
144134

@@ -151,18 +141,15 @@ async def _operation(session):
151141
instance = result.scalars().first()
152142

153143
if instance:
154-
# Update existing
155144
instance.content = content
156145
if description is not None:
157146
instance.description = description
158147
instance.gmt_updated = utc_now()
159148
else:
160-
# Create new
161149
instance = PromptTemplate(
162150
prompt_type=prompt_type,
163151
scope=scope,
164152
user_id=user_id,
165-
language=language,
166153
content=content,
167154
description=description,
168155
)
@@ -174,15 +161,14 @@ async def _operation(session):
174161

175162
return await self.execute_with_transaction(_operation)
176163

177-
async def delete_prompt_template(self, prompt_type: str, scope: str, user_id: Optional[str], language: str) -> bool:
164+
async def delete_prompt_template(self, prompt_type: str, scope: str, user_id: Optional[str]) -> bool:
178165
"""
179166
Soft delete a prompt template.
180167
181168
Args:
182169
prompt_type: Type of prompt
183170
scope: 'user' or 'system'
184171
user_id: User ID (required for scope='user')
185-
language: Language code
186172
187173
Returns:
188174
True if deleted, False if not found
@@ -192,7 +178,6 @@ async def _operation(session):
192178
stmt = select(PromptTemplate).where(
193179
PromptTemplate.prompt_type == prompt_type,
194180
PromptTemplate.scope == scope,
195-
PromptTemplate.language == language,
196181
PromptTemplate.gmt_deleted.is_(None),
197182
)
198183

aperag/migration/versions/20260204171951-8abbaf1aa10d.py

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,60 +7,47 @@
77
"""
88
from typing import Sequence, Union
99

10-
from alembic import op
1110
import sqlalchemy as sa
12-
11+
from alembic import op
1312

1413
# revision identifiers, used by Alembic.
1514
revision: str = '8abbaf1aa10d'
1615
down_revision: Union[str, None] = '332faa764121'
1716
branch_labels: Union[str, Sequence[str], None] = None
1817
depends_on: Union[str, Sequence[str], None] = None
1918

20-
21-
# Import prompt constants from service module
2219
from aperag.service.prompt_template_service import (
23-
APERAG_AGENT_INSTRUCTION_EN,
24-
APERAG_AGENT_INSTRUCTION_ZH,
25-
DEFAULT_AGENT_QUERY_PROMPT_EN,
26-
DEFAULT_AGENT_QUERY_PROMPT_ZH,
20+
APERAG_AGENT_INSTRUCTION,
21+
DEFAULT_AGENT_QUERY_PROMPT,
2722
)
2823

29-
# Agent prompts are imported from service module above
30-
3124

3225
def upgrade() -> None:
3326
"""Upgrade schema."""
34-
# Create prompt_template table
3527
op.create_table(
3628
'prompt_template',
3729
sa.Column('id', sa.String(length=24), nullable=False),
3830
sa.Column('prompt_type', sa.String(length=50), nullable=False),
3931
sa.Column('scope', sa.String(length=20), nullable=False),
4032
sa.Column('user_id', sa.String(length=256), nullable=True),
41-
sa.Column('language', sa.String(length=10), nullable=False, server_default='en-US'),
4233
sa.Column('content', sa.Text(), nullable=False),
4334
sa.Column('description', sa.Text(), nullable=True),
4435
sa.Column('gmt_created', sa.DateTime(timezone=True), nullable=False, server_default=sa.text('NOW()')),
4536
sa.Column('gmt_updated', sa.DateTime(timezone=True), nullable=False, server_default=sa.text('NOW()')),
4637
sa.Column('gmt_deleted', sa.DateTime(timezone=True), nullable=True),
4738
sa.PrimaryKeyConstraint('id', name=op.f('pk_prompt_template'))
4839
)
49-
50-
# Create indexes
40+
5141
op.create_index(op.f('ix_prompt_template_prompt_type'), 'prompt_template', ['prompt_type'], unique=False)
5242
op.create_index(op.f('ix_prompt_template_scope'), 'prompt_template', ['scope'], unique=False)
5343
op.create_index(op.f('ix_prompt_template_user_id'), 'prompt_template', ['user_id'], unique=False)
5444
op.create_index(op.f('ix_prompt_template_gmt_deleted'), 'prompt_template', ['gmt_deleted'], unique=False)
55-
56-
# Insert system default prompts (Agent prompts only)
45+
5746
op.execute(f"""
58-
INSERT INTO prompt_template (id, prompt_type, scope, user_id, language, content, description, gmt_created, gmt_updated)
59-
VALUES
60-
('pt_sys_agent_system_en', 'agent_system', 'system', NULL, 'en-US', $${APERAG_AGENT_INSTRUCTION_EN}$$, 'System default agent system prompt (English)', NOW(), NOW()),
61-
('pt_sys_agent_system_zh', 'agent_system', 'system', NULL, 'zh-CN', $${APERAG_AGENT_INSTRUCTION_ZH}$$, 'System default agent system prompt (Chinese)', NOW(), NOW()),
62-
('pt_sys_agent_query_en', 'agent_query', 'system', NULL, 'en-US', $${DEFAULT_AGENT_QUERY_PROMPT_EN}$$, 'System default agent query prompt template (English)', NOW(), NOW()),
63-
('pt_sys_agent_query_zh', 'agent_query', 'system', NULL, 'zh-CN', $${DEFAULT_AGENT_QUERY_PROMPT_ZH}$$, 'System default agent query prompt template (Chinese)', NOW(), NOW())
47+
INSERT INTO prompt_template (id, prompt_type, scope, user_id, content, description, gmt_created, gmt_updated)
48+
VALUES
49+
('pt_sys_agent_system', 'agent_system', 'system', NULL, $${APERAG_AGENT_INSTRUCTION}$$, 'System default agent system prompt', NOW(), NOW()),
50+
('pt_sys_agent_query', 'agent_query', 'system', NULL, $${DEFAULT_AGENT_QUERY_PROMPT}$$, 'System default agent query prompt template', NOW(), NOW())
6451
""")
6552

6653

aperag/schema/view_models.py

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
# generated by datamodel-codegen:
1616
# filename: openapi.merged.yaml
17-
# timestamp: 2026-03-03T01:27:45+00:00
17+
# timestamp: 2026-03-03T01:49:27+00:00
1818

1919
from __future__ import annotations
2020

@@ -994,9 +994,6 @@ class PromptDetail(BaseModel):
994994
None, description='Whether user has customized this prompt'
995995
)
996996
description: Optional[str] = Field(None, description='Optional description')
997-
language: Optional[Literal['zh-CN', 'en-US']] = Field(
998-
None, description='Language of the prompt'
999-
)
1000997

1001998

1002999
class UserPromptsResponse(BaseModel):
@@ -1032,7 +1029,6 @@ class Prompts(BaseModel):
10321029

10331030

10341031
class UpdateUserPromptsRequest(BaseModel):
1035-
language: Literal['zh-CN', 'en-US']
10361032
prompts: Prompts = Field(
10371033
...,
10381034
description='Prompts to update (all fields are optional, only provided fields will be updated)',
@@ -1058,7 +1054,6 @@ class DeleteUserPromptResponse(BaseModel):
10581054

10591055

10601056
class ResetPromptsRequest(BaseModel):
1061-
language: Literal['zh-CN', 'en-US']
10621057
types: Optional[list[str]] = Field(
10631058
None, description='Prompt types to reset, omit to reset all'
10641059
)
@@ -1072,14 +1067,12 @@ class ResetPromptsResponse(BaseModel):
10721067
class SystemPromptDetail(BaseModel):
10731068
type: Optional[str] = None
10741069
content: Optional[str] = None
1075-
language: Optional[str] = None
10761070
description: Optional[str] = None
10771071

10781072

10791073
class SystemPromptsResponse1(BaseModel):
10801074
content: Optional[str] = None
10811075
description: Optional[str] = None
1082-
language: Optional[str] = None
10831076

10841077

10851078
class SystemPromptsResponse(RootModel[Optional[dict[str, SystemPromptsResponse1]]]):

aperag/service/agent_chat_service.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,6 @@ async def handle_websocket_agent_chat(self, websocket: WebSocket, user: str, bot
174174
# Parse bot configuration and get default collections once
175175
bot_config = None
176176
default_collections = []
177-
default_language = "zh-CN" # Default language
178-
179177
if bot.config:
180178
try:
181179
config_dict = json.loads(bot.config)
@@ -194,12 +192,8 @@ async def handle_websocket_agent_chat(self, websocket: WebSocket, user: str, bot
194192

195193
# Resolve prompts once at the beginning using prompt_template_service
196194
# Priority: Bot config > User default > System default > Hardcoded
197-
resolved_system_prompt = await prompt_template_service.resolve_agent_system_prompt(
198-
bot=bot, user_id=user, language=default_language
199-
)
200-
resolved_query_prompt = await prompt_template_service.resolve_agent_query_prompt(
201-
bot=bot, user_id=user, language=default_language
202-
)
195+
resolved_system_prompt = await prompt_template_service.resolve_agent_system_prompt(bot=bot, user_id=user)
196+
resolved_query_prompt = await prompt_template_service.resolve_agent_query_prompt(bot=bot, user_id=user)
203197

204198
while True:
205199
# Receive message from WebSocket

0 commit comments

Comments
 (0)