chore: update gitignore; feat: 新增customer_agent业务模块与api路由

This commit is contained in:
2026-09-11 11:02:15 +08:00
parent 5915319f9f
commit 2004b8fcf4
59 changed files with 3527 additions and 18 deletions
+56
View File
@@ -0,0 +1,56 @@
import json
import unittest
from agent.customer_agent.context import RedisConversationContext
class ContextRedis:
def __init__(self):
self.values = {}
async def rpush(self, key, value):
self.values.setdefault(key, []).append(value)
async def lrange(self, key, start, end):
values = self.values.get(key, [])[start:]
return values if end == -1 else values[: end - start + 1]
async def ltrim(self, key, start, end):
values = self.values.get(key, [])[start:]
self.values[key] = values if end == -1 else values[: end - start + 1]
async def expire(self, key, seconds):
pass
class ContextTests(unittest.IsolatedAsyncioTestCase):
async def test_appends_messages_and_trims_oldest_when_token_limit_is_exceeded(self):
redis = ContextRedis()
context = RedisConversationContext(
redis,
config_getter={
"agent.customer.session_max_token": "5",
"agent.customer.session.ttl": "120",
}.get,
token_counter=lambda text: len(text),
)
await context.append("s1", "user", "123")
await context.append("s1", "assistant", "456")
await context.append("s1", "user", "789")
messages = await context.get("s1")
self.assertEqual([item["content"] for item in messages], ["789"])
async def test_message_payload_is_structured_json(self):
redis = ContextRedis()
context = RedisConversationContext(redis, config_getter={}.get)
await context.append("s1", "user", "基金是什么")
raw = redis.values["session:s1:messages"][0]
self.assertEqual(json.loads(raw)["role"], "user")
if __name__ == "__main__":
unittest.main()