Spaces:
Sleeping
Sleeping
credit issue fix
Browse files
routers/gemini.py
CHANGED
|
@@ -72,7 +72,7 @@ async def create_job(
|
|
| 72 |
credits_reserved: int = 0
|
| 73 |
) -> GeminiJob:
|
| 74 |
"""Create a new job in the queue."""
|
| 75 |
-
from services.
|
| 76 |
|
| 77 |
job_id = f"job_{uuid.uuid4().hex[:16]}"
|
| 78 |
priority = get_priority_for_job_type(job_type)
|
|
@@ -339,7 +339,7 @@ async def get_job_status(
|
|
| 339 |
|
| 340 |
|
| 341 |
if job.status == "processing" and job.job_type == "video" and job.third_party_id:
|
| 342 |
-
from services.
|
| 343 |
processor = GeminiJobProcessor()
|
| 344 |
job = await processor.check_status(job, db)
|
| 345 |
await db.commit()
|
|
|
|
| 72 |
credits_reserved: int = 0
|
| 73 |
) -> GeminiJob:
|
| 74 |
"""Create a new job in the queue."""
|
| 75 |
+
from services.gemini_service.job_processor import get_priority_for_job_type, get_pool
|
| 76 |
|
| 77 |
job_id = f"job_{uuid.uuid4().hex[:16]}"
|
| 78 |
priority = get_priority_for_job_type(job_type)
|
|
|
|
| 339 |
|
| 340 |
|
| 341 |
if job.status == "processing" and job.job_type == "video" and job.third_party_id:
|
| 342 |
+
from services.gemini_service.job_processor import GeminiJobProcessor
|
| 343 |
processor = GeminiJobProcessor()
|
| 344 |
job = await processor.check_status(job, db)
|
| 345 |
await db.commit()
|
services/credit_service/middleware.py
CHANGED
|
@@ -89,6 +89,7 @@ class CreditMiddleware(BaseServiceMiddleware):
|
|
| 89 |
request.state.credit_transaction_id = transaction.transaction_id
|
| 90 |
request.state.endpoint_type = endpoint_type
|
| 91 |
request.state.credit_cost = credit_cost
|
|
|
|
| 92 |
|
| 93 |
self.log_request(
|
| 94 |
request,
|
|
|
|
| 89 |
request.state.credit_transaction_id = transaction.transaction_id
|
| 90 |
request.state.endpoint_type = endpoint_type
|
| 91 |
request.state.credit_cost = credit_cost
|
| 92 |
+
request.state.credits_reserved = credit_cost # For gemini router compatibility
|
| 93 |
|
| 94 |
self.log_request(
|
| 95 |
request,
|
services/credit_service/transaction_manager.py
CHANGED
|
@@ -70,7 +70,7 @@ class CreditTransactionManager:
|
|
| 70 |
|
| 71 |
Args:
|
| 72 |
session: Database session
|
| 73 |
-
user: User model instance
|
| 74 |
amount: Number of credits to reserve
|
| 75 |
source: Source of transaction (e.g., "middleware")
|
| 76 |
reference_type: Type of reference (e.g., "request", "job")
|
|
@@ -84,10 +84,17 @@ class CreditTransactionManager:
|
|
| 84 |
|
| 85 |
Raises:
|
| 86 |
InsufficientCreditsError: If user doesn't have enough credits
|
|
|
|
| 87 |
"""
|
| 88 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 89 |
raise InsufficientCreditsError(
|
| 90 |
-
f"User has {
|
| 91 |
)
|
| 92 |
|
| 93 |
# Generate transaction ID
|
|
@@ -111,11 +118,11 @@ class CreditTransactionManager:
|
|
| 111 |
# Create transaction record
|
| 112 |
transaction = CreditTransaction(
|
| 113 |
transaction_id=transaction_id,
|
| 114 |
-
user_id=
|
| 115 |
transaction_type="reserve",
|
| 116 |
amount=-amount, # Negative for deduction
|
| 117 |
-
balance_before=
|
| 118 |
-
balance_after=
|
| 119 |
source=source,
|
| 120 |
reference_type=reference_type,
|
| 121 |
reference_id=reference_id,
|
|
@@ -126,15 +133,15 @@ class CreditTransactionManager:
|
|
| 126 |
)
|
| 127 |
|
| 128 |
# Update user balance
|
| 129 |
-
|
| 130 |
-
|
| 131 |
|
| 132 |
session.add(transaction)
|
| 133 |
await session.flush() # Don't commit yet - let caller handle
|
| 134 |
|
| 135 |
logger.info(
|
| 136 |
-
f"Reserved {amount} credits for user {
|
| 137 |
-
f"transaction: {transaction_id}, new balance: {
|
| 138 |
)
|
| 139 |
|
| 140 |
return transaction
|
|
@@ -299,7 +306,7 @@ class CreditTransactionManager:
|
|
| 299 |
|
| 300 |
Args:
|
| 301 |
session: Database session
|
| 302 |
-
user: User model instance
|
| 303 |
amount: Number of credits to add
|
| 304 |
source: Source of transaction (e.g., "payment")
|
| 305 |
reference_type: Type of reference (e.g., "payment")
|
|
@@ -309,16 +316,25 @@ class CreditTransactionManager:
|
|
| 309 |
|
| 310 |
Returns:
|
| 311 |
CreditTransaction record
|
|
|
|
|
|
|
|
|
|
| 312 |
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 313 |
transaction_id = f"add_{uuid.uuid4().hex[:16]}"
|
| 314 |
|
| 315 |
transaction = CreditTransaction(
|
| 316 |
transaction_id=transaction_id,
|
| 317 |
-
user_id=
|
| 318 |
transaction_type="purchase",
|
| 319 |
amount=amount,
|
| 320 |
-
balance_before=
|
| 321 |
-
balance_after=
|
| 322 |
source=source,
|
| 323 |
reference_type=reference_type,
|
| 324 |
reference_id=reference_id,
|
|
@@ -326,14 +342,14 @@ class CreditTransactionManager:
|
|
| 326 |
extra_data=metadata
|
| 327 |
)
|
| 328 |
|
| 329 |
-
|
| 330 |
|
| 331 |
session.add(transaction)
|
| 332 |
await session.flush()
|
| 333 |
|
| 334 |
logger.info(
|
| 335 |
-
f"Added {amount} credits to user {
|
| 336 |
-
f"source: {source}, new balance: {
|
| 337 |
)
|
| 338 |
|
| 339 |
return transaction
|
|
|
|
| 70 |
|
| 71 |
Args:
|
| 72 |
session: Database session
|
| 73 |
+
user: User model instance (used for user.id reference)
|
| 74 |
amount: Number of credits to reserve
|
| 75 |
source: Source of transaction (e.g., "middleware")
|
| 76 |
reference_type: Type of reference (e.g., "request", "job")
|
|
|
|
| 84 |
|
| 85 |
Raises:
|
| 86 |
InsufficientCreditsError: If user doesn't have enough credits
|
| 87 |
+
UserNotFoundError: If user not found in database
|
| 88 |
"""
|
| 89 |
+
# Fetch fresh user from DB to ensure we have current state
|
| 90 |
+
# (user parameter may be detached from AuthMiddleware's closed session)
|
| 91 |
+
db_user = await session.get(User, user.id)
|
| 92 |
+
if not db_user:
|
| 93 |
+
raise UserNotFoundError(f"User {user.id} not found")
|
| 94 |
+
|
| 95 |
+
if db_user.credits < amount:
|
| 96 |
raise InsufficientCreditsError(
|
| 97 |
+
f"User has {db_user.credits} credits, needs {amount}"
|
| 98 |
)
|
| 99 |
|
| 100 |
# Generate transaction ID
|
|
|
|
| 118 |
# Create transaction record
|
| 119 |
transaction = CreditTransaction(
|
| 120 |
transaction_id=transaction_id,
|
| 121 |
+
user_id=db_user.id,
|
| 122 |
transaction_type="reserve",
|
| 123 |
amount=-amount, # Negative for deduction
|
| 124 |
+
balance_before=db_user.credits,
|
| 125 |
+
balance_after=db_user.credits - amount,
|
| 126 |
source=source,
|
| 127 |
reference_type=reference_type,
|
| 128 |
reference_id=reference_id,
|
|
|
|
| 133 |
)
|
| 134 |
|
| 135 |
# Update user balance
|
| 136 |
+
db_user.credits -= amount
|
| 137 |
+
db_user.last_used_at = datetime.utcnow()
|
| 138 |
|
| 139 |
session.add(transaction)
|
| 140 |
await session.flush() # Don't commit yet - let caller handle
|
| 141 |
|
| 142 |
logger.info(
|
| 143 |
+
f"Reserved {amount} credits for user {db_user.user_id}, "
|
| 144 |
+
f"transaction: {transaction_id}, new balance: {db_user.credits}"
|
| 145 |
)
|
| 146 |
|
| 147 |
return transaction
|
|
|
|
| 306 |
|
| 307 |
Args:
|
| 308 |
session: Database session
|
| 309 |
+
user: User model instance (used for user.id reference)
|
| 310 |
amount: Number of credits to add
|
| 311 |
source: Source of transaction (e.g., "payment")
|
| 312 |
reference_type: Type of reference (e.g., "payment")
|
|
|
|
| 316 |
|
| 317 |
Returns:
|
| 318 |
CreditTransaction record
|
| 319 |
+
|
| 320 |
+
Raises:
|
| 321 |
+
UserNotFoundError: If user not found in database
|
| 322 |
"""
|
| 323 |
+
# Fetch fresh user from DB to ensure we have current state
|
| 324 |
+
# (user parameter may be detached from AuthMiddleware's closed session)
|
| 325 |
+
db_user = await session.get(User, user.id)
|
| 326 |
+
if not db_user:
|
| 327 |
+
raise UserNotFoundError(f"User {user.id} not found")
|
| 328 |
+
|
| 329 |
transaction_id = f"add_{uuid.uuid4().hex[:16]}"
|
| 330 |
|
| 331 |
transaction = CreditTransaction(
|
| 332 |
transaction_id=transaction_id,
|
| 333 |
+
user_id=db_user.id,
|
| 334 |
transaction_type="purchase",
|
| 335 |
amount=amount,
|
| 336 |
+
balance_before=db_user.credits,
|
| 337 |
+
balance_after=db_user.credits + amount,
|
| 338 |
source=source,
|
| 339 |
reference_type=reference_type,
|
| 340 |
reference_id=reference_id,
|
|
|
|
| 342 |
extra_data=metadata
|
| 343 |
)
|
| 344 |
|
| 345 |
+
db_user.credits += amount
|
| 346 |
|
| 347 |
session.add(transaction)
|
| 348 |
await session.flush()
|
| 349 |
|
| 350 |
logger.info(
|
| 351 |
+
f"Added {amount} credits to user {db_user.user_id}, "
|
| 352 |
+
f"source: {source}, new balance: {db_user.credits}"
|
| 353 |
)
|
| 354 |
|
| 355 |
return transaction
|
tests/test_worker_pool.py
CHANGED
|
@@ -30,7 +30,7 @@ from services.priority_worker_pool import (
|
|
| 30 |
)
|
| 31 |
|
| 32 |
# Test the Gemini-specific implementation
|
| 33 |
-
from services.
|
| 34 |
get_priority_for_job_type as gemini_get_priority,
|
| 35 |
JOB_PRIORITY_MAP,
|
| 36 |
GeminiJobProcessor
|
|
|
|
| 30 |
)
|
| 31 |
|
| 32 |
# Test the Gemini-specific implementation
|
| 33 |
+
from services.gemini_service.job_processor import (
|
| 34 |
get_priority_for_job_type as gemini_get_priority,
|
| 35 |
JOB_PRIORITY_MAP,
|
| 36 |
GeminiJobProcessor
|