Skip to Content

Import Claude Sessions

Import Claude Sessions

Original file: import_claude_sessions.py
Type: PYTHON


#!/usr/bin/env python3
"""
Batch import Claude Code JSONL sessions to Odoo
"""

import sys
import os
sys.path.insert(0, r"C:\Program Files\Odoo 18\server")

import odoo
from odoo import api

# Initialize Odoo
odoo.tools.config.parse_config([
    '-c', r'C:\Program Files\Odoo 18\server\odoo.conf',
    '-d', 'ai_automator_db'
])

registry = odoo.registry('ai_automator_db')

# Path to JSONL files
JSONL_DIR = r"C:\Users\total\.claude\projects\C--Users-total"

print("=" * 70)
print("IMPORTING CLAUDE CODE SESSIONS TO ODOO")
print("=" * 70)

with registry.cursor() as cr:
    env = api.Environment(cr, 1, {})

    # Get all JSONL files
    jsonl_files = [f for f in os.listdir(JSONL_DIR) if f.endswith('.jsonl')]
    total_files = len(jsonl_files)

    print(f"\nFound {total_files} JSONL files to import\n")

    importer = env['ai.conversation.import']

    success_count = 0
    error_count = 0
    skip_count = 0

    for idx, filename in enumerate(jsonl_files, 1):
        filepath = os.path.join(JSONL_DIR, filename)

        try:
            # Check if already imported (by filename or session ID)
            session_id = filename.replace('.jsonl', '')
            existing = env['ai.conversation'].search([
                ('name', 'ilike', session_id)
            ], limit=1)

            if existing:
                skip_count += 1
                if idx % 10 == 0:
                    print(f"[{idx}/{total_files}] SKIP: {filename[:40]}... (already exists)")
                continue

            # Create import record
            import_record = importer.create({
                'name': f'Import {filename}',
                'source_path': filepath,
                'skip_duplicates': True,
            })

            # Run import
            import_record.action_validate_source()

            if import_record.is_valid:
                import_record.action_import_data()

                if import_record.imported_conversations > 0:
                    success_count += 1
                    print(f"[{idx}/{total_files}] OK: {filename[:40]}... ({import_record.imported_messages} messages)")
                else:
                    skip_count += 1
            else:
                error_count += 1
                print(f"[{idx}/{total_files}] ERROR: {filename[:40]}...")

            # Commit every 10 imports
            if idx % 10 == 0:
                cr.commit()

        except Exception as e:
            error_count += 1
            print(f"[{idx}/{total_files}] ERROR: {filename[:40]}... - {str(e)[:50]}")

    # Final commit
    cr.commit()

    print("\n" + "=" * 70)
    print("IMPORT COMPLETE!")
    print("=" * 70)
    print(f"  Total files:     {total_files}")
    print(f"  Imported:        {success_count}")
    print(f"  Skipped:         {skip_count}")
    print(f"  Errors:          {error_count}")
    print("=" * 70)

    # Now embed all conversations
    print("\nEmbedding conversations to ChromaDB...")

    vector_service = env['ai.vector.service']
    all_convs = env['ai.conversation'].search([])

    embedded = 0
    for conv in all_convs:
        if conv.ai_message_ids:
            try:
                result = vector_service.add_conversation_embedding(conv.id)
                if result.get('success'):
                    embedded += 1
            except:
                pass

    cr.commit()

    print(f"Embedded {embedded} conversations to ChromaDB")
    print("\nDONE! SAM can now search your conversation history.")
Was this helpful?