key_pool_pusher.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. """
  2. 号池数据推送服务
  3. 定时将分组和key数据推送到company_base_pool
  4. """
  5. import logging
  6. import asyncio
  7. from datetime import datetime
  8. import httpx
  9. import os
  10. logger = logging.getLogger(__name__)
  11. # company_base_pool的API地址
  12. COMPANY_BASE_POOL_URL = os.getenv("COMPANY_BASE_POOL_URL", "http://localhost:8010")
  13. SYNC_ENDPOINT = f"{COMPANY_BASE_POOL_URL}/api/admin/key-pool/sync"
  14. async def push_group_keys_to_pool(pool, group_id: int, api_key_ids: list):
  15. """
  16. 推送分组的key到company_base_pool
  17. Args:
  18. pool: 数据库连接池
  19. group_id: 分组ID
  20. api_key_ids: key ID列表
  21. """
  22. try:
  23. async with pool.acquire() as conn:
  24. # 设置search_path
  25. await conn.execute("SET search_path TO crawl")
  26. # 获取分组信息
  27. group = await conn.fetchrow("SELECT name FROM model_groups WHERE id = $1", group_id)
  28. if not group:
  29. return
  30. # 获取keys
  31. keys = await conn.fetch("""
  32. SELECT ak.key_value
  33. FROM api_keys ak
  34. JOIN group_keys gk ON gk.api_key_id = ak.id
  35. WHERE gk.group_id = $1 AND gk.is_active = TRUE
  36. """, group_id)
  37. if not keys:
  38. return
  39. api_keys = [k['key_value'] for k in keys]
  40. # 推送到company_base_pool
  41. data = [{
  42. "group_name": group['name'],
  43. "provider": "dashscope",
  44. "base_url": "https://dashscope.aliyuncs.com",
  45. "model_name": None,
  46. "api_keys": api_keys
  47. }]
  48. async with httpx.AsyncClient(timeout=30) as client:
  49. response = await client.post(SYNC_ENDPOINT, json=data)
  50. if response.status_code == 200:
  51. result = response.json()
  52. logger.info(f"推送分组 {group['name']} 到号池: {result}")
  53. else:
  54. logger.error(f"推送失败: {response.status_code} {response.text}")
  55. except Exception as e:
  56. logger.error(f"推送分组 {group_id} 失败: {e}")
  57. async def push_all_groups_to_pool(pool):
  58. """推送所有分组到company_base_pool"""
  59. try:
  60. async with pool.acquire() as conn:
  61. # 设置search_path
  62. await conn.execute("SET search_path TO crawl")
  63. # 获取所有有key的分组
  64. groups = await conn.fetch("""
  65. SELECT DISTINCT g.id, g.name
  66. FROM model_groups g
  67. JOIN group_keys gk ON gk.group_id = g.id
  68. WHERE gk.is_active = TRUE
  69. """)
  70. logger.info(f"开始推送 {len(groups)} 个分组到号池")
  71. for group in groups:
  72. await push_group_keys_to_pool(pool, group['id'], [])
  73. logger.info("推送完成")
  74. except Exception as e:
  75. logger.error(f"推送所有分组失败: {e}")