mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-06-16 10:46:03 +00:00
78 lines
3.0 KiB
Python
78 lines
3.0 KiB
Python
"""Artifact persistence entity for Host-owned artifact store."""
|
|
from __future__ import annotations
|
|
|
|
import sqlalchemy
|
|
import datetime
|
|
|
|
from .base import Base
|
|
|
|
|
|
class AgentArtifact(Base):
|
|
"""AgentArtifact stores metadata for large files, images, tool results, etc.
|
|
|
|
This table only stores metadata. The actual blob content is stored in
|
|
BinaryStorage or external storage, referenced by storage_key.
|
|
|
|
Artifacts are accessed via artifact_metadata and artifact_read APIs
|
|
with run_id authorization.
|
|
"""
|
|
|
|
__tablename__ = 'agent_artifact'
|
|
|
|
id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True, autoincrement=True)
|
|
"""Auto-increment ID for sequencing."""
|
|
|
|
artifact_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=False, unique=True, index=True)
|
|
"""Unique artifact identifier."""
|
|
|
|
artifact_type = sqlalchemy.Column(sqlalchemy.String(50), nullable=False)
|
|
"""Artifact type: 'image', 'file', 'voice', 'tool_result', 'platform_attachment', etc."""
|
|
|
|
mime_type = sqlalchemy.Column(sqlalchemy.String(255), nullable=True)
|
|
"""MIME type of the content."""
|
|
|
|
name = sqlalchemy.Column(sqlalchemy.String(255), nullable=True)
|
|
"""Original file name (if applicable)."""
|
|
|
|
size_bytes = sqlalchemy.Column(sqlalchemy.BigInteger, nullable=True)
|
|
"""Size in bytes."""
|
|
|
|
sha256 = sqlalchemy.Column(sqlalchemy.String(64), nullable=True)
|
|
"""SHA256 hash of content (for integrity verification)."""
|
|
|
|
source = sqlalchemy.Column(sqlalchemy.String(50), nullable=False)
|
|
"""Source of artifact: 'platform', 'runner', 'tool', 'system'."""
|
|
|
|
# Storage reference (points to BinaryStorage or external storage)
|
|
storage_key = sqlalchemy.Column(sqlalchemy.String(255), nullable=True)
|
|
"""Key in BinaryStorage or external storage reference."""
|
|
|
|
storage_type = sqlalchemy.Column(sqlalchemy.String(50), nullable=False, default='binary_storage')
|
|
"""Storage type: 'binary_storage', 'file', 'url', etc."""
|
|
|
|
# Context
|
|
conversation_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=True, index=True)
|
|
"""Conversation this artifact belongs to."""
|
|
|
|
run_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=True, index=True)
|
|
"""Run ID that created this artifact."""
|
|
|
|
runner_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=True)
|
|
"""Runner ID that created this artifact."""
|
|
|
|
bot_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=True)
|
|
"""Bot UUID that handled this artifact."""
|
|
|
|
workspace_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=True)
|
|
"""Workspace ID for multi-tenant deployments."""
|
|
|
|
# Lifecycle
|
|
created_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, default=datetime.datetime.utcnow)
|
|
"""When this artifact was created."""
|
|
|
|
expires_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=True)
|
|
"""When this artifact expires (optional)."""
|
|
|
|
metadata_json = sqlalchemy.Column(sqlalchemy.Text, nullable=True)
|
|
"""Additional metadata as JSON string."""
|