Files
LangBot/src/langbot/pkg/entity/persistence/agent_interaction.py
T
BiFangKNT 3456668497 feat(media): centralize resource URLs and persist refreshed image URLs
- Deduplicate message and history resource URLs using stable catalog references
- Persist renewed URLs with concurrent refresh protection
- Refresh OneBot images via get_msg intervals or NapCat rkey TTL
- Migrate historical payloads and cover SQLite and PostgreSQL behavior
2026-10-23 12:49:56 +08:00

63 lines
2.8 KiB
Python

"""Host-owned structured interaction persistence entities."""
from __future__ import annotations
import datetime
import sqlalchemy
from .base import Base
from ...persistence.media import MediaReferenceText
class AgentInteraction(Base):
"""Persist one interaction request and its eventual submission."""
__tablename__ = 'agent_interaction'
id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True, autoincrement=True)
interaction_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)
run_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=False, index=True)
binding_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=False, index=True)
runner_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=False, index=True)
processor_type = sqlalchemy.Column(sqlalchemy.String(50), nullable=False, index=True)
processor_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=False, index=True)
bot_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=True, index=True)
workspace_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=True)
conversation_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=True, index=True)
thread_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=True)
actor_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=True, index=True)
status = sqlalchemy.Column(sqlalchemy.String(50), nullable=False, index=True)
request_json = sqlalchemy.Column(MediaReferenceText, nullable=False)
delivery_target_json = sqlalchemy.Column(sqlalchemy.Text, nullable=True)
delivery_result_json = sqlalchemy.Column(MediaReferenceText, nullable=True)
replaces_interaction_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=True)
callback_token_hash = sqlalchemy.Column(sqlalchemy.String(64), nullable=False, unique=True, index=True)
expires_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=True, index=True)
submitted_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=True)
submission_json = sqlalchemy.Column(MediaReferenceText, nullable=True)
status_reason = sqlalchemy.Column(sqlalchemy.Text, nullable=True)
created_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, default=datetime.datetime.utcnow)
updated_at = sqlalchemy.Column(
sqlalchemy.DateTime,
nullable=False,
default=datetime.datetime.utcnow,
onupdate=datetime.datetime.utcnow,
)
__table_args__ = (
sqlalchemy.UniqueConstraint('run_id', 'interaction_id', name='uq_agent_interaction_run_interaction'),
sqlalchemy.Index(
'ix_agent_interaction_scope_status',
'bot_id',
'conversation_id',
'actor_id',
'status',
),
sqlalchemy.Index('ix_agent_interaction_processor_status', 'processor_type', 'processor_id', 'status'),
)