--- title: Chat History --- # Chat History SMG supports multiple storage backends for persisting conversation history, responses, and feedback data for analytics, debugging, and compliance. --- ## Overview
### :material-database: Multiple Backends Choose from in-memory, PostgreSQL, Redis, or Oracle based on your requirements.
### :material-message-text: Conversation Tracking Store complete conversation history including messages, tool calls, and reasoning.
### :material-thumb-up: Feedback Collection Collect user feedback on responses for quality monitoring and fine-tuning.
### :material-tune: Configurable Retention Control data retention with TTL settings for compliance and storage management.
--- ## Backend Comparison | Backend | Use Case | Persistence | Scalability | |---------|----------|-------------|-------------| | `memory` | Development, testing | Process lifetime | Single instance | | `none` | Stateless deployments | None | N/A | | `postgres` | Production, self-hosted | Durable | High | | `redis` | Caching, ephemeral storage | Configurable TTL | High | | `oracle` | Enterprise, OCI deployments | Durable | High | --- ## Configuration ### Backend Selection ```bash smg --history-backend [backend-specific options] ``` | Option | Default | Description | |--------|---------|-------------| | `--history-backend` | `memory` | Storage backend: `memory`, `none`, `oracle`, `postgres`, `redis` | --- ## Memory Backend The default in-process storage. Suitable for development and testing. ```bash smg --history-backend memory ```
#### :material-check-circle: Advantages - Zero configuration - Fast access - No external dependencies
#### :material-close-circle: Limitations - Data lost on restart - Not shared across instances - Memory grows with conversations
--- ## None Backend Disables history storage entirely. Use for stateless deployments where persistence isn't needed. ```bash smg --history-backend none ``` **Use when**: Privacy requirements prohibit storing conversations, or external systems handle logging. --- ## PostgreSQL Backend Production-ready storage with PostgreSQL. ### Configuration Options | Option | Default | Description | |--------|---------|-------------| | `--postgres-db-url` | - | PostgreSQL connection URL | | `--postgres-pool-max-size` | `16` | Maximum connection pool size | ### Connection URL Format ``` postgres://[user[:password]@][host][:port][/database][?param=value] ``` ### Examples
#### Basic Connection ```bash smg --history-backend postgres \ --postgres-db-url "postgres://user:password@localhost:5432/smg" ```
#### With SSL ```bash smg --history-backend postgres \ --postgres-db-url "postgres://user:password@db.example.com:5432/smg?sslmode=require" ```
### SSL Modes | Mode | Description | |------|-------------| | `disable` | No SSL | | `allow` | Try non-SSL first, then SSL | | `prefer` | Try SSL first, then non-SSL (default) | | `require` | Require SSL, skip verification | | `verify-ca` | Require SSL, verify CA | | `verify-full` | Require SSL, verify CA and hostname | --- ## Redis Backend High-performance caching with optional persistence and TTL-based retention. ### Configuration Options | Option | Default | Description | |--------|---------|-------------| | `--redis-url` | - | Redis connection URL | | `--redis-pool-max-size` | `16` | Maximum connection pool size | | `--redis-retention-days` | `30` | Data retention in days (-1 for persistent) | ### Connection URL Format ``` redis://[:password@]host[:port][/db] rediss://[:password@]host[:port][/db] # TLS ``` ### Examples
#### Basic Connection ```bash smg --history-backend redis \ --redis-url "redis://localhost:6379" ```
#### With TLS and Auth ```bash smg --history-backend redis \ --redis-url "rediss://:password@redis.example.com:6379" ```
#### Persistent Storage ```bash smg --history-backend redis \ --redis-url "redis://localhost:6379" \ --redis-retention-days -1 ```
--- ## Oracle Backend Enterprise-grade storage using Oracle Autonomous Database. ### Configuration Options | Option | Environment Variable | Default | Description | |--------|---------------------|---------|-------------| | `--oracle-wallet-path` | `ATP_WALLET_PATH` | - | Path to ATP wallet directory | | `--oracle-tns-alias` | `ATP_TNS_ALIAS` | - | TNS alias from tnsnames.ora | | `--oracle-dsn` | `ATP_DSN` | - | Direct connection descriptor | | `--oracle-user` | `ATP_USER` | - | Database username | | `--oracle-password` | `ATP_PASSWORD` | - | Database password | | `--oracle-external-auth` | `ATP_EXTERNAL_AUTH` | `false` | Use external (OS) authentication instead of username/password | | `--oracle-pool-min` | `ATP_POOL_MIN` | `1` | Minimum connection pool size | | `--oracle-pool-max` | `ATP_POOL_MAX` | `16` | Maximum connection pool size | | `--oracle-pool-timeout-secs` | `ATP_POOL_TIMEOUT_SECS` | `30` | Connection timeout in seconds | ### Examples
#### Using ATP Wallet ```bash smg --history-backend oracle \ --oracle-wallet-path /path/to/wallet \ --oracle-tns-alias mydb_high \ --oracle-user admin \ --oracle-password "$ORACLE_PASSWORD" ```
#### Using Direct DSN ```bash smg --history-backend oracle \ --oracle-dsn "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=db.example.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=myservice)))" \ --oracle-user admin \ --oracle-password "$ORACLE_PASSWORD" ```
--- ## What Gets Stored ### Conversations Container for a sequence of interactions: - Conversation ID - Creation timestamp - Metadata (model, user, session info) ### Conversation Items Individual items within a conversation: | Type | Description | |------|-------------| | **Messages** | User and assistant messages with content | | **Reasoning** | Model reasoning/thinking steps | | **Tool Calls** | Tool invocations and results | | **MCP Calls** | MCP server interactions | | **Function Calls** | Function calling results | ### Responses Complete response records including: - Input (original request) - Output (model response) - Tool calls executed - Model information - Timestamps and metadata - Token usage ### Feedback User feedback on responses for quality tracking: - Rating (positive/negative) - Comments - Timestamp - Response reference --- ## Recommended Configurations
### :material-laptop: Development In-memory for fast iteration. ```bash smg --history-backend memory ```
### :material-server-network: Production (Self-Hosted) PostgreSQL for durable storage. ```bash smg --history-backend postgres \ --postgres-db-url "postgres://smg:$DB_PASSWORD@postgres:5432/smg?sslmode=require" \ --postgres-pool-max-size 32 ```
### :material-office-building: Enterprise (OCI) Oracle for enterprise deployments. ```bash smg --history-backend oracle \ --oracle-wallet-path /etc/smg/wallet \ --oracle-tns-alias smg_high \ --oracle-user smg_app \ --oracle-password "$ATP_PASSWORD" \ --oracle-pool-max 32 ```
### :material-lightning-bolt: Caching Layer Redis for high-performance ephemeral storage. ```bash smg --history-backend redis \ --redis-url "rediss://:$REDIS_PASSWORD@redis.example.com:6379" \ --redis-retention-days 7 \ --redis-pool-max-size 64 ```
--- ## Troubleshooting | Symptom | Cause | Solution | |---------|-------|----------| | Connection timeouts | Slow network | Increase pool timeout | | Pool exhaustion | High concurrency | Increase pool size | | Data not persisting | Wrong backend | Verify `--history-backend` setting | | Redis data expiring | TTL too short | Increase `--redis-retention-days` | ### Pool Configuration ```bash # PostgreSQL --postgres-db-url "postgres://...?connect_timeout=30" --postgres-pool-max-size 64 # Oracle --oracle-pool-timeout-secs 60 --oracle-pool-max 64 # Redis --redis-pool-max-size 64 ``` --- ## What's Next?
### :material-shield-lock: Authentication Secure access to your SMG deployment. [Authentication →](../security/authentication.md)
### :material-chart-box: Metrics Reference Monitor storage backend performance. [Metrics Reference →](../../reference/metrics.md)
### :material-shield-check: High Availability Deploy SMG in a highly available configuration. [High Availability →](../architecture/high-availability.md)