From c70ee8816e5dcc2e9d9db354c0d32e6f8bcb7cfa Mon Sep 17 00:00:00 2001 From: Mai Development Date: Mon, 26 Jan 2026 22:43:41 -0500 Subject: [PATCH] Complete fresh slate --- .editorconfig | 11 - .mai/config/memory.yaml | 171 - .mai/config/sandbox.yaml | 74 - .mai/logs/sandbox_audit_20260125.jsonl | 0 .mai/logs/sandbox_audit_20260126.jsonl | 0 .pre-commit-config.yaml | 7 - data/mai_memory.db | Bin 90112 -> 0 bytes mai.log | 7123 ---------------------- pyproject.toml | 35 - scripts/bootstrap.ps1 | 9 - scripts/bootstrap.sh | 15 - scripts/check.ps1 | 7 - scripts/check.sh | 10 - scripts/contextpack.py | 86 - src/Mai.egg-info/PKG-INFO | 17 - src/Mai.egg-info/SOURCES.txt | 42 - src/Mai.egg-info/dependency_links.txt | 1 - src/Mai.egg-info/requires.txt | 12 - src/Mai.egg-info/top_level.txt | 2 - src/app/__init__.py | 1 - src/app/__main__.py | 1882 ------ src/mai.log | 2 - src/mai/conversation/__init__.py | 20 - src/mai/conversation/decomposition.py | 458 -- src/mai/conversation/engine.py | 648 -- src/mai/conversation/interruption.py | 333 - src/mai/conversation/reasoning.py | 284 - src/mai/conversation/state.py | 386 -- src/mai/conversation/timing.py | 281 - src/mai/core/__init__.py | 13 - src/mai/core/config.py | 738 --- src/mai/core/exceptions.py | 834 --- src/mai/core/interface.py | 1015 --- src/mai/git/__init__.py | 12 - src/mai/git/committer.py | 499 -- src/mai/git/health_check.py | 1011 --- src/mai/git/workflow.py | 399 -- src/mai/memory/__init__.py | 95 - src/mai/memory/compression.py | 780 --- src/mai/memory/manager.py | 1056 ---- src/mai/memory/retrieval.py | 1628 ----- src/mai/memory/storage.py | 822 --- src/mai/model/__init__.py | 14 - src/mai/model/compression.py | 522 -- src/mai/model/ollama_client.py | 316 - src/mai/model/resource_detector.py | 497 -- src/mai/model/switcher.py | 594 -- src/mai/models/__init__.py | 40 - src/mai/models/conversation.py | 172 - src/mai/models/memory.py | 256 - src/mai/sandbox/__init__.py | 29 - src/mai/sandbox/approval_system.py | 431 -- src/mai/sandbox/audit_logger.py | 442 -- src/mai/sandbox/docker_executor.py | 432 -- src/mai/sandbox/manager.py | 439 -- src/mai/sandbox/resource_enforcer.py | 337 - src/mai/sandbox/risk_analyzer.py | 260 - tests/test_docker_executor.py | 378 -- tests/test_docker_integration.py | 341 -- tests/test_integration.py | 632 -- tests/test_memory_system.py | 351 -- tests/test_sandbox_approval.py | 409 -- tests/test_sandbox_docker_integration.py | 403 -- tests/test_smoke.py | 2 - 64 files changed, 28116 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .mai/config/memory.yaml delete mode 100644 .mai/config/sandbox.yaml delete mode 100644 .mai/logs/sandbox_audit_20260125.jsonl delete mode 100644 .mai/logs/sandbox_audit_20260126.jsonl delete mode 100644 .pre-commit-config.yaml delete mode 100644 data/mai_memory.db delete mode 100644 mai.log delete mode 100644 pyproject.toml delete mode 100644 scripts/bootstrap.ps1 delete mode 100755 scripts/bootstrap.sh delete mode 100644 scripts/check.ps1 delete mode 100755 scripts/check.sh delete mode 100755 scripts/contextpack.py delete mode 100644 src/Mai.egg-info/PKG-INFO delete mode 100644 src/Mai.egg-info/SOURCES.txt delete mode 100644 src/Mai.egg-info/dependency_links.txt delete mode 100644 src/Mai.egg-info/requires.txt delete mode 100644 src/Mai.egg-info/top_level.txt delete mode 100644 src/app/__init__.py delete mode 100644 src/app/__main__.py delete mode 100644 src/mai.log delete mode 100644 src/mai/conversation/__init__.py delete mode 100644 src/mai/conversation/decomposition.py delete mode 100644 src/mai/conversation/engine.py delete mode 100644 src/mai/conversation/interruption.py delete mode 100644 src/mai/conversation/reasoning.py delete mode 100644 src/mai/conversation/state.py delete mode 100644 src/mai/conversation/timing.py delete mode 100644 src/mai/core/__init__.py delete mode 100644 src/mai/core/config.py delete mode 100644 src/mai/core/exceptions.py delete mode 100644 src/mai/core/interface.py delete mode 100644 src/mai/git/__init__.py delete mode 100644 src/mai/git/committer.py delete mode 100644 src/mai/git/health_check.py delete mode 100644 src/mai/git/workflow.py delete mode 100644 src/mai/memory/__init__.py delete mode 100644 src/mai/memory/compression.py delete mode 100644 src/mai/memory/manager.py delete mode 100644 src/mai/memory/retrieval.py delete mode 100644 src/mai/memory/storage.py delete mode 100644 src/mai/model/__init__.py delete mode 100644 src/mai/model/compression.py delete mode 100644 src/mai/model/ollama_client.py delete mode 100644 src/mai/model/resource_detector.py delete mode 100644 src/mai/model/switcher.py delete mode 100644 src/mai/models/__init__.py delete mode 100644 src/mai/models/conversation.py delete mode 100644 src/mai/models/memory.py delete mode 100644 src/mai/sandbox/__init__.py delete mode 100644 src/mai/sandbox/approval_system.py delete mode 100644 src/mai/sandbox/audit_logger.py delete mode 100644 src/mai/sandbox/docker_executor.py delete mode 100644 src/mai/sandbox/manager.py delete mode 100644 src/mai/sandbox/resource_enforcer.py delete mode 100644 src/mai/sandbox/risk_analyzer.py delete mode 100644 tests/test_docker_executor.py delete mode 100644 tests/test_docker_integration.py delete mode 100644 tests/test_integration.py delete mode 100644 tests/test_memory_system.py delete mode 100644 tests/test_sandbox_approval.py delete mode 100644 tests/test_sandbox_docker_integration.py delete mode 100644 tests/test_smoke.py diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 3f56a53..0000000 --- a/.editorconfig +++ /dev/null @@ -1,11 +0,0 @@ -root = true - -[*] -end_of_line = lf -insert_final_newline = true -charset = utf-8 -trim_trailing_whitespace = true - -[*.py] -indent_style = space -indent_size = 4 diff --git a/.mai/config/memory.yaml b/.mai/config/memory.yaml deleted file mode 100644 index 58ab736..0000000 --- a/.mai/config/memory.yaml +++ /dev/null @@ -1,171 +0,0 @@ -# Memory System Configuration for Mai - -# Compression settings -compression: - # Triggers for automatic compression - thresholds: - message_count: 50 # Compress after 50 messages - age_days: 30 # Compress conversations older than 30 days - memory_limit_mb: 500 # Compress when memory usage exceeds 500MB - - # AI summarization configuration - summarization: - model: "llama2" # Model to use for summarization - preserve_elements: # Elements to preserve in compression - - "preferences" # User preferences and choices - - "decisions" # Important decisions made - - "patterns" # Interaction and topic patterns - - "key_facts" # Critical information and facts - min_quality_score: 0.7 # Minimum acceptable summary quality - max_summary_length: 1000 # Maximum summary length in characters - context_messages: 30 # Messages to include for context - - # Adaptive weighting parameters - adaptive_weighting: - importance_decay_days: 90 # Days for importance decay - pattern_weight: 1.5 # Weight for pattern preservation - technical_weight: 1.2 # Weight for technical conversations - planning_weight: 1.3 # Weight for planning conversations - recency_boost: 1.2 # Boost for recent messages - keyword_boost: 1.5 # Boost for preference keywords - - # Compression strategy settings - strategy: - keep_recent_count: 10 # Recent messages to always keep - max_patterns_extracted: 5 # Maximum patterns to extract - topic_extraction_method: "keyword" # Method for topic extraction - pattern_confidence_threshold: 0.6 # Minimum confidence for pattern extraction - -# Context retrieval settings -retrieval: - # Search configuration - search: - similarity_threshold: 0.7 # Minimum similarity for semantic search - max_results: 5 # Maximum search results to return - include_content: false # Include full content in results - - # Multi-faceted search weights - weights: - semantic_similarity: 0.4 # Weight for semantic similarity - keyword_match: 0.3 # Weight for keyword matching - recency_weight: 0.2 # Weight for recency - user_pattern_weight: 0.1 # Weight for user patterns - - # Adaptive search settings - adaptive: - conversation_type_detection: true # Automatically detect conversation type - weight_adjustment: true # Adjust weights based on context - context_window_limit: 2000 # Token limit for context retrieval - - # Performance tuning - performance: - cache_search_results: true # Cache frequent searches - cache_ttl_seconds: 300 # Cache time-to-live in seconds - parallel_search: false # Enable parallel search (experimental) - max_search_time_ms: 1000 # Maximum search time in milliseconds - -# Pattern extraction settings -patterns: - # Granularity levels - extraction_granularity: - fine: # Detailed extraction for important conversations - message_sample_size: 50 - pattern_confidence: 0.8 - medium: # Standard extraction - message_sample_size: 30 - pattern_confidence: 0.7 - coarse: # Broad extraction for old conversations - message_sample_size: 20 - pattern_confidence: 0.6 - - # Pattern types to extract - types: - user_preferences: - enabled: true - keywords: - - "prefer" - - "like" - - "want" - - "should" - - "don't like" - - "avoid" - confidence_threshold: 0.7 - - interaction_patterns: - enabled: true - metrics: - - "message_length_ratio" - - "response_time_pattern" - - "question_frequency" - - "clarification_requests" - - topic_preferences: - enabled: true - max_topics: 10 - min_topic_frequency: 3 - - emotional_patterns: - enabled: false # Future enhancement - sentiment_analysis: false - - decision_patterns: - enabled: true - decision_keywords: - - "decided" - - "chose" - - "selected" - - "agreed" - - "rejected" - -# Memory management settings -management: - # Storage limits and cleanup - storage: - max_conversation_age_days: 365 # Maximum age before review - auto_cleanup: false # Enable automatic cleanup - backup_before_cleanup: true # Backup before cleanup - - # User control settings - user_control: - allow_conversation_deletion: true # Allow users to delete conversations - grace_period_days: 7 # Recovery grace period - bulk_operations: true # Allow bulk operations - - # Privacy settings - privacy: - anonymize_patterns: false # Anonymize extracted patterns - pattern_retention_days: 180 # How long to keep patterns - encrypt_sensitive_topics: true # Encrypt sensitive topic patterns - -# Performance and monitoring -performance: - # Resource limits - resources: - max_memory_usage_mb: 200 # Maximum memory for compression - max_cpu_usage_percent: 80 # Maximum CPU usage - max_compression_time_seconds: 30 # Maximum time per compression - - # Background processing - background: - enable_background_compression: true # Run compression in background - compression_interval_hours: 6 # Check interval for compression - batch_size: 5 # Conversations per batch - - # Monitoring and metrics - monitoring: - track_compression_stats: true # Track compression statistics - log_compression_events: true # Log compression operations - performance_metrics_retention_days: 30 # How long to keep metrics - -# Development and debugging -debug: - # Debug settings - enabled: false # Enable debug mode - log_compression_details: false # Log detailed compression info - save_intermediate_results: false # Save intermediate compression results - - # Testing settings - testing: - mock_summarization: false # Use mock summarization for testing - force_compression_threshold: false # Force compression for testing - disable_pattern_extraction: false # Disable pattern extraction for testing \ No newline at end of file diff --git a/.mai/config/sandbox.yaml b/.mai/config/sandbox.yaml deleted file mode 100644 index cf9a70d..0000000 --- a/.mai/config/sandbox.yaml +++ /dev/null @@ -1,74 +0,0 @@ -# Mai Sandbox Configuration -# -# This file contains all sandbox-related settings for safe code execution - -# Resource Limits -resource_limits: - cpu_percent: 70 # Maximum CPU usage percentage - memory_percent: 70 # Maximum memory usage percentage - timeout_seconds: 30 # Maximum execution time in seconds - bandwidth_mbps: 50 # Maximum network bandwidth in MB/s - max_processes: 10 # Maximum number of processes - -# Approval Settings -approval: - auto_approve_low_risk: true # Automatically approve low-risk operations - require_approval_high_risk: true # Always require approval for high-risk operations - remember_preferences: true # Remember user preferences for similar operations - batch_approval: true # Allow batch approval for similar operations - session_timeout: 3600 # Session timeout in seconds (1 hour) - -# Risk Thresholds -risk_thresholds: - low_threshold: 0.3 # Below this is low risk - medium_threshold: 0.6 # Below this is medium risk - high_threshold: 0.8 # Below this is high risk, above is critical - -# Docker Settings -docker: - image_name: "python:3.11-slim" # Docker image for code execution - network_access: false # Allow network access in sandbox - mount_points: [] # Additional mount points (empty = no mounts) - volume_size: "1G" # Maximum volume size - temp_dir: "/tmp/mai_sandbox" # Temporary directory inside container - user: "nobody" # User to run as inside container - -# Audit Logging -audit: - log_level: "INFO" # Log level (DEBUG, INFO, WARNING, ERROR) - retention_days: 30 # How many days to keep logs - mask_sensitive_data: true # Mask potentially sensitive data in logs - log_file_path: ".mai/logs/audit.log" # Path to audit log file - max_log_size_mb: 100 # Maximum log file size before rotation - enable_tamper_detection: true # Enable log tamper detection - -# Security Settings -security: - blocked_patterns: # Regex patterns for blocked operations - - "rm\\s+-rf\\s+/" # Dangerous delete commands - - "dd\\s+if=" # Disk imaging commands - - "format\\s+" # Disk formatting - - "fdisk" # Disk partitioning - - "mkfs" # Filesystem creation - - "chmod\\s+777" # Dangerous permission changes - - quarantine_unknown: true # Quarantine unknown file types - scan_for_malware: false # Scan for malware (requires external tools) - enforce_path_restrictions: true # Restrict file system access - -# Performance Settings -performance: - enable_caching: true # Enable execution result caching - cache_size_mb: 100 # Maximum cache size - enable_parallel: false # Enable parallel execution (not recommended) - max_concurrent: 1 # Maximum concurrent executions - -# User Preferences (auto-populated) -user_preferences: - # Automatically populated based on user choices - # Format: operation_type: preference - -# Trust Patterns (learned) -trust_patterns: - # Automatically populated based on approval history - # Format: operation_type: approval_count \ No newline at end of file diff --git a/.mai/logs/sandbox_audit_20260125.jsonl b/.mai/logs/sandbox_audit_20260125.jsonl deleted file mode 100644 index e69de29..0000000 diff --git a/.mai/logs/sandbox_audit_20260126.jsonl b/.mai/logs/sandbox_audit_20260126.jsonl deleted file mode 100644 index e69de29..0000000 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index 057b52e..0000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,7 +0,0 @@ -repos: - - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.6.9 - hooks: - - id: ruff - args: ["--fix"] - - id: ruff-format diff --git a/data/mai_memory.db b/data/mai_memory.db deleted file mode 100644 index 33a4fef134438f9a368f6c3f5a935ee49579088e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90112 zcmeHwZ)_Y%b|0xBIn;nZP*7SA8aJZ2j`n%!?2UsKo0(JUlIgK zfHM#y#vw@FtDYIo3^`;`x9hv;io!~qsaI96e)Zm~SFc{xK6&q5FQ&u|!loG$b?mjV z@$s?0PsrHV*ev|_7W~)!xd6XRbU(nq<9)x6`gL}!xbq9y{Qn+%ZQ`Gf<-U>sw=;h3 z>4o3T{O1d1CUyQh)Bh{|z3FdH{@2O&WDW?#k3c{mAP^Yac`ZGAYkqwH4bOMzbI*Bh z*nz)8!^n)iz>kb}%Q0i>41D?8oyRM+^%b(Z_Rh)|$;dk7;TjpJx6oUFy|Faj;v+un(zF%WA-{rqIpOLXc?KlVxyWaM< zBS|`);=+Jr%$;6gZXuC~eo07rjmYhHAKvcG_M$yAHM{%X_!v{b==}ybCx+RM1NIq& zm1(0fnt4M$on~fV&wv8n8b25x1qov}I;N?lAag1J30-&G$7lknZLB|BU4w=mtgNjs zdCn5UALYM8-T5ML-H68BFBc!3pPK#bXUCs0&N~1_^!+yVZ94Sv`~a6jg$usfq)Sk9 zaerevK|>#fMj{!sA9aX&Scp8fpi$M>&}8kgt0!7-!4ucuBO6H?8Qg>AY=V){HLt#`<^xuw-K1}&!|=HOUE|0_`*%4XRlrz|M_eE+;{aXniv4R!(udI zo#`$V{Wj&;Ui&R4=kgK;4LZ0wkURHR?tFoO9fOk9HL@_@j%YZ)MCQ#X^1w0hWBd^9 zMKNv8FD@Q$@qv|?`dkZ7&s!MeM2qm^~5}yJW$5dv-9)gUrXe=f6k(T59bDCWT5DW6_nVEho}8`?CdkS5QqLH z&s28(v4pleiSr+RW&Vh8FY4!}W*^LtLU{liLmv2;f=$LWZZsz0zw!JJ@Ygq!fAClF zBM=Y>2m}NI0s(=5KtLcM5D*9m1Ox&C0fE4)gTNc<3=C!_cWEsDrTp*YelK@3cPaP1 zyq5oq{71QO=P%^8UY)Uukq86?0s;YnfIvVXAP^7;2m}NI0s(=*5d;=e8{<`lN~&yC z3a+Z?1J^^wk^}L7oqN>q?MQyuaX{Kq*<&rH`o%2XoH8sgrX|>>5(5oiF zh=9;6s3lo-DpZn6W;M-tENfM>QdJ9uX zswi@`A{8{f0z4`eU_w{qf~h!`4Fl3Dnw3IAtxR1DDgwfQo~D#&p{kau0D=TxR4heN z%ID@&8|QUP*Ch*pE1Rwb&Dzj)89r7OU;{=B^eUeJr}E!N5qK;AgZy9Tzn}j7^o^;D zli!^9^VID4uT8u+R!V(mNJ0+$*QTFsTzm1=+BD?=%m9fw9oAkR&FXxUIFRtSMRsYU zu|(p!>2H(0ppCZ_h#74|QIQ~(Ng8IjMd5FMs|{JYq!~CAYD589g(m#@nAFW3xZOZ$ z11d!X>eFVxa)?R8+oq)6Zkm1sv`fTlL+%VTTBjjqZaD;!JRHdF3gDYYi}kT zB9LwuC9Ob=M%opm89$g&*e`ZAct*k8H7V0>7>q z-clr`T#)2~QeIc&Wwo+g(u;CcRjT@dpX&n7Bg%%%LnQz|7Vt_*Eh+n{Z2H;8rBZF0 z2T4QXp~8f*`yP2$(&A@fiTP87gL?KWHw>_Kb?O;|7;ChB0jisUKIna9wC zYc)w>-%8k|IEi7~KL$mqD9cJ&SN7AB2;&XTae&`>x}$_Ju8d&*D5PCZzJ7TEA^paa z+BA=oWym~KJxJFBvK!)MOOv=BB$}dhgJrebVTd`wju*0f7?3><05Um*Q81ECYS)9! z9=>kSXau{U9~QVL&;n-ilfY%avzD>`E@UKQ7fG%v_#q(e;CX;aqR-(LQ-dyNGMk&5 zmKoJE*gToL58hTlo(5sVnIkv5d>PncF@7E+btbc3hsoac8jViFFc_ciCIdn~9J1LN zP_N=9Dk<_AA)mcrf(=N%wL`BJ7c-evm-$ejl8-Uzt!#{oejG+YGj}3$) zqN!Gkk_=*2*?%*IO7fIbG9@0#L?wC3Bax%o`lxyiHRhXdz&gvZ+kkbJgQ}-7U7013 zhZ0L3?ST>ZNyH=uga=GdG65jhObltW1#1FIY$Dw)Rw46ga))JX8>Rumnh0iVFOzYo z+i9S$WMOfcWm?DKUh)gxabpV=2%Nt#*J}ZEVs44d?anQtC?}ov--m+>A%46tR~uH4 z`TiE>VTTfdI8wjEiBp_gWc}0UHf_b^E(~TZi0?vfzq1mCL3qeirvnsj?41lXybBHc zK@7GUs$#1d&n1R|T51^N#tkxO7){gj4P!28Gr@8IijLAV6Aplb?kC{G9t$^Cu&{!O zG0A4JwYQltfvZDz*?{6im6M6ig0}6-H zw&A{14-M>M$uCjB&($T)>{<(lz+&^{epLMRxvw`NH3f<^DtNH}d}|zmffi+4p8X zn0Yw!cQ5=+_D{3Fp8L7nll*_m|7QMr?*C?gYUT&Ih3x;C`IDJ{0hPs%KtLcM5D*9m z1Ox&C0fB%(Kp^n{3j)_u&$!Nb4f$9HYyiknorf}}i0 z&4&CIH>q?9NqNp(4Ec3#Qt2X+@|-ala*mr+$|5Px`HLZ6<|dV9k(B3b!jLoEq|$jL zR*NjKC^*i^cW>cwB=W*9w$%ECkhmU8^rAnRGSPu(o{{RZcQ;Syy+uDJww_+LZ z|4-!q`B?sc=Ko{<-@q^8M<5^&5C{ka1Ofs9fq+0jARrJB2nYlO0s?^_1p=2xgaIaw zDPU26)NutE1vqyxwKxQNC0s;YnfIvVXAP^7;2m}NI0s(=5KtLdX@BfMW z|3VG~0s;YnfIvVXAP^7;2m}NI0s(=5KtLeyY9k=d|6lF-6{8af2m}NI0s(=5KtLcM z5D*9m1Ox&C0f7J_fam|0XBNkD-^=}8{-gYtvcH^tf96+bKAd?xvzYzw*+0mAJGYhp zi~R58wfu$b{p_{e&D^D#zn=Lcfu2A>ARrJB2nYlO0s;YnfIvVX@CqZaklGlpDpXQs zt5R@PMK5S}NiOI%e6($umL11dC6m6*OL!Ft%eE$4s-zZlO}7hLwd@vj)iDdE?dqyx zNtz{92ruC^B&5{VWm9$vs!l5f&9#(*Wm-}}uc~&rs>_O0(musYcm)Y5-L?% zvK+TuaHbTB^d-OYlX-QWT{;!AqDzLfz7J$pQf^o2~_n z+A!)ee5@*f0L(Kqte%@sZJg&JWc&Z@m9hNy@_&&3)%@4ou!vi~akPqNkQmF!OT=__pM#Lxr+0s(=5KtLcM5D*9m1Ox&CfuA%4 z-cHrV6-g-@! zpE|kt%F$vOIIk9^vI@Mvb#n2g;bM8YR9aS)qF&JyNqYU{;)_R%)yi^7FUpmYT2gW+ z7iWiymE{iSRY1LT`Q+l+;bM7N10a=Ea@OEs;ZRET}{=__X%<`uwF6l|7UXF>fisf z-GBZb?Ek-&`>mfewHMRQIjP0aQyzi z)D12izyI$=4^G+tuPgPB_w{^j}X^o#WGr*BMMoc!j*pQmQWe=YSL{4+H7 zsed;9{oWS$9$S!R(mPlMT{cW-rw22#p z#EiC~s7R2?Bn>m%qVTuB)i&XmX5dh$5d~xwn(*giQa5)faVc#;rHDX%+6-bZ@FUXj zwkfH%nNxpsy>9j z_$Uw%2nYlO0zX;=K1`>dZCv_HZJH+$(U5qk+7S&~xc13K_NQ-67&?;JzdJPzi}3#E zYSTPfi-ycYb+`x<+w=*2PVIIK%OQ#OqL?;`9W-IVbl6G^>sgUJt(!6NB3Ptpudr_= zY*Ji6!?xeQxOE27bzt_>lL+Gt&T&AF@##652;<5K=8rc#^ClJzaJgH6dq-`2- zI&*q*XAjc#fb51IL(}yd3>b!5I}E8GgU1k3I}XCVCFW}&{4fdz>?XDA!DbI%H)u41 zUFr}E+!MgvHv#6rWxunQVFJi5cv6VH4Q@PncF@7E+btbc3hsoac8jViFAR0d1C9GTI!y%i)6*r0J zGu|TPvo}oec7t{UkUMSor;nd8l%V^ufpA1Ldv5&x zn<-S1r<{^0@kk~r$x|MQ9L?58)pMvZ-+ZGs&690x$UIa%jp@oPi9D28@@Oxv2R@0I z#DMUC=}9I4UJ9FD_K}v&Jg&C z!@cAe{J=ba5IBEfuGa$S#M}~@+nrlPQAQ0oq{lj~(DUPkx!SOT%=fo24?C0y#F6?P zPMqT0BI}<%w`nUTccI<2Aif*4eP<;MgYdAEP6sI5O#g-&-i3z!AO>3vRk78K=Muv} zEj0{s;|7^CjHc=NhB244nP52pMMvqG2?xMI_Y?48kA)j6kC_;gY!+L4n+X%RI&_x} zC{9#4nYccSlT6I<(=uddVC&R^-4hzRCXFK8=Dh@_1jdd{FraW4ZQF*{+;*d}*F&Cw z3F;9!0Zs6u&tYG>gkxoPkD*THI8i^MI=z$k{nR*Wbcs`QBp%H{jZQ=z6rzJMj(9W| z+0^z}?%a3BvTw|M>%29SPJciBUhdWfFZ0&acPD>g^3914&V3jE{Ae95(Yrw4>oZdPr>Y517Dlx${xfJIWG3~Jcm2r=dKO~?xLVcVF?4zk~X3v6V(?gj;^5CT;gO* z;$aNMCWe?{pCLx+=I?cUki3MVb z8&bCUY0wx}bh7PZgcQ7n)p^)eI00$yLFFj%ELcpqNFKtf9PWA%T}lGFCfP!V4nwGa zXAsi5(}P(dW|Mrm zjR0W~8s-FD7G{oYjDY(d?1}pM8$8K4@N-PgAa>7lY1EK;sCs%QV)u|LJa{&=FJ}<& z{Yh~2IBvkg7KwxEWWZrJl4v1FM{)vz(S$yG7zdy^154Flvh2a5x4OoN=k~K9^H3e~ z{1ax3*a2g7sbh?IpfV&LsuPV7>lB=aMJ@+oKb1xHU^Bv_?%*nM+&53G78)(E+Gyip zIe?XCSnT@p!}n9?J6!PSfFbcvadOd@DSogxjlzG>=8WsgJaOGa;m5!#984x(B!PvH zvI9kohry!OgmXa)gJ2L$g8&{{d3JF5ywwO`oi@o%yWvCV%kml?L^~k3)(g*q*84Qx z4Z>~KFrGS6sOH&NuMNSI(EFgfxU=XROv#{I1XcoV#lVqg|BMXhJ>=g<6ix@SHAqI+033Kt`pqYgc4_*C^UtPJACf+(&dtcT~G>c z9iC6a$k-G?R0G-eDaZ;QOn0FJPXJ_LtL-_aZ_@!EY0w?WPW}6_smUi}xqqC^UihWV z=cfPNFhaeIN2m}NI0)Z|92Yx!eQL5Fxmg4b}?t5qPkOud4{V8Z4 z&UK>Wh7Ixlcy5^}a5#~K^c};*FXl$oRw{Uq(QY|#Qg|Azsv&KEpumXtS`?e_Wvbs(UF+Ki3~5VW$xG;3 zueMe_Ro8m7rP9Z*YjBHLh6}Bg3aDH~leB8TswvVbs&?Q`q&Gf;wvA`g!fIJQK4sH1p0bMC6RYle`K)(cQNk8aH`84VN>bdmBQv{tS zed32qoj5WByBps}bs`XC* z2Q=%ELF;I_fjjVYFU>x3BA_d)=h^G-HAFb8uemphT;3s zC7y(mlaomX@$JuTIXk|GwN-}MN%$VpYE172RHYm4>)Rs?lqaghGx#&B63mRI>M}$w z;6X86Qc?1I6H`Lh_a!t*)vEB+7CbSgYG>4>pS{3l`o&jyPU}a`G&`w3cBWa$OV2da zR@jDvW2S*tRYq!3-%OuzH+b4~ouo(yyLq-+K^&bUG4sr;Rq~MEAnyH7{GA>5UTsxB zRl|C;n)C@+FpeeXB;>*C+599upBK~T(;FVfS$NU`KCaBS{;3{31V8Ik_tlmwC&w9K zo_p^n!ft$|iv19aRaKJ9@KB(lYPzDS^59~H7VV^|#{2*0QolYnQHH<7k3c{m@Z*TU z{>(MZjDxETJX;h);-SLKxHGSs$xiMU@4by_U%xGLUagRMR`71_QVdtCAY}{F1tZMc zG8?@_FG%m|UbMjEt_C$jACkY2nmw_xV}@SPhU6;tBnRBt^6f_3!91;2vb9$cO4CY7;N zUC)Pv-6m^|zy(K42!j^tNef`U9gn>>0&k&U+B?e^3tFA8lBY@{fWod9fvHEmk&<;x z^Tn=r6TXxD!oYQ5mk1+_J-b08c=-fifqyy;b#Ao)8(lO_O!|-E^%Qpi#zSy1JKt;} znzZ2-FflD@4KCy%z=vmI zFfGsCvm0>R6Uq|ET4AsQJ;FmVG=_^lkZdzy2_3?hYUt^<*ab z6k?}7jD>Z`;o#)`699gd66`H3I1RxOyBSpHfjVuwKJNt<0ld)XTzaQCc3TTAnD-N z9V1FE^aa_ikPm_aGCUolEJ069SPOUr!%PI5z1u;s-Bt8j)BGUtQBHPD%*IWo%|Z(3 z6))*SeyVMDQdJY_1YH10fbpZ=Fw%a`5(|YRy$v=D=JBV3=f0l zQQ+8sK^Ga+=k=9$$YYrH0A4q0huBdoAxd!RX>^|wv-{MLnhdw1K+|#h>OmVW@uNw1 z&^q-^;!$JXo3<0Qn=u4e@{X{B3DGcTaOv9H>U+ounE)+fj}nB)3&E+~!-QbeOe_XN zjCz+OPy@J6;a;cfU8VL`m+P9G}2}fS-W+qf!jYZcn882h)>^L)a3t-|2zj z_D*28+4726<=thR#%{xVj=e;U9o`U3 z9{3s%ZBKaL3Sdp?Uq8T7!Luw~BIXK=Tw&2_bi@)_LPNO@Hzk>V9*zPL$EAGG|G_Jj zXZ3bQNq&FmWAJ}uf&2gQi8Ac}e;l_xf+vB1K;Xv@fnU5wy8C~gNP{8sP>KD2vRe@Q zf3g2(u0SVH)7|BY{Xguylh~Em{~rb$#Qy)-=$_dBi~T=Dq*>giFK#0C{}`MW`+u?j IPfqgwAMN$E&Hw-a diff --git a/mai.log b/mai.log deleted file mode 100644 index 6f2781e..0000000 --- a/mai.log +++ /dev/null @@ -1,7123 +0,0 @@ -20:43:02 - mai.model.ollama_client - WARNING - Failed to initialize Ollama client: 'Config' object has no attribute 'partition' -20:43:18 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -20:43:18 - urllib3.connectionpool - DEBUG - Starting new HTTPS connection (1): openaipublic.blob.core.windows.net:443 -20:43:18 - urllib3.connectionpool - DEBUG - https://openaipublic.blob.core.windows.net:443 "GET /encodings/cl100k_base.tiktoken HTTP/1.1" 200 1681126 -20:43:19 - urllib3.connectionpool - DEBUG - Starting new HTTPS connection (1): openaipublic.blob.core.windows.net:443 -20:43:19 - urllib3.connectionpool - DEBUG - https://openaipublic.blob.core.windows.net:443 "GET /encodings/p50k_base.tiktoken HTTP/1.1" 200 836186 -20:43:31 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -20:43:31 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:43:31 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -20:43:31 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:43:31 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -20:43:31 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -20:43:31 - mai.core.interface - INFO - Mai interface initialized -20:43:31 - mai.core.interface - INFO - Initializing Mai interface... -20:43:31 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -20:43:31 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -20:43:31 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:43:31 - httpcore.http11 - DEBUG - send_request_headers.complete -20:43:31 - httpcore.http11 - DEBUG - send_request_body.started request= -20:43:31 - httpcore.http11 - DEBUG - send_request_body.complete -20:43:31 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:43:31 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:43:31 GMT'), (b'Content-Length', b'337')]) -20:43:31 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:43:31 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:43:31 - httpcore.http11 - DEBUG - receive_response_body.complete -20:43:31 - httpcore.http11 - DEBUG - response_closed.started -20:43:31 - httpcore.http11 - DEBUG - response_closed.complete -20:43:31 - mai.model.ollama_client - INFO - Found 1 models -20:43:32 - mai.core.interface - WARNING - Git repository health check failed -20:43:32 - mai.core.interface - ERROR - Initialization failed: 'dict' object has no attribute 'name' -20:43:57 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -20:43:58 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:43:58 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -20:43:58 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:43:58 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -20:43:58 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -20:43:58 - mai.core.interface - INFO - Mai interface initialized -20:43:58 - mai.core.interface - INFO - Initializing Mai interface... -20:43:58 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -20:43:58 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -20:43:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:43:58 - httpcore.http11 - DEBUG - send_request_headers.complete -20:43:58 - httpcore.http11 - DEBUG - send_request_body.started request= -20:43:58 - httpcore.http11 - DEBUG - send_request_body.complete -20:43:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:43:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:43:58 GMT'), (b'Content-Length', b'337')]) -20:43:58 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:43:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:43:58 - httpcore.http11 - DEBUG - receive_response_body.complete -20:43:58 - httpcore.http11 - DEBUG - response_closed.started -20:43:58 - httpcore.http11 - DEBUG - response_closed.complete -20:43:58 - mai.model.ollama_client - INFO - Found 1 models -20:43:59 - mai.core.interface - WARNING - Git repository health check failed -20:43:59 - mai.core.interface - INFO - Selected initial model: -20:43:59 - mai.core.interface - INFO - Mai interface initialized successfully -20:44:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:44:00 - httpcore.http11 - DEBUG - send_request_headers.complete -20:44:00 - httpcore.http11 - DEBUG - send_request_body.started request= -20:44:00 - httpcore.http11 - DEBUG - send_request_body.complete -20:44:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:44:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:44:00 GMT'), (b'Content-Length', b'337')]) -20:44:00 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:44:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:44:00 - httpcore.http11 - DEBUG - receive_response_body.complete -20:44:00 - httpcore.http11 - DEBUG - response_closed.started -20:44:00 - httpcore.http11 - DEBUG - response_closed.complete -20:44:00 - mai.model.ollama_client - INFO - Found 1 models -20:44:00 - mai.core.interface - ERROR - Failed to get system status: 'dict' object has no attribute 'name' -20:44:18 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -20:44:18 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:44:18 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -20:44:18 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:44:18 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -20:44:18 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -20:44:18 - mai.core.interface - INFO - Mai interface initialized -20:44:18 - mai.core.interface - INFO - Initializing Mai interface... -20:44:18 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -20:44:18 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -20:44:18 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:44:18 - httpcore.http11 - DEBUG - send_request_headers.complete -20:44:18 - httpcore.http11 - DEBUG - send_request_body.started request= -20:44:18 - httpcore.http11 - DEBUG - send_request_body.complete -20:44:18 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:44:18 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:44:18 GMT'), (b'Content-Length', b'337')]) -20:44:18 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:44:18 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:44:18 - httpcore.http11 - DEBUG - receive_response_body.complete -20:44:18 - httpcore.http11 - DEBUG - response_closed.started -20:44:18 - httpcore.http11 - DEBUG - response_closed.complete -20:44:18 - mai.model.ollama_client - INFO - Found 1 models -20:44:19 - mai.core.interface - WARNING - Git repository health check failed -20:44:19 - mai.core.interface - INFO - Selected initial model: -20:44:19 - mai.core.interface - INFO - Mai interface initialized successfully -20:44:20 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:44:20 - httpcore.http11 - DEBUG - send_request_headers.complete -20:44:20 - httpcore.http11 - DEBUG - send_request_body.started request= -20:44:20 - httpcore.http11 - DEBUG - send_request_body.complete -20:44:20 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:44:20 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:44:20 GMT'), (b'Content-Length', b'337')]) -20:44:20 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:44:20 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:44:20 - httpcore.http11 - DEBUG - receive_response_body.complete -20:44:20 - httpcore.http11 - DEBUG - response_closed.started -20:44:20 - httpcore.http11 - DEBUG - response_closed.complete -20:44:20 - mai.model.ollama_client - INFO - Found 1 models -20:44:20 - mai.core.interface - ERROR - Failed to get system status: 'ContextCompressor' object has no attribute 'is_enabled' -20:44:33 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -20:44:33 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:44:33 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -20:44:33 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:44:33 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -20:44:33 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -20:44:33 - mai.core.interface - INFO - Mai interface initialized -20:44:33 - mai.core.interface - INFO - Initializing Mai interface... -20:44:33 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -20:44:33 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -20:44:33 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:44:33 - httpcore.http11 - DEBUG - send_request_headers.complete -20:44:33 - httpcore.http11 - DEBUG - send_request_body.started request= -20:44:33 - httpcore.http11 - DEBUG - send_request_body.complete -20:44:33 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:44:33 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:44:33 GMT'), (b'Content-Length', b'337')]) -20:44:33 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:44:33 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:44:33 - httpcore.http11 - DEBUG - receive_response_body.complete -20:44:33 - httpcore.http11 - DEBUG - response_closed.started -20:44:33 - httpcore.http11 - DEBUG - response_closed.complete -20:44:33 - mai.model.ollama_client - INFO - Found 1 models -20:44:34 - mai.core.interface - WARNING - Git repository health check failed -20:44:34 - mai.core.interface - INFO - Selected initial model: -20:44:34 - mai.core.interface - INFO - Mai interface initialized successfully -20:44:36 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:44:36 - httpcore.http11 - DEBUG - send_request_headers.complete -20:44:36 - httpcore.http11 - DEBUG - send_request_body.started request= -20:44:36 - httpcore.http11 - DEBUG - send_request_body.complete -20:44:36 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:44:36 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:44:36 GMT'), (b'Content-Length', b'337')]) -20:44:36 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:44:36 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:44:36 - httpcore.http11 - DEBUG - receive_response_body.complete -20:44:36 - httpcore.http11 - DEBUG - response_closed.started -20:44:36 - httpcore.http11 - DEBUG - response_closed.complete -20:44:36 - mai.model.ollama_client - INFO - Found 1 models -20:44:53 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -20:44:54 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:44:54 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -20:44:54 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:44:54 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -20:44:54 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -20:44:54 - mai.core.interface - INFO - Mai interface initialized -20:44:54 - mai.core.interface - INFO - Initializing Mai interface... -20:44:54 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -20:44:54 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -20:44:54 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:44:54 - httpcore.http11 - DEBUG - send_request_headers.complete -20:44:54 - httpcore.http11 - DEBUG - send_request_body.started request= -20:44:54 - httpcore.http11 - DEBUG - send_request_body.complete -20:44:54 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:44:54 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:44:54 GMT'), (b'Content-Length', b'337')]) -20:44:54 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:44:54 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:44:54 - httpcore.http11 - DEBUG - receive_response_body.complete -20:44:54 - httpcore.http11 - DEBUG - response_closed.started -20:44:54 - httpcore.http11 - DEBUG - response_closed.complete -20:44:54 - mai.model.ollama_client - INFO - Found 1 models -20:44:55 - mai.core.interface - WARNING - Git repository health check failed -20:44:55 - mai.core.interface - INFO - Selected initial model: -20:44:55 - mai.core.interface - INFO - Mai interface initialized successfully -20:44:55 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:44:55 - httpcore.http11 - DEBUG - send_request_headers.complete -20:44:55 - httpcore.http11 - DEBUG - send_request_body.started request= -20:44:55 - httpcore.http11 - DEBUG - send_request_body.complete -20:44:55 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:44:55 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:44:55 GMT'), (b'Content-Length', b'337')]) -20:44:55 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:44:55 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:44:55 - httpcore.http11 - DEBUG - receive_response_body.complete -20:44:55 - httpcore.http11 - DEBUG - response_closed.started -20:44:55 - httpcore.http11 - DEBUG - response_closed.complete -20:44:55 - mai.model.ollama_client - INFO - Found 1 models -20:44:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:44:57 - httpcore.http11 - DEBUG - send_request_headers.complete -20:44:57 - httpcore.http11 - DEBUG - send_request_body.started request= -20:44:57 - httpcore.http11 - DEBUG - send_request_body.complete -20:44:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:44:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:44:57 GMT'), (b'Content-Length', b'337')]) -20:44:57 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:44:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:44:57 - httpcore.http11 - DEBUG - receive_response_body.complete -20:44:57 - httpcore.http11 - DEBUG - response_closed.started -20:44:57 - httpcore.http11 - DEBUG - response_closed.complete -20:44:57 - mai.model.ollama_client - INFO - Found 1 models -20:50:27 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -20:50:27 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:50:27 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -20:50:27 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:50:27 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -20:50:27 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -20:50:27 - mai.core.interface - INFO - Mai interface initialized -20:50:27 - mai.core.interface - INFO - Initializing Mai interface... -20:50:27 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -20:50:27 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -20:50:27 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:50:27 - httpcore.http11 - DEBUG - send_request_headers.complete -20:50:27 - httpcore.http11 - DEBUG - send_request_body.started request= -20:50:27 - httpcore.http11 - DEBUG - send_request_body.complete -20:50:27 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:50:27 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:50:27 GMT'), (b'Content-Length', b'337')]) -20:50:27 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:50:27 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:50:27 - httpcore.http11 - DEBUG - receive_response_body.complete -20:50:27 - httpcore.http11 - DEBUG - response_closed.started -20:50:27 - httpcore.http11 - DEBUG - response_closed.complete -20:50:27 - mai.model.ollama_client - INFO - Found 1 models -20:50:29 - mai.core.interface - WARNING - Git repository health check failed -20:50:29 - mai.core.interface - INFO - Selected initial model: -20:50:29 - mai.core.interface - INFO - Mai interface initialized successfully -20:50:30 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:50:30 - httpcore.http11 - DEBUG - send_request_headers.complete -20:50:30 - httpcore.http11 - DEBUG - send_request_body.started request= -20:50:30 - httpcore.http11 - DEBUG - send_request_body.complete -20:50:30 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:50:30 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:50:30 GMT'), (b'Content-Length', b'337')]) -20:50:30 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:50:30 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:50:30 - httpcore.http11 - DEBUG - receive_response_body.complete -20:50:30 - httpcore.http11 - DEBUG - response_closed.started -20:50:30 - httpcore.http11 - DEBUG - response_closed.complete -20:50:30 - mai.model.ollama_client - INFO - Found 1 models -20:50:45 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -20:50:45 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:50:45 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -20:50:45 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:50:45 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -20:50:45 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -20:50:45 - mai.core.interface - INFO - Mai interface initialized -20:50:45 - mai.core.interface - INFO - Initializing Mai interface... -20:50:45 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -20:50:45 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -20:50:45 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:50:45 - httpcore.http11 - DEBUG - send_request_headers.complete -20:50:45 - httpcore.http11 - DEBUG - send_request_body.started request= -20:50:45 - httpcore.http11 - DEBUG - send_request_body.complete -20:50:45 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:50:45 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:50:45 GMT'), (b'Content-Length', b'337')]) -20:50:45 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:50:45 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:50:45 - httpcore.http11 - DEBUG - receive_response_body.complete -20:50:45 - httpcore.http11 - DEBUG - response_closed.started -20:50:45 - httpcore.http11 - DEBUG - response_closed.complete -20:50:45 - mai.model.ollama_client - INFO - Found 1 models -20:50:46 - mai.core.interface - WARNING - Git repository health check failed -20:50:46 - mai.core.interface - INFO - Selected initial model: -20:50:46 - mai.core.interface - INFO - Mai interface initialized successfully -20:50:46 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:50:46 - httpcore.http11 - DEBUG - send_request_headers.complete -20:50:46 - httpcore.http11 - DEBUG - send_request_body.started request= -20:50:46 - httpcore.http11 - DEBUG - send_request_body.complete -20:50:46 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:50:46 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:50:46 GMT'), (b'Content-Length', b'337')]) -20:50:46 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:50:46 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:50:46 - httpcore.http11 - DEBUG - receive_response_body.complete -20:50:46 - httpcore.http11 - DEBUG - response_closed.started -20:50:46 - httpcore.http11 - DEBUG - response_closed.complete -20:50:46 - mai.model.ollama_client - INFO - Found 1 models -20:50:48 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:50:48 - httpcore.http11 - DEBUG - send_request_headers.complete -20:50:48 - httpcore.http11 - DEBUG - send_request_body.started request= -20:50:48 - httpcore.http11 - DEBUG - send_request_body.complete -20:50:48 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:50:48 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:50:48 GMT'), (b'Content-Length', b'337')]) -20:50:48 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:50:48 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:50:48 - httpcore.http11 - DEBUG - receive_response_body.complete -20:50:48 - httpcore.http11 - DEBUG - response_closed.started -20:50:48 - httpcore.http11 - DEBUG - response_closed.complete -20:50:48 - mai.model.ollama_client - INFO - Found 1 models -20:50:59 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -20:51:00 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:51:00 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -20:51:00 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:51:00 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -20:51:00 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -20:51:00 - mai.core.interface - INFO - Mai interface initialized -20:51:00 - mai.core.interface - INFO - Initializing Mai interface... -20:51:00 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -20:51:00 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -20:51:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:51:00 - httpcore.http11 - DEBUG - send_request_headers.complete -20:51:00 - httpcore.http11 - DEBUG - send_request_body.started request= -20:51:00 - httpcore.http11 - DEBUG - send_request_body.complete -20:51:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:51:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:51:00 GMT'), (b'Content-Length', b'337')]) -20:51:00 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:51:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:51:00 - httpcore.http11 - DEBUG - receive_response_body.complete -20:51:00 - httpcore.http11 - DEBUG - response_closed.started -20:51:00 - httpcore.http11 - DEBUG - response_closed.complete -20:51:00 - mai.model.ollama_client - INFO - Found 1 models -20:51:01 - mai.core.interface - WARNING - Git repository health check failed -20:51:01 - mai.core.interface - INFO - Selected initial model: -20:51:01 - mai.core.interface - INFO - Mai interface initialized successfully -20:51:02 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:51:02 - httpcore.http11 - DEBUG - send_request_headers.complete -20:51:02 - httpcore.http11 - DEBUG - send_request_body.started request= -20:51:02 - httpcore.http11 - DEBUG - send_request_body.complete -20:51:02 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:51:02 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:51:02 GMT'), (b'Content-Length', b'337')]) -20:51:02 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:51:02 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:51:02 - httpcore.http11 - DEBUG - receive_response_body.complete -20:51:02 - httpcore.http11 - DEBUG - response_closed.started -20:51:02 - httpcore.http11 - DEBUG - response_closed.complete -20:51:02 - mai.model.ollama_client - INFO - Found 1 models -20:51:10 - mai.core.interface - ERROR - Failed to send message: 'OllamaClient' object has no attribute 'generate_response' -20:52:06 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -20:52:07 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:52:07 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -20:52:07 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:52:07 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -20:52:07 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -20:52:07 - mai.core.interface - INFO - Mai interface initialized -20:52:07 - mai.core.interface - INFO - Initializing Mai interface... -20:52:07 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -20:52:07 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -20:52:07 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:52:07 - httpcore.http11 - DEBUG - send_request_headers.complete -20:52:07 - httpcore.http11 - DEBUG - send_request_body.started request= -20:52:07 - httpcore.http11 - DEBUG - send_request_body.complete -20:52:07 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:52:07 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:52:07 GMT'), (b'Content-Length', b'337')]) -20:52:07 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:52:07 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:52:07 - httpcore.http11 - DEBUG - receive_response_body.complete -20:52:07 - httpcore.http11 - DEBUG - response_closed.started -20:52:07 - httpcore.http11 - DEBUG - response_closed.complete -20:52:07 - mai.model.ollama_client - INFO - Found 1 models -20:52:08 - mai.core.interface - WARNING - Git repository health check failed -20:52:08 - mai.core.interface - INFO - Selected initial model: -20:52:08 - mai.core.interface - INFO - Mai interface initialized successfully -20:52:08 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:52:08 - httpcore.http11 - DEBUG - send_request_headers.complete -20:52:08 - httpcore.http11 - DEBUG - send_request_body.started request= -20:52:08 - httpcore.http11 - DEBUG - send_request_body.complete -20:52:08 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:52:08 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:52:08 GMT'), (b'Content-Length', b'337')]) -20:52:08 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:52:08 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:52:08 - httpcore.http11 - DEBUG - receive_response_body.complete -20:52:08 - httpcore.http11 - DEBUG - response_closed.started -20:52:08 - httpcore.http11 - DEBUG - response_closed.complete -20:52:08 - mai.model.ollama_client - INFO - Found 1 models -20:52:09 - mai.core.interface - ERROR - Failed to send message: No model specified -20:52:32 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -20:52:32 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:52:32 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -20:52:32 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:52:32 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -20:52:32 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -20:52:32 - mai.core.interface - INFO - Mai interface initialized -20:52:32 - mai.core.interface - INFO - Initializing Mai interface... -20:52:32 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -20:52:32 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -20:52:32 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:52:32 - httpcore.http11 - DEBUG - send_request_headers.complete -20:52:32 - httpcore.http11 - DEBUG - send_request_body.started request= -20:52:32 - httpcore.http11 - DEBUG - send_request_body.complete -20:52:32 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:52:32 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:52:32 GMT'), (b'Content-Length', b'337')]) -20:52:32 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:52:32 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:52:32 - httpcore.http11 - DEBUG - receive_response_body.complete -20:52:32 - httpcore.http11 - DEBUG - response_closed.started -20:52:32 - httpcore.http11 - DEBUG - response_closed.complete -20:52:32 - mai.model.ollama_client - INFO - Found 1 models -20:52:33 - mai.core.interface - WARNING - Git repository health check failed -20:52:33 - mai.core.interface - INFO - Selected initial model: llama3.2:1b -20:52:33 - mai.core.interface - INFO - Mai interface initialized successfully -20:52:34 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:52:34 - httpcore.http11 - DEBUG - send_request_headers.complete -20:52:34 - httpcore.http11 - DEBUG - send_request_body.started request= -20:52:34 - httpcore.http11 - DEBUG - send_request_body.complete -20:52:34 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:52:34 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:52:34 GMT'), (b'Content-Length', b'337')]) -20:52:34 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:52:34 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:52:34 - httpcore.http11 - DEBUG - receive_response_body.complete -20:52:34 - httpcore.http11 - DEBUG - response_closed.started -20:52:34 - httpcore.http11 - DEBUG - response_closed.complete -20:52:34 - mai.model.ollama_client - INFO - Found 1 models -20:52:35 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:52:35 - httpcore.http11 - DEBUG - send_request_headers.complete -20:52:35 - httpcore.http11 - DEBUG - send_request_body.started request= -20:52:35 - httpcore.http11 - DEBUG - send_request_body.complete -20:52:35 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:52:45 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -20:52:45 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:52:45 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -20:52:45 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:52:45 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -20:52:45 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -20:52:45 - mai.core.interface - INFO - Mai interface initialized -20:52:45 - mai.core.interface - INFO - Initializing Mai interface... -20:52:45 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -20:52:45 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -20:52:45 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:52:45 - httpcore.http11 - DEBUG - send_request_headers.complete -20:52:45 - httpcore.http11 - DEBUG - send_request_body.started request= -20:52:45 - httpcore.http11 - DEBUG - send_request_body.complete -20:52:45 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:52:45 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:52:45 GMT'), (b'Content-Length', b'337')]) -20:52:45 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:52:45 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:52:45 - httpcore.http11 - DEBUG - receive_response_body.complete -20:52:45 - httpcore.http11 - DEBUG - response_closed.started -20:52:45 - httpcore.http11 - DEBUG - response_closed.complete -20:52:45 - mai.model.ollama_client - INFO - Found 1 models -20:52:46 - mai.core.interface - WARNING - Git repository health check failed -20:52:46 - mai.core.interface - INFO - Selected initial model: llama3.2:1b -20:52:46 - mai.core.interface - INFO - Mai interface initialized successfully -20:52:47 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:52:47 - httpcore.http11 - DEBUG - send_request_headers.complete -20:52:47 - httpcore.http11 - DEBUG - send_request_body.started request= -20:52:47 - httpcore.http11 - DEBUG - send_request_body.complete -20:52:47 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:52:47 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:52:47 GMT'), (b'Content-Length', b'337')]) -20:52:47 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:52:47 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:52:47 - httpcore.http11 - DEBUG - receive_response_body.complete -20:52:47 - httpcore.http11 - DEBUG - response_closed.started -20:52:47 - httpcore.http11 - DEBUG - response_closed.complete -20:52:47 - mai.model.ollama_client - INFO - Found 1 models -20:53:50 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -20:53:50 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:53:50 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -20:53:50 - git.util - DEBUG - sys.platform='linux', git_executable='git' -20:53:50 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -20:53:50 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -20:53:50 - mai.core.interface - INFO - Mai interface initialized -20:53:50 - mai.core.interface - INFO - Initializing Mai interface... -20:53:50 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -20:53:50 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -20:53:50 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:53:50 - httpcore.http11 - DEBUG - send_request_headers.complete -20:53:50 - httpcore.http11 - DEBUG - send_request_body.started request= -20:53:50 - httpcore.http11 - DEBUG - send_request_body.complete -20:53:50 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:53:50 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:53:50 GMT'), (b'Content-Length', b'337')]) -20:53:50 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:53:50 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:53:50 - httpcore.http11 - DEBUG - receive_response_body.complete -20:53:50 - httpcore.http11 - DEBUG - response_closed.started -20:53:50 - httpcore.http11 - DEBUG - response_closed.complete -20:53:50 - mai.model.ollama_client - INFO - Found 1 models -20:53:51 - mai.core.interface - WARNING - Git repository health check failed -20:53:51 - mai.core.interface - INFO - Selected initial model: llama3.2:1b -20:53:51 - mai.core.interface - INFO - Mai interface initialized successfully -20:53:52 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:53:52 - httpcore.http11 - DEBUG - send_request_headers.complete -20:53:52 - httpcore.http11 - DEBUG - send_request_body.started request= -20:53:52 - httpcore.http11 - DEBUG - send_request_body.complete -20:53:52 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:53:52 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:53:52 GMT'), (b'Content-Length', b'337')]) -20:53:52 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -20:53:52 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:53:52 - httpcore.http11 - DEBUG - receive_response_body.complete -20:53:52 - httpcore.http11 - DEBUG - response_closed.started -20:53:52 - httpcore.http11 - DEBUG - response_closed.complete -20:53:52 - mai.model.ollama_client - INFO - Found 1 models -20:53:57 - httpcore.connection - DEBUG - close.started -20:53:57 - httpcore.connection - DEBUG - close.complete -20:53:57 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -20:53:57 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -20:53:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -20:53:57 - httpcore.http11 - DEBUG - send_request_headers.complete -20:53:57 - httpcore.http11 - DEBUG - send_request_body.started request= -20:53:57 - httpcore.http11 - DEBUG - send_request_body.complete -20:53:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -20:54:13 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 01:54:13 GMT'), (b'Content-Length', b'366')]) -20:54:13 - httpx - INFO - HTTP Request: POST http://localhost:11434/api/chat "HTTP/1.1 200 OK" -20:54:13 - httpcore.http11 - DEBUG - receive_response_body.started request= -20:54:13 - httpcore.http11 - DEBUG - receive_response_body.complete -20:54:13 - httpcore.http11 - DEBUG - response_closed.started -20:54:13 - httpcore.http11 - DEBUG - response_closed.complete -20:54:13 - mai.model.ollama_client - DEBUG - Generated response from llama3.2:1b -12:26:16 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -12:26:17 - urllib3.connectionpool - DEBUG - Starting new HTTPS connection (1): openaipublic.blob.core.windows.net:443 -12:26:17 - urllib3.connectionpool - DEBUG - https://openaipublic.blob.core.windows.net:443 "GET /encodings/cl100k_base.tiktoken HTTP/1.1" 200 1681126 -12:26:17 - urllib3.connectionpool - DEBUG - Starting new HTTPS connection (1): openaipublic.blob.core.windows.net:443 -12:26:17 - urllib3.connectionpool - DEBUG - https://openaipublic.blob.core.windows.net:443 "GET /encodings/p50k_base.tiktoken HTTP/1.1" 200 836186 -12:26:18 - git.util - DEBUG - sys.platform='linux', git_executable='git' -12:26:18 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -12:26:18 - git.util - DEBUG - sys.platform='linux', git_executable='git' -12:26:18 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -12:26:18 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -12:26:18 - mai.core.interface - INFO - Mai interface initialized -12:26:18 - mai.core.interface - INFO - Initializing Mai interface... -12:26:18 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -12:26:18 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -12:26:18 - httpcore.http11 - DEBUG - send_request_headers.started request= -12:26:18 - httpcore.http11 - DEBUG - send_request_headers.complete -12:26:18 - httpcore.http11 - DEBUG - send_request_body.started request= -12:26:18 - httpcore.http11 - DEBUG - send_request_body.complete -12:26:18 - httpcore.http11 - DEBUG - receive_response_headers.started request= -12:26:18 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 17:26:18 GMT'), (b'Content-Length', b'337')]) -12:26:18 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -12:26:18 - httpcore.http11 - DEBUG - receive_response_body.started request= -12:26:18 - httpcore.http11 - DEBUG - receive_response_body.complete -12:26:18 - httpcore.http11 - DEBUG - response_closed.started -12:26:18 - httpcore.http11 - DEBUG - response_closed.complete -12:26:18 - mai.model.ollama_client - INFO - Found 1 models -12:26:19 - mai.core.interface - WARNING - Git repository health check failed -12:26:19 - mai.core.interface - INFO - Selected initial model: llama3.2:1b -12:26:19 - mai.core.interface - INFO - Mai interface initialized successfully -12:26:20 - httpcore.http11 - DEBUG - send_request_headers.started request= -12:26:20 - httpcore.http11 - DEBUG - send_request_headers.complete -12:26:20 - httpcore.http11 - DEBUG - send_request_body.started request= -12:26:20 - httpcore.http11 - DEBUG - send_request_body.complete -12:26:20 - httpcore.http11 - DEBUG - receive_response_headers.started request= -12:26:20 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 17:26:20 GMT'), (b'Content-Length', b'337')]) -12:26:20 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -12:26:20 - httpcore.http11 - DEBUG - receive_response_body.started request= -12:26:20 - httpcore.http11 - DEBUG - receive_response_body.complete -12:26:20 - httpcore.http11 - DEBUG - response_closed.started -12:26:20 - httpcore.http11 - DEBUG - response_closed.complete -12:26:20 - mai.model.ollama_client - INFO - Found 1 models -12:26:27 - httpcore.connection - DEBUG - close.started -12:26:27 - httpcore.connection - DEBUG - close.complete -12:26:27 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -12:26:27 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -12:26:27 - httpcore.http11 - DEBUG - send_request_headers.started request= -12:26:27 - httpcore.http11 - DEBUG - send_request_headers.complete -12:26:27 - httpcore.http11 - DEBUG - send_request_body.started request= -12:26:27 - httpcore.http11 - DEBUG - send_request_body.complete -12:26:27 - httpcore.http11 - DEBUG - receive_response_headers.started request= -12:26:33 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 17:26:33 GMT'), (b'Content-Length', b'547')]) -12:26:33 - httpx - INFO - HTTP Request: POST http://localhost:11434/api/chat "HTTP/1.1 200 OK" -12:26:33 - httpcore.http11 - DEBUG - receive_response_body.started request= -12:26:33 - httpcore.http11 - DEBUG - receive_response_body.complete -12:26:33 - httpcore.http11 - DEBUG - response_closed.started -12:26:33 - httpcore.http11 - DEBUG - response_closed.complete -12:26:33 - mai.model.ollama_client - DEBUG - Generated response from llama3.2:1b -12:26:49 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -12:26:50 - git.util - DEBUG - sys.platform='linux', git_executable='git' -12:26:50 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -12:26:50 - git.util - DEBUG - sys.platform='linux', git_executable='git' -12:26:50 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -12:26:50 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -12:26:50 - mai.core.interface - INFO - Mai interface initialized -12:26:50 - mai.core.interface - INFO - Initializing Mai interface... -12:26:50 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -12:26:50 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -12:26:50 - httpcore.http11 - DEBUG - send_request_headers.started request= -12:26:50 - httpcore.http11 - DEBUG - send_request_headers.complete -12:26:50 - httpcore.http11 - DEBUG - send_request_body.started request= -12:26:50 - httpcore.http11 - DEBUG - send_request_body.complete -12:26:50 - httpcore.http11 - DEBUG - receive_response_headers.started request= -12:26:50 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 17:26:50 GMT'), (b'Content-Length', b'337')]) -12:26:50 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -12:26:50 - httpcore.http11 - DEBUG - receive_response_body.started request= -12:26:50 - httpcore.http11 - DEBUG - receive_response_body.complete -12:26:50 - httpcore.http11 - DEBUG - response_closed.started -12:26:50 - httpcore.http11 - DEBUG - response_closed.complete -12:26:50 - mai.model.ollama_client - INFO - Found 1 models -12:26:51 - mai.core.interface - WARNING - Git repository health check failed -12:26:51 - mai.core.interface - INFO - Selected initial model: llama3.2:1b -12:26:51 - mai.core.interface - INFO - Mai interface initialized successfully -12:26:52 - httpcore.http11 - DEBUG - send_request_headers.started request= -12:26:52 - httpcore.http11 - DEBUG - send_request_headers.complete -12:26:52 - httpcore.http11 - DEBUG - send_request_body.started request= -12:26:52 - httpcore.http11 - DEBUG - send_request_body.complete -12:26:52 - httpcore.http11 - DEBUG - receive_response_headers.started request= -12:26:52 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 17:26:52 GMT'), (b'Content-Length', b'337')]) -12:26:52 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -12:26:52 - httpcore.http11 - DEBUG - receive_response_body.started request= -12:26:52 - httpcore.http11 - DEBUG - receive_response_body.complete -12:26:52 - httpcore.http11 - DEBUG - response_closed.started -12:26:52 - httpcore.http11 - DEBUG - response_closed.complete -12:26:52 - mai.model.ollama_client - INFO - Found 1 models -12:27:06 - httpcore.connection - DEBUG - close.started -12:27:06 - httpcore.connection - DEBUG - close.complete -12:27:06 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -12:27:06 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -12:27:06 - httpcore.http11 - DEBUG - send_request_headers.started request= -12:27:06 - httpcore.http11 - DEBUG - send_request_headers.complete -12:27:06 - httpcore.http11 - DEBUG - send_request_body.started request= -12:27:06 - httpcore.http11 - DEBUG - send_request_body.complete -12:27:06 - httpcore.http11 - DEBUG - receive_response_headers.started request= -12:27:08 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 17:27:08 GMT'), (b'Content-Length', b'1171')]) -12:27:08 - httpx - INFO - HTTP Request: POST http://localhost:11434/api/chat "HTTP/1.1 200 OK" -12:27:08 - httpcore.http11 - DEBUG - receive_response_body.started request= -12:27:08 - httpcore.http11 - DEBUG - receive_response_body.complete -12:27:08 - httpcore.http11 - DEBUG - response_closed.started -12:27:08 - httpcore.http11 - DEBUG - response_closed.complete -12:27:08 - mai.model.ollama_client - DEBUG - Generated response from llama3.2:1b -12:27:38 - httpcore.connection - DEBUG - close.started -12:27:38 - httpcore.connection - DEBUG - close.complete -12:27:38 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -12:27:38 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -12:27:38 - httpcore.http11 - DEBUG - send_request_headers.started request= -12:27:38 - httpcore.http11 - DEBUG - send_request_headers.complete -12:27:38 - httpcore.http11 - DEBUG - send_request_body.started request= -12:27:38 - httpcore.http11 - DEBUG - send_request_body.complete -12:27:38 - httpcore.http11 - DEBUG - receive_response_headers.started request= -12:27:39 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 17:27:39 GMT'), (b'Content-Length', b'1334')]) -12:27:39 - httpx - INFO - HTTP Request: POST http://localhost:11434/api/chat "HTTP/1.1 200 OK" -12:27:39 - httpcore.http11 - DEBUG - receive_response_body.started request= -12:27:39 - httpcore.http11 - DEBUG - receive_response_body.complete -12:27:39 - httpcore.http11 - DEBUG - response_closed.started -12:27:39 - httpcore.http11 - DEBUG - response_closed.complete -12:27:39 - mai.model.ollama_client - DEBUG - Generated response from llama3.2:1b -12:27:52 - httpcore.connection - DEBUG - close.started -12:27:52 - httpcore.connection - DEBUG - close.complete -12:27:52 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -12:27:52 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -12:27:52 - httpcore.http11 - DEBUG - send_request_headers.started request= -12:27:52 - httpcore.http11 - DEBUG - send_request_headers.complete -12:27:52 - httpcore.http11 - DEBUG - send_request_body.started request= -12:27:52 - httpcore.http11 - DEBUG - send_request_body.complete -12:27:52 - httpcore.http11 - DEBUG - receive_response_headers.started request= -12:27:53 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 17:27:53 GMT'), (b'Content-Length', b'1229')]) -12:27:53 - httpx - INFO - HTTP Request: POST http://localhost:11434/api/chat "HTTP/1.1 200 OK" -12:27:53 - httpcore.http11 - DEBUG - receive_response_body.started request= -12:27:53 - httpcore.http11 - DEBUG - receive_response_body.complete -12:27:53 - httpcore.http11 - DEBUG - response_closed.started -12:27:53 - httpcore.http11 - DEBUG - response_closed.complete -12:27:53 - mai.model.ollama_client - DEBUG - Generated response from llama3.2:1b -12:28:06 - httpcore.connection - DEBUG - close.started -12:28:06 - httpcore.connection - DEBUG - close.complete -12:28:06 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -12:28:06 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -12:28:06 - httpcore.http11 - DEBUG - send_request_headers.started request= -12:28:06 - httpcore.http11 - DEBUG - send_request_headers.complete -12:28:06 - httpcore.http11 - DEBUG - send_request_body.started request= -12:28:06 - httpcore.http11 - DEBUG - send_request_body.complete -12:28:06 - httpcore.http11 - DEBUG - receive_response_headers.started request= -12:28:07 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 17:28:07 GMT'), (b'Content-Length', b'1082')]) -12:28:07 - httpx - INFO - HTTP Request: POST http://localhost:11434/api/chat "HTTP/1.1 200 OK" -12:28:07 - httpcore.http11 - DEBUG - receive_response_body.started request= -12:28:07 - httpcore.http11 - DEBUG - receive_response_body.complete -12:28:07 - httpcore.http11 - DEBUG - response_closed.started -12:28:07 - httpcore.http11 - DEBUG - response_closed.complete -12:28:07 - mai.model.ollama_client - DEBUG - Generated response from llama3.2:1b -12:28:15 - httpcore.connection - DEBUG - close.started -12:28:15 - httpcore.connection - DEBUG - close.complete -12:28:15 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -12:28:15 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -12:28:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -12:28:15 - httpcore.http11 - DEBUG - send_request_headers.complete -12:28:15 - httpcore.http11 - DEBUG - send_request_body.started request= -12:28:15 - httpcore.http11 - DEBUG - send_request_body.complete -12:28:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -12:28:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Sun, 25 Jan 2026 17:28:17 GMT'), (b'Content-Length', b'1602')]) -12:28:17 - httpx - INFO - HTTP Request: POST http://localhost:11434/api/chat "HTTP/1.1 200 OK" -12:28:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -12:28:17 - httpcore.http11 - DEBUG - receive_response_body.complete -12:28:17 - httpcore.http11 - DEBUG - response_closed.started -12:28:17 - httpcore.http11 - DEBUG - response_closed.complete -12:28:17 - mai.model.ollama_client - DEBUG - Generated response from llama3.2:1b -16:58:58 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -16:58:59 - git.util - DEBUG - sys.platform='linux', git_executable='git' -16:58:59 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -16:58:59 - git.util - DEBUG - sys.platform='linux', git_executable='git' -16:58:59 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -16:58:59 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -16:58:59 - docker.utils.config - DEBUG - Trying paths: ['/home/mystiatech/.docker/config.json', '/home/mystiatech/.dockercfg'] -16:58:59 - docker.utils.config - DEBUG - Found file at path: /home/mystiatech/.docker/config.json -16:58:59 - docker.auth - DEBUG - Found 'credsStore' section -16:58:59 - urllib3.connectionpool - DEBUG - http://localhost:None "GET /version HTTP/1.1" 200 None -16:58:59 - urllib3.connectionpool - DEBUG - http://localhost:None "GET /v1.52/_ping HTTP/1.1" 200 None -16:58:59 - src.mai.memory.storage - INFO - Loading embedding model: all-MiniLM-L6-v2 -16:58:59 - sentence_transformers.SentenceTransformer - INFO - Use pytorch device_name: cuda:0 -16:58:59 - sentence_transformers.SentenceTransformer - INFO - Load pretrained SentenceTransformer: all-MiniLM-L6-v2 -16:58:59 - httpcore.connection - DEBUG - connect_tcp.started host='huggingface.co' port=443 local_address=None timeout=10 socket_options=None -16:58:59 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -16:58:59 - httpcore.connection - DEBUG - start_tls.started ssl_context= server_hostname='huggingface.co' timeout=10 -16:58:59 - httpcore.connection - DEBUG - start_tls.complete return_value= -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_body.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_body.complete -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 26 Jan 2026 21:58:59 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-6977e3a3-483c239610874d6216247723;7597b2a2-25ca-4514-9b59-1148545f8717'), (b'RateLimit', b'"resolvers";r=2988;t=33'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'T1LjPMQlQO9HkespQcs2RqWzDwGl1JuTp8CdkH4pM0hWuSVOvJZa2Q==')]) -16:58:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.complete -16:58:59 - httpcore.http11 - DEBUG - response_closed.started -16:58:59 - httpcore.http11 - DEBUG - response_closed.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_body.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_body.complete -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'W5ceXYicW4KnvD06XmBklMqqRX6wbqhLjg5qrvB5k5JTn0e-c4UQ-g=='), (b'Age', b'16896449')]) -16:58:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.complete -16:58:59 - httpcore.http11 - DEBUG - response_closed.started -16:58:59 - httpcore.http11 - DEBUG - response_closed.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_body.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_body.complete -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 26 Jan 2026 21:58:59 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-6977e3a3-5efcc9126d20cdc038d97ec6;50be03da-a042-4306-ac99-fd6511b264f6'), (b'RateLimit', b'"resolvers";r=2987;t=33'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'ywolfEfxV9pVgRcHC_SZlT3qzcAWMtTa5ruoD4YmQLMBD2znu-t5AQ==')]) -16:58:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.complete -16:58:59 - httpcore.http11 - DEBUG - response_closed.started -16:58:59 - httpcore.http11 - DEBUG - response_closed.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_body.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_body.complete -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'AIt2gx7yAbN5vfmPA0ehdNjbHKYWRRZw-xebgaxXsDMrP15kyQhbLg=='), (b'Age', b'16896448')]) -16:58:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.complete -16:58:59 - httpcore.http11 - DEBUG - response_closed.started -16:58:59 - httpcore.http11 - DEBUG - response_closed.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_body.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_body.complete -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 26 Jan 2026 21:58:59 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-6977e3a3-072195327a4f2e1239e1c4dd;ef130f7d-a5db-42f1-8ef5-c56f4a6dae96'), (b'RateLimit', b'"resolvers";r=2986;t=33'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'MgH6NjxIvCB48jHE3MupIwdEVxwAUeVBYjVr0kTxid6POc9BNMiOpA==')]) -16:58:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.complete -16:58:59 - httpcore.http11 - DEBUG - response_closed.started -16:58:59 - httpcore.http11 - DEBUG - response_closed.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_body.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_body.complete -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'A-F3UHJ6XNWhIf5wHwuFXmyM8U5jbZaIYo-CA2sggCqMZjPxE2vbHA=='), (b'Age', b'16896448')]) -16:58:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.complete -16:58:59 - httpcore.http11 - DEBUG - response_closed.started -16:58:59 - httpcore.http11 - DEBUG - response_closed.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_body.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_body.complete -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'276'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 26 Jan 2026 21:58:59 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2FREADME.md=&etag=%2258d4a9a45664eb9e12de9549c548c09b6134c17f%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-6977e3a3-7b0b6c3656150afb0111a19c;d7b40899-9d16-431b-bc1d-a4db49297330'), (b'RateLimit', b'"resolvers";r=2985;t=33'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'kQPDV88aG_U1koufz2DZMSyaqvJr3WR8NhS7RfDqxKn4oXmU1EacVQ==')]) -16:58:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/README.md "HTTP/1.1 307 Temporary Redirect" -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.complete -16:58:59 - httpcore.http11 - DEBUG - response_closed.started -16:58:59 - httpcore.http11 - DEBUG - response_closed.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_body.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_body.complete -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'10454'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:32 GMT'), (b'ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e4-65f7ce852d1fe6c63dd82d8c;83c3a845-c5a5-4419-abf2-31960223e770'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'9I6_u3g1qCGEiCQc49nWSYHQ6suhN2cezPUu--q2dtAgByEAyuvTTA=='), (b'Age', b'16896447')]) -16:58:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md "HTTP/1.1 200 OK" -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.complete -16:58:59 - httpcore.http11 - DEBUG - response_closed.started -16:58:59 - httpcore.http11 - DEBUG - response_closed.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_body.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_body.complete -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 26 Jan 2026 21:58:59 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-6977e3a3-17ef35cc497a7f8c1ade282f;5a4546a9-42b3-4cbd-86af-4600f7ff4fa6'), (b'RateLimit', b'"resolvers";r=2984;t=33'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Z_vdqdjRfTB15cCEnY08ZXKLjm9qPBp8OZuAXXf_X-tRDul2uOIMYA==')]) -16:58:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.complete -16:58:59 - httpcore.http11 - DEBUG - response_closed.started -16:58:59 - httpcore.http11 - DEBUG - response_closed.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_body.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_body.complete -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'3eXTqvUvN3rDs4HzjaKwWWBvh26jM8uTSbDFo0fOIe7ZgfNoXhB6dA=='), (b'Age', b'16896449')]) -16:58:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.complete -16:58:59 - httpcore.http11 - DEBUG - response_closed.started -16:58:59 - httpcore.http11 - DEBUG - response_closed.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_body.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_body.complete -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'308'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 26 Jan 2026 21:58:59 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fsentence_bert_config.json=&etag=%2259d594003bf59880a884c574bf88ef7555bb0202%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-6977e3a3-65c3c4874985c11673053d93;a3c57b4b-920c-4071-9740-34da43155b9c'), (b'RateLimit', b'"resolvers";r=2983;t=33'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'adJp6fMAMfeqrZvWJeB68wi5rOJ6gWMTBsO7vy5_QzUHeOrK5r2jqg==')]) -16:58:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/sentence_bert_config.json "HTTP/1.1 307 Temporary Redirect" -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.complete -16:58:59 - httpcore.http11 - DEBUG - response_closed.started -16:58:59 - httpcore.http11 - DEBUG - response_closed.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_body.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_body.complete -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'53'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:35 GMT'), (b'ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e7-793defd917b2fff34bb93137;f97df483-7cc7-4061-bccd-166531ee26ec'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'AK3o1sQX_uS4QgRXuLrvUXtsDkn7n8-3MGXTckXg80EXz3ThK4CXrw=='), (b'Age', b'16896444')]) -16:58:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json "HTTP/1.1 200 OK" -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.complete -16:58:59 - httpcore.http11 - DEBUG - response_closed.started -16:58:59 - httpcore.http11 - DEBUG - response_closed.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_body.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_body.complete -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'15'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 26 Jan 2026 21:58:59 GMT'), (b'ETag', b'W/"f-mY2VvLxuxB7KhsoOdQTlMTccuAQ"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-6977e3a3-27b2a3272f02301511d87353;8c49650b-6bdd-4d30-b396-6edecae8372f'), (b'RateLimit', b'"resolvers";r=2982;t=33'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'MISS'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'Entry not found'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'8FIUmc2tyPJbPI5vT79Tilrk5PgoUF4xqSrxlKmPB1Lq9AwHIse-MA==')]) -16:58:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/adapter_config.json "HTTP/1.1 404 Not Found" -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.complete -16:58:59 - httpcore.http11 - DEBUG - response_closed.started -16:58:59 - httpcore.http11 - DEBUG - response_closed.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_body.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_body.complete -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 26 Jan 2026 21:58:59 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-6977e3a3-63414d1a313a11d558df5005;1c94ff1f-68e2-4234-bc31-acdf7fca4c5f'), (b'RateLimit', b'"resolvers";r=2981;t=33'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'iFHRFYtzh1qPUM6zLeKCuS3UPLlUDNRiJZqVMEW-xXhhOHwFfO8bZQ==')]) -16:58:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.complete -16:58:59 - httpcore.http11 - DEBUG - response_closed.started -16:58:59 - httpcore.http11 - DEBUG - response_closed.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_body.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_body.complete -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'ZEO87udb4iFtpChISljmt-JJLTB6kIef-1yH1TMlJFxevJFHyn-E4g=='), (b'Age', b'18590195')]) -16:58:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.complete -16:58:59 - httpcore.http11 - DEBUG - response_closed.started -16:58:59 - httpcore.http11 - DEBUG - response_closed.complete -16:58:59 - src.mai.memory.storage - ERROR - Failed to initialize embedding model: [Errno 32] Broken pipe -16:58:59 - src.mai.memory.storage - INFO - sqlite-vec extension loaded successfully -16:58:59 - src.mai.memory.storage - INFO - Database schema created successfully -16:58:59 - src.mai.memory.storage - INFO - Database schema verification passed -16:58:59 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -16:58:59 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -16:58:59 - src.mai.memory.compression - INFO - MemoryCompressor initialized -16:58:59 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -16:58:59 - mai.core.interface - WARNING - Memory system initialization failed: 'MemoryConfig' object has no attribute 'get' -16:58:59 - mai.core.interface - INFO - Mai interface initialized -16:58:59 - mai.core.interface - INFO - Initializing Mai interface... -16:58:59 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -16:58:59 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_headers.complete -16:58:59 - httpcore.http11 - DEBUG - send_request_body.started request= -16:58:59 - httpcore.http11 - DEBUG - send_request_body.complete -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Mon, 26 Jan 2026 21:58:59 GMT'), (b'Content-Length', b'337')]) -16:58:59 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:58:59 - httpcore.http11 - DEBUG - receive_response_body.complete -16:58:59 - httpcore.http11 - DEBUG - response_closed.started -16:58:59 - httpcore.http11 - DEBUG - response_closed.complete -16:58:59 - mai.model.ollama_client - INFO - Found 1 models -16:59:00 - mai.core.interface - WARNING - Git repository health check failed -16:59:00 - mai.core.interface - INFO - Selected initial model: llama3.2:1b -16:59:00 - mai.core.interface - INFO - Mai interface initialized successfully -16:59:00 - src.mai.memory.storage - INFO - Loading embedding model: all-MiniLM-L6-v2 -16:59:00 - sentence_transformers.SentenceTransformer - INFO - Use pytorch device_name: cuda:0 -16:59:00 - sentence_transformers.SentenceTransformer - INFO - Load pretrained SentenceTransformer: all-MiniLM-L6-v2 -16:59:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:59:00 - httpcore.http11 - DEBUG - send_request_headers.complete -16:59:00 - httpcore.http11 - DEBUG - send_request_body.started request= -16:59:00 - httpcore.http11 - DEBUG - send_request_body.complete -16:59:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:59:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 26 Jan 2026 21:59:00 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-6977e3a4-3662148b55c10ed6437effca;678a27e2-c92b-4302-86d5-e22c88031d66'), (b'RateLimit', b'"resolvers";r=2980;t=32'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'DAbQv8FZUfZOQ_m226ICJzlx6ZCdL9URvoEOQWrtQtXWYMG6CDkajQ==')]) -16:59:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -16:59:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:59:00 - httpcore.http11 - DEBUG - receive_response_body.complete -16:59:00 - httpcore.http11 - DEBUG - response_closed.started -16:59:00 - httpcore.http11 - DEBUG - response_closed.complete -16:59:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:59:00 - httpcore.http11 - DEBUG - send_request_headers.complete -16:59:00 - httpcore.http11 - DEBUG - send_request_body.started request= -16:59:00 - httpcore.http11 - DEBUG - send_request_body.complete -16:59:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:59:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'JYulfGhrB5mpMgAl2GTD0f7eQ3QCgv1vcEmuJ2DqAmH3bnqb-dnDJQ=='), (b'Age', b'16896450')]) -16:59:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -16:59:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:59:00 - httpcore.http11 - DEBUG - receive_response_body.complete -16:59:00 - httpcore.http11 - DEBUG - response_closed.started -16:59:00 - httpcore.http11 - DEBUG - response_closed.complete -16:59:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:59:00 - httpcore.http11 - DEBUG - send_request_headers.complete -16:59:00 - httpcore.http11 - DEBUG - send_request_body.started request= -16:59:00 - httpcore.http11 - DEBUG - send_request_body.complete -16:59:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:59:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 26 Jan 2026 21:59:00 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-6977e3a4-24df637958af2eb52e6a2445;1dfb173f-2af0-4529-be9e-55d96439cafe'), (b'RateLimit', b'"resolvers";r=2979;t=32'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'e4Sl7zL93GDK79AqP76kDycF_F4UbfNJCBFyV5VJrMqSuvg8-wBRxw==')]) -16:59:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -16:59:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:59:00 - httpcore.http11 - DEBUG - receive_response_body.complete -16:59:00 - httpcore.http11 - DEBUG - response_closed.started -16:59:00 - httpcore.http11 - DEBUG - response_closed.complete -16:59:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:59:00 - httpcore.http11 - DEBUG - send_request_headers.complete -16:59:00 - httpcore.http11 - DEBUG - send_request_body.started request= -16:59:00 - httpcore.http11 - DEBUG - send_request_body.complete -16:59:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:59:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'1hZKey7hmnowgAs3Wo73T6ad4b6cXplCjSItjTGJdpWnm8rKpuZPbQ=='), (b'Age', b'16896449')]) -16:59:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -16:59:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:59:00 - httpcore.http11 - DEBUG - receive_response_body.complete -16:59:00 - httpcore.http11 - DEBUG - response_closed.started -16:59:00 - httpcore.http11 - DEBUG - response_closed.complete -16:59:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:59:00 - httpcore.http11 - DEBUG - send_request_headers.complete -16:59:00 - httpcore.http11 - DEBUG - send_request_body.started request= -16:59:00 - httpcore.http11 - DEBUG - send_request_body.complete -16:59:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:59:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 26 Jan 2026 21:59:00 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-6977e3a4-23c494e7256e9f4929d20c09;77ec377a-9590-4f96-a25d-0544079031e7'), (b'RateLimit', b'"resolvers";r=2978;t=32'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'5PMDcLemVk7GAKJfe-ufU_vVNZdY0j6FMxxb-kfb17UfUa8TjCCr5A==')]) -16:59:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -16:59:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:59:00 - httpcore.http11 - DEBUG - receive_response_body.complete -16:59:00 - httpcore.http11 - DEBUG - response_closed.started -16:59:00 - httpcore.http11 - DEBUG - response_closed.complete -16:59:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:59:00 - httpcore.http11 - DEBUG - send_request_headers.complete -16:59:00 - httpcore.http11 - DEBUG - send_request_body.started request= -16:59:00 - httpcore.http11 - DEBUG - send_request_body.complete -16:59:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:59:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'jZMDVhkyz-SXPifJGx-zu7rPDQLmVKAt0lQBSsdcsdRPxeaRE-SHHA=='), (b'Age', b'16896449')]) -16:59:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -16:59:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:59:00 - httpcore.http11 - DEBUG - receive_response_body.complete -16:59:00 - httpcore.http11 - DEBUG - response_closed.started -16:59:00 - httpcore.http11 - DEBUG - response_closed.complete -16:59:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:59:00 - httpcore.http11 - DEBUG - send_request_headers.complete -16:59:00 - httpcore.http11 - DEBUG - send_request_body.started request= -16:59:00 - httpcore.http11 - DEBUG - send_request_body.complete -16:59:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:59:01 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'276'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 26 Jan 2026 21:59:00 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2FREADME.md=&etag=%2258d4a9a45664eb9e12de9549c548c09b6134c17f%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-6977e3a4-27ea05731ba3465a09bf0bde;4634b5a4-0449-4313-9840-fd96efba67d4'), (b'RateLimit', b'"resolvers";r=2977;t=32'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'oFvnT41aNk_Jls6OOWu6CydvfwRfYCw-2MFAmonJY6oKJhSaWPTY2w==')]) -16:59:01 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/README.md "HTTP/1.1 307 Temporary Redirect" -16:59:01 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:59:01 - httpcore.http11 - DEBUG - receive_response_body.complete -16:59:01 - httpcore.http11 - DEBUG - response_closed.started -16:59:01 - httpcore.http11 - DEBUG - response_closed.complete -16:59:01 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:59:01 - httpcore.http11 - DEBUG - send_request_headers.complete -16:59:01 - httpcore.http11 - DEBUG - send_request_body.started request= -16:59:01 - httpcore.http11 - DEBUG - send_request_body.complete -16:59:01 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:59:01 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'10454'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:32 GMT'), (b'ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e4-65f7ce852d1fe6c63dd82d8c;83c3a845-c5a5-4419-abf2-31960223e770'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'mgpKMFvFwyi40LSH3tVUMX5_1CF0zU-UgHsvWDRFq3EGxkiH66UryA=='), (b'Age', b'16896448')]) -16:59:01 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md "HTTP/1.1 200 OK" -16:59:01 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:59:01 - httpcore.http11 - DEBUG - receive_response_body.complete -16:59:01 - httpcore.http11 - DEBUG - response_closed.started -16:59:01 - httpcore.http11 - DEBUG - response_closed.complete -16:59:01 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:59:01 - httpcore.http11 - DEBUG - send_request_headers.complete -16:59:01 - httpcore.http11 - DEBUG - send_request_body.started request= -16:59:01 - httpcore.http11 - DEBUG - send_request_body.complete -16:59:01 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:59:01 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 26 Jan 2026 21:59:00 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-6977e3a4-73fba0b407916a8e45d7257a;2adde4de-fbfa-4843-b9b4-7f6d02fcce51'), (b'RateLimit', b'"resolvers";r=2976;t=32'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'1fHZ3xZKh0wWjcaY4jz5Txza9l9VN5JLwv6-NB2i8xqCJRl4tmpj6w==')]) -16:59:01 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -16:59:01 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:59:01 - httpcore.http11 - DEBUG - receive_response_body.complete -16:59:01 - httpcore.http11 - DEBUG - response_closed.started -16:59:01 - httpcore.http11 - DEBUG - response_closed.complete -16:59:01 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:59:01 - httpcore.http11 - DEBUG - send_request_headers.complete -16:59:01 - httpcore.http11 - DEBUG - send_request_body.started request= -16:59:01 - httpcore.http11 - DEBUG - send_request_body.complete -16:59:01 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:59:01 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'fEuDhzWi2mAaMPg9tS9ROAPxf2axTfX0kAonEBoc1cS-lguVIHLevg=='), (b'Age', b'16896450')]) -16:59:01 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -16:59:01 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:59:01 - httpcore.http11 - DEBUG - receive_response_body.complete -16:59:01 - httpcore.http11 - DEBUG - response_closed.started -16:59:01 - httpcore.http11 - DEBUG - response_closed.complete -16:59:01 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:59:01 - httpcore.http11 - DEBUG - send_request_headers.complete -16:59:01 - httpcore.http11 - DEBUG - send_request_body.started request= -16:59:01 - httpcore.http11 - DEBUG - send_request_body.complete -16:59:01 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:59:01 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'308'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 26 Jan 2026 21:59:00 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fsentence_bert_config.json=&etag=%2259d594003bf59880a884c574bf88ef7555bb0202%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-6977e3a4-4a3202b245286bc06f3ed950;45434b84-1aaf-44f5-a1d8-d9a0a4eaac6d'), (b'RateLimit', b'"resolvers";r=2975;t=32'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'fMyuLZNjpPG8gVBCQ0sEyH2tXVWSncDQmiavgLh4nd1RjHaYNdWX_Q==')]) -16:59:01 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/sentence_bert_config.json "HTTP/1.1 307 Temporary Redirect" -16:59:01 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:59:01 - httpcore.http11 - DEBUG - receive_response_body.complete -16:59:01 - httpcore.http11 - DEBUG - response_closed.started -16:59:01 - httpcore.http11 - DEBUG - response_closed.complete -16:59:01 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:59:01 - httpcore.http11 - DEBUG - send_request_headers.complete -16:59:01 - httpcore.http11 - DEBUG - send_request_body.started request= -16:59:01 - httpcore.http11 - DEBUG - send_request_body.complete -16:59:01 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:59:01 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'53'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:35 GMT'), (b'ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e7-793defd917b2fff34bb93137;f97df483-7cc7-4061-bccd-166531ee26ec'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'jiHvPn7PIGRGcBPrzyHs5wk6tRV98T8ei-2kFCj2ZzsHIVWripyXcw=='), (b'Age', b'16896445')]) -16:59:01 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json "HTTP/1.1 200 OK" -16:59:01 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:59:01 - httpcore.http11 - DEBUG - receive_response_body.complete -16:59:01 - httpcore.http11 - DEBUG - response_closed.started -16:59:01 - httpcore.http11 - DEBUG - response_closed.complete -16:59:01 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:59:01 - httpcore.http11 - DEBUG - send_request_headers.complete -16:59:01 - httpcore.http11 - DEBUG - send_request_body.started request= -16:59:01 - httpcore.http11 - DEBUG - send_request_body.complete -16:59:01 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:59:01 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'15'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 26 Jan 2026 21:59:00 GMT'), (b'ETag', b'W/"f-mY2VvLxuxB7KhsoOdQTlMTccuAQ"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-6977e3a4-5d9501367c9e62a6540dabd2;ef41b9d6-8e86-41b4-82e6-716f354ee455'), (b'RateLimit', b'"resolvers";r=2974;t=32'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'MISS'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'Entry not found'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'7_1zZLmJqEj3JbhZ7y_JDwdaspYe_mF56FNsDJ0bowU2sCviZHiHXg==')]) -16:59:01 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/adapter_config.json "HTTP/1.1 404 Not Found" -16:59:01 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:59:01 - httpcore.http11 - DEBUG - receive_response_body.complete -16:59:01 - httpcore.http11 - DEBUG - response_closed.started -16:59:01 - httpcore.http11 - DEBUG - response_closed.complete -16:59:01 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:59:01 - httpcore.http11 - DEBUG - send_request_headers.complete -16:59:01 - httpcore.http11 - DEBUG - send_request_body.started request= -16:59:01 - httpcore.http11 - DEBUG - send_request_body.complete -16:59:01 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:59:01 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 26 Jan 2026 21:59:00 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-6977e3a4-697d7b776a3c696125c72075;1a329c2e-86d2-4f4a-bc66-6ee2e0820664'), (b'RateLimit', b'"resolvers";r=2973;t=32'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'zbxaLxsfvgc1L03Nhs6Xao2ZzYhfl-14m2YV7sy_iUFOuvgB04T1vA==')]) -16:59:01 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -16:59:01 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:59:01 - httpcore.http11 - DEBUG - receive_response_body.complete -16:59:01 - httpcore.http11 - DEBUG - response_closed.started -16:59:01 - httpcore.http11 - DEBUG - response_closed.complete -16:59:01 - httpcore.http11 - DEBUG - send_request_headers.started request= -16:59:01 - httpcore.http11 - DEBUG - send_request_headers.complete -16:59:01 - httpcore.http11 - DEBUG - send_request_body.started request= -16:59:01 - httpcore.http11 - DEBUG - send_request_body.complete -16:59:01 - httpcore.http11 - DEBUG - receive_response_headers.started request= -16:59:01 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'AhnSxkLxRg-XmcfqXZiJKvbrWyd6op4COvsVQFx-5ZltUKWF8VVPMg=='), (b'Age', b'18590196')]) -16:59:01 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -16:59:01 - httpcore.http11 - DEBUG - receive_response_body.started request= -16:59:01 - httpcore.http11 - DEBUG - receive_response_body.complete -16:59:01 - httpcore.http11 - DEBUG - response_closed.started -16:59:01 - httpcore.http11 - DEBUG - response_closed.complete -16:59:01 - src.mai.memory.storage - ERROR - Failed to initialize embedding model: [Errno 32] Broken pipe -16:59:01 - src.mai.memory.storage - INFO - sqlite-vec extension loaded successfully -16:59:01 - src.mai.memory.storage - INFO - Database schema created successfully -16:59:01 - src.mai.memory.storage - INFO - Database schema verification passed -16:59:01 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -16:59:01 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -16:59:01 - src.mai.memory.compression - INFO - MemoryCompressor initialized -16:59:01 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -16:59:01 - httpcore.connection - DEBUG - close.started -16:59:01 - httpcore.connection - DEBUG - close.complete -19:35:46 - asyncio - DEBUG - Using selector: EpollSelector -19:35:46 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -19:35:46 - git.util - DEBUG - sys.platform='linux', git_executable='git' -19:35:46 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -19:35:46 - git.util - DEBUG - sys.platform='linux', git_executable='git' -19:35:46 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -19:35:46 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -19:35:46 - src.mai.memory.storage - WARNING - sentence-transformers not available - embeddings disabled -19:35:46 - src.mai.memory.storage - WARNING - sqlite-vec not available - vector features disabled -19:35:46 - src.mai.memory.storage - INFO - Database schema created successfully -19:35:46 - src.mai.memory.storage - INFO - Database schema verification passed -19:35:46 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -19:35:46 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -19:35:46 - src.mai.memory.compression - INFO - MemoryCompressor initialized -19:35:46 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -19:35:46 - mai.memory.manager - INFO - MemoryManager initialized with all components -19:35:46 - mai.core.interface - INFO - Memory system initialized successfully -19:35:46 - mai.core.interface - INFO - Mai interface initialized -19:35:46 - mai.core.interface - INFO - Initializing Mai interface... -19:35:46 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -19:35:46 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -19:35:46 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:35:46 - httpcore.http11 - DEBUG - send_request_headers.complete -19:35:46 - httpcore.http11 - DEBUG - send_request_body.started request= -19:35:46 - httpcore.http11 - DEBUG - send_request_body.complete -19:35:46 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:35:46 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 00:35:46 GMT'), (b'Content-Length', b'337')]) -19:35:46 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -19:35:46 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:35:46 - httpcore.http11 - DEBUG - receive_response_body.complete -19:35:46 - httpcore.http11 - DEBUG - response_closed.started -19:35:46 - httpcore.http11 - DEBUG - response_closed.complete -19:35:46 - mai.model.ollama_client - INFO - Found 1 models -19:35:47 - mai.core.interface - WARNING - Git repository health check failed -19:35:47 - mai.core.interface - INFO - Selected initial model: llama3.2:1b -19:35:47 - mai.core.interface - INFO - Mai interface initialized successfully -19:35:47 - src.mai.memory.storage - WARNING - sentence-transformers not available - embeddings disabled -19:35:47 - src.mai.memory.storage - WARNING - sqlite-vec not available - vector features disabled -19:35:47 - src.mai.memory.storage - INFO - Database schema created successfully -19:35:47 - src.mai.memory.storage - INFO - Database schema verification passed -19:35:47 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -19:35:47 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -19:35:47 - src.mai.memory.compression - INFO - MemoryCompressor initialized -19:35:47 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -19:35:47 - mai.memory.manager - INFO - MemoryManager initialized with all components -19:35:47 - mai.conversation.state - INFO - ConversationState initialized with max 10 turns per conversation -19:35:47 - mai.conversation.timing - INFO - TimingCalculator initialized with 'default' profile -19:35:47 - mai.conversation.reasoning - INFO - ReasoningEngine initialized -19:35:47 - mai.conversation.decomposition - INFO - RequestDecomposer initialized -19:35:47 - mai.conversation.interruption - INFO - InterruptHandler initialized with 30.0s timeout -19:35:47 - mai.conversation.interruption - DEBUG - Conversation state integrated -19:35:47 - mai.conversation.engine - INFO - ConversationEngine initialized with timing_profile='default', debug=False -19:35:48 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:35:48 - httpcore.http11 - DEBUG - send_request_headers.complete -19:35:48 - httpcore.http11 - DEBUG - send_request_body.started request= -19:35:48 - httpcore.http11 - DEBUG - send_request_body.complete -19:35:48 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:35:48 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 00:35:48 GMT'), (b'Content-Length', b'337')]) -19:35:48 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -19:35:48 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:35:48 - httpcore.http11 - DEBUG - receive_response_body.complete -19:35:48 - httpcore.http11 - DEBUG - response_closed.started -19:35:48 - httpcore.http11 - DEBUG - response_closed.complete -19:35:48 - mai.model.ollama_client - INFO - Found 1 models -19:36:13 - mai.conversation.state - DEBUG - Started new conversation: e648a783-b233-4478-a1d2-5eafd433e9a2 -19:36:13 - mai.conversation.engine - INFO - Processing conversation turn for e648a783-b233-4478-a1d2-5eafd433e9a2 -19:36:26 - asyncio - DEBUG - Using selector: EpollSelector -19:36:26 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -19:36:26 - git.util - DEBUG - sys.platform='linux', git_executable='git' -19:36:26 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -19:36:26 - git.util - DEBUG - sys.platform='linux', git_executable='git' -19:36:26 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -19:36:26 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -19:36:26 - src.mai.memory.storage - WARNING - sentence-transformers not available - embeddings disabled -19:36:26 - src.mai.memory.storage - WARNING - sqlite-vec not available - vector features disabled -19:36:26 - src.mai.memory.storage - INFO - Database schema created successfully -19:36:26 - src.mai.memory.storage - INFO - Database schema verification passed -19:36:26 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -19:36:26 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -19:36:26 - src.mai.memory.compression - INFO - MemoryCompressor initialized -19:36:26 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -19:36:26 - mai.memory.manager - INFO - MemoryManager initialized with all components -19:36:26 - mai.core.interface - INFO - Memory system initialized successfully -19:36:26 - mai.core.interface - INFO - Mai interface initialized -19:36:26 - mai.core.interface - INFO - Initializing Mai interface... -19:36:26 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -19:36:26 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -19:36:26 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:36:26 - httpcore.http11 - DEBUG - send_request_headers.complete -19:36:26 - httpcore.http11 - DEBUG - send_request_body.started request= -19:36:26 - httpcore.http11 - DEBUG - send_request_body.complete -19:36:26 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:36:26 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 00:36:26 GMT'), (b'Content-Length', b'337')]) -19:36:26 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -19:36:26 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:36:26 - httpcore.http11 - DEBUG - receive_response_body.complete -19:36:26 - httpcore.http11 - DEBUG - response_closed.started -19:36:26 - httpcore.http11 - DEBUG - response_closed.complete -19:36:26 - mai.model.ollama_client - INFO - Found 1 models -19:36:26 - mai.core.interface - WARNING - Git repository health check failed -19:36:26 - mai.core.interface - INFO - Selected initial model: llama3.2:1b -19:36:26 - mai.core.interface - INFO - Mai interface initialized successfully -19:36:26 - src.mai.memory.storage - WARNING - sentence-transformers not available - embeddings disabled -19:36:26 - src.mai.memory.storage - WARNING - sqlite-vec not available - vector features disabled -19:36:26 - src.mai.memory.storage - INFO - Database schema created successfully -19:36:26 - src.mai.memory.storage - INFO - Database schema verification passed -19:36:26 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -19:36:26 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -19:36:26 - src.mai.memory.compression - INFO - MemoryCompressor initialized -19:36:26 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -19:36:26 - mai.memory.manager - INFO - MemoryManager initialized with all components -19:36:26 - mai.conversation.state - INFO - ConversationState initialized with max 10 turns per conversation -19:36:26 - mai.conversation.timing - INFO - TimingCalculator initialized with 'default' profile -19:36:26 - mai.conversation.reasoning - INFO - ReasoningEngine initialized -19:36:26 - mai.conversation.decomposition - INFO - RequestDecomposer initialized -19:36:26 - mai.conversation.interruption - INFO - InterruptHandler initialized with 30.0s timeout -19:36:26 - mai.conversation.interruption - DEBUG - Conversation state integrated -19:36:26 - mai.conversation.engine - INFO - ConversationEngine initialized with timing_profile='default', debug=False -19:36:27 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:36:27 - httpcore.http11 - DEBUG - send_request_headers.complete -19:36:27 - httpcore.http11 - DEBUG - send_request_body.started request= -19:36:27 - httpcore.http11 - DEBUG - send_request_body.complete -19:36:27 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:36:27 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 00:36:27 GMT'), (b'Content-Length', b'337')]) -19:36:27 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -19:36:27 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:36:27 - httpcore.http11 - DEBUG - receive_response_body.complete -19:36:27 - httpcore.http11 - DEBUG - response_closed.started -19:36:27 - httpcore.http11 - DEBUG - response_closed.complete -19:36:27 - mai.model.ollama_client - INFO - Found 1 models -19:36:48 - mai.conversation.state - DEBUG - Started new conversation: e648a783-b233-4478-a1d2-5eafd433e9a2 -19:36:48 - mai.conversation.engine - INFO - Processing conversation turn for e648a783-b233-4478-a1d2-5eafd433e9a2 -19:37:01 - mai.conversation.engine - INFO - Handling interruption for conversation e648a783-b233-4478-a1d2-5eafd433e9a2 -19:37:01 - mai.conversation.interruption - INFO - Interruption f2037800-6ea2-4fbf-b33f-bd93542caa4e for conversation e648a783-b233-4478-a1d2-5eafd433e9a2: user_input -19:37:01 - mai.conversation.state - DEBUG - Retrieved 0 messages from conversation e648a783-b233-4478-a1d2-5eafd433e9a2 -19:37:02 - src.mai.memory.retrieval - INFO - Retrieving context for query: Create a python file... -19:37:02 - src.mai.memory.storage - WARNING - Vector search not available - falling back to text search -19:37:02 - src.mai.memory.storage - DEBUG - Text search fallback found 0 conversations for query: 'Create a python file' -19:37:02 - src.mai.memory.retrieval - DEBUG - Semantic search found 0 results -19:37:02 - src.mai.memory.retrieval - DEBUG - Keyword search found 0 results -19:37:02 - src.mai.memory.retrieval - DEBUG - Recency search found 0 results -19:37:02 - src.mai.memory.retrieval - INFO - Retrieved 0 conversations, ~0 tokens -19:37:02 - mai.memory.manager - INFO - Retrieved context for query: 'Create a python file...' (0 results) -19:37:02 - httpcore.connection - DEBUG - close.started -19:37:02 - httpcore.connection - DEBUG - close.complete -19:37:02 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -19:37:02 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -19:37:02 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:37:02 - httpcore.http11 - DEBUG - send_request_headers.complete -19:37:02 - httpcore.http11 - DEBUG - send_request_body.started request= -19:37:02 - httpcore.http11 - DEBUG - send_request_body.complete -19:37:02 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:37:09 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 00:37:09 GMT'), (b'Content-Length', b'1042')]) -19:37:09 - httpx - INFO - HTTP Request: POST http://localhost:11434/api/chat "HTTP/1.1 200 OK" -19:37:09 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:37:09 - httpcore.http11 - DEBUG - receive_response_body.complete -19:37:09 - httpcore.http11 - DEBUG - response_closed.started -19:37:09 - httpcore.http11 - DEBUG - response_closed.complete -19:37:09 - mai.model.ollama_client - DEBUG - Generated response from llama3.2:1b -19:37:09 - src.mai.memory.storage - INFO - Stored conversation '9b990be1-6afb-49c2-86e1-8245d5a820c3' with 2 messages -19:37:09 - src.mai.memory.storage - DEBUG - Retrieved conversation '9b990be1-6afb-49c2-86e1-8245d5a820c3' with 2 messages -19:37:09 - mai.memory.manager - INFO - Stored conversation '9b990be1-6afb-49c2-86e1-8245d5a820c3' with 2 messages -19:37:09 - mai.core.interface - DEBUG - Stored conversation in memory: 9b990be1-6afb-49c2-86e1-8245d5a820c3 -19:37:35 - mai.conversation.engine - INFO - Handling interruption for conversation e648a783-b233-4478-a1d2-5eafd433e9a2 -19:37:35 - mai.conversation.interruption - INFO - Interruption d3fb637e-1be3-4bfe-8b2b-3e2268dc1ef5 for conversation e648a783-b233-4478-a1d2-5eafd433e9a2: user_input -19:37:35 - mai.conversation.state - DEBUG - Retrieved 0 messages from conversation e648a783-b233-4478-a1d2-5eafd433e9a2 -19:37:36 - src.mai.memory.retrieval - INFO - Retrieving context for query: Write a file to the current directory... -19:37:36 - src.mai.memory.storage - WARNING - Vector search not available - falling back to text search -19:37:36 - src.mai.memory.storage - DEBUG - Text search fallback found 0 conversations for query: 'Write a file to the current directory' -19:37:36 - src.mai.memory.retrieval - DEBUG - Semantic search found 0 results -19:37:36 - src.mai.memory.storage - DEBUG - Retrieved conversation '9b990be1-6afb-49c2-86e1-8245d5a820c3' with 2 messages -19:37:36 - src.mai.memory.retrieval - DEBUG - Keyword search found 1 results -19:37:36 - src.mai.memory.retrieval - DEBUG - Recency search found 1 results -19:37:36 - mai.memory.manager - ERROR - Failed to get context: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -19:37:36 - mai.core.interface - DEBUG - Failed to retrieve memory context: Context retrieval failed: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -19:37:36 - httpcore.connection - DEBUG - close.started -19:37:36 - httpcore.connection - DEBUG - close.complete -19:37:36 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -19:37:36 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -19:37:36 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:37:36 - httpcore.http11 - DEBUG - send_request_headers.complete -19:37:36 - httpcore.http11 - DEBUG - send_request_body.started request= -19:37:36 - httpcore.http11 - DEBUG - send_request_body.complete -19:37:36 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:37:38 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 00:37:38 GMT'), (b'Content-Length', b'893')]) -19:37:38 - httpx - INFO - HTTP Request: POST http://localhost:11434/api/chat "HTTP/1.1 200 OK" -19:37:38 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:37:38 - httpcore.http11 - DEBUG - receive_response_body.complete -19:37:38 - httpcore.http11 - DEBUG - response_closed.started -19:37:38 - httpcore.http11 - DEBUG - response_closed.complete -19:37:38 - mai.model.ollama_client - DEBUG - Generated response from llama3.2:1b -19:37:38 - src.mai.memory.storage - INFO - Stored conversation '46efb9e2-acb0-425e-8358-320cb07b2226' with 2 messages -19:37:38 - src.mai.memory.storage - DEBUG - Retrieved conversation '46efb9e2-acb0-425e-8358-320cb07b2226' with 2 messages -19:37:38 - mai.memory.manager - INFO - Stored conversation '46efb9e2-acb0-425e-8358-320cb07b2226' with 2 messages -19:37:38 - mai.core.interface - DEBUG - Stored conversation in memory: 46efb9e2-acb0-425e-8358-320cb07b2226 -19:37:48 - mai.conversation.engine - INFO - Handling interruption for conversation e648a783-b233-4478-a1d2-5eafd433e9a2 -19:37:48 - mai.conversation.interruption - INFO - Interruption e8df0e25-1f3f-4b3b-8424-7c46f8a04527 for conversation e648a783-b233-4478-a1d2-5eafd433e9a2: user_input -19:37:48 - mai.conversation.state - DEBUG - Retrieved 0 messages from conversation e648a783-b233-4478-a1d2-5eafd433e9a2 -19:37:49 - src.mai.memory.retrieval - INFO - Retrieving context for query: Execute a system command... -19:37:49 - src.mai.memory.storage - WARNING - Vector search not available - falling back to text search -19:37:49 - src.mai.memory.storage - DEBUG - Text search fallback found 0 conversations for query: 'Execute a system command' -19:37:49 - src.mai.memory.retrieval - DEBUG - Semantic search found 0 results -19:37:49 - src.mai.memory.storage - DEBUG - Retrieved conversation '46efb9e2-acb0-425e-8358-320cb07b2226' with 2 messages -19:37:49 - src.mai.memory.storage - DEBUG - Retrieved conversation '9b990be1-6afb-49c2-86e1-8245d5a820c3' with 2 messages -19:37:49 - src.mai.memory.retrieval - DEBUG - Keyword search found 2 results -19:37:49 - src.mai.memory.retrieval - DEBUG - Recency search found 2 results -19:37:49 - mai.memory.manager - ERROR - Failed to get context: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -19:37:49 - mai.core.interface - DEBUG - Failed to retrieve memory context: Context retrieval failed: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -19:37:49 - httpcore.connection - DEBUG - close.started -19:37:49 - httpcore.connection - DEBUG - close.complete -19:37:49 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -19:37:49 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -19:37:49 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:37:49 - httpcore.http11 - DEBUG - send_request_headers.complete -19:37:49 - httpcore.http11 - DEBUG - send_request_body.started request= -19:37:49 - httpcore.http11 - DEBUG - send_request_body.complete -19:37:49 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:37:50 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 00:37:50 GMT'), (b'Content-Length', b'377')]) -19:37:50 - httpx - INFO - HTTP Request: POST http://localhost:11434/api/chat "HTTP/1.1 200 OK" -19:37:50 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:37:50 - httpcore.http11 - DEBUG - receive_response_body.complete -19:37:50 - httpcore.http11 - DEBUG - response_closed.started -19:37:50 - httpcore.http11 - DEBUG - response_closed.complete -19:37:50 - mai.model.ollama_client - DEBUG - Generated response from llama3.2:1b -19:37:50 - src.mai.memory.storage - INFO - Stored conversation 'ae221870-4972-4273-b921-a2dbc4aa474b' with 2 messages -19:37:50 - src.mai.memory.storage - DEBUG - Retrieved conversation 'ae221870-4972-4273-b921-a2dbc4aa474b' with 2 messages -19:37:50 - mai.memory.manager - INFO - Stored conversation 'ae221870-4972-4273-b921-a2dbc4aa474b' with 2 messages -19:37:50 - mai.core.interface - DEBUG - Stored conversation in memory: ae221870-4972-4273-b921-a2dbc4aa474b -19:37:58 - mai.conversation.engine - INFO - Handling interruption for conversation e648a783-b233-4478-a1d2-5eafd433e9a2 -19:37:58 - mai.conversation.interruption - INFO - Interruption e50e3b96-6262-447c-94de-78bca93fb34c for conversation e648a783-b233-4478-a1d2-5eafd433e9a2: user_input -19:37:58 - mai.conversation.state - DEBUG - Retrieved 0 messages from conversation e648a783-b233-4478-a1d2-5eafd433e9a2 -19:37:59 - src.mai.memory.retrieval - INFO - Retrieving context for query: ping 1.1.1.1... -19:37:59 - src.mai.memory.storage - WARNING - Vector search not available - falling back to text search -19:37:59 - src.mai.memory.storage - DEBUG - Text search fallback found 0 conversations for query: 'ping 1.1.1.1' -19:37:59 - src.mai.memory.retrieval - DEBUG - Semantic search found 0 results -19:37:59 - src.mai.memory.storage - DEBUG - Retrieved conversation 'ae221870-4972-4273-b921-a2dbc4aa474b' with 2 messages -19:37:59 - src.mai.memory.storage - DEBUG - Retrieved conversation '46efb9e2-acb0-425e-8358-320cb07b2226' with 2 messages -19:37:59 - src.mai.memory.storage - DEBUG - Retrieved conversation '9b990be1-6afb-49c2-86e1-8245d5a820c3' with 2 messages -19:37:59 - src.mai.memory.retrieval - DEBUG - Keyword search found 0 results -19:37:59 - src.mai.memory.retrieval - DEBUG - Recency search found 3 results -19:37:59 - mai.memory.manager - ERROR - Failed to get context: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -19:37:59 - mai.core.interface - DEBUG - Failed to retrieve memory context: Context retrieval failed: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -19:37:59 - httpcore.connection - DEBUG - close.started -19:37:59 - httpcore.connection - DEBUG - close.complete -19:37:59 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -19:37:59 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -19:37:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:37:59 - httpcore.http11 - DEBUG - send_request_headers.complete -19:37:59 - httpcore.http11 - DEBUG - send_request_body.started request= -19:37:59 - httpcore.http11 - DEBUG - send_request_body.complete -19:37:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:37:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 00:37:59 GMT'), (b'Content-Length', b'476')]) -19:37:59 - httpx - INFO - HTTP Request: POST http://localhost:11434/api/chat "HTTP/1.1 200 OK" -19:37:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:37:59 - httpcore.http11 - DEBUG - receive_response_body.complete -19:37:59 - httpcore.http11 - DEBUG - response_closed.started -19:37:59 - httpcore.http11 - DEBUG - response_closed.complete -19:37:59 - mai.model.ollama_client - DEBUG - Generated response from llama3.2:1b -19:37:59 - src.mai.memory.storage - INFO - Stored conversation '28e5bdf6-d8bc-45d2-82b4-3a95d09e2bba' with 2 messages -19:37:59 - src.mai.memory.storage - DEBUG - Retrieved conversation '28e5bdf6-d8bc-45d2-82b4-3a95d09e2bba' with 2 messages -19:37:59 - mai.memory.manager - INFO - Stored conversation '28e5bdf6-d8bc-45d2-82b4-3a95d09e2bba' with 2 messages -19:37:59 - mai.core.interface - DEBUG - Stored conversation in memory: 28e5bdf6-d8bc-45d2-82b4-3a95d09e2bba -19:49:27 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -19:49:27 - git.util - DEBUG - sys.platform='linux', git_executable='git' -19:49:27 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -19:49:27 - git.util - DEBUG - sys.platform='linux', git_executable='git' -19:49:27 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -19:49:27 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -19:49:27 - docker.utils.config - DEBUG - Trying paths: ['/home/mystiatech/.docker/config.json', '/home/mystiatech/.dockercfg'] -19:49:27 - docker.utils.config - DEBUG - Found file at path: /home/mystiatech/.docker/config.json -19:49:27 - docker.auth - DEBUG - Found 'credsStore' section -19:49:27 - urllib3.connectionpool - DEBUG - http://localhost:None "GET /version HTTP/1.1" 200 None -19:49:27 - urllib3.connectionpool - DEBUG - http://localhost:None "GET /v1.52/_ping HTTP/1.1" 200 None -19:49:27 - src.mai.memory.storage - INFO - Loading embedding model: all-MiniLM-L6-v2 -19:49:27 - sentence_transformers.SentenceTransformer - INFO - Use pytorch device_name: cuda:0 -19:49:27 - sentence_transformers.SentenceTransformer - INFO - Load pretrained SentenceTransformer: all-MiniLM-L6-v2 -19:49:27 - httpcore.connection - DEBUG - connect_tcp.started host='huggingface.co' port=443 local_address=None timeout=10 socket_options=None -19:49:27 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -19:49:27 - httpcore.connection - DEBUG - start_tls.started ssl_context= server_hostname='huggingface.co' timeout=10 -19:49:27 - httpcore.connection - DEBUG - start_tls.complete return_value= -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:27 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b97-4647f4384c46aaf03ded88d1;06f4edb8-df95-4f81-8a17-5c7567f1970d'), (b'RateLimit', b'"resolvers";r=2999;t=5'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'hw4GDu-7ijJH0NlMGl87f7o7Wej7nohZ0DpqE56C_FVZEqlmUf_rnw==')]) -19:49:27 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:27 - httpcore.http11 - DEBUG - response_closed.started -19:49:27 - httpcore.http11 - DEBUG - response_closed.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'ty-V9zVAnOUR685a7p-BP_YFnLqngnmriTSIQtHzrHjgbdzskvA9hQ=='), (b'Age', b'16906677')]) -19:49:27 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:27 - httpcore.http11 - DEBUG - response_closed.started -19:49:27 - httpcore.http11 - DEBUG - response_closed.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:27 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b97-1d2867290bd194812b52db76;507809b3-9e7d-4030-9a99-44be7e7674c6'), (b'RateLimit', b'"resolvers";r=2998;t=5'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'voCxiqklEXMp86MD2qBYzRPf1NaQC_cHqGGTrguf0hsTHSHagZnwUA==')]) -19:49:27 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:27 - httpcore.http11 - DEBUG - response_closed.started -19:49:27 - httpcore.http11 - DEBUG - response_closed.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'v-asUB0hr_je9Hk_IZsWLOdqVbRmQup0-B1MOx0s4PukjF3FAT4ARg=='), (b'Age', b'16906676')]) -19:49:27 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:27 - httpcore.http11 - DEBUG - response_closed.started -19:49:27 - httpcore.http11 - DEBUG - response_closed.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:27 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b97-1807cae24c9e0fd878d6cefd;52d91379-7b9d-42ac-a5e5-e576231d6074'), (b'RateLimit', b'"resolvers";r=2997;t=5'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Ih1907uge0SjeZAqQCJdpLmU06Cwf0n8CTqlszVbWQE7zzXrvsS9jQ==')]) -19:49:27 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:27 - httpcore.http11 - DEBUG - response_closed.started -19:49:27 - httpcore.http11 - DEBUG - response_closed.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'OytT5MreeoUepVpF2Np3lbyPq7fS0TOm58HE3Ky6Q9S-uwlGMe_J1A=='), (b'Age', b'16906676')]) -19:49:27 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:27 - httpcore.http11 - DEBUG - response_closed.started -19:49:27 - httpcore.http11 - DEBUG - response_closed.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'276'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:27 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2FREADME.md=&etag=%2258d4a9a45664eb9e12de9549c548c09b6134c17f%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b97-6b8be86a4fa582a545065b36;3cb4e764-4b86-49f9-af4c-09efde459c0c'), (b'RateLimit', b'"resolvers";r=2996;t=5'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'PZ0RiPFPb-ajXfOBRlTBhG5Ke5ddAN5BaU2ND4qazzlBjLHfLEnLjQ==')]) -19:49:27 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/README.md "HTTP/1.1 307 Temporary Redirect" -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:27 - httpcore.http11 - DEBUG - response_closed.started -19:49:27 - httpcore.http11 - DEBUG - response_closed.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'10454'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:32 GMT'), (b'ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e4-65f7ce852d1fe6c63dd82d8c;83c3a845-c5a5-4419-abf2-31960223e770'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'OcPe13Xhd7a5FPyVZ_9tBRku6hQLJpBUxrXDdPu1h7XmGZEc_YXSUg=='), (b'Age', b'16906675')]) -19:49:27 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md "HTTP/1.1 200 OK" -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:27 - httpcore.http11 - DEBUG - response_closed.started -19:49:27 - httpcore.http11 - DEBUG - response_closed.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:27 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b97-7ebf38f40df99ae656658efb;b49de0b9-86ad-419b-9635-843fe8362e3a'), (b'RateLimit', b'"resolvers";r=2995;t=5'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-HF-Warning', b'unauthenticated; Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'6LR1ysod6USnW-bXWdh5k7CrBJ_E88r6Jafr_-LVfiRxZI_S7Cro0A==')]) -19:49:27 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:27 - httpcore.http11 - DEBUG - response_closed.started -19:49:27 - httpcore.http11 - DEBUG - response_closed.complete -19:49:27 - huggingface_hub.utils._http - WARNING - Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads. -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'km_thhWjsXs3OwTNAP1dNgVaTs6s3eWuUQ7qmOBXDUVW0jmyDLf07w=='), (b'Age', b'16906677')]) -19:49:27 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:27 - httpcore.http11 - DEBUG - response_closed.started -19:49:27 - httpcore.http11 - DEBUG - response_closed.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'308'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:27 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fsentence_bert_config.json=&etag=%2259d594003bf59880a884c574bf88ef7555bb0202%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b97-46db7aac6264060837a8240c;323d9b00-7e74-4f00-bcd6-19924d752ea3'), (b'RateLimit', b'"resolvers";r=2994;t=5'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'g2Tks1G8yYw5jX5Fa1DpCSjQttIkNt77WwUkKaYArWiXD9cf6qUi-A==')]) -19:49:27 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/sentence_bert_config.json "HTTP/1.1 307 Temporary Redirect" -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:27 - httpcore.http11 - DEBUG - response_closed.started -19:49:27 - httpcore.http11 - DEBUG - response_closed.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'53'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:35 GMT'), (b'ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e7-793defd917b2fff34bb93137;f97df483-7cc7-4061-bccd-166531ee26ec'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'fyBVe5Z4x1wFXu0HHrqq88IGh7Kre0X-Q5zNORfLsv3Rhi2PssPOeg=='), (b'Age', b'16906672')]) -19:49:27 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json "HTTP/1.1 200 OK" -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:27 - httpcore.http11 - DEBUG - response_closed.started -19:49:27 - httpcore.http11 - DEBUG - response_closed.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'15'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:27 GMT'), (b'ETag', b'W/"f-mY2VvLxuxB7KhsoOdQTlMTccuAQ"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b97-593e337159083d64105986d9;5b5d7b15-e287-4057-bc15-92dc5982260b'), (b'RateLimit', b'"resolvers";r=2993;t=5'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'MISS'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'Entry not found'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'AAvwhMHtgc0pQY9mxWkU9WLi0pNrqJHU_k3ceIIN19XDLrl2FKc4mA==')]) -19:49:27 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/adapter_config.json "HTTP/1.1 404 Not Found" -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:27 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:27 - httpcore.http11 - DEBUG - response_closed.started -19:49:27 - httpcore.http11 - DEBUG - response_closed.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:27 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:27 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:27 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:28 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:27 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b97-6e122e883afad5af3120aee6;fb8c4df0-e16e-4464-b566-0e496423d57d'), (b'RateLimit', b'"resolvers";r=2992;t=5'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'1xi8rBqmjKHH3vKNE8WOr1ovtl_FOB2_wCYE-TLCcEx0qGcLjD2dnw==')]) -19:49:28 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -19:49:28 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:28 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:28 - httpcore.http11 - DEBUG - response_closed.started -19:49:28 - httpcore.http11 - DEBUG - response_closed.complete -19:49:28 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:28 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:28 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:28 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:28 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:28 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'fg0ShC59wk-aSpOk6kFRFhhWmsr4tuZRhC9_oIkjDjL2rYw7K9g1Zw=='), (b'Age', b'18600423')]) -19:49:28 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -19:49:28 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:28 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:28 - httpcore.http11 - DEBUG - response_closed.started -19:49:28 - httpcore.http11 - DEBUG - response_closed.complete -19:49:28 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:28 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:28 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:28 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:28 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:28 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:27 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b97-65f7194b109d68831b7f9946;dd289fe5-259d-4142-9a74-a42a1fb8e31e'), (b'RateLimit', b'"resolvers";r=2991;t=5'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'IDVq9dC9Vcd6cM1IUmGbZML35mlvkmpvnVangMyZkVSLXBd8k7c2fQ==')]) -19:49:28 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -19:49:28 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:28 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:28 - httpcore.http11 - DEBUG - response_closed.started -19:49:28 - httpcore.http11 - DEBUG - response_closed.complete -19:49:28 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:28 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:28 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:28 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:28 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:28 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'i4Ql2Q7zQuDeWwwTX8dW2sq2YlGTKSLsyfc_W_7MQdYFy5jOQ82tjQ=='), (b'Age', b'18600423')]) -19:49:28 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -19:49:28 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:28 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:28 - httpcore.http11 - DEBUG - response_closed.started -19:49:28 - httpcore.http11 - DEBUG - response_closed.complete -19:49:28 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:28 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:28 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:28 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:28 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:28 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'300'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:27 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Ftokenizer_config.json=&etag=%22c79f2b6a0cea6f4b564fed1938984bace9d30ff0%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b97-4f7befad1a7c8c8745cf7852;6c6d1030-3277-40d4-8247-41cfe47825e9'), (b'RateLimit', b'"resolvers";r=2990;t=5'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-HF-Warning', b'unauthenticated; Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Rkb6JslzIR3E8KHIYqA07pBXVwvjU3s5-VFqPOdQEvzruaLRL2bE_A==')]) -19:49:28 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/tokenizer_config.json "HTTP/1.1 307 Temporary Redirect" -19:49:28 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:28 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:28 - httpcore.http11 - DEBUG - response_closed.started -19:49:28 - httpcore.http11 - DEBUG - response_closed.complete -19:49:28 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:28 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:28 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:28 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:28 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:28 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'350'), (b'Connection', b'keep-alive'), (b'Date', b'Fri, 27 Jun 2025 08:23:00 GMT'), (b'ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685e54e4-185fabac3ee499f1325b7683;ac28f8a9-2ca5-4215-a430-8da70930e987'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'oje8a-gQATuh5y0QM_wHWEEfOq8oRq-B__lW29E9ulu2bfMOUsG_sA=='), (b'Age', b'18462387')]) -19:49:28 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json "HTTP/1.1 200 OK" -19:49:28 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:28 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:28 - httpcore.http11 - DEBUG - response_closed.started -19:49:28 - httpcore.http11 - DEBUG - response_closed.complete -19:49:28 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:28 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:28 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:28 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:28 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:28 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'64'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:27 GMT'), (b'ETag', b'W/"40-09f9IAqP13xarAhQxFS2W8rvRkM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b97-7a03817e045e96365a7c5991;688428a9-24d7-4b4b-ab97-026788126cab'), (b'RateLimit', b'"api";r=499;t=5'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'additional_chat_templates does not exist on "main"'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'XxLlPt1QuXak1MTKp2bWsDlnlFFNG0nFZDr6b_WPAVF6mLvX9HDO4Q==')]) -19:49:28 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main/additional_chat_templates?recursive=false&expand=false "HTTP/1.1 404 Not Found" -19:49:28 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:28 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:28 - httpcore.http11 - DEBUG - response_closed.started -19:49:28 - httpcore.http11 - DEBUG - response_closed.complete -19:49:28 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:28 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:28 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:28 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:28 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:28 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6465'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:27 GMT'), (b'ETag', b'W/"1941-m0CqwCT0eLaAYulV6LKBoBypnns"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b97-22782efa606e728251a73dab;6b7f2528-cdb2-4e20-9a60-5830f16958e9'), (b'RateLimit', b'"api";r=498;t=5'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Kkmcuy1SLYQhGzoUvOsbRrh0FzoQ2yI4yxAqGV5LpqKfS_3Mo3pepQ==')]) -19:49:28 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main?recursive=true&expand=false "HTTP/1.1 200 OK" -19:49:28 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:28 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:28 - httpcore.http11 - DEBUG - response_closed.started -19:49:28 - httpcore.http11 - DEBUG - response_closed.complete -19:49:28 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:28 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:28 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:28 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:28 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:28 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'304'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:27 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2F1_Pooling%2Fconfig.json=&etag=%22d1514c3162bbe87b343f565fadc62e6c06f04f03%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b97-1dac4a4176dc5602555b853c;6267630f-894e-425a-b994-e406793ccd05'), (b'RateLimit', b'"resolvers";r=2989;t=5'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'KRiw3NOaILl1MuLhUnRVwNxfdQdha700EXjk_IGNG9Zrv1OPBkoNlQ==')]) -19:49:28 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/1_Pooling/config.json "HTTP/1.1 307 Temporary Redirect" -19:49:28 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:28 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:28 - httpcore.http11 - DEBUG - response_closed.started -19:49:28 - httpcore.http11 - DEBUG - response_closed.complete -19:49:28 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:28 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:28 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:28 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:28 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:28 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'190'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 18 Aug 2025 04:37:11 GMT'), (b'ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-68a2adf7-4d7e79097342d93a4134b829;2f881d9e-e68d-4662-b2f6-33a4aabad755'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'i_Fh3MhV8qaH7U80uziS6IHvUR6gtAjyaSVXrZAnLy6e-IfElFdkCg=='), (b'Age', b'13983136')]) -19:49:28 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json "HTTP/1.1 200 OK" -19:49:28 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:28 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:28 - httpcore.http11 - DEBUG - response_closed.started -19:49:28 - httpcore.http11 - DEBUG - response_closed.complete -19:49:28 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:28 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:28 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:28 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:28 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:28 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6825'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:27 GMT'), (b'ETag', b'W/"1aa9-XXTNzHzWlYOmKJGelWoAnligEjM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b97-4159d91751e47d200681a147;6cda554b-888f-4afd-9546-d62fc649f293'), (b'RateLimit', b'"api";r=497;t=5'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'kb4uUU7ns7_YLVwbWqRqdbmcnSFo9YAsd8ss0rFfMFANAH6LinnhWQ==')]) -19:49:28 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2 "HTTP/1.1 200 OK" -19:49:28 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:28 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:28 - httpcore.http11 - DEBUG - response_closed.started -19:49:28 - httpcore.http11 - DEBUG - response_closed.complete -19:49:29 - src.mai.memory.storage - INFO - Embedding model loaded: all-MiniLM-L6-v2 (dim: 384) -19:49:29 - src.mai.memory.storage - INFO - sqlite-vec extension loaded successfully -19:49:29 - src.mai.memory.storage - INFO - Database schema created successfully -19:49:29 - src.mai.memory.storage - INFO - Database schema verification passed -19:49:29 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -19:49:29 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -19:49:29 - src.mai.memory.compression - INFO - MemoryCompressor initialized -19:49:29 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -19:49:29 - mai.memory.manager - INFO - MemoryManager initialized with all components -19:49:29 - mai.core.interface - INFO - Memory system initialized successfully -19:49:29 - mai.core.interface - INFO - Mai interface initialized -19:49:29 - mai.core.interface - INFO - Initializing Mai interface... -19:49:29 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -19:49:29 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -19:49:29 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:29 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:29 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:29 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:29 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:29 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 00:49:29 GMT'), (b'Content-Length', b'337')]) -19:49:29 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -19:49:29 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:29 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:29 - httpcore.http11 - DEBUG - response_closed.started -19:49:29 - httpcore.http11 - DEBUG - response_closed.complete -19:49:29 - mai.model.ollama_client - INFO - Found 1 models -19:49:30 - mai.core.interface - WARNING - Git repository health check failed -19:49:30 - mai.core.interface - INFO - Selected initial model: llama3.2:1b -19:49:30 - mai.core.interface - INFO - Mai interface initialized successfully -19:49:30 - src.mai.memory.storage - INFO - Loading embedding model: all-MiniLM-L6-v2 -19:49:30 - sentence_transformers.SentenceTransformer - INFO - Use pytorch device_name: cuda:0 -19:49:30 - sentence_transformers.SentenceTransformer - INFO - Load pretrained SentenceTransformer: all-MiniLM-L6-v2 -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:29 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b99-3037d50f611277c9068dc56f;070294f5-8b55-4d92-bd10-b18f53c836e1'), (b'RateLimit', b'"resolvers";r=2988;t=3'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Rs7EnH7L9EMamHtcx7Zg_iE9MPx8ZDh64MphmS2TdtiLPXgmYeAKPQ==')]) -19:49:30 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:30 - httpcore.http11 - DEBUG - response_closed.started -19:49:30 - httpcore.http11 - DEBUG - response_closed.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'NShTAdrReQjNrTY86MdntOa8zxYBRwdTE5RkAG4Bo8SyVJpI_5naLg=='), (b'Age', b'16906679')]) -19:49:30 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:30 - httpcore.http11 - DEBUG - response_closed.started -19:49:30 - httpcore.http11 - DEBUG - response_closed.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:29 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b99-5539fcd254195483790ab81f;177b882f-5ab6-443c-a2fb-19200ec48f7a'), (b'RateLimit', b'"resolvers";r=2987;t=3'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'w4L0SSBgCdlGclcjiYAw8R7plHfo6HUPA6IOFxiBv9ATgDP3rUhWgQ==')]) -19:49:30 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:30 - httpcore.http11 - DEBUG - response_closed.started -19:49:30 - httpcore.http11 - DEBUG - response_closed.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Pqwb6zXKJfwgZjPdNccSYMKVOnOxwuEHLJ7bUYw9EYzjcpyBzZGg5w=='), (b'Age', b'16906678')]) -19:49:30 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:30 - httpcore.http11 - DEBUG - response_closed.started -19:49:30 - httpcore.http11 - DEBUG - response_closed.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:30 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b9a-6648d5437bbfd24d6ef370f7;808d3c30-4d83-4df6-9f13-c6bee246eccb'), (b'RateLimit', b'"resolvers";r=2986;t=2'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'EgzmVfOFiOE8dNhUYqSOtM8_D9U194p__Dp2kFEjRF1hIqq7xjijcg==')]) -19:49:30 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:30 - httpcore.http11 - DEBUG - response_closed.started -19:49:30 - httpcore.http11 - DEBUG - response_closed.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'8a9enj_OQgy6rQX2vr-OGWsLlFqlpeudU-haLTkNl0bbCV_mTw5bTg=='), (b'Age', b'16906679')]) -19:49:30 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:30 - httpcore.http11 - DEBUG - response_closed.started -19:49:30 - httpcore.http11 - DEBUG - response_closed.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'276'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:30 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2FREADME.md=&etag=%2258d4a9a45664eb9e12de9549c548c09b6134c17f%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b9a-58bb43b53ab6ecb27b9c6e2a;ae5e86e5-ecea-4dd8-8191-eafd410174c1'), (b'RateLimit', b'"resolvers";r=2985;t=2'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'v74askDXOQnY5Nnf_rHEUY6qUs3UXrA8oMZQhTnvfBgTKhhHLejsyg==')]) -19:49:30 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/README.md "HTTP/1.1 307 Temporary Redirect" -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:30 - httpcore.http11 - DEBUG - response_closed.started -19:49:30 - httpcore.http11 - DEBUG - response_closed.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'10454'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:32 GMT'), (b'ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e4-65f7ce852d1fe6c63dd82d8c;83c3a845-c5a5-4419-abf2-31960223e770'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Dltgh_AHbXhKQOOIWI_pAkEpocNeBix4LNLF3YQN0aMi6HJFAYIixQ=='), (b'Age', b'16906678')]) -19:49:30 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md "HTTP/1.1 200 OK" -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:30 - httpcore.http11 - DEBUG - response_closed.started -19:49:30 - httpcore.http11 - DEBUG - response_closed.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:30 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b9a-0d34f55e29d072d9043b1adb;5a83ece0-2b84-49a7-a9ae-94e3148b2e52'), (b'RateLimit', b'"resolvers";r=2984;t=2'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'yklLvTWHouXdii_nuGGf5WVc87cCEH3Q5J-QcxQknZZQRxrX0-7wGw==')]) -19:49:30 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:30 - httpcore.http11 - DEBUG - response_closed.started -19:49:30 - httpcore.http11 - DEBUG - response_closed.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'B0G1tLy9f9tmF3GcMMinlw8ghspOZlFEyighkBsA8BfwGQAEpz8sbw=='), (b'Age', b'16906680')]) -19:49:30 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:30 - httpcore.http11 - DEBUG - response_closed.started -19:49:30 - httpcore.http11 - DEBUG - response_closed.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'308'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:30 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fsentence_bert_config.json=&etag=%2259d594003bf59880a884c574bf88ef7555bb0202%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b9a-7a8615ab6e5f1303202536b6;496c443f-64e8-4852-9348-949131e8e58b'), (b'RateLimit', b'"resolvers";r=2983;t=2'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'2hSZs05bC9BlKno70U8hHbKckXjzFcQVTCe6VXmdM8e79eHoqqiaiw==')]) -19:49:30 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/sentence_bert_config.json "HTTP/1.1 307 Temporary Redirect" -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:30 - httpcore.http11 - DEBUG - response_closed.started -19:49:30 - httpcore.http11 - DEBUG - response_closed.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'53'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:35 GMT'), (b'ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e7-793defd917b2fff34bb93137;f97df483-7cc7-4061-bccd-166531ee26ec'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'PYqR19zx4EMj2Ixu1rLqH0PPcmTrPAxsmSnmiAbwAZgLJC-fIkOvPg=='), (b'Age', b'16906675')]) -19:49:30 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json "HTTP/1.1 200 OK" -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:30 - httpcore.http11 - DEBUG - response_closed.started -19:49:30 - httpcore.http11 - DEBUG - response_closed.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'15'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:30 GMT'), (b'ETag', b'W/"f-mY2VvLxuxB7KhsoOdQTlMTccuAQ"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b9a-5fb27001058423d95c87a982;738a0305-2aef-41cc-aff0-190252f8d679'), (b'RateLimit', b'"resolvers";r=2982;t=2'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'MISS'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'Entry not found'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'EePVeuy2kgVddht8nISogiAf85E1RX49WDdrvgdyGNfrK1vwGrktSw==')]) -19:49:30 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/adapter_config.json "HTTP/1.1 404 Not Found" -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:30 - httpcore.http11 - DEBUG - response_closed.started -19:49:30 - httpcore.http11 - DEBUG - response_closed.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:30 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b9a-44f195b205a7dead28d9e5a1;a173bc83-7a39-43e8-86af-cdb5bdad8ecd'), (b'RateLimit', b'"resolvers";r=2981;t=2'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'1wmxL6HySICZeiQwO4PUGH6tqySpRdXtJFnNjl-ALtkOGQ2OcO53rQ==')]) -19:49:30 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:30 - httpcore.http11 - DEBUG - response_closed.started -19:49:30 - httpcore.http11 - DEBUG - response_closed.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:30 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:30 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'P-mLMWQFqpjIZRxtUCF2mMHqgJLtN70rxc9wNcvDNfGH14_TV021Hg=='), (b'Age', b'18600426')]) -19:49:30 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:30 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:30 - httpcore.http11 - DEBUG - response_closed.started -19:49:30 - httpcore.http11 - DEBUG - response_closed.complete -19:49:31 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:31 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:31 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:31 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:31 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:31 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:30 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b9a-77a98f334750bd884070c108;f723bfa6-7d72-48f5-aed1-c47f62a1320d'), (b'RateLimit', b'"resolvers";r=2980;t=2'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'_yJe9XXGKc1-mmJn7ZQ4o_g3WzPZSQ86ZujW1fy2mKWy-86ytyfC8g==')]) -19:49:31 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -19:49:31 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:31 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:31 - httpcore.http11 - DEBUG - response_closed.started -19:49:31 - httpcore.http11 - DEBUG - response_closed.complete -19:49:31 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:31 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:31 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:31 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:31 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:31 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'WCgJnq87uswDASrllE64kLjbv9MIrYJaRS17T-wphWNMR_F5v59N_w=='), (b'Age', b'18600426')]) -19:49:31 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -19:49:31 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:31 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:31 - httpcore.http11 - DEBUG - response_closed.started -19:49:31 - httpcore.http11 - DEBUG - response_closed.complete -19:49:31 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:31 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:31 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:31 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:31 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:31 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'300'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:30 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Ftokenizer_config.json=&etag=%22c79f2b6a0cea6f4b564fed1938984bace9d30ff0%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b9a-205da44558281afc232f040b;bb49aa21-92bd-42d8-aa23-d548f67adc1e'), (b'RateLimit', b'"resolvers";r=2979;t=2'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'yotsCP8mAhdX24_vbIVabyHJItjN1YIm7jR8XU9kwRe0AIKVZ5ARJg==')]) -19:49:31 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/tokenizer_config.json "HTTP/1.1 307 Temporary Redirect" -19:49:31 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:31 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:31 - httpcore.http11 - DEBUG - response_closed.started -19:49:31 - httpcore.http11 - DEBUG - response_closed.complete -19:49:31 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:31 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:31 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:31 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:31 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:31 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'350'), (b'Connection', b'keep-alive'), (b'Date', b'Fri, 27 Jun 2025 08:23:00 GMT'), (b'ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685e54e4-185fabac3ee499f1325b7683;ac28f8a9-2ca5-4215-a430-8da70930e987'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Opaduapf8MDzwyhILQdtjwS2d_RqyWF85C8k-vAPVLDhbe_8LufpDg=='), (b'Age', b'18462390')]) -19:49:31 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json "HTTP/1.1 200 OK" -19:49:31 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:31 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:31 - httpcore.http11 - DEBUG - response_closed.started -19:49:31 - httpcore.http11 - DEBUG - response_closed.complete -19:49:31 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:31 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:31 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:31 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:31 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:31 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'64'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:30 GMT'), (b'ETag', b'W/"40-09f9IAqP13xarAhQxFS2W8rvRkM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b9a-106de5cc4fb828ef3ae7b802;0f2695f5-6f21-40d3-8784-07443e34e2ea'), (b'RateLimit', b'"api";r=496;t=2'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'additional_chat_templates does not exist on "main"'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'nQpVkHPbAs1AteH0WYyKuY3f4fbT41Cg0aPebopUmHgEL6x8qtMPCw==')]) -19:49:31 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main/additional_chat_templates?recursive=false&expand=false "HTTP/1.1 404 Not Found" -19:49:31 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:31 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:31 - httpcore.http11 - DEBUG - response_closed.started -19:49:31 - httpcore.http11 - DEBUG - response_closed.complete -19:49:31 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:31 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:31 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:31 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:31 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:31 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6465'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:30 GMT'), (b'ETag', b'W/"1941-m0CqwCT0eLaAYulV6LKBoBypnns"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b9a-547571a71a197f260cc986b6;1ac83e28-ceda-4130-b4d5-e3fd95027751'), (b'RateLimit', b'"api";r=495;t=2'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'bP-6OGFAJRkS4XPo2etOnfK_t3D2RxdX_jOuphEle9_nLYQPkT3M-w==')]) -19:49:31 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main?recursive=true&expand=false "HTTP/1.1 200 OK" -19:49:31 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:31 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:31 - httpcore.http11 - DEBUG - response_closed.started -19:49:31 - httpcore.http11 - DEBUG - response_closed.complete -19:49:31 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:31 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:31 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:31 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:31 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:31 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'304'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:30 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2F1_Pooling%2Fconfig.json=&etag=%22d1514c3162bbe87b343f565fadc62e6c06f04f03%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b9a-725562913fc3ba586247bb08;b19601ea-5f5a-4dd1-996a-23db4b78fcd7'), (b'RateLimit', b'"resolvers";r=2978;t=2'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'0d_MuGHexxPcU21OGSFkTqNd2IamVml2WQ3mKhW02grQ46j_mjCgHQ==')]) -19:49:31 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/1_Pooling/config.json "HTTP/1.1 307 Temporary Redirect" -19:49:31 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:31 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:31 - httpcore.http11 - DEBUG - response_closed.started -19:49:31 - httpcore.http11 - DEBUG - response_closed.complete -19:49:31 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:31 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:31 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:31 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:31 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:31 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'190'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 18 Aug 2025 04:37:11 GMT'), (b'ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-68a2adf7-4d7e79097342d93a4134b829;2f881d9e-e68d-4662-b2f6-33a4aabad755'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'tl1XilJm2WIYV1VVZcX3tThG48pbDk6uhGr3Hw1gsPGCpzZNhgO2JA=='), (b'Age', b'13983139')]) -19:49:31 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json "HTTP/1.1 200 OK" -19:49:31 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:31 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:31 - httpcore.http11 - DEBUG - response_closed.started -19:49:31 - httpcore.http11 - DEBUG - response_closed.complete -19:49:31 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:31 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:31 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:31 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:31 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:31 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6825'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 00:49:30 GMT'), (b'ETag', b'W/"1aa9-XXTNzHzWlYOmKJGelWoAnligEjM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69780b9a-72c38a5c10e08fe32dc39c3a;19e3a0b5-9370-42a6-9323-aadee29c9a15'), (b'RateLimit', b'"api";r=494;t=2'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 0fad2b2f93c2ade9df8e31249e9938a2.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'4Us36YE1Xp2G_thyK0yOcCc3_LMx_6ukrMCK0Y2J21YLgIDv6tyWMg==')]) -19:49:31 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2 "HTTP/1.1 200 OK" -19:49:31 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:31 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:31 - httpcore.http11 - DEBUG - response_closed.started -19:49:31 - httpcore.http11 - DEBUG - response_closed.complete -19:49:31 - src.mai.memory.storage - INFO - Embedding model loaded: all-MiniLM-L6-v2 (dim: 384) -19:49:31 - src.mai.memory.storage - INFO - sqlite-vec extension loaded successfully -19:49:31 - src.mai.memory.storage - INFO - Database schema created successfully -19:49:31 - src.mai.memory.storage - INFO - Database schema verification passed -19:49:31 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -19:49:31 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -19:49:31 - src.mai.memory.compression - INFO - MemoryCompressor initialized -19:49:31 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -19:49:31 - mai.memory.manager - INFO - MemoryManager initialized with all components -19:49:31 - mai.conversation.state - INFO - ConversationState initialized with max 10 turns per conversation -19:49:31 - mai.conversation.timing - INFO - TimingCalculator initialized with 'default' profile -19:49:31 - mai.conversation.reasoning - INFO - ReasoningEngine initialized -19:49:31 - mai.conversation.decomposition - INFO - RequestDecomposer initialized -19:49:31 - mai.conversation.interruption - INFO - InterruptHandler initialized with 30.0s timeout -19:49:31 - mai.conversation.interruption - DEBUG - Conversation state integrated -19:49:31 - mai.conversation.engine - INFO - ConversationEngine initialized with timing_profile='default', debug=False -19:49:32 - httpcore.http11 - DEBUG - send_request_headers.started request= -19:49:32 - httpcore.http11 - DEBUG - send_request_headers.complete -19:49:32 - httpcore.http11 - DEBUG - send_request_body.started request= -19:49:32 - httpcore.http11 - DEBUG - send_request_body.complete -19:49:32 - httpcore.http11 - DEBUG - receive_response_headers.started request= -19:49:32 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 00:49:32 GMT'), (b'Content-Length', b'337')]) -19:49:32 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -19:49:32 - httpcore.http11 - DEBUG - receive_response_body.started request= -19:49:32 - httpcore.http11 - DEBUG - receive_response_body.complete -19:49:32 - httpcore.http11 - DEBUG - response_closed.started -19:49:32 - httpcore.http11 - DEBUG - response_closed.complete -19:49:32 - mai.model.ollama_client - INFO - Found 1 models -19:49:33 - httpcore.connection - DEBUG - close.started -19:49:33 - httpcore.connection - DEBUG - close.complete -21:35:04 - asyncio - DEBUG - Using selector: EpollSelector -21:35:04 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -21:35:04 - git.util - DEBUG - sys.platform='linux', git_executable='git' -21:35:04 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -21:35:04 - git.util - DEBUG - sys.platform='linux', git_executable='git' -21:35:04 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -21:35:04 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -21:35:04 - src.mai.memory.storage - WARNING - sentence-transformers not available - embeddings disabled -21:35:04 - src.mai.memory.storage - WARNING - sqlite-vec not available - vector features disabled -21:35:04 - src.mai.memory.storage - INFO - Database schema created successfully -21:35:04 - src.mai.memory.storage - INFO - Database schema verification passed -21:35:04 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -21:35:04 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -21:35:04 - src.mai.memory.compression - INFO - MemoryCompressor initialized -21:35:04 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -21:35:04 - mai.memory.manager - INFO - MemoryManager initialized with all components -21:35:04 - mai.core.interface - INFO - Memory system initialized successfully -21:35:04 - mai.core.interface - INFO - Mai interface initialized -21:35:04 - mai.core.interface - INFO - Initializing Mai interface... -21:35:04 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -21:35:04 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -21:35:04 - httpcore.http11 - DEBUG - send_request_headers.started request= -21:35:04 - httpcore.http11 - DEBUG - send_request_headers.complete -21:35:04 - httpcore.http11 - DEBUG - send_request_body.started request= -21:35:04 - httpcore.http11 - DEBUG - send_request_body.complete -21:35:04 - httpcore.http11 - DEBUG - receive_response_headers.started request= -21:35:04 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 02:35:04 GMT'), (b'Content-Length', b'337')]) -21:35:04 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -21:35:04 - httpcore.http11 - DEBUG - receive_response_body.started request= -21:35:04 - httpcore.http11 - DEBUG - receive_response_body.complete -21:35:04 - httpcore.http11 - DEBUG - response_closed.started -21:35:04 - httpcore.http11 - DEBUG - response_closed.complete -21:35:04 - mai.model.ollama_client - INFO - Found 1 models -21:35:05 - mai.core.interface - WARNING - Git repository health check failed -21:35:05 - mai.core.interface - INFO - Selected initial model: llama3.2:1b -21:35:05 - mai.core.interface - INFO - Mai interface initialized successfully -21:35:05 - src.mai.memory.storage - WARNING - sentence-transformers not available - embeddings disabled -21:35:05 - src.mai.memory.storage - WARNING - sqlite-vec not available - vector features disabled -21:35:05 - src.mai.memory.storage - INFO - Database schema created successfully -21:35:05 - src.mai.memory.storage - INFO - Database schema verification passed -21:35:05 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -21:35:05 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -21:35:05 - src.mai.memory.compression - INFO - MemoryCompressor initialized -21:35:05 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -21:35:05 - mai.memory.manager - INFO - MemoryManager initialized with all components -21:35:05 - mai.conversation.state - INFO - ConversationState initialized with max 10 turns per conversation -21:35:05 - mai.conversation.timing - INFO - TimingCalculator initialized with 'default' profile -21:35:05 - mai.conversation.reasoning - INFO - ReasoningEngine initialized -21:35:05 - mai.conversation.decomposition - INFO - RequestDecomposer initialized -21:35:05 - mai.conversation.interruption - INFO - InterruptHandler initialized with 30.0s timeout -21:35:05 - mai.conversation.interruption - DEBUG - Conversation state integrated -21:35:05 - mai.conversation.engine - INFO - ConversationEngine initialized with timing_profile='default', debug=False -21:35:06 - httpcore.http11 - DEBUG - send_request_headers.started request= -21:35:06 - httpcore.http11 - DEBUG - send_request_headers.complete -21:35:06 - httpcore.http11 - DEBUG - send_request_body.started request= -21:35:06 - httpcore.http11 - DEBUG - send_request_body.complete -21:35:06 - httpcore.http11 - DEBUG - receive_response_headers.started request= -21:35:06 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 02:35:06 GMT'), (b'Content-Length', b'337')]) -21:35:06 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -21:35:06 - httpcore.http11 - DEBUG - receive_response_body.started request= -21:35:06 - httpcore.http11 - DEBUG - receive_response_body.complete -21:35:06 - httpcore.http11 - DEBUG - response_closed.started -21:35:06 - httpcore.http11 - DEBUG - response_closed.complete -21:35:06 - mai.model.ollama_client - INFO - Found 1 models -21:35:07 - httpcore.http11 - DEBUG - send_request_headers.started request= -21:35:07 - httpcore.http11 - DEBUG - send_request_headers.complete -21:35:07 - httpcore.http11 - DEBUG - send_request_body.started request= -21:35:07 - httpcore.http11 - DEBUG - send_request_body.complete -21:35:07 - httpcore.http11 - DEBUG - receive_response_headers.started request= -21:35:07 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 02:35:07 GMT'), (b'Content-Length', b'337')]) -21:35:07 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -21:35:07 - httpcore.http11 - DEBUG - receive_response_body.started request= -21:35:07 - httpcore.http11 - DEBUG - receive_response_body.complete -21:35:07 - httpcore.http11 - DEBUG - response_closed.started -21:35:07 - httpcore.http11 - DEBUG - response_closed.complete -21:35:07 - mai.model.ollama_client - INFO - Found 1 models -21:35:16 - httpcore.connection - DEBUG - close.started -21:35:16 - httpcore.connection - DEBUG - close.complete -21:35:16 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -21:35:16 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -21:35:16 - httpcore.http11 - DEBUG - send_request_headers.started request= -21:35:16 - httpcore.http11 - DEBUG - send_request_headers.complete -21:35:16 - httpcore.http11 - DEBUG - send_request_body.started request= -21:35:16 - httpcore.http11 - DEBUG - send_request_body.complete -21:35:16 - httpcore.http11 - DEBUG - receive_response_headers.started request= -21:35:16 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 02:35:16 GMT'), (b'Content-Length', b'337')]) -21:35:16 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -21:35:16 - httpcore.http11 - DEBUG - receive_response_body.started request= -21:35:16 - httpcore.http11 - DEBUG - receive_response_body.complete -21:35:16 - httpcore.http11 - DEBUG - response_closed.started -21:35:16 - httpcore.http11 - DEBUG - response_closed.complete -21:35:16 - mai.model.ollama_client - INFO - Found 1 models -21:35:16 - mai.conversation.state - DEBUG - Started new conversation: e648a783-b233-4478-a1d2-5eafd433e9a2 -21:35:16 - mai.conversation.engine - INFO - Processing conversation turn for e648a783-b233-4478-a1d2-5eafd433e9a2 -21:35:16 - src.mai.memory.retrieval - INFO - Retrieving context for query: Hi Mai, how are you?... -21:35:16 - src.mai.memory.storage - WARNING - Vector search not available - falling back to text search -21:35:16 - src.mai.memory.storage - DEBUG - Text search fallback found 0 conversations for query: 'Hi Mai, how are you?' -21:35:16 - src.mai.memory.retrieval - DEBUG - Semantic search found 0 results -21:35:16 - src.mai.memory.storage - DEBUG - Retrieved conversation '28e5bdf6-d8bc-45d2-82b4-3a95d09e2bba' with 2 messages -21:35:16 - src.mai.memory.storage - DEBUG - Retrieved conversation 'ae221870-4972-4273-b921-a2dbc4aa474b' with 2 messages -21:35:16 - src.mai.memory.storage - DEBUG - Retrieved conversation '46efb9e2-acb0-425e-8358-320cb07b2226' with 2 messages -21:35:16 - src.mai.memory.storage - DEBUG - Retrieved conversation '9b990be1-6afb-49c2-86e1-8245d5a820c3' with 2 messages -21:35:16 - src.mai.memory.retrieval - DEBUG - Keyword search found 3 results -21:35:16 - src.mai.memory.retrieval - DEBUG - Recency search found 3 results -21:35:16 - mai.memory.manager - ERROR - Failed to get context: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -21:35:16 - mai.conversation.engine - WARNING - Failed to retrieve memory context: Context retrieval failed: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -21:35:16 - mai.conversation.state - DEBUG - Retrieved 0 messages from conversation e648a783-b233-4478-a1d2-5eafd433e9a2 -21:35:16 - mai.conversation.timing - DEBUG - Complexity analysis: score=0.10, words=5, questions=1, technical=0 -21:35:16 - mai.conversation.timing - DEBUG - Delay calculation: simple complexity (0.10) -> 2.61s -21:35:16 - mai.conversation.engine - INFO - Applying 2.61s delay for natural timing -21:35:19 - src.mai.memory.retrieval - INFO - Retrieving context for query: Hi Mai, how are you?... -21:35:19 - src.mai.memory.storage - WARNING - Vector search not available - falling back to text search -21:35:19 - src.mai.memory.storage - DEBUG - Text search fallback found 0 conversations for query: 'Hi Mai, how are you?' -21:35:19 - src.mai.memory.retrieval - DEBUG - Semantic search found 0 results -21:35:19 - src.mai.memory.storage - DEBUG - Retrieved conversation '28e5bdf6-d8bc-45d2-82b4-3a95d09e2bba' with 2 messages -21:35:19 - src.mai.memory.storage - DEBUG - Retrieved conversation 'ae221870-4972-4273-b921-a2dbc4aa474b' with 2 messages -21:35:19 - src.mai.memory.storage - DEBUG - Retrieved conversation '46efb9e2-acb0-425e-8358-320cb07b2226' with 2 messages -21:35:19 - src.mai.memory.storage - DEBUG - Retrieved conversation '9b990be1-6afb-49c2-86e1-8245d5a820c3' with 2 messages -21:35:19 - src.mai.memory.retrieval - DEBUG - Keyword search found 3 results -21:35:19 - src.mai.memory.retrieval - DEBUG - Recency search found 3 results -21:35:19 - mai.memory.manager - ERROR - Failed to get context: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -21:35:19 - mai.core.interface - DEBUG - Failed to retrieve memory context: Context retrieval failed: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -21:35:19 - httpcore.http11 - DEBUG - send_request_headers.started request= -21:35:19 - httpcore.http11 - DEBUG - send_request_headers.complete -21:35:19 - httpcore.http11 - DEBUG - send_request_body.started request= -21:35:19 - httpcore.http11 - DEBUG - send_request_body.complete -21:35:19 - httpcore.http11 - DEBUG - receive_response_headers.started request= -21:35:21 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 02:35:21 GMT'), (b'Content-Length', b'356')]) -21:35:21 - httpx - INFO - HTTP Request: POST http://localhost:11434/api/chat "HTTP/1.1 200 OK" -21:35:21 - httpcore.http11 - DEBUG - receive_response_body.started request= -21:35:21 - httpcore.http11 - DEBUG - receive_response_body.complete -21:35:21 - httpcore.http11 - DEBUG - response_closed.started -21:35:21 - httpcore.http11 - DEBUG - response_closed.complete -21:35:21 - mai.model.ollama_client - DEBUG - Generated response from llama3.2:1b -21:35:21 - src.mai.memory.storage - INFO - Stored conversation '96dc6411-4d2e-4bf8-949f-5dcc472e447b' with 2 messages -21:35:21 - src.mai.memory.storage - DEBUG - Retrieved conversation '96dc6411-4d2e-4bf8-949f-5dcc472e447b' with 2 messages -21:35:21 - mai.memory.manager - INFO - Stored conversation '96dc6411-4d2e-4bf8-949f-5dcc472e447b' with 2 messages -21:35:21 - mai.core.interface - DEBUG - Stored conversation in memory: 96dc6411-4d2e-4bf8-949f-5dcc472e447b -21:35:21 - src.mai.memory.storage - INFO - Stored conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -21:35:21 - src.mai.memory.storage - DEBUG - Retrieved conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -21:35:21 - mai.memory.manager - INFO - Stored conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -21:35:21 - mai.conversation.engine - DEBUG - Stored conversation turn in memory: e648a783-b233-4478-a1d2-5eafd433e9a2 -21:35:21 - mai.conversation.state - DEBUG - Added turn to conversation e648a783-b233-4478-a1d2-5eafd433e9a2: 20 tokens, 2.61s -21:35:21 - mai.conversation.timing - DEBUG - Complexity analysis: score=0.10, words=5, questions=1, technical=0 -21:35:21 - mai.conversation.engine - INFO - Conversation turn completed for e648a783-b233-4478-a1d2-5eafd433e9a2 -21:37:29 - asyncio - DEBUG - Using selector: EpollSelector -21:37:29 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -21:37:29 - git.util - DEBUG - sys.platform='linux', git_executable='git' -21:37:29 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -21:37:29 - git.util - DEBUG - sys.platform='linux', git_executable='git' -21:37:29 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -21:37:29 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -21:37:29 - src.mai.memory.storage - WARNING - sentence-transformers not available - embeddings disabled -21:37:29 - src.mai.memory.storage - WARNING - sqlite-vec not available - vector features disabled -21:37:29 - src.mai.memory.storage - INFO - Database schema created successfully -21:37:29 - src.mai.memory.storage - INFO - Database schema verification passed -21:37:29 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -21:37:29 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -21:37:29 - src.mai.memory.compression - INFO - MemoryCompressor initialized -21:37:29 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -21:37:29 - mai.memory.manager - INFO - MemoryManager initialized with all components -21:37:29 - mai.core.interface - INFO - Memory system initialized successfully -21:37:29 - mai.core.interface - INFO - Mai interface initialized -21:37:29 - mai.core.interface - INFO - Initializing Mai interface... -21:37:29 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -21:37:29 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -21:37:29 - httpcore.http11 - DEBUG - send_request_headers.started request= -21:37:29 - httpcore.http11 - DEBUG - send_request_headers.complete -21:37:29 - httpcore.http11 - DEBUG - send_request_body.started request= -21:37:29 - httpcore.http11 - DEBUG - send_request_body.complete -21:37:29 - httpcore.http11 - DEBUG - receive_response_headers.started request= -21:37:29 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 02:37:29 GMT'), (b'Content-Length', b'337')]) -21:37:29 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -21:37:29 - httpcore.http11 - DEBUG - receive_response_body.started request= -21:37:29 - httpcore.http11 - DEBUG - receive_response_body.complete -21:37:29 - httpcore.http11 - DEBUG - response_closed.started -21:37:29 - httpcore.http11 - DEBUG - response_closed.complete -21:37:29 - mai.model.ollama_client - INFO - Found 1 models -21:37:30 - mai.core.interface - WARNING - Git repository health check failed -21:37:30 - mai.core.interface - INFO - Selected initial model: llama3.2:1b -21:37:30 - mai.core.interface - INFO - Mai interface initialized successfully -21:37:30 - src.mai.memory.storage - WARNING - sentence-transformers not available - embeddings disabled -21:37:30 - src.mai.memory.storage - WARNING - sqlite-vec not available - vector features disabled -21:37:30 - src.mai.memory.storage - INFO - Database schema created successfully -21:37:30 - src.mai.memory.storage - INFO - Database schema verification passed -21:37:30 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -21:37:30 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -21:37:30 - src.mai.memory.compression - INFO - MemoryCompressor initialized -21:37:30 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -21:37:30 - mai.memory.manager - INFO - MemoryManager initialized with all components -21:37:30 - mai.conversation.state - INFO - ConversationState initialized with max 10 turns per conversation -21:37:30 - mai.conversation.timing - INFO - TimingCalculator initialized with 'default' profile -21:37:30 - mai.conversation.reasoning - INFO - ReasoningEngine initialized -21:37:30 - mai.conversation.decomposition - INFO - RequestDecomposer initialized -21:37:30 - mai.conversation.interruption - INFO - InterruptHandler initialized with 30.0s timeout -21:37:30 - mai.conversation.interruption - DEBUG - Conversation state integrated -21:37:30 - mai.conversation.engine - INFO - ConversationEngine initialized with timing_profile='default', debug=False -21:37:31 - httpcore.http11 - DEBUG - send_request_headers.started request= -21:37:31 - httpcore.http11 - DEBUG - send_request_headers.complete -21:37:31 - httpcore.http11 - DEBUG - send_request_body.started request= -21:37:31 - httpcore.http11 - DEBUG - send_request_body.complete -21:37:31 - httpcore.http11 - DEBUG - receive_response_headers.started request= -21:37:31 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 02:37:31 GMT'), (b'Content-Length', b'337')]) -21:37:31 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -21:37:31 - httpcore.http11 - DEBUG - receive_response_body.started request= -21:37:31 - httpcore.http11 - DEBUG - receive_response_body.complete -21:37:31 - httpcore.http11 - DEBUG - response_closed.started -21:37:31 - httpcore.http11 - DEBUG - response_closed.complete -21:37:31 - mai.model.ollama_client - INFO - Found 1 models -21:37:32 - httpcore.http11 - DEBUG - send_request_headers.started request= -21:37:32 - httpcore.http11 - DEBUG - send_request_headers.complete -21:37:32 - httpcore.http11 - DEBUG - send_request_body.started request= -21:37:32 - httpcore.http11 - DEBUG - send_request_body.complete -21:37:32 - httpcore.http11 - DEBUG - receive_response_headers.started request= -21:37:32 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 02:37:32 GMT'), (b'Content-Length', b'337')]) -21:37:32 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -21:37:32 - httpcore.http11 - DEBUG - receive_response_body.started request= -21:37:32 - httpcore.http11 - DEBUG - receive_response_body.complete -21:37:32 - httpcore.http11 - DEBUG - response_closed.started -21:37:32 - httpcore.http11 - DEBUG - response_closed.complete -21:37:32 - mai.model.ollama_client - INFO - Found 1 models -21:37:55 - httpcore.connection - DEBUG - close.started -21:37:55 - httpcore.connection - DEBUG - close.complete -21:37:55 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -21:37:55 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -21:37:55 - httpcore.http11 - DEBUG - send_request_headers.started request= -21:37:55 - httpcore.http11 - DEBUG - send_request_headers.complete -21:37:55 - httpcore.http11 - DEBUG - send_request_body.started request= -21:37:55 - httpcore.http11 - DEBUG - send_request_body.complete -21:37:55 - httpcore.http11 - DEBUG - receive_response_headers.started request= -21:37:55 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 02:37:55 GMT'), (b'Content-Length', b'337')]) -21:37:55 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -21:37:55 - httpcore.http11 - DEBUG - receive_response_body.started request= -21:37:55 - httpcore.http11 - DEBUG - receive_response_body.complete -21:37:55 - httpcore.http11 - DEBUG - response_closed.started -21:37:55 - httpcore.http11 - DEBUG - response_closed.complete -21:37:55 - mai.model.ollama_client - INFO - Found 1 models -21:37:55 - mai.conversation.state - DEBUG - Started new conversation: e648a783-b233-4478-a1d2-5eafd433e9a2 -21:37:55 - mai.conversation.engine - INFO - Processing conversation turn for e648a783-b233-4478-a1d2-5eafd433e9a2 -21:37:55 - src.mai.memory.retrieval - INFO - Retrieving context for query: Hi Mai, how are you?... -21:37:55 - src.mai.memory.storage - WARNING - Vector search not available - falling back to text search -21:37:55 - src.mai.memory.storage - DEBUG - Text search fallback found 2 conversations for query: 'Hi Mai, how are you?' -21:37:55 - src.mai.memory.retrieval - DEBUG - Semantic search found 2 results -21:37:55 - src.mai.memory.storage - DEBUG - Retrieved conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -21:37:55 - src.mai.memory.storage - DEBUG - Retrieved conversation '96dc6411-4d2e-4bf8-949f-5dcc472e447b' with 2 messages -21:37:55 - src.mai.memory.storage - DEBUG - Retrieved conversation '28e5bdf6-d8bc-45d2-82b4-3a95d09e2bba' with 2 messages -21:37:55 - src.mai.memory.storage - DEBUG - Retrieved conversation 'ae221870-4972-4273-b921-a2dbc4aa474b' with 2 messages -21:37:55 - src.mai.memory.storage - DEBUG - Retrieved conversation '46efb9e2-acb0-425e-8358-320cb07b2226' with 2 messages -21:37:55 - src.mai.memory.storage - DEBUG - Retrieved conversation '9b990be1-6afb-49c2-86e1-8245d5a820c3' with 2 messages -21:37:55 - src.mai.memory.retrieval - DEBUG - Keyword search found 3 results -21:37:55 - src.mai.memory.retrieval - DEBUG - Recency search found 3 results -21:37:55 - mai.memory.manager - ERROR - Failed to get context: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -21:37:55 - mai.conversation.engine - WARNING - Failed to retrieve memory context: Context retrieval failed: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -21:37:55 - mai.conversation.state - DEBUG - Retrieved 0 messages from conversation e648a783-b233-4478-a1d2-5eafd433e9a2 -21:37:55 - mai.conversation.timing - DEBUG - Complexity analysis: score=0.10, words=5, questions=1, technical=0 -21:37:55 - mai.conversation.timing - DEBUG - Delay calculation: simple complexity (0.10) -> 2.22s -21:37:55 - mai.conversation.engine - INFO - Applying 2.22s delay for natural timing -21:37:58 - src.mai.memory.retrieval - INFO - Retrieving context for query: Hi Mai, how are you?... -21:37:58 - src.mai.memory.storage - WARNING - Vector search not available - falling back to text search -21:37:58 - src.mai.memory.storage - DEBUG - Text search fallback found 2 conversations for query: 'Hi Mai, how are you?' -21:37:58 - src.mai.memory.retrieval - DEBUG - Semantic search found 2 results -21:37:58 - src.mai.memory.storage - DEBUG - Retrieved conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -21:37:58 - src.mai.memory.storage - DEBUG - Retrieved conversation '96dc6411-4d2e-4bf8-949f-5dcc472e447b' with 2 messages -21:37:58 - src.mai.memory.storage - DEBUG - Retrieved conversation '28e5bdf6-d8bc-45d2-82b4-3a95d09e2bba' with 2 messages -21:37:58 - src.mai.memory.storage - DEBUG - Retrieved conversation 'ae221870-4972-4273-b921-a2dbc4aa474b' with 2 messages -21:37:58 - src.mai.memory.storage - DEBUG - Retrieved conversation '46efb9e2-acb0-425e-8358-320cb07b2226' with 2 messages -21:37:58 - src.mai.memory.storage - DEBUG - Retrieved conversation '9b990be1-6afb-49c2-86e1-8245d5a820c3' with 2 messages -21:37:58 - src.mai.memory.retrieval - DEBUG - Keyword search found 3 results -21:37:58 - src.mai.memory.retrieval - DEBUG - Recency search found 3 results -21:37:58 - mai.memory.manager - ERROR - Failed to get context: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -21:37:58 - mai.core.interface - DEBUG - Failed to retrieve memory context: Context retrieval failed: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -21:37:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -21:37:58 - httpcore.http11 - DEBUG - send_request_headers.complete -21:37:58 - httpcore.http11 - DEBUG - send_request_body.started request= -21:37:58 - httpcore.http11 - DEBUG - send_request_body.complete -21:37:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -21:37:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 02:37:59 GMT'), (b'Content-Length', b'545')]) -21:37:59 - httpx - INFO - HTTP Request: POST http://localhost:11434/api/chat "HTTP/1.1 200 OK" -21:37:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -21:37:59 - httpcore.http11 - DEBUG - receive_response_body.complete -21:37:59 - httpcore.http11 - DEBUG - response_closed.started -21:37:59 - httpcore.http11 - DEBUG - response_closed.complete -21:37:59 - mai.model.ollama_client - DEBUG - Generated response from llama3.2:1b -21:37:59 - src.mai.memory.storage - INFO - Stored conversation '8a40c3e8-fbb2-4029-beca-3513d7e005a8' with 2 messages -21:37:59 - src.mai.memory.storage - DEBUG - Retrieved conversation '8a40c3e8-fbb2-4029-beca-3513d7e005a8' with 2 messages -21:37:59 - mai.memory.manager - INFO - Stored conversation '8a40c3e8-fbb2-4029-beca-3513d7e005a8' with 2 messages -21:37:59 - mai.core.interface - DEBUG - Stored conversation in memory: 8a40c3e8-fbb2-4029-beca-3513d7e005a8 -21:37:59 - src.mai.memory.storage - INFO - Stored conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -21:37:59 - src.mai.memory.storage - DEBUG - Retrieved conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -21:37:59 - mai.memory.manager - INFO - Stored conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -21:37:59 - mai.conversation.engine - DEBUG - Stored conversation turn in memory: e648a783-b233-4478-a1d2-5eafd433e9a2 -21:37:59 - mai.conversation.state - DEBUG - Added turn to conversation e648a783-b233-4478-a1d2-5eafd433e9a2: 67 tokens, 2.22s -21:37:59 - mai.conversation.timing - DEBUG - Complexity analysis: score=0.10, words=5, questions=1, technical=0 -21:37:59 - mai.conversation.engine - INFO - Conversation turn completed for e648a783-b233-4478-a1d2-5eafd433e9a2 -21:54:58 - asyncio - DEBUG - Using selector: EpollSelector -21:54:58 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -21:54:58 - git.util - DEBUG - sys.platform='linux', git_executable='git' -21:54:58 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -21:54:58 - git.util - DEBUG - sys.platform='linux', git_executable='git' -21:54:58 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -21:54:58 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -21:54:58 - src.mai.memory.storage - WARNING - sentence-transformers not available - embeddings disabled -21:54:58 - src.mai.memory.storage - WARNING - sqlite-vec not available - vector features disabled -21:54:58 - src.mai.memory.storage - INFO - Database schema created successfully -21:54:58 - src.mai.memory.storage - INFO - Database schema verification passed -21:54:58 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -21:54:58 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -21:54:58 - src.mai.memory.compression - INFO - MemoryCompressor initialized -21:54:58 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -21:54:58 - mai.memory.manager - INFO - MemoryManager initialized with all components -21:54:58 - mai.core.interface - INFO - Memory system initialized successfully -21:54:58 - mai.core.interface - INFO - Mai interface initialized -21:54:58 - mai.core.interface - INFO - Initializing Mai interface... -21:54:58 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -21:54:58 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -21:54:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -21:54:58 - httpcore.http11 - DEBUG - send_request_headers.complete -21:54:58 - httpcore.http11 - DEBUG - send_request_body.started request= -21:54:58 - httpcore.http11 - DEBUG - send_request_body.complete -21:54:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -21:54:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 02:54:58 GMT'), (b'Content-Length', b'337')]) -21:54:58 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -21:54:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -21:54:58 - httpcore.http11 - DEBUG - receive_response_body.complete -21:54:58 - httpcore.http11 - DEBUG - response_closed.started -21:54:58 - httpcore.http11 - DEBUG - response_closed.complete -21:54:58 - mai.model.ollama_client - INFO - Found 1 models -21:54:59 - mai.core.interface - WARNING - Git repository health check failed -21:54:59 - mai.core.interface - INFO - Selected initial model: llama3.2:1b -21:54:59 - mai.core.interface - INFO - Mai interface initialized successfully -21:54:59 - src.mai.memory.storage - WARNING - sentence-transformers not available - embeddings disabled -21:54:59 - src.mai.memory.storage - WARNING - sqlite-vec not available - vector features disabled -21:54:59 - src.mai.memory.storage - INFO - Database schema created successfully -21:54:59 - src.mai.memory.storage - INFO - Database schema verification passed -21:54:59 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -21:54:59 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -21:54:59 - src.mai.memory.compression - INFO - MemoryCompressor initialized -21:54:59 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -21:54:59 - mai.memory.manager - INFO - MemoryManager initialized with all components -21:54:59 - mai.conversation.state - INFO - ConversationState initialized with max 10 turns per conversation -21:54:59 - mai.conversation.timing - INFO - TimingCalculator initialized with 'default' profile -21:54:59 - mai.conversation.reasoning - INFO - ReasoningEngine initialized -21:54:59 - mai.conversation.decomposition - INFO - RequestDecomposer initialized -21:54:59 - mai.conversation.interruption - INFO - InterruptHandler initialized with 30.0s timeout -21:54:59 - mai.conversation.interruption - DEBUG - Conversation state integrated -21:54:59 - mai.conversation.engine - INFO - ConversationEngine initialized with timing_profile='default', debug=False -21:55:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -21:55:00 - httpcore.http11 - DEBUG - send_request_headers.complete -21:55:00 - httpcore.http11 - DEBUG - send_request_body.started request= -21:55:00 - httpcore.http11 - DEBUG - send_request_body.complete -21:55:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -21:55:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 02:55:00 GMT'), (b'Content-Length', b'337')]) -21:55:00 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -21:55:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -21:55:00 - httpcore.http11 - DEBUG - receive_response_body.complete -21:55:00 - httpcore.http11 - DEBUG - response_closed.started -21:55:00 - httpcore.http11 - DEBUG - response_closed.complete -21:55:00 - mai.model.ollama_client - INFO - Found 1 models -21:55:01 - httpcore.http11 - DEBUG - send_request_headers.started request= -21:55:01 - httpcore.http11 - DEBUG - send_request_headers.complete -21:55:01 - httpcore.http11 - DEBUG - send_request_body.started request= -21:55:01 - httpcore.http11 - DEBUG - send_request_body.complete -21:55:01 - httpcore.http11 - DEBUG - receive_response_headers.started request= -21:55:01 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 02:55:01 GMT'), (b'Content-Length', b'337')]) -21:55:01 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -21:55:01 - httpcore.http11 - DEBUG - receive_response_body.started request= -21:55:01 - httpcore.http11 - DEBUG - receive_response_body.complete -21:55:01 - httpcore.http11 - DEBUG - response_closed.started -21:55:01 - httpcore.http11 - DEBUG - response_closed.complete -21:55:01 - mai.model.ollama_client - INFO - Found 1 models -21:55:17 - httpcore.connection - DEBUG - close.started -21:55:17 - httpcore.connection - DEBUG - close.complete -21:55:17 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -21:55:17 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -21:55:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -21:55:17 - httpcore.http11 - DEBUG - send_request_headers.complete -21:55:17 - httpcore.http11 - DEBUG - send_request_body.started request= -21:55:17 - httpcore.http11 - DEBUG - send_request_body.complete -21:55:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -21:55:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 02:55:17 GMT'), (b'Content-Length', b'337')]) -21:55:17 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -21:55:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -21:55:17 - httpcore.http11 - DEBUG - receive_response_body.complete -21:55:17 - httpcore.http11 - DEBUG - response_closed.started -21:55:17 - httpcore.http11 - DEBUG - response_closed.complete -21:55:17 - mai.model.ollama_client - INFO - Found 1 models -21:55:17 - mai.conversation.state - DEBUG - Started new conversation: e648a783-b233-4478-a1d2-5eafd433e9a2 -21:55:17 - mai.conversation.engine - INFO - Processing conversation turn for e648a783-b233-4478-a1d2-5eafd433e9a2 -21:55:17 - src.mai.memory.retrieval - INFO - Retrieving context for query: Hi, Mai. I am just testing the resouce monitor... -21:55:17 - src.mai.memory.storage - WARNING - Vector search not available - falling back to text search -21:55:17 - src.mai.memory.storage - DEBUG - Text search fallback found 0 conversations for query: 'Hi, Mai. I am just testing the resouce monitor' -21:55:17 - src.mai.memory.retrieval - DEBUG - Semantic search found 0 results -21:55:17 - src.mai.memory.storage - DEBUG - Retrieved conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -21:55:17 - src.mai.memory.storage - DEBUG - Retrieved conversation '8a40c3e8-fbb2-4029-beca-3513d7e005a8' with 2 messages -21:55:17 - src.mai.memory.storage - DEBUG - Retrieved conversation '96dc6411-4d2e-4bf8-949f-5dcc472e447b' with 2 messages -21:55:17 - src.mai.memory.storage - DEBUG - Retrieved conversation '28e5bdf6-d8bc-45d2-82b4-3a95d09e2bba' with 2 messages -21:55:17 - src.mai.memory.storage - DEBUG - Retrieved conversation 'ae221870-4972-4273-b921-a2dbc4aa474b' with 2 messages -21:55:17 - src.mai.memory.storage - DEBUG - Retrieved conversation '46efb9e2-acb0-425e-8358-320cb07b2226' with 2 messages -21:55:17 - src.mai.memory.storage - DEBUG - Retrieved conversation '9b990be1-6afb-49c2-86e1-8245d5a820c3' with 2 messages -21:55:17 - src.mai.memory.retrieval - DEBUG - Keyword search found 3 results -21:55:17 - src.mai.memory.retrieval - DEBUG - Recency search found 3 results -21:55:17 - mai.memory.manager - ERROR - Failed to get context: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -21:55:17 - mai.conversation.engine - WARNING - Failed to retrieve memory context: Context retrieval failed: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -21:55:17 - mai.conversation.state - DEBUG - Retrieved 0 messages from conversation e648a783-b233-4478-a1d2-5eafd433e9a2 -21:55:17 - mai.conversation.timing - DEBUG - Complexity analysis: score=0.00, words=9, questions=0, technical=0 -21:55:17 - mai.conversation.timing - DEBUG - Delay calculation: simple complexity (0.00) -> 2.93s -21:55:17 - mai.conversation.engine - INFO - Applying 2.93s delay for natural timing -21:55:21 - src.mai.memory.retrieval - INFO - Retrieving context for query: Hi, Mai. I am just testing the resouce monitor... -21:55:21 - src.mai.memory.storage - WARNING - Vector search not available - falling back to text search -21:55:21 - src.mai.memory.storage - DEBUG - Text search fallback found 0 conversations for query: 'Hi, Mai. I am just testing the resouce monitor' -21:55:21 - src.mai.memory.retrieval - DEBUG - Semantic search found 0 results -21:55:21 - src.mai.memory.storage - DEBUG - Retrieved conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -21:55:21 - src.mai.memory.storage - DEBUG - Retrieved conversation '8a40c3e8-fbb2-4029-beca-3513d7e005a8' with 2 messages -21:55:21 - src.mai.memory.storage - DEBUG - Retrieved conversation '96dc6411-4d2e-4bf8-949f-5dcc472e447b' with 2 messages -21:55:21 - src.mai.memory.storage - DEBUG - Retrieved conversation '28e5bdf6-d8bc-45d2-82b4-3a95d09e2bba' with 2 messages -21:55:21 - src.mai.memory.storage - DEBUG - Retrieved conversation 'ae221870-4972-4273-b921-a2dbc4aa474b' with 2 messages -21:55:21 - src.mai.memory.storage - DEBUG - Retrieved conversation '46efb9e2-acb0-425e-8358-320cb07b2226' with 2 messages -21:55:21 - src.mai.memory.storage - DEBUG - Retrieved conversation '9b990be1-6afb-49c2-86e1-8245d5a820c3' with 2 messages -21:55:21 - src.mai.memory.retrieval - DEBUG - Keyword search found 3 results -21:55:21 - src.mai.memory.retrieval - DEBUG - Recency search found 3 results -21:55:21 - mai.memory.manager - ERROR - Failed to get context: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -21:55:21 - mai.core.interface - DEBUG - Failed to retrieve memory context: Context retrieval failed: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -21:55:21 - httpcore.http11 - DEBUG - send_request_headers.started request= -21:55:21 - httpcore.http11 - DEBUG - send_request_headers.complete -21:55:21 - httpcore.http11 - DEBUG - send_request_body.started request= -21:55:21 - httpcore.http11 - DEBUG - send_request_body.complete -21:55:21 - httpcore.http11 - DEBUG - receive_response_headers.started request= -21:55:22 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 02:55:22 GMT'), (b'Content-Length', b'627')]) -21:55:22 - httpx - INFO - HTTP Request: POST http://localhost:11434/api/chat "HTTP/1.1 200 OK" -21:55:22 - httpcore.http11 - DEBUG - receive_response_body.started request= -21:55:22 - httpcore.http11 - DEBUG - receive_response_body.complete -21:55:22 - httpcore.http11 - DEBUG - response_closed.started -21:55:22 - httpcore.http11 - DEBUG - response_closed.complete -21:55:22 - mai.model.ollama_client - DEBUG - Generated response from llama3.2:1b -21:55:22 - src.mai.memory.storage - INFO - Stored conversation '58f4f7b3-3267-434e-becc-b4aac165c08d' with 2 messages -21:55:22 - src.mai.memory.storage - DEBUG - Retrieved conversation '58f4f7b3-3267-434e-becc-b4aac165c08d' with 2 messages -21:55:22 - mai.memory.manager - INFO - Stored conversation '58f4f7b3-3267-434e-becc-b4aac165c08d' with 2 messages -21:55:22 - mai.core.interface - DEBUG - Stored conversation in memory: 58f4f7b3-3267-434e-becc-b4aac165c08d -21:55:22 - src.mai.memory.storage - INFO - Stored conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -21:55:22 - src.mai.memory.storage - DEBUG - Retrieved conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -21:55:22 - mai.memory.manager - INFO - Stored conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -21:55:22 - mai.conversation.engine - DEBUG - Stored conversation turn in memory: e648a783-b233-4478-a1d2-5eafd433e9a2 -21:55:22 - mai.conversation.state - DEBUG - Added turn to conversation e648a783-b233-4478-a1d2-5eafd433e9a2: 93 tokens, 2.93s -21:55:22 - mai.conversation.timing - DEBUG - Complexity analysis: score=0.00, words=9, questions=0, technical=0 -21:55:22 - mai.conversation.engine - INFO - Conversation turn completed for e648a783-b233-4478-a1d2-5eafd433e9a2 -22:09:56 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -22:09:56 - git.util - DEBUG - sys.platform='linux', git_executable='git' -22:09:56 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -22:09:56 - git.util - DEBUG - sys.platform='linux', git_executable='git' -22:09:56 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -22:09:56 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -22:09:56 - docker.utils.config - DEBUG - Trying paths: ['/home/mystiatech/.docker/config.json', '/home/mystiatech/.dockercfg'] -22:09:56 - docker.utils.config - DEBUG - Found file at path: /home/mystiatech/.docker/config.json -22:09:56 - docker.auth - DEBUG - Found 'credsStore' section -22:09:56 - urllib3.connectionpool - DEBUG - http://localhost:None "GET /version HTTP/1.1" 200 None -22:09:56 - urllib3.connectionpool - DEBUG - http://localhost:None "GET /v1.52/_ping HTTP/1.1" 200 None -22:09:56 - src.mai.memory.storage - INFO - Loading embedding model: all-MiniLM-L6-v2 -22:09:56 - sentence_transformers.SentenceTransformer - INFO - Use pytorch device_name: cuda:0 -22:09:56 - sentence_transformers.SentenceTransformer - INFO - Load pretrained SentenceTransformer: all-MiniLM-L6-v2 -22:09:56 - httpcore.connection - DEBUG - connect_tcp.started host='huggingface.co' port=443 local_address=None timeout=10 socket_options=None -22:09:57 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -22:09:57 - httpcore.connection - DEBUG - start_tls.started ssl_context= server_hostname='huggingface.co' timeout=10 -22:09:57 - httpcore.connection - DEBUG - start_tls.complete return_value= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:56 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c84-20be853077411cc401c15439;9eb26390-c936-4814-9629-c2d46de8e90d'), (b'RateLimit', b'"resolvers";r=2999;t=276'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'uxvF4adChMjvvLsBQBWabFmSxoHadAeq7Y2ns021Klo34oZG1BXTbw==')]) -22:09:57 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'ufYoCbpQrVcU27zplw540LbSUFC22lSEFVcqczENTDznC1pbSnvADg=='), (b'Age', b'16915106')]) -22:09:57 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:56 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c84-7bcac32e2df26e96769fa9bf;58045f2d-6c89-4fbb-9066-b5c54af7d0bb'), (b'RateLimit', b'"resolvers";r=2998;t=276'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-HF-Warning', b'unauthenticated; Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'aJkBy3zlWWphFphfmBMg8drPCnzFOVapn6mmLoNmaECO6OF6Zor1sw==')]) -22:09:57 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - huggingface_hub.utils._http - WARNING - Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads. -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'B8pzyHDRbTRiIeSTL0M6ID2EBdF7WgG31A37ZRDe5Rr0NrBEPW0Mgg=='), (b'Age', b'16915105')]) -22:09:57 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:57 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c85-58514e7b713d23047eda6ad2;ed41fe26-9f7d-4fc5-8381-058b83318e94'), (b'RateLimit', b'"resolvers";r=2997;t=275'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'RSKtbIur9QpQfijq5_S-UBCtTJKGrWC9-DhiYroMEyw6-X_SazWcBw==')]) -22:09:57 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'hGI-soBFJkZql044TVTeMQ_Ysp4S5w4PzpsZL5bW5VjpLwORSn0SYw=='), (b'Age', b'16915106')]) -22:09:57 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'276'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:57 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2FREADME.md=&etag=%2258d4a9a45664eb9e12de9549c548c09b6134c17f%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c85-61df44fe7af70b326cd67b00;4153ca3b-09ea-4045-96c6-b6ff9758ff40'), (b'RateLimit', b'"resolvers";r=2996;t=275'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'ZJgGvHOFDz7Kor1VBAExWqSaHpKOVJCzyBESJoCq-OEUs0wqWYh9vA==')]) -22:09:57 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/README.md "HTTP/1.1 307 Temporary Redirect" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'10454'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:32 GMT'), (b'ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e4-65f7ce852d1fe6c63dd82d8c;83c3a845-c5a5-4419-abf2-31960223e770'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'epF_V0hZh2MgbjuCmHKC84_z7EgU5rKPem-Clck_0XYxRVEUTxupSg=='), (b'Age', b'16915105')]) -22:09:57 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md "HTTP/1.1 200 OK" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:57 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c85-776c9c4c7a729a7c3feafdac;b7d731ef-0353-4e78-af8f-5a2cda7ac22e'), (b'RateLimit', b'"resolvers";r=2995;t=275'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'6gjaj722tS1sW_raUFVk4cS272LBDJbki-eCSIQDE4x_EZRewZYJ-g==')]) -22:09:57 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'6TjWFWJISN583ZW8GbiTS1TlDw7PL_Qz6ATl9ml6XHtKBNZ9At5xJg=='), (b'Age', b'16915107')]) -22:09:57 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'308'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:57 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fsentence_bert_config.json=&etag=%2259d594003bf59880a884c574bf88ef7555bb0202%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c85-2172c02c0cd23c5b651b311d;cb7575b2-5343-4228-9547-c5cbdf1d5b6d'), (b'RateLimit', b'"resolvers";r=2994;t=275'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'KZhab4MSXrAKrKgHw40Wt7jZv17srgjh_to1chH1968nGSmavTh3qg==')]) -22:09:57 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/sentence_bert_config.json "HTTP/1.1 307 Temporary Redirect" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'53'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:35 GMT'), (b'ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e7-793defd917b2fff34bb93137;f97df483-7cc7-4061-bccd-166531ee26ec'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'yyAbPUKI4DVcVL21jQ1akC3st2xe3t-c7z8KP4wWQgcEnj3MlZfMGA=='), (b'Age', b'16915102')]) -22:09:57 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json "HTTP/1.1 200 OK" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'15'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:57 GMT'), (b'ETag', b'W/"f-mY2VvLxuxB7KhsoOdQTlMTccuAQ"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c85-33df3a9c6597b646255bf72f;b468110e-6b0a-4af4-b80f-c3d555099f43'), (b'RateLimit', b'"resolvers";r=2993;t=275'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'MISS'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'Entry not found'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'-jlGaGL-5Gx2c3oKpV1CDMJAYhip8kOOilrwE1-NHa0mJXJvitd7zA==')]) -22:09:57 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/adapter_config.json "HTTP/1.1 404 Not Found" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:57 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c85-2b2b5b1a6c2d6b7d7c1e0c38;70d5ed81-82be-4aab-a045-859be97e0236'), (b'RateLimit', b'"resolvers";r=2992;t=275'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'S_NwK6RSApS3gTTL0ZBIxrrPGfV5122GGbUBrg6nSsEztQX2MoD2lA==')]) -22:09:57 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'IUUz0j31gyiZSiN9nHIECF_uzmNTuS4Do-mRyJh-zCcc6jZrumCRIA=='), (b'Age', b'18608853')]) -22:09:57 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:57 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c85-7bd4d5d97bcd36846115fa6d;bbdfd3b2-05b4-4070-bd5c-ac489f1821be'), (b'RateLimit', b'"resolvers";r=2991;t=275'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'AcZcg0HWrYY53hRkuvolmpaSCn4kYwG-HZN_EpNW_IMy6TDJLQFP9g==')]) -22:09:57 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'kxO3ZJoEaPAcanDEW0f4pRN9bbKaX20-MSptoMQPcgngnrMW0kw4rA=='), (b'Age', b'18608853')]) -22:09:57 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'300'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:57 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Ftokenizer_config.json=&etag=%22c79f2b6a0cea6f4b564fed1938984bace9d30ff0%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c85-5184d587081b2fae5a0bacd8;10873bd6-4755-4bcf-b918-4d80929943ba'), (b'RateLimit', b'"resolvers";r=2990;t=275'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'AWpcVKjL_I38XTg68f_ZO0nJFtWDWtXWo5z7z8lBagA9hTdTkaK7ZQ==')]) -22:09:57 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/tokenizer_config.json "HTTP/1.1 307 Temporary Redirect" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'350'), (b'Connection', b'keep-alive'), (b'Date', b'Fri, 27 Jun 2025 08:23:00 GMT'), (b'ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685e54e4-185fabac3ee499f1325b7683;ac28f8a9-2ca5-4215-a430-8da70930e987'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'FfD7GYNQgUtBN08REm72QoJuh918iBpyZZU9BQ8cx9MBfMvFjxCuAg=='), (b'Age', b'18470817')]) -22:09:57 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json "HTTP/1.1 200 OK" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'64'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:57 GMT'), (b'ETag', b'W/"40-09f9IAqP13xarAhQxFS2W8rvRkM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c85-622fb4a9385ca5dd44e5a9b6;147d0299-8d20-4a87-878c-722c8550a050'), (b'RateLimit', b'"api";r=499;t=275'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'additional_chat_templates does not exist on "main"'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b't56kAhObEZ--YoM8EEebxqA7ByrRbcfzPg7Md7JbxG5k0z_T7IcF0A==')]) -22:09:57 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main/additional_chat_templates?recursive=false&expand=false "HTTP/1.1 404 Not Found" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - asyncio - DEBUG - Using selector: EpollSelector -22:09:57 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6465'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:57 GMT'), (b'ETag', b'W/"1941-m0CqwCT0eLaAYulV6LKBoBypnns"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c85-41d38a6136931b5a005acd79;e8752e73-6fea-4f0a-9fbc-94b123287a88'), (b'RateLimit', b'"api";r=498;t=275'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'vLYj6fXVZfgGU2PwZXvahiv2WnosuYxb_PfPGnh2_WS-Z7SdekS_Cw==')]) -22:09:57 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main?recursive=true&expand=false "HTTP/1.1 200 OK" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'304'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:57 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2F1_Pooling%2Fconfig.json=&etag=%22d1514c3162bbe87b343f565fadc62e6c06f04f03%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c85-16b84c8e619ad0d710d85293;cf97a8ed-1b7d-4691-8dca-def9c5e321f4'), (b'RateLimit', b'"resolvers";r=2989;t=275'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'I7O30vMw24uCLsz2RCKL5CphhGwFNM7ew3Cbh32tyEhEyUPc_N7wGA==')]) -22:09:57 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/1_Pooling/config.json "HTTP/1.1 307 Temporary Redirect" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'190'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 18 Aug 2025 04:37:11 GMT'), (b'ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-68a2adf7-4d7e79097342d93a4134b829;2f881d9e-e68d-4662-b2f6-33a4aabad755'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'PQYtqbhb6nTlbYEIq9JLtc-sAPnwneGei0iDEK0WgsV5UQtJ61KXew=='), (b'Age', b'13991566')]) -22:09:57 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json "HTTP/1.1 200 OK" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:57 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:57 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6825'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:57 GMT'), (b'ETag', b'W/"1aa9-XXTNzHzWlYOmKJGelWoAnligEjM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c85-7b799da6451cf99561645295;81b06a7b-f328-41a6-a848-61db2e0680db'), (b'RateLimit', b'"api";r=497;t=275'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'ORWc9mzz3N3Oqa2vNvW-kX24hcVeW7NLTswevXzeX_Mo2KDwuuMQmg==')]) -22:09:57 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2 "HTTP/1.1 200 OK" -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:57 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:57 - httpcore.http11 - DEBUG - response_closed.started -22:09:57 - httpcore.http11 - DEBUG - response_closed.complete -22:09:57 - git.util - DEBUG - sys.platform='linux', git_executable='git' -22:09:57 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -22:09:57 - git.util - DEBUG - sys.platform='linux', git_executable='git' -22:09:57 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -22:09:57 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -22:09:58 - docker.utils.config - DEBUG - Trying paths: ['/home/mystiatech/.docker/config.json', '/home/mystiatech/.dockercfg'] -22:09:58 - docker.utils.config - DEBUG - Found file at path: /home/mystiatech/.docker/config.json -22:09:58 - docker.auth - DEBUG - Found 'credsStore' section -22:09:58 - urllib3.connectionpool - DEBUG - http://localhost:None "GET /version HTTP/1.1" 200 None -22:09:58 - urllib3.connectionpool - DEBUG - http://localhost:None "GET /v1.52/_ping HTTP/1.1" 200 None -22:09:58 - src.mai.memory.storage - INFO - Loading embedding model: all-MiniLM-L6-v2 -22:09:58 - sentence_transformers.SentenceTransformer - INFO - Use pytorch device_name: cuda:0 -22:09:58 - sentence_transformers.SentenceTransformer - INFO - Load pretrained SentenceTransformer: all-MiniLM-L6-v2 -22:09:58 - httpcore.connection - DEBUG - connect_tcp.started host='huggingface.co' port=443 local_address=None timeout=10 socket_options=None -22:09:58 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -22:09:58 - httpcore.connection - DEBUG - start_tls.started ssl_context= server_hostname='huggingface.co' timeout=10 -22:09:58 - httpcore.connection - DEBUG - start_tls.complete return_value= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:57 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c85-2bae60583f592de54248a697;580488d5-a34e-47c1-9799-31af87505c2e'), (b'RateLimit', b'"resolvers";r=2988;t=275'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'cu5zoU503HTg1BvskhOweb31KNfbQbbKHjRRMnoPKG0-kCnzl7PFHw==')]) -22:09:58 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'p3CsxqZ8fHBJLRr13LR9-QQYurpr3vat_WcTqCvIci5Tv4XyknwzCQ=='), (b'Age', b'16915107')]) -22:09:58 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:57 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c85-4e8a9e20613f09212d9e649f;45b9f8c3-1ba0-487b-8d7d-af046b42ceb8'), (b'RateLimit', b'"resolvers";r=2987;t=275'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'iznsrrIhvdlPlz09DDnzvnay9_69cYydXY-2QGakNHyrE8sOlGI76w==')]) -22:09:58 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'YFgQK3_Ae2U0I2n9Ut3DpY9Z8EyMKJrv0_2inL44zdjKHf8cZwKGzw=='), (b'Age', b'16915106')]) -22:09:58 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:58 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c86-35d847045427ab4c0b7e408c;6fafd88f-193f-4ba0-92f1-83378e8cdbed'), (b'RateLimit', b'"resolvers";r=2986;t=274'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'XuRC4YkODSSKxLab7V4H3ael2tjlCy_JCSi41940D-NWSnhImZK7ig==')]) -22:09:58 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'ERnioO8F0SGLcDcJZMCCg2SvSueWLjBq242Rh5hmFZT5dryQbeXyug=='), (b'Age', b'16915107')]) -22:09:58 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'276'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:58 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2FREADME.md=&etag=%2258d4a9a45664eb9e12de9549c548c09b6134c17f%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c86-1d17c93f5bf173606832a6fd;63f8d13c-6605-4920-a1df-6b6d2fb14bab'), (b'RateLimit', b'"resolvers";r=2985;t=274'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-HF-Warning', b'unauthenticated; Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'F3fXOk8-ZWzXXdqsx4xdd_CW0wHD1qnbY3O58sAMLHj4tYbjmQENlw==')]) -22:09:58 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/README.md "HTTP/1.1 307 Temporary Redirect" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - huggingface_hub.utils._http - WARNING - Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads. -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'10454'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:32 GMT'), (b'ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e4-65f7ce852d1fe6c63dd82d8c;83c3a845-c5a5-4419-abf2-31960223e770'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'ikc3MfsNL-N_OuN9Svuf1WVOO7potM5oYkbrv4Tzy5UJkIEpT_qHWw=='), (b'Age', b'16915106')]) -22:09:58 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md "HTTP/1.1 200 OK" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:58 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c86-35b93abd41a3f226119fddfc;77232ab0-acda-4629-b7d3-0dbfcdd7d973'), (b'RateLimit', b'"resolvers";r=2984;t=274'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'GMBpUOIwij2Eo4HzmvQc3EtER9yvY-hTpM34qFbSmr0TxKwR36gm7Q==')]) -22:09:58 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'nxMFv8dGeeAWkf_uqNFHgq9cOpKRm8ConorX02c7rjGvWpZkeHdCFw=='), (b'Age', b'16915108')]) -22:09:58 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'308'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:58 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fsentence_bert_config.json=&etag=%2259d594003bf59880a884c574bf88ef7555bb0202%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c86-7e8b5030570172403986f492;ab6fcd49-6347-4e84-a547-558a01125cbb'), (b'RateLimit', b'"resolvers";r=2983;t=274'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'FBHsx0X5E0Qhr-W8q2Hkcwf-Fhnl8DDvS-01tUn47n-pNyyhCqYlAA==')]) -22:09:58 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/sentence_bert_config.json "HTTP/1.1 307 Temporary Redirect" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'53'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:35 GMT'), (b'ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e7-793defd917b2fff34bb93137;f97df483-7cc7-4061-bccd-166531ee26ec'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'0G1GZ5QcdDe5wkTU907FvAFZQ5K-bMj7LKk7j-5uPcp3v5mXnIvgMg=='), (b'Age', b'16915103')]) -22:09:58 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json "HTTP/1.1 200 OK" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - src.mai.memory.storage - INFO - Embedding model loaded: all-MiniLM-L6-v2 (dim: 384) -22:09:58 - src.mai.memory.storage - INFO - sqlite-vec extension loaded successfully -22:09:58 - src.mai.memory.storage - INFO - Database schema created successfully -22:09:58 - src.mai.memory.storage - INFO - Database schema verification passed -22:09:58 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'15'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:58 GMT'), (b'ETag', b'W/"f-mY2VvLxuxB7KhsoOdQTlMTccuAQ"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c86-069d14995d9c9a3238c16286;cd305605-37d8-4f17-9868-ae14843d6a36'), (b'RateLimit', b'"resolvers";r=2982;t=274'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-HF-Warning', b'unauthenticated; Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.'), (b'X-Hub-Cache', b'MISS'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'Entry not found'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'7soi_lUvRAHeQ0XLrH81eqwtE5JsjF7HuGQuhbr51u0r4tJIcpATXg==')]) -22:09:58 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/adapter_config.json "HTTP/1.1 404 Not Found" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -22:09:58 - src.mai.memory.compression - INFO - MemoryCompressor initialized -22:09:58 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -22:09:58 - mai.memory.manager - INFO - MemoryManager initialized with all components -22:09:58 - mai.core.interface - INFO - Memory system initialized successfully -22:09:58 - mai.core.interface - INFO - Mai interface initialized -22:09:58 - mai.core.interface - INFO - Initializing Mai interface... -22:09:58 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -22:09:58 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:09:58 GMT'), (b'Content-Length', b'337')]) -22:09:58 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - mai.model.ollama_client - INFO - Found 1 models -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:58 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c86-2b2b438352792c6e2e2a557f;e29076d0-363d-4364-a669-d4cb152135a7'), (b'RateLimit', b'"resolvers";r=2981;t=274'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'gMyIbCpl8JpQfbl7kSm0GDbJgA85dmYAPd_RYOPn1Y7sPQoLMScP1w==')]) -22:09:58 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'LQxnkHB3EYis45VPOi_P6US2D6PUELoFg4b36JbK9S5fM_NRZcgUKw=='), (b'Age', b'18608854')]) -22:09:58 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:58 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c86-5fa63f3405bb10db32b7df37;bec43f4d-1976-4a95-929f-8bb24dc984a2'), (b'RateLimit', b'"resolvers";r=2980;t=274'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'W0dBeLEILD2Kt5eZlh3mjDnEfwEmG0FY5QHXpKdyWo-pPiWF_Q3_bQ==')]) -22:09:58 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'XglRIvJu4r8B9vAX_2R_7vvq8yfcaHOhGzBhj2pawflZOpQPh9Y-Ww=='), (b'Age', b'18608854')]) -22:09:58 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'300'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:58 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Ftokenizer_config.json=&etag=%22c79f2b6a0cea6f4b564fed1938984bace9d30ff0%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c86-72f32b9123869f0b5053e5df;580bc143-7a29-49b9-812d-d60ced261ae6'), (b'RateLimit', b'"resolvers";r=2979;t=274'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'dzjAtWNsDmIDHmslb1LxYSXVg4fu9WmxU7LGZMC1ATDiV1LyfWBK-g==')]) -22:09:58 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/tokenizer_config.json "HTTP/1.1 307 Temporary Redirect" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'350'), (b'Connection', b'keep-alive'), (b'Date', b'Fri, 27 Jun 2025 08:23:00 GMT'), (b'ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685e54e4-185fabac3ee499f1325b7683;ac28f8a9-2ca5-4215-a430-8da70930e987'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'6ifK-HewADzOnZo4I1i2oNZMBvc9QIIyK2rOeAXu_Ua6OY4i5Y0xFg=='), (b'Age', b'18470818')]) -22:09:58 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json "HTTP/1.1 200 OK" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'64'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:58 GMT'), (b'ETag', b'W/"40-09f9IAqP13xarAhQxFS2W8rvRkM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c86-615ed09d360f9b7614ef6a56;f47027c3-fbfb-4212-8c71-632e01b930ee'), (b'RateLimit', b'"api";r=496;t=274'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'additional_chat_templates does not exist on "main"'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'6re_7nS7Z6WLR-ZVlsoQT9eNhf4PYuIr4kwHtvczPuMOh80uakz4lg==')]) -22:09:58 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main/additional_chat_templates?recursive=false&expand=false "HTTP/1.1 404 Not Found" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6465'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:58 GMT'), (b'ETag', b'W/"1941-m0CqwCT0eLaAYulV6LKBoBypnns"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c86-14624e974f62441573d20ac1;ff5919e2-4cc8-45a8-90a7-3c77bc8a09af'), (b'RateLimit', b'"api";r=495;t=274'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Gqee4IYGjzZiUMLRtoRSDk9cp8Ogm2BA6LQCTaoY__R0jrFiRrR-SA==')]) -22:09:58 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main?recursive=true&expand=false "HTTP/1.1 200 OK" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'304'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:58 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2F1_Pooling%2Fconfig.json=&etag=%22d1514c3162bbe87b343f565fadc62e6c06f04f03%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c86-291e63586f6232b2738d6c43;d30bece0-4bb4-49df-a8f4-d49be4b6e87d'), (b'RateLimit', b'"resolvers";r=2978;t=274'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Sa8b75LjvCk77LnGJbYR3FMR3QR1cTcg0mS7iGaMI4kqDzOitrVmQQ==')]) -22:09:58 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/1_Pooling/config.json "HTTP/1.1 307 Temporary Redirect" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'190'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 18 Aug 2025 04:37:11 GMT'), (b'ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-68a2adf7-4d7e79097342d93a4134b829;2f881d9e-e68d-4662-b2f6-33a4aabad755'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Jhx6veL6yoBEqTY5Hl9G9oRP09Nc3_e85BRBE4wpDx_UttcriT2ffA=='), (b'Age', b'13991567')]) -22:09:58 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json "HTTP/1.1 200 OK" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:58 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:58 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6825'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:58 GMT'), (b'ETag', b'W/"1aa9-XXTNzHzWlYOmKJGelWoAnligEjM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c86-35a5f5330b979a662d96d1d0;61401d70-4b9e-436c-9498-328a41980a98'), (b'RateLimit', b'"api";r=494;t=274'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'v1y_WoZemv5bCeYZwQTH2_veAOSf9N48A3EARLY-PTnyODqqTOzKLQ==')]) -22:09:58 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2 "HTTP/1.1 200 OK" -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:58 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:58 - httpcore.http11 - DEBUG - response_closed.started -22:09:58 - httpcore.http11 - DEBUG - response_closed.complete -22:09:59 - src.mai.memory.storage - INFO - Embedding model loaded: all-MiniLM-L6-v2 (dim: 384) -22:09:59 - src.mai.memory.storage - INFO - sqlite-vec extension loaded successfully -22:09:59 - src.mai.memory.storage - INFO - Database schema created successfully -22:09:59 - src.mai.memory.storage - INFO - Database schema verification passed -22:09:59 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -22:09:59 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -22:09:59 - src.mai.memory.compression - INFO - MemoryCompressor initialized -22:09:59 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -22:09:59 - mai.memory.manager - INFO - MemoryManager initialized with all components -22:09:59 - mai.core.interface - INFO - Memory system initialized successfully -22:09:59 - mai.core.interface - INFO - Mai interface initialized -22:09:59 - mai.core.interface - INFO - Initializing Mai interface... -22:09:59 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -22:09:59 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:09:59 GMT'), (b'Content-Length', b'337')]) -22:09:59 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:59 - httpcore.http11 - DEBUG - response_closed.started -22:09:59 - httpcore.http11 - DEBUG - response_closed.complete -22:09:59 - mai.model.ollama_client - INFO - Found 1 models -22:09:59 - mai.core.interface - WARNING - Git repository health check failed -22:09:59 - mai.core.interface - INFO - Selected initial model: llama3.2:1b -22:09:59 - mai.core.interface - INFO - Mai interface initialized successfully -22:09:59 - src.mai.memory.storage - INFO - Loading embedding model: all-MiniLM-L6-v2 -22:09:59 - sentence_transformers.SentenceTransformer - INFO - Use pytorch device_name: cuda:0 -22:09:59 - sentence_transformers.SentenceTransformer - INFO - Load pretrained SentenceTransformer: all-MiniLM-L6-v2 -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:59 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c87-78770f0863c0bfcb6ac2851a;231eeb72-2083-4432-b4d8-2008a09e8bcc'), (b'RateLimit', b'"resolvers";r=2977;t=273'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'8sqIfhpFcq_y3WaUJq1FHMihsoj-yv5rI3flj8FjQmmaSOgTjcohJQ==')]) -22:09:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:59 - httpcore.http11 - DEBUG - response_closed.started -22:09:59 - httpcore.http11 - DEBUG - response_closed.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'oPQuqp66M6T_ULVFITlfSvrck_2fvIBAfAw3NX8HHRpc0MOo_kWXqQ=='), (b'Age', b'16915109')]) -22:09:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:59 - httpcore.http11 - DEBUG - response_closed.started -22:09:59 - httpcore.http11 - DEBUG - response_closed.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:59 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c87-6e8c23bb6ff630d26e07a6bb;d5a20022-f15d-43bf-a32e-a96fe30c4639'), (b'RateLimit', b'"resolvers";r=2976;t=273'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'WfZGNZp-ykBX-xD0vqkMAJUfl7-6XV5WEv38G-FS2dnJ3kWmItQp5g==')]) -22:09:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:59 - httpcore.http11 - DEBUG - response_closed.started -22:09:59 - httpcore.http11 - DEBUG - response_closed.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'0NG4gZjot6ZO2My928fbK8BY_HJf_PvNrcRkYghuLXzAhxTP25PUKA=='), (b'Age', b'16915108')]) -22:09:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:59 - httpcore.http11 - DEBUG - response_closed.started -22:09:59 - httpcore.http11 - DEBUG - response_closed.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:59 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c87-425a8cc8710d6ff37be39431;07a8d587-218d-4746-a78a-ba07c9e8f6c5'), (b'RateLimit', b'"resolvers";r=2975;t=273'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'JaOpf2JOtMo4ChX7hdj2EsWbTILFdxrwuYVovQTumMHLP6YkFyrUFQ==')]) -22:09:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:59 - httpcore.http11 - DEBUG - response_closed.started -22:09:59 - httpcore.http11 - DEBUG - response_closed.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'jjVRzwxcBRVQqmg5qMElhZXt3o_sOQi6SsTGoTZp4pTLwJiBcZtG1Q=='), (b'Age', b'16915108')]) -22:09:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:59 - httpcore.http11 - DEBUG - response_closed.started -22:09:59 - httpcore.http11 - DEBUG - response_closed.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'276'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:59 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2FREADME.md=&etag=%2258d4a9a45664eb9e12de9549c548c09b6134c17f%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c87-45f7963f512c4bf63255a67a;52d12416-12ba-4bf8-82dc-85978dd92c2e'), (b'RateLimit', b'"resolvers";r=2974;t=273'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'wL4DaksSKk1YzYtiJRDJd5FUU6Y7RDU9nVJROQU5sS3zHrKrWjsqQw==')]) -22:09:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/README.md "HTTP/1.1 307 Temporary Redirect" -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:59 - httpcore.http11 - DEBUG - response_closed.started -22:09:59 - httpcore.http11 - DEBUG - response_closed.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'10454'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:32 GMT'), (b'ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e4-65f7ce852d1fe6c63dd82d8c;83c3a845-c5a5-4419-abf2-31960223e770'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'07B6fzaJa6JAJQNbd5OuyRJ7IbyboiYNDnY2R1dj32niUAkMfCahWQ=='), (b'Age', b'16915107')]) -22:09:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md "HTTP/1.1 200 OK" -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:59 - httpcore.http11 - DEBUG - response_closed.started -22:09:59 - httpcore.http11 - DEBUG - response_closed.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:59 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c87-1d8ccbb11fcad6326dd1fafc;aa806766-1ba9-45eb-9d01-369268cc338a'), (b'RateLimit', b'"resolvers";r=2973;t=273'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'wWzra5FrD8w6H_Cp9_BlSbsjcTjDYeEIs_MYGgrjRkFTY1SP-RkdGw==')]) -22:09:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:59 - httpcore.http11 - DEBUG - response_closed.started -22:09:59 - httpcore.http11 - DEBUG - response_closed.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Omnm4yxe67WKmS2sjD98ivRlslXgVwr95uUtqD0qFfgGzRXAH3v5mw=='), (b'Age', b'16915109')]) -22:09:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:59 - httpcore.http11 - DEBUG - response_closed.started -22:09:59 - httpcore.http11 - DEBUG - response_closed.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'308'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:59 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fsentence_bert_config.json=&etag=%2259d594003bf59880a884c574bf88ef7555bb0202%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c87-7d2a1100684069801bb6fe4e;187a42f2-bc30-4010-b65d-3c1de10a60c2'), (b'RateLimit', b'"resolvers";r=2972;t=273'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-HF-Warning', b'unauthenticated; Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'ek4Vv2Blgv2RJG-lGpFNBUT6WTXVHjoR1bFq5lyIdGZ-tb7u8TdQXg==')]) -22:09:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/sentence_bert_config.json "HTTP/1.1 307 Temporary Redirect" -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:59 - httpcore.http11 - DEBUG - response_closed.started -22:09:59 - httpcore.http11 - DEBUG - response_closed.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'53'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:35 GMT'), (b'ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e7-793defd917b2fff34bb93137;f97df483-7cc7-4061-bccd-166531ee26ec'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'XaRoCh-knBwxU4MnFIErpXYcqqnScPyMjAU8tKRiHaL4l47KUEoqXw=='), (b'Age', b'16915104')]) -22:09:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json "HTTP/1.1 200 OK" -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:59 - httpcore.http11 - DEBUG - response_closed.started -22:09:59 - httpcore.http11 - DEBUG - response_closed.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'15'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:59 GMT'), (b'ETag', b'W/"f-mY2VvLxuxB7KhsoOdQTlMTccuAQ"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c87-392ad9d6356bace2029d656b;12d65021-b817-4402-a73a-a80abf1e746c'), (b'RateLimit', b'"resolvers";r=2971;t=273'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'MISS'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'Entry not found'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'WuwqdSD8juhixAEH-XLdc-Q-z503rFht3d7BVoKHyAftYgwF1q1d-w==')]) -22:09:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/adapter_config.json "HTTP/1.1 404 Not Found" -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:59 - httpcore.http11 - DEBUG - response_closed.started -22:09:59 - httpcore.http11 - DEBUG - response_closed.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:59 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c87-58e1e7646d3161a631600ca3;d477c68c-d8f9-4554-a40c-c9b5238271ce'), (b'RateLimit', b'"resolvers";r=2970;t=273'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-HF-Warning', b'unauthenticated; Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'U153qwq7DjP4Fq1O81Xc2kHIlh_vTbLfgxjXFcEEIzLjipMoc404WA==')]) -22:09:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:59 - httpcore.http11 - DEBUG - response_closed.started -22:09:59 - httpcore.http11 - DEBUG - response_closed.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'd8_-Id_Omni9p2Ml3wOIJj_voHv15t9sU1mIcF-y4jbj7pp30Zb_tQ=='), (b'Age', b'18608855')]) -22:09:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:59 - httpcore.http11 - DEBUG - response_closed.started -22:09:59 - httpcore.http11 - DEBUG - response_closed.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:59 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c87-2b2087ae4319edff1babe7c1;f8033942-3b1f-48bf-91b3-cca33995185e'), (b'RateLimit', b'"resolvers";r=2969;t=273'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'zoazbIFbfLug1vafZgQ5km0GJRX7YWLDNe0OWk0XqFKECGTKG85Deg==')]) -22:09:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:59 - httpcore.http11 - DEBUG - response_closed.started -22:09:59 - httpcore.http11 - DEBUG - response_closed.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'WtGRn1P-r8Ttq6--PZNozahyK7gpHWJzInHIEmqxCxRjo9cIOpHCWA=='), (b'Age', b'18608855')]) -22:09:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:59 - httpcore.http11 - DEBUG - response_closed.started -22:09:59 - httpcore.http11 - DEBUG - response_closed.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'300'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:59 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Ftokenizer_config.json=&etag=%22c79f2b6a0cea6f4b564fed1938984bace9d30ff0%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c87-4b097ef51791466c747cdbe2;76890897-d1e8-43f8-8039-6063b0bbf199'), (b'RateLimit', b'"resolvers";r=2968;t=273'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'mAx-2F_L9A81sRvC-owOVPOg9SO_ODptzlAJ00U4Mbq3hyLRqhYPBA==')]) -22:09:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/tokenizer_config.json "HTTP/1.1 307 Temporary Redirect" -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:59 - httpcore.http11 - DEBUG - response_closed.started -22:09:59 - httpcore.http11 - DEBUG - response_closed.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_body.started request= -22:09:59 - httpcore.http11 - DEBUG - send_request_body.complete -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'350'), (b'Connection', b'keep-alive'), (b'Date', b'Fri, 27 Jun 2025 08:23:00 GMT'), (b'ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685e54e4-185fabac3ee499f1325b7683;ac28f8a9-2ca5-4215-a430-8da70930e987'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'kTb4xl4jIKgOz7KiU0dE07zL1j4RgQa8AOiczLXCdSW_1h4sRKouRQ=='), (b'Age', b'18470819')]) -22:09:59 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json "HTTP/1.1 200 OK" -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:09:59 - httpcore.http11 - DEBUG - receive_response_body.complete -22:09:59 - httpcore.http11 - DEBUG - response_closed.started -22:09:59 - httpcore.http11 - DEBUG - response_closed.complete -22:09:59 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'64'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:59 GMT'), (b'ETag', b'W/"40-09f9IAqP13xarAhQxFS2W8rvRkM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c87-252981ab74f9345d3c3010fa;d40446f5-1d4b-4c69-9e6f-672db4d42196'), (b'RateLimit', b'"api";r=493;t=273'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'additional_chat_templates does not exist on "main"'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Kv4eaLY4MpkbRPbCPy9KVUGlmryRm0UQ4mssNQ582C4m2FFoeWm9_w==')]) -22:10:00 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main/additional_chat_templates?recursive=false&expand=false "HTTP/1.1 404 Not Found" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6465'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:59 GMT'), (b'ETag', b'W/"1941-m0CqwCT0eLaAYulV6LKBoBypnns"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c87-6dcd164e3e3cfe7f04f184d1;36cb5873-d2af-4fde-8c9d-68d629a7c8c7'), (b'RateLimit', b'"api";r=492;t=273'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'OcT3OleUd6VcQlsXNFZJGvNYjFWjNWbB9kssHlxFEMfDtWfxeA_OFw==')]) -22:10:00 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main?recursive=true&expand=false "HTTP/1.1 200 OK" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'304'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:59 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2F1_Pooling%2Fconfig.json=&etag=%22d1514c3162bbe87b343f565fadc62e6c06f04f03%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c87-0712707c359210153e747105;923f2f10-2f33-45e2-9132-454abe55c614'), (b'RateLimit', b'"resolvers";r=2967;t=273'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-HF-Warning', b'unauthenticated; Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'1Q5_aRoSZlTux-7TkaU8jTbluDzSvJySFne580Gfhgbs9cWTxznM_A==')]) -22:10:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/1_Pooling/config.json "HTTP/1.1 307 Temporary Redirect" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'190'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 18 Aug 2025 04:37:11 GMT'), (b'ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-68a2adf7-4d7e79097342d93a4134b829;2f881d9e-e68d-4662-b2f6-33a4aabad755'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'lYThueK7GNipYBkbaj-MiGRaXoUOP1b4HSP0qaIRgeA0hAfbrG-sNA=='), (b'Age', b'13991568')]) -22:10:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json "HTTP/1.1 200 OK" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6825'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:09:59 GMT'), (b'ETag', b'W/"1aa9-XXTNzHzWlYOmKJGelWoAnligEjM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c87-3db21d9d4b0b98986bf11184;3777d218-e7a3-4359-b227-77e1cbe57221'), (b'RateLimit', b'"api";r=491;t=273'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1a5ddecdee7139ebf663ea7d3699cd88.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'wK-Wbd33HyubewTiZWvLPxT3_liq-DB53Qyxk5PyEucKpM4Y03CS_Q==')]) -22:10:00 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2 "HTTP/1.1 200 OK" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - src.mai.memory.storage - INFO - Embedding model loaded: all-MiniLM-L6-v2 (dim: 384) -22:10:00 - src.mai.memory.storage - INFO - sqlite-vec extension loaded successfully -22:10:00 - src.mai.memory.storage - INFO - Database schema created successfully -22:10:00 - src.mai.memory.storage - INFO - Database schema verification passed -22:10:00 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -22:10:00 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -22:10:00 - src.mai.memory.compression - INFO - MemoryCompressor initialized -22:10:00 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -22:10:00 - mai.memory.manager - INFO - MemoryManager initialized with all components -22:10:00 - mai.conversation.state - INFO - ConversationState initialized with max 10 turns per conversation -22:10:00 - mai.conversation.timing - INFO - TimingCalculator initialized with 'default' profile -22:10:00 - mai.conversation.reasoning - INFO - ReasoningEngine initialized -22:10:00 - mai.conversation.decomposition - INFO - RequestDecomposer initialized -22:10:00 - mai.conversation.interruption - INFO - InterruptHandler initialized with 30.0s timeout -22:10:00 - mai.conversation.interruption - DEBUG - Conversation state integrated -22:10:00 - mai.conversation.engine - INFO - ConversationEngine initialized with timing_profile='default', debug=False -22:10:00 - mai.core.interface - WARNING - Git repository health check failed -22:10:00 - mai.core.interface - INFO - Selected initial model: llama3.2:1b -22:10:00 - mai.core.interface - INFO - Mai interface initialized successfully -22:10:00 - src.mai.memory.storage - INFO - Loading embedding model: all-MiniLM-L6-v2 -22:10:00 - sentence_transformers.SentenceTransformer - INFO - Use pytorch device_name: cuda:0 -22:10:00 - sentence_transformers.SentenceTransformer - INFO - Load pretrained SentenceTransformer: all-MiniLM-L6-v2 -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:00 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c88-62cb88f1071b060e1c76517e;0902b7dd-a827-461d-9ee4-d1f1bfcf57a8'), (b'RateLimit', b'"resolvers";r=2966;t=272'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'fGPGF_V5EZsFAKAMvkDdyydMIMUhOZUSDslbYc64kYXJ9OghwNrPFA==')]) -22:10:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'cqlokQPD1xgIA6M3cuidJ_Bokj0jUjBVJ9AiGkzlfgT4vTCXjx41OQ=='), (b'Age', b'16915110')]) -22:10:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:00 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c88-278d1f8220706933003d27ef;5ba251b5-f81d-494e-ac8e-1d9377b500db'), (b'RateLimit', b'"resolvers";r=2965;t=272'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'tZmVec_TT449CuWsLTojVD7VCyy78ro5D7xNbJVoqf6aeJSc5dzexg==')]) -22:10:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'FmACsfoczYBU3lzba0xf5F3k5lFU2PD4-0tZGT5Ed_FsyXjRBxKC7g=='), (b'Age', b'16915109')]) -22:10:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:00 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c88-689e105d489652284330db66;749d4ae9-9020-4f68-bdbe-3d752394409b'), (b'RateLimit', b'"resolvers";r=2964;t=272'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-HF-Warning', b'unauthenticated; Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Du7MAJPdIX6gnP5G8YmB9gKVE-m8z12YgmmD_lZntCTz_DYk8dIhNA==')]) -22:10:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'0KQovj85lrNvs0c2vUMm4Ro_0Js6fQuFzSKsZUsEmCRpMdHUrxiX9w=='), (b'Age', b'16915109')]) -22:10:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'276'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:00 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2FREADME.md=&etag=%2258d4a9a45664eb9e12de9549c548c09b6134c17f%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c88-5977b8081f1bbcc32b057ff5;33df7d4e-bc05-4752-b916-e6c788a49069'), (b'RateLimit', b'"resolvers";r=2963;t=272'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'PdCJm_zDm26Tk8DzWYW8iJKFglPld0nTS5BheWKsTl83NgPrt7TH3w==')]) -22:10:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/README.md "HTTP/1.1 307 Temporary Redirect" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'10454'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:32 GMT'), (b'ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e4-65f7ce852d1fe6c63dd82d8c;83c3a845-c5a5-4419-abf2-31960223e770'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'STFC8bMg8PDgYUCM-X8DY2p-EbTQ0eMMfqyCigGmL0Tsib6p-PJzRA=='), (b'Age', b'16915108')]) -22:10:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md "HTTP/1.1 200 OK" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:00 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c88-140228f14eff08cc74867edd;74006ce8-1961-4cf2-bc89-74969d9bdcd3'), (b'RateLimit', b'"resolvers";r=2962;t=272'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'mXBg0S5AWZ8aPt4gPUVy59nv_PgNtJ1ILvgfnFC0ptBuVVQY-SPbeA==')]) -22:10:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'fTGAuOO6fC8uOGuf9F6xKqCsrSNeynAbq5os8jZ5VvDLXI1kiC_Yvg=='), (b'Age', b'16915110')]) -22:10:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'308'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:00 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fsentence_bert_config.json=&etag=%2259d594003bf59880a884c574bf88ef7555bb0202%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c88-7a7f57e54b5af633049ca82c;49b98484-58fc-4db2-8ada-7827b7d0d2d4'), (b'RateLimit', b'"resolvers";r=2961;t=272'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'9hR0GPRGl9yOQGiujmCKuCS4KIhk1osP2zXHkeIotafSsk8jJTkvgA==')]) -22:10:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/sentence_bert_config.json "HTTP/1.1 307 Temporary Redirect" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'53'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:35 GMT'), (b'ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e7-793defd917b2fff34bb93137;f97df483-7cc7-4061-bccd-166531ee26ec'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'WMoghhmLNZcK1FDVZNiw4_WQnFgH6oB7cwikTI2g5t6aGY4-N3WuXg=='), (b'Age', b'16915105')]) -22:10:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json "HTTP/1.1 200 OK" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'15'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:00 GMT'), (b'ETag', b'W/"f-mY2VvLxuxB7KhsoOdQTlMTccuAQ"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c88-6e8dcf6a4bb8cc3951a7aa15;6f763373-304e-4cd6-98c3-bf8d4b086d21'), (b'RateLimit', b'"resolvers";r=2960;t=272'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'MISS'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'Entry not found'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'RtUT9CWcbeU9h1eDNX7-hyskqXsEOa4pgw3LLH7M17KmkL4mLvVQLg==')]) -22:10:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/adapter_config.json "HTTP/1.1 404 Not Found" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:00 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c88-5b1184ec26a079a92b526ecf;e8b0af10-3c15-494e-848a-7f611c76d57c'), (b'RateLimit', b'"resolvers";r=2959;t=272'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Jb7fjlq0_Ta-wPdT8PEePcORvKS0_nuQDyrZki5QHnHQQkIm7WnCqQ==')]) -22:10:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'IN13yC_o9BMs1-2K21XNq06suHq7tWi2rkCRJIGISXRYHdiIw_wzAw=='), (b'Age', b'18608856')]) -22:10:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:00 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c88-0b57cb257659dedc720c44d4;eb4240d5-47f3-42f9-9179-69f372eed93c'), (b'RateLimit', b'"resolvers";r=2958;t=272'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'7wGnOgXVsw9OitI_-MVltcnD2A_XjkOUfoa755lFS_jQMk0y3phuaw==')]) -22:10:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'gNlTzEjfmg-o1_1s3zk4795GcEWI6qWv7-lYehGoLoBGETddOROOAQ=='), (b'Age', b'18608856')]) -22:10:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'300'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:00 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Ftokenizer_config.json=&etag=%22c79f2b6a0cea6f4b564fed1938984bace9d30ff0%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c88-4c62445705b184277b979806;24e378cc-a628-468c-a2a2-6cae9b7b2527'), (b'RateLimit', b'"resolvers";r=2957;t=272'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'cqLsFddd8ggERcKCQB_3zXfOfVvHJlWNRwB_p8Z0RLd_Kh2Mm8icTA==')]) -22:10:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/tokenizer_config.json "HTTP/1.1 307 Temporary Redirect" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'350'), (b'Connection', b'keep-alive'), (b'Date', b'Fri, 27 Jun 2025 08:23:00 GMT'), (b'ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685e54e4-185fabac3ee499f1325b7683;ac28f8a9-2ca5-4215-a430-8da70930e987'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'UreJjy2-8Sc9mGhPC-mDPZkA65Qg1G2wm7l2115Ha6jKWhR7cLdcJg=='), (b'Age', b'18470820')]) -22:10:00 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json "HTTP/1.1 200 OK" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'64'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:00 GMT'), (b'ETag', b'W/"40-09f9IAqP13xarAhQxFS2W8rvRkM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c88-5877d8aa35438cc02c4f6ed8;2a4464f1-1fba-43ad-8485-1c749ef840b6'), (b'RateLimit', b'"api";r=490;t=272'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'additional_chat_templates does not exist on "main"'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'2rcp9JyCLnJJGJHOUY-hFkTHWAA4GriIo4kdEEhgS868XoI8cFF01g==')]) -22:10:00 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main/additional_chat_templates?recursive=false&expand=false "HTTP/1.1 404 Not Found" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:00 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:00 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6465'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:00 GMT'), (b'ETag', b'W/"1941-m0CqwCT0eLaAYulV6LKBoBypnns"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c88-6f23b9eb190cfbaa4d786969;04d770aa-4e1c-4d53-8780-4f839646ea64'), (b'RateLimit', b'"api";r=489;t=272'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'ryzgByzNXF9Q_VqB0ZmYZrYjgsc9MDv0iylTMSr0KKXKMP0uWmLpRA==')]) -22:10:00 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main?recursive=true&expand=false "HTTP/1.1 200 OK" -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:00 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:00 - httpcore.http11 - DEBUG - response_closed.started -22:10:00 - httpcore.http11 - DEBUG - response_closed.complete -22:10:01 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:01 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:01 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:01 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:01 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:01 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'304'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:00 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2F1_Pooling%2Fconfig.json=&etag=%22d1514c3162bbe87b343f565fadc62e6c06f04f03%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c88-45ff62e3173c63144bff3cc8;c699b42c-508e-42a9-9e7b-9cdc672db4fb'), (b'RateLimit', b'"resolvers";r=2956;t=272'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'DdS5_AlXpkDbLuf3t0WlKpEZh9pkFwMrD65aJQnNhLi7LUS572TQ2Q==')]) -22:10:01 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/1_Pooling/config.json "HTTP/1.1 307 Temporary Redirect" -22:10:01 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:01 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:01 - httpcore.http11 - DEBUG - response_closed.started -22:10:01 - httpcore.http11 - DEBUG - response_closed.complete -22:10:01 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:01 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:01 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:01 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:01 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:01 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'190'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 18 Aug 2025 04:37:11 GMT'), (b'ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-68a2adf7-4d7e79097342d93a4134b829;2f881d9e-e68d-4662-b2f6-33a4aabad755'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'ZRNslGvUel-YVhteGNHqIdhvZmSITfDpxH1UqmRKWGD2Z9aiO_nJiw=='), (b'Age', b'13991569')]) -22:10:01 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json "HTTP/1.1 200 OK" -22:10:01 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:01 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:01 - httpcore.http11 - DEBUG - response_closed.started -22:10:01 - httpcore.http11 - DEBUG - response_closed.complete -22:10:01 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:01 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:01 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:01 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:01 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:01 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6825'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:00 GMT'), (b'ETag', b'W/"1aa9-XXTNzHzWlYOmKJGelWoAnligEjM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c88-29420f1657eaebea36cba9b3;e5fcef2e-bf89-43c8-897f-3919f31258d8'), (b'RateLimit', b'"api";r=488;t=272'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 5130f24afa7aed6f49e6e72496306d12.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'j1687dHc0iIZC15BfH0e70TAnvYqy7RlJMuHVWG7VLgWnCdpUZqRlA==')]) -22:10:01 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2 "HTTP/1.1 200 OK" -22:10:01 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:01 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:01 - httpcore.http11 - DEBUG - response_closed.started -22:10:01 - httpcore.http11 - DEBUG - response_closed.complete -22:10:01 - src.mai.memory.storage - INFO - Embedding model loaded: all-MiniLM-L6-v2 (dim: 384) -22:10:01 - src.mai.memory.storage - INFO - sqlite-vec extension loaded successfully -22:10:01 - src.mai.memory.storage - INFO - Database schema created successfully -22:10:01 - src.mai.memory.storage - INFO - Database schema verification passed -22:10:01 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -22:10:01 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -22:10:01 - src.mai.memory.compression - INFO - MemoryCompressor initialized -22:10:01 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -22:10:01 - mai.memory.manager - INFO - MemoryManager initialized with all components -22:10:01 - mai.conversation.state - INFO - ConversationState initialized with max 10 turns per conversation -22:10:01 - mai.conversation.timing - INFO - TimingCalculator initialized with 'default' profile -22:10:01 - mai.conversation.reasoning - INFO - ReasoningEngine initialized -22:10:01 - mai.conversation.decomposition - INFO - RequestDecomposer initialized -22:10:01 - mai.conversation.interruption - INFO - InterruptHandler initialized with 30.0s timeout -22:10:01 - mai.conversation.interruption - DEBUG - Conversation state integrated -22:10:01 - mai.conversation.engine - INFO - ConversationEngine initialized with timing_profile='default', debug=False -22:10:01 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:01 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:01 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:01 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:01 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:01 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:10:01 GMT'), (b'Content-Length', b'337')]) -22:10:01 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:10:01 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:01 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:01 - httpcore.http11 - DEBUG - response_closed.started -22:10:01 - httpcore.http11 - DEBUG - response_closed.complete -22:10:01 - mai.model.ollama_client - INFO - Found 1 models -22:10:02 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:02 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:02 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:02 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:02 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:02 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:10:02 GMT'), (b'Content-Length', b'337')]) -22:10:02 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:10:02 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:02 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:02 - httpcore.http11 - DEBUG - response_closed.started -22:10:02 - httpcore.http11 - DEBUG - response_closed.complete -22:10:02 - mai.model.ollama_client - INFO - Found 1 models -22:10:02 - httpcore.connection - DEBUG - close.started -22:10:02 - httpcore.connection - DEBUG - close.complete -22:10:03 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:03 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:03 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:03 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:03 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:03 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:10:03 GMT'), (b'Content-Length', b'337')]) -22:10:03 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:10:03 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:03 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:03 - httpcore.http11 - DEBUG - response_closed.started -22:10:03 - httpcore.http11 - DEBUG - response_closed.complete -22:10:03 - mai.model.ollama_client - INFO - Found 1 models -22:10:04 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:04 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:04 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:04 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:04 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:04 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:10:04 GMT'), (b'Content-Length', b'337')]) -22:10:04 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:10:04 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:04 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:04 - httpcore.http11 - DEBUG - response_closed.started -22:10:04 - httpcore.http11 - DEBUG - response_closed.complete -22:10:04 - mai.model.ollama_client - INFO - Found 1 models -22:10:04 - mai.conversation.state - INFO - Restored 2 turns to conversation 05b1f335-eb0f-4357-a397-1191c4979c6a -22:10:04 - httpcore.connection - DEBUG - close.started -22:10:04 - httpcore.connection - DEBUG - close.complete -22:10:16 - asyncio - DEBUG - Using selector: EpollSelector -22:10:16 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -22:10:16 - git.util - DEBUG - sys.platform='linux', git_executable='git' -22:10:16 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -22:10:16 - git.util - DEBUG - sys.platform='linux', git_executable='git' -22:10:16 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -22:10:16 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -22:10:16 - docker.utils.config - DEBUG - Trying paths: ['/home/mystiatech/.docker/config.json', '/home/mystiatech/.dockercfg'] -22:10:16 - docker.utils.config - DEBUG - Found file at path: /home/mystiatech/.docker/config.json -22:10:16 - docker.auth - DEBUG - Found 'credsStore' section -22:10:16 - urllib3.connectionpool - DEBUG - http://localhost:None "GET /version HTTP/1.1" 200 None -22:10:16 - urllib3.connectionpool - DEBUG - http://localhost:None "GET /v1.52/_ping HTTP/1.1" 200 None -22:10:16 - src.mai.memory.storage - INFO - Loading embedding model: all-MiniLM-L6-v2 -22:10:16 - sentence_transformers.SentenceTransformer - INFO - Use pytorch device_name: cuda:0 -22:10:16 - sentence_transformers.SentenceTransformer - INFO - Load pretrained SentenceTransformer: all-MiniLM-L6-v2 -22:10:16 - httpcore.connection - DEBUG - connect_tcp.started host='huggingface.co' port=443 local_address=None timeout=10 socket_options=None -22:10:16 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -22:10:16 - httpcore.connection - DEBUG - start_tls.started ssl_context= server_hostname='huggingface.co' timeout=10 -22:10:16 - httpcore.connection - DEBUG - start_tls.complete return_value= -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:15 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c97-108c67d1252fabe31fa63cdf;23d04afc-a511-4cb3-8239-7e0a21e6dce4'), (b'RateLimit', b'"resolvers";r=2955;t=257'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Jbtt7JVbtqDJQDnjrOWlQzLDUmb0qmwgStOVNU8sJwtRAMr9tS6XmQ==')]) -22:10:16 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:16 - httpcore.http11 - DEBUG - response_closed.started -22:10:16 - httpcore.http11 - DEBUG - response_closed.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'v5Cjxkkk98ocA8J0UOXC7ags8ztS9v9V1rTzR97I5q-HSb5kvDPrzA=='), (b'Age', b'16915125')]) -22:10:16 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:16 - httpcore.http11 - DEBUG - response_closed.started -22:10:16 - httpcore.http11 - DEBUG - response_closed.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:15 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c97-2af45575276ad3802c48d4b6;d2dec851-e02e-40b1-a1cd-00797e003d6a'), (b'RateLimit', b'"resolvers";r=2954;t=257'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'pifJvtJOXN13sLGPEB_FpWtz0GiNSfqGnxtBqRnY95UPW2wKMoHP8Q==')]) -22:10:16 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:16 - httpcore.http11 - DEBUG - response_closed.started -22:10:16 - httpcore.http11 - DEBUG - response_closed.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'mLJ39_pZltrukOwuD3YFUn1ffMiIqCNCuu3yc4ILtgyUTkucxKFKyg=='), (b'Age', b'16915124')]) -22:10:16 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:16 - httpcore.http11 - DEBUG - response_closed.started -22:10:16 - httpcore.http11 - DEBUG - response_closed.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:15 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c97-09dc3a153a91a824231ab1e6;4a1102de-598a-47b3-bd04-4af2d96fe79c'), (b'RateLimit', b'"resolvers";r=2953;t=257'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'pYtpPF_v0sC9EdHZiMmAK5kehVmBltuEVOCx7baP48Jc3OPbvN8fEA==')]) -22:10:16 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:16 - httpcore.http11 - DEBUG - response_closed.started -22:10:16 - httpcore.http11 - DEBUG - response_closed.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'ttGTNHgaOkEflvOjgbq5EP3-Oz9TtKpdC8pm5a1_ck93h5ozf-6Uqg=='), (b'Age', b'16915124')]) -22:10:16 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:16 - httpcore.http11 - DEBUG - response_closed.started -22:10:16 - httpcore.http11 - DEBUG - response_closed.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'276'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:15 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2FREADME.md=&etag=%2258d4a9a45664eb9e12de9549c548c09b6134c17f%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c97-4f17fe2722767978724feb56;574c9e83-1288-4d12-88d4-65508227246a'), (b'RateLimit', b'"resolvers";r=2952;t=257'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'hGnw-Ae3pU03y6EgpaBLd2rXr0QBPW5LKnakJdaYEn3qBjp2xBI5gQ==')]) -22:10:16 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/README.md "HTTP/1.1 307 Temporary Redirect" -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:16 - httpcore.http11 - DEBUG - response_closed.started -22:10:16 - httpcore.http11 - DEBUG - response_closed.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'10454'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:32 GMT'), (b'ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e4-65f7ce852d1fe6c63dd82d8c;83c3a845-c5a5-4419-abf2-31960223e770'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'9Pb9a1Il-fBqd_KAWolBS8lUqrjSlp8HL0enhfFRgKWjMiK_4_YIOw=='), (b'Age', b'16915123')]) -22:10:16 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md "HTTP/1.1 200 OK" -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:16 - httpcore.http11 - DEBUG - response_closed.started -22:10:16 - httpcore.http11 - DEBUG - response_closed.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:15 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c97-37d7f9df42b9279159f047ac;5eccdfc6-cb17-40ea-8da1-a12a35b31988'), (b'RateLimit', b'"resolvers";r=2951;t=257'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'BFqzyfyxS96kC1L7jXC7nR6ySGjtarI9lyLHsJLgPrNHxLyWPqamkQ==')]) -22:10:16 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:16 - httpcore.http11 - DEBUG - response_closed.started -22:10:16 - httpcore.http11 - DEBUG - response_closed.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'8t1_1MiGeDJqRbtkW7xmv6BxU5dpdRhpjk4lQ9AxeXLY4ijzYSZOpg=='), (b'Age', b'16915125')]) -22:10:16 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:16 - httpcore.http11 - DEBUG - response_closed.started -22:10:16 - httpcore.http11 - DEBUG - response_closed.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'308'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:16 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fsentence_bert_config.json=&etag=%2259d594003bf59880a884c574bf88ef7555bb0202%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c97-65e13d8515e988590635b661;52226739-a101-4189-afce-4e4753370e7d'), (b'RateLimit', b'"resolvers";r=2950;t=257'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'pPKoaKLNCYlz26Zn6jofYjlLofuC_s3HfULLshF2rl9BsjnMl2mXCw==')]) -22:10:16 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/sentence_bert_config.json "HTTP/1.1 307 Temporary Redirect" -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:16 - httpcore.http11 - DEBUG - response_closed.started -22:10:16 - httpcore.http11 - DEBUG - response_closed.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'53'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:35 GMT'), (b'ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e7-793defd917b2fff34bb93137;f97df483-7cc7-4061-bccd-166531ee26ec'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'PMxYPgXouORFA3xR2RzfqQcCSxjcTfj0O_M556UYHS_ohQFECLmZAA=='), (b'Age', b'16915121')]) -22:10:16 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json "HTTP/1.1 200 OK" -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:16 - httpcore.http11 - DEBUG - response_closed.started -22:10:16 - httpcore.http11 - DEBUG - response_closed.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'15'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:16 GMT'), (b'ETag', b'W/"f-mY2VvLxuxB7KhsoOdQTlMTccuAQ"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c98-14d7b865480e9dbc4a5fdc13;a1f76383-dfb2-4cd7-8a13-4d6ef9bbcf5f'), (b'RateLimit', b'"resolvers";r=2949;t=256'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'MISS'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'Entry not found'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'IjLakn57B1O_pmbipFLT8fX5mX2n2OxRWCgh7z1qGn2SPGhJDommaw==')]) -22:10:16 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/adapter_config.json "HTTP/1.1 404 Not Found" -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:16 - httpcore.http11 - DEBUG - response_closed.started -22:10:16 - httpcore.http11 - DEBUG - response_closed.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:16 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c98-4112b7e11acc802c4a112d46;7d9cfb3b-9d7c-48c2-9f78-7675dc006453'), (b'RateLimit', b'"resolvers";r=2948;t=256'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'p5NR8JDazNlIZqBnDHok8-fam1PYWhujXCf55u3nfwTjyfTjQ2fjlg==')]) -22:10:16 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:16 - httpcore.http11 - DEBUG - response_closed.started -22:10:16 - httpcore.http11 - DEBUG - response_closed.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:16 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:16 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'LuhQRPv8J12jiXk5dXD9Pvh62Z2tlieXraKR-K42c0It_jh_gJiv-g=='), (b'Age', b'18608872')]) -22:10:16 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:16 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:16 - httpcore.http11 - DEBUG - response_closed.started -22:10:16 - httpcore.http11 - DEBUG - response_closed.complete -22:10:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:16 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c98-67b439317156bced35af2240;9a947d72-670f-4467-a920-ee34ff486b81'), (b'RateLimit', b'"resolvers";r=2947;t=256'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-HF-Warning', b'unauthenticated; Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'bilbHcinbOzpBSSOJnFtg-WlssCVKKj1pb33zng8NgitA9ipT6PLog==')]) -22:10:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:10:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:17 - httpcore.http11 - DEBUG - response_closed.started -22:10:17 - httpcore.http11 - DEBUG - response_closed.complete -22:10:17 - huggingface_hub.utils._http - WARNING - Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads. -22:10:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'P44IvT0ojVxozMP4-hO4vT-sYnXTFSg05vVf1SplzJh5O3jxf2molg=='), (b'Age', b'18608872')]) -22:10:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:10:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:17 - httpcore.http11 - DEBUG - response_closed.started -22:10:17 - httpcore.http11 - DEBUG - response_closed.complete -22:10:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'300'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:16 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Ftokenizer_config.json=&etag=%22c79f2b6a0cea6f4b564fed1938984bace9d30ff0%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c98-118fcca0636417863f353f8a;aedccec5-4072-453e-804a-c25e9cf06e4c'), (b'RateLimit', b'"resolvers";r=2946;t=256'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'0B_hF3ZNf9KSrI-IdXnQ3UXjMFL5MiIxTLrQeS4PrT-IBR4zamfM2g==')]) -22:10:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/tokenizer_config.json "HTTP/1.1 307 Temporary Redirect" -22:10:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:17 - httpcore.http11 - DEBUG - response_closed.started -22:10:17 - httpcore.http11 - DEBUG - response_closed.complete -22:10:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'350'), (b'Connection', b'keep-alive'), (b'Date', b'Fri, 27 Jun 2025 08:23:00 GMT'), (b'ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685e54e4-185fabac3ee499f1325b7683;ac28f8a9-2ca5-4215-a430-8da70930e987'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'p8lBSziTi98rwyVB78sUBdDV0_0zptKpTvlgFTOwI6IoR0Tjbw7TRQ=='), (b'Age', b'18470836')]) -22:10:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json "HTTP/1.1 200 OK" -22:10:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:17 - httpcore.http11 - DEBUG - response_closed.started -22:10:17 - httpcore.http11 - DEBUG - response_closed.complete -22:10:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'64'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:16 GMT'), (b'ETag', b'W/"40-09f9IAqP13xarAhQxFS2W8rvRkM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c98-5f89a4041419de3b12aa163d;6ffaea9d-caee-4ac2-a393-efeece5b0349'), (b'RateLimit', b'"api";r=487;t=256'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'additional_chat_templates does not exist on "main"'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'hjx9-WzG4DYn3WqkYSdepZYgYBabX7pu89o_jdPGkOJvqtR3QxJSxw==')]) -22:10:17 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main/additional_chat_templates?recursive=false&expand=false "HTTP/1.1 404 Not Found" -22:10:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:17 - httpcore.http11 - DEBUG - response_closed.started -22:10:17 - httpcore.http11 - DEBUG - response_closed.complete -22:10:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6465'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:16 GMT'), (b'ETag', b'W/"1941-m0CqwCT0eLaAYulV6LKBoBypnns"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c98-6da00db044db184a531e156f;944e3889-4045-46d1-9252-59643a6c6277'), (b'RateLimit', b'"api";r=486;t=256'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b't65cq04qIA6e-sHtee5ya6X2INDG0ib4uO3Ykg7MVDTGpuv6MVVIhQ==')]) -22:10:17 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main?recursive=true&expand=false "HTTP/1.1 200 OK" -22:10:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:17 - httpcore.http11 - DEBUG - response_closed.started -22:10:17 - httpcore.http11 - DEBUG - response_closed.complete -22:10:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'304'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:16 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2F1_Pooling%2Fconfig.json=&etag=%22d1514c3162bbe87b343f565fadc62e6c06f04f03%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c98-28c6b383247e1a0129fe8359;57c3876c-0fd3-4b73-ae77-0e8888a26990'), (b'RateLimit', b'"resolvers";r=2945;t=256'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'l9jgVJtJ0x4j-vLb8GJXpbQThTApTxDJCrHNXKHAZ34ty3RY2oSUWA==')]) -22:10:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/1_Pooling/config.json "HTTP/1.1 307 Temporary Redirect" -22:10:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:17 - httpcore.http11 - DEBUG - response_closed.started -22:10:17 - httpcore.http11 - DEBUG - response_closed.complete -22:10:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'190'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 18 Aug 2025 04:37:11 GMT'), (b'ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-68a2adf7-4d7e79097342d93a4134b829;2f881d9e-e68d-4662-b2f6-33a4aabad755'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'B6c8hBdODK8EIRacwDjkV5NDF9rgNsUcebH7cZMMF9goAQLVZVcdiw=='), (b'Age', b'13991585')]) -22:10:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json "HTTP/1.1 200 OK" -22:10:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:17 - httpcore.http11 - DEBUG - response_closed.started -22:10:17 - httpcore.http11 - DEBUG - response_closed.complete -22:10:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6825'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:16 GMT'), (b'ETag', b'W/"1aa9-XXTNzHzWlYOmKJGelWoAnligEjM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c98-0a01d42e30dc19e02bd01c55;ed02fff6-03c8-4920-8d75-7b7b4eb77abf'), (b'RateLimit', b'"api";r=485;t=256'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'k5bmb-qbUy_8JhHREAAbdV3WMMzdiHbGMNmtj11Y44Z4U8M74LmuuA==')]) -22:10:17 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2 "HTTP/1.1 200 OK" -22:10:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:17 - httpcore.http11 - DEBUG - response_closed.started -22:10:17 - httpcore.http11 - DEBUG - response_closed.complete -22:10:17 - src.mai.memory.storage - INFO - Embedding model loaded: all-MiniLM-L6-v2 (dim: 384) -22:10:17 - src.mai.memory.storage - INFO - sqlite-vec extension loaded successfully -22:10:17 - src.mai.memory.storage - INFO - Database schema created successfully -22:10:17 - src.mai.memory.storage - INFO - Database schema verification passed -22:10:17 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -22:10:17 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -22:10:17 - src.mai.memory.compression - INFO - MemoryCompressor initialized -22:10:17 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -22:10:17 - mai.memory.manager - INFO - MemoryManager initialized with all components -22:10:17 - mai.core.interface - INFO - Memory system initialized successfully -22:10:17 - mai.core.interface - INFO - Mai interface initialized -22:10:17 - mai.core.interface - INFO - Initializing Mai interface... -22:10:17 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -22:10:17 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -22:10:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:10:17 GMT'), (b'Content-Length', b'337')]) -22:10:17 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:10:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:17 - httpcore.http11 - DEBUG - response_closed.started -22:10:17 - httpcore.http11 - DEBUG - response_closed.complete -22:10:17 - mai.model.ollama_client - INFO - Found 1 models -22:10:18 - mai.core.interface - WARNING - Git repository health check failed -22:10:18 - mai.core.interface - INFO - Selected initial model: llama3.2:1b -22:10:18 - mai.core.interface - INFO - Mai interface initialized successfully -22:10:18 - src.mai.memory.storage - INFO - Loading embedding model: all-MiniLM-L6-v2 -22:10:18 - sentence_transformers.SentenceTransformer - INFO - Use pytorch device_name: cuda:0 -22:10:18 - sentence_transformers.SentenceTransformer - INFO - Load pretrained SentenceTransformer: all-MiniLM-L6-v2 -22:10:18 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:18 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:18 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:18 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:18 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:18 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:17 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c99-7be4c26d1c6a40691a40f9ca;1794cc0e-cb7f-4882-b477-fcd69d229fc9'), (b'RateLimit', b'"resolvers";r=2944;t=255'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'IESH_syoatUPyGsws0iIpE9YqtuEWKF1prfrRAze7HKr9kwcecA63g==')]) -22:10:18 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:10:18 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:18 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:18 - httpcore.http11 - DEBUG - response_closed.started -22:10:18 - httpcore.http11 - DEBUG - response_closed.complete -22:10:18 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:18 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:18 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:18 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:18 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:18 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'CuVIBiv9RYCu-ep33P_YUToc7Lijj-P9zwkNXt93O_2gr2X885YlHg=='), (b'Age', b'16915127')]) -22:10:18 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:10:18 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:18 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:18 - httpcore.http11 - DEBUG - response_closed.started -22:10:18 - httpcore.http11 - DEBUG - response_closed.complete -22:10:18 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:18 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:18 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:18 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:18 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:18 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:17 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c99-0a88be424607c6390ffa3502;05ac4665-6959-4933-9de3-7c26227c4ae4'), (b'RateLimit', b'"resolvers";r=2943;t=255'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'V3DWExlVjq5ZNs_nxgkmcRPONMe1GmSnKUhu1EglC2pPTpsTz97OTw==')]) -22:10:18 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:10:18 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:18 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:18 - httpcore.http11 - DEBUG - response_closed.started -22:10:18 - httpcore.http11 - DEBUG - response_closed.complete -22:10:18 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:18 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:18 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:18 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:18 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:18 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'w9oPK-Lo6PhPgXMHM4aNGx2WdOUiJP0cZuXYQMKFGdDn5TfsD8DoBw=='), (b'Age', b'16915126')]) -22:10:18 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:10:18 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:18 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:18 - httpcore.http11 - DEBUG - response_closed.started -22:10:18 - httpcore.http11 - DEBUG - response_closed.complete -22:10:18 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:18 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:18 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:18 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:18 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:18 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:17 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c99-2691086d2c24a4537e914a4b;48f92dc2-1629-446f-bae6-bfa3499336b1'), (b'RateLimit', b'"resolvers";r=2942;t=255'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'4zPYWeNtSWNVrJLCTgU9UGzbFCdSKUA2bleZmm8MoP0NxsnQUGVy6g==')]) -22:10:18 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:10:18 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:18 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:18 - httpcore.http11 - DEBUG - response_closed.started -22:10:18 - httpcore.http11 - DEBUG - response_closed.complete -22:10:18 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:18 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:18 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:18 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:18 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:18 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'dGArQ-_UENL6axJwqp3QotG0gfmyAiBn7Rv_BH6hfnRNSCiBLULrrw=='), (b'Age', b'16915127')]) -22:10:18 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:10:18 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:18 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:18 - httpcore.http11 - DEBUG - response_closed.started -22:10:18 - httpcore.http11 - DEBUG - response_closed.complete -22:10:18 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:18 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:18 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:18 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:18 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:18 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'276'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:18 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2FREADME.md=&etag=%2258d4a9a45664eb9e12de9549c548c09b6134c17f%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c9a-1bcc81794cb4bc3c603100ed;169bd3c1-cb5c-4b60-be5d-1636a1706819'), (b'RateLimit', b'"resolvers";r=2941;t=254'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-HF-Warning', b'unauthenticated; Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'JGjgq_7CUvx0Nes_28coA9JaaT7BGgKjOUuUUKbgEkExqbW2bLPBFQ==')]) -22:10:18 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/README.md "HTTP/1.1 307 Temporary Redirect" -22:10:18 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:18 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:18 - httpcore.http11 - DEBUG - response_closed.started -22:10:18 - httpcore.http11 - DEBUG - response_closed.complete -22:10:18 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:18 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:18 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:18 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:18 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:18 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'10454'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:32 GMT'), (b'ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e4-65f7ce852d1fe6c63dd82d8c;83c3a845-c5a5-4419-abf2-31960223e770'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'6R7b9_S7HvoMRMdIbq7fAAHcwjyT7qJdC1jmZzHco2TTsRzt9zPaEg=='), (b'Age', b'16915126')]) -22:10:18 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md "HTTP/1.1 200 OK" -22:10:18 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:18 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:18 - httpcore.http11 - DEBUG - response_closed.started -22:10:18 - httpcore.http11 - DEBUG - response_closed.complete -22:10:18 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:18 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:18 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:18 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:18 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:18 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c9a-38e7c6785cb8992040a520fe;e1a4154f-8430-4dbd-9c9e-18be14e4e4fb'), (b'RateLimit', b'"resolvers";r=2940;t=254'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'F69ZeAykzaNnnqFTXNiHUiGyiZqNSpjXNKeidJP4ERGdbKcyfypOtg==')]) -22:10:19 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:19 - httpcore.http11 - DEBUG - response_closed.started -22:10:19 - httpcore.http11 - DEBUG - response_closed.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'3NBaz59skRrWdHASwN_2uN4hYaTcw8vQlGVisLv3A2KArv-yZBb3qg=='), (b'Age', b'16915128')]) -22:10:19 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:19 - httpcore.http11 - DEBUG - response_closed.started -22:10:19 - httpcore.http11 - DEBUG - response_closed.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'308'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:18 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fsentence_bert_config.json=&etag=%2259d594003bf59880a884c574bf88ef7555bb0202%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c9a-0adbb94c2029d12d102f5d62;4a4f0bcb-4790-4801-bd2b-407551bc303b'), (b'RateLimit', b'"resolvers";r=2939;t=254'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'YCB2sAP7oZc3uY1ZiBaDIRkG9k3h1oe24TFc8yr0-G0yfXkdL_W3uw==')]) -22:10:19 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/sentence_bert_config.json "HTTP/1.1 307 Temporary Redirect" -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:19 - httpcore.http11 - DEBUG - response_closed.started -22:10:19 - httpcore.http11 - DEBUG - response_closed.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'53'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:35 GMT'), (b'ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e7-793defd917b2fff34bb93137;f97df483-7cc7-4061-bccd-166531ee26ec'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'buljFajwb0BQlhKkyK0rw4c932xCYTzlfxDO6znvNJT6FkkOK3MbgQ=='), (b'Age', b'16915123')]) -22:10:19 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json "HTTP/1.1 200 OK" -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:19 - httpcore.http11 - DEBUG - response_closed.started -22:10:19 - httpcore.http11 - DEBUG - response_closed.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'15'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:18 GMT'), (b'ETag', b'W/"f-mY2VvLxuxB7KhsoOdQTlMTccuAQ"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c9a-43adce465e9618f5130e85d7;11f42988-60cf-4f2c-8703-2c4d5c1c9548'), (b'RateLimit', b'"resolvers";r=2938;t=254'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'MISS'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'Entry not found'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'igOLr3qQlC5RY0tZTgtB7XhoFgesLZPY64jsTfrrwnPOUvMgTVx-2g==')]) -22:10:19 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/adapter_config.json "HTTP/1.1 404 Not Found" -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:19 - httpcore.http11 - DEBUG - response_closed.started -22:10:19 - httpcore.http11 - DEBUG - response_closed.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:18 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c9a-194485de6f4c120c0eae68bb;43a7262b-ec5a-47c7-bdd2-dd4aa3295e26'), (b'RateLimit', b'"resolvers";r=2937;t=254'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'20liQabXGfjoUYC5Iyw3qHvl5WRZZAtBFpuOq_LdB8M3laS1U9WzHw==')]) -22:10:19 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:19 - httpcore.http11 - DEBUG - response_closed.started -22:10:19 - httpcore.http11 - DEBUG - response_closed.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'ejNWAPMeQJN1Ed2p1YscXQoX17MEQVZWYNjA8OE6OIC5UV21rkWb7A=='), (b'Age', b'18608874')]) -22:10:19 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:19 - httpcore.http11 - DEBUG - response_closed.started -22:10:19 - httpcore.http11 - DEBUG - response_closed.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:18 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c9a-2bd1830b772abc334ad1ca3d;4a163c80-2dbd-41f4-9a76-219487cea429'), (b'RateLimit', b'"resolvers";r=2936;t=254'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'LGWI6qCos7nzEZukZqPOYcKv05wTshp-7ovtE3RqgF1eSSMwP6NfBA==')]) -22:10:19 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:19 - httpcore.http11 - DEBUG - response_closed.started -22:10:19 - httpcore.http11 - DEBUG - response_closed.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'HMEtOx8vvnGJQWWrPROiRjl2F75X-6Lpc4lDc3cVEsKwOuwIOtzbCQ=='), (b'Age', b'18608874')]) -22:10:19 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:19 - httpcore.http11 - DEBUG - response_closed.started -22:10:19 - httpcore.http11 - DEBUG - response_closed.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'300'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:18 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Ftokenizer_config.json=&etag=%22c79f2b6a0cea6f4b564fed1938984bace9d30ff0%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c9a-127cf7ed52d4e91556757e5a;210e5eda-df20-440d-9817-75907a7da3f8'), (b'RateLimit', b'"resolvers";r=2935;t=254'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'5vk7kxFkuLOc66nouoYunsa1yN9Wx0pLES74_GrapuPrqUUpkSuSWw==')]) -22:10:19 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/tokenizer_config.json "HTTP/1.1 307 Temporary Redirect" -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:19 - httpcore.http11 - DEBUG - response_closed.started -22:10:19 - httpcore.http11 - DEBUG - response_closed.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'350'), (b'Connection', b'keep-alive'), (b'Date', b'Fri, 27 Jun 2025 08:23:00 GMT'), (b'ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685e54e4-185fabac3ee499f1325b7683;ac28f8a9-2ca5-4215-a430-8da70930e987'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'sfsoKZqPuTUJ9BD9S9xa1k9KDKKWLDmNYY0yD1RuMMbI3Za-du8oiw=='), (b'Age', b'18470838')]) -22:10:19 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json "HTTP/1.1 200 OK" -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:19 - httpcore.http11 - DEBUG - response_closed.started -22:10:19 - httpcore.http11 - DEBUG - response_closed.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'64'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:18 GMT'), (b'ETag', b'W/"40-09f9IAqP13xarAhQxFS2W8rvRkM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c9a-17abb6b84b5736363c632bee;3d1d22f8-40dc-46a7-8d77-21e3bad43ab7'), (b'RateLimit', b'"api";r=484;t=254'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'additional_chat_templates does not exist on "main"'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'TyybSfSxxzkW_axepAoimGq_H8xir-arRTBilG_bqEXPY7yj0_PR1w==')]) -22:10:19 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main/additional_chat_templates?recursive=false&expand=false "HTTP/1.1 404 Not Found" -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:19 - httpcore.http11 - DEBUG - response_closed.started -22:10:19 - httpcore.http11 - DEBUG - response_closed.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6465'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:18 GMT'), (b'ETag', b'W/"1941-m0CqwCT0eLaAYulV6LKBoBypnns"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c9a-5966c02206ed60530c5ec632;447e0944-6301-4f9f-a8b0-12982384e4fe'), (b'RateLimit', b'"api";r=483;t=254'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'PAXqe0EB9AkH7fGFw1CZlsOK2PAk45a4qO5V9i1iPk89CgPvYajP9A==')]) -22:10:19 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main?recursive=true&expand=false "HTTP/1.1 200 OK" -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:19 - httpcore.http11 - DEBUG - response_closed.started -22:10:19 - httpcore.http11 - DEBUG - response_closed.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'304'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:18 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2F1_Pooling%2Fconfig.json=&etag=%22d1514c3162bbe87b343f565fadc62e6c06f04f03%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c9a-109b552a4357da2e4ecaa5b5;7f2db690-f664-4782-a8a3-4db52b977d6c'), (b'RateLimit', b'"resolvers";r=2934;t=254'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'TUStNjW6cVPIpQqe22GucGsg9jwj88Qn9eZ1uIIRkiqG6kAvKHCFkg==')]) -22:10:19 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/1_Pooling/config.json "HTTP/1.1 307 Temporary Redirect" -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:19 - httpcore.http11 - DEBUG - response_closed.started -22:10:19 - httpcore.http11 - DEBUG - response_closed.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'190'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 18 Aug 2025 04:37:11 GMT'), (b'ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-68a2adf7-4d7e79097342d93a4134b829;2f881d9e-e68d-4662-b2f6-33a4aabad755'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'jiiE2uN4hx6YAYMqsAdqsuK2F2bTFHfHzS9T73iwI44uJNYUCCZ08Q=='), (b'Age', b'13991587')]) -22:10:19 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json "HTTP/1.1 200 OK" -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:19 - httpcore.http11 - DEBUG - response_closed.started -22:10:19 - httpcore.http11 - DEBUG - response_closed.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:19 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:19 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6825'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:18 GMT'), (b'ETag', b'W/"1aa9-XXTNzHzWlYOmKJGelWoAnligEjM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782c9a-6ff8285424dc367555be138b;0f019d93-7672-448c-b653-b41d88582ee8'), (b'RateLimit', b'"api";r=482;t=254'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 4d89e7f6870714b602988e2ed1135996.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'_bIwT5kpc-3xSIT_3yIO0ifClcqioPD_D3ePdxybnuN7rLQqcS9f_A==')]) -22:10:19 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2 "HTTP/1.1 200 OK" -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:19 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:19 - httpcore.http11 - DEBUG - response_closed.started -22:10:19 - httpcore.http11 - DEBUG - response_closed.complete -22:10:19 - src.mai.memory.storage - INFO - Embedding model loaded: all-MiniLM-L6-v2 (dim: 384) -22:10:19 - src.mai.memory.storage - INFO - sqlite-vec extension loaded successfully -22:10:19 - src.mai.memory.storage - INFO - Database schema created successfully -22:10:19 - src.mai.memory.storage - INFO - Database schema verification passed -22:10:19 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -22:10:19 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -22:10:19 - src.mai.memory.compression - INFO - MemoryCompressor initialized -22:10:19 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -22:10:19 - mai.memory.manager - INFO - MemoryManager initialized with all components -22:10:19 - mai.conversation.state - INFO - ConversationState initialized with max 10 turns per conversation -22:10:19 - mai.conversation.timing - INFO - TimingCalculator initialized with 'default' profile -22:10:19 - mai.conversation.reasoning - INFO - ReasoningEngine initialized -22:10:19 - mai.conversation.decomposition - INFO - RequestDecomposer initialized -22:10:19 - mai.conversation.interruption - INFO - InterruptHandler initialized with 30.0s timeout -22:10:19 - mai.conversation.interruption - DEBUG - Conversation state integrated -22:10:19 - mai.conversation.engine - INFO - ConversationEngine initialized with timing_profile='default', debug=False -22:10:20 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:20 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:20 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:20 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:20 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:20 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:10:20 GMT'), (b'Content-Length', b'337')]) -22:10:20 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:10:20 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:20 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:20 - httpcore.http11 - DEBUG - response_closed.started -22:10:20 - httpcore.http11 - DEBUG - response_closed.complete -22:10:20 - mai.model.ollama_client - INFO - Found 1 models -22:10:21 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:21 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:21 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:21 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:21 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:21 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:10:21 GMT'), (b'Content-Length', b'337')]) -22:10:21 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:10:21 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:21 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:21 - httpcore.http11 - DEBUG - response_closed.started -22:10:21 - httpcore.http11 - DEBUG - response_closed.complete -22:10:21 - mai.model.ollama_client - INFO - Found 1 models -22:10:22 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:22 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:22 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:22 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:22 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:22 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:10:22 GMT'), (b'Content-Length', b'337')]) -22:10:22 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:10:22 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:22 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:22 - httpcore.http11 - DEBUG - response_closed.started -22:10:22 - httpcore.http11 - DEBUG - response_closed.complete -22:10:22 - mai.model.ollama_client - INFO - Found 1 models -22:10:22 - mai.conversation.state - INFO - Restored 2 turns to conversation 07e318d3-dc61-45ae-b23e-7e50d33f126a -22:10:39 - asyncio - DEBUG - Using selector: EpollSelector -22:10:39 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -22:10:39 - git.util - DEBUG - sys.platform='linux', git_executable='git' -22:10:39 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -22:10:39 - git.util - DEBUG - sys.platform='linux', git_executable='git' -22:10:39 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -22:10:39 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -22:10:39 - docker.utils.config - DEBUG - Trying paths: ['/home/mystiatech/.docker/config.json', '/home/mystiatech/.dockercfg'] -22:10:39 - docker.utils.config - DEBUG - Found file at path: /home/mystiatech/.docker/config.json -22:10:39 - docker.auth - DEBUG - Found 'credsStore' section -22:10:39 - urllib3.connectionpool - DEBUG - http://localhost:None "GET /version HTTP/1.1" 200 None -22:10:39 - urllib3.connectionpool - DEBUG - http://localhost:None "GET /v1.52/_ping HTTP/1.1" 200 None -22:10:39 - src.mai.memory.storage - INFO - Loading embedding model: all-MiniLM-L6-v2 -22:10:39 - sentence_transformers.SentenceTransformer - INFO - Use pytorch device_name: cuda:0 -22:10:39 - sentence_transformers.SentenceTransformer - INFO - Load pretrained SentenceTransformer: all-MiniLM-L6-v2 -22:10:39 - httpcore.connection - DEBUG - connect_tcp.started host='huggingface.co' port=443 local_address=None timeout=10 socket_options=None -22:10:39 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -22:10:39 - httpcore.connection - DEBUG - start_tls.started ssl_context= server_hostname='huggingface.co' timeout=10 -22:10:39 - httpcore.connection - DEBUG - start_tls.complete return_value= -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:38 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cae-630625a169743b872a2ee0a7;ef4c7698-4e4c-4ada-aca7-2fec4f13959b'), (b'RateLimit', b'"resolvers";r=2933;t=234'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'83cQZMMx6cZ4eLz09nwrLjMzS4-YJSuShYKm8bpiODWZFR1JGuU3MA==')]) -22:10:39 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:39 - httpcore.http11 - DEBUG - response_closed.started -22:10:39 - httpcore.http11 - DEBUG - response_closed.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'VF0DmqUMpaaAsC6YV34mGS_g32m5mrZdI8ZaUwS-HaJ-kXJXMjZXoQ=='), (b'Age', b'16915148')]) -22:10:39 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:39 - httpcore.http11 - DEBUG - response_closed.started -22:10:39 - httpcore.http11 - DEBUG - response_closed.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:38 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cae-78a97a963d3a190027d2d84f;6b6cc7bc-12f0-4c09-9788-50e823631128'), (b'RateLimit', b'"resolvers";r=2932;t=234'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Iv7Hjaw9RSDeP7ONGCU3KxL0V6qP02h0OrP17Uk0_ptSMXspXFNjjA==')]) -22:10:39 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:39 - httpcore.http11 - DEBUG - response_closed.started -22:10:39 - httpcore.http11 - DEBUG - response_closed.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'xX_NbmZ_fYsRujM-gccE6UvQHzwkz3Yq8lCS6ZhD9p6IbA7EzoUhZQ=='), (b'Age', b'16915147')]) -22:10:39 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:39 - httpcore.http11 - DEBUG - response_closed.started -22:10:39 - httpcore.http11 - DEBUG - response_closed.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:38 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cae-71e7dbd855d1ad83145587a7;b9b9f345-79a3-4364-b9af-5670156193a1'), (b'RateLimit', b'"resolvers";r=2931;t=234'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'FqBFFAn7Ufqe3HbwW4QVV0vocVUknGcpCweNqxOp-4QHhKqAPmKVhQ==')]) -22:10:39 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:39 - httpcore.http11 - DEBUG - response_closed.started -22:10:39 - httpcore.http11 - DEBUG - response_closed.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'n461SnGrI-HnlofHeInD1otziZTD_kqs7u_bpXYJsxGsInBPE-r9OA=='), (b'Age', b'16915147')]) -22:10:39 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:39 - httpcore.http11 - DEBUG - response_closed.started -22:10:39 - httpcore.http11 - DEBUG - response_closed.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'276'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:38 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2FREADME.md=&etag=%2258d4a9a45664eb9e12de9549c548c09b6134c17f%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cae-23cd0d5b78149e0a17e2b8a9;2e766eee-6b54-42e2-8e3f-1e9817e55f46'), (b'RateLimit', b'"resolvers";r=2930;t=234'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'_flVk4ghf8ze78KeWLqaQ3Yc1ErhK3y_r7s_dQU9sIA3Y1dUilOZ_Q==')]) -22:10:39 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/README.md "HTTP/1.1 307 Temporary Redirect" -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:39 - httpcore.http11 - DEBUG - response_closed.started -22:10:39 - httpcore.http11 - DEBUG - response_closed.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'10454'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:32 GMT'), (b'ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e4-65f7ce852d1fe6c63dd82d8c;83c3a845-c5a5-4419-abf2-31960223e770'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'PPbpPWK3cDkdGD6QczMVLf5sUObM2g86Z2nkPFBQlZhsoSFXDH2DHw=='), (b'Age', b'16915147')]) -22:10:39 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md "HTTP/1.1 200 OK" -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:39 - httpcore.http11 - DEBUG - response_closed.started -22:10:39 - httpcore.http11 - DEBUG - response_closed.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:39 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782caf-20f752152c6811181f398276;7bbc7ab4-7768-425e-b4b4-b35dea1e56a6'), (b'RateLimit', b'"resolvers";r=2929;t=233'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'KCToDI3MhNr3S3dBdgoJ_6QKxwQ74RL3B1gyqbQx2xucEjNK2IEgVA==')]) -22:10:39 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:39 - httpcore.http11 - DEBUG - response_closed.started -22:10:39 - httpcore.http11 - DEBUG - response_closed.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'3ADhvjT9tZwht5FHlCqrrQutbMIsKQqN8x2QvLDn5vW6jMLSSuGzTw=='), (b'Age', b'16915149')]) -22:10:39 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:39 - httpcore.http11 - DEBUG - response_closed.started -22:10:39 - httpcore.http11 - DEBUG - response_closed.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'308'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:39 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fsentence_bert_config.json=&etag=%2259d594003bf59880a884c574bf88ef7555bb0202%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782caf-3994cce4752120374bfae0c5;df452c36-2dc7-4e09-af19-701c1d96faee'), (b'RateLimit', b'"resolvers";r=2928;t=233'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'rykDT58-GbO4ioozUJ8ZmxDoMptGrVoEPuijlKIe6UPZHJePM0UzoA==')]) -22:10:39 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/sentence_bert_config.json "HTTP/1.1 307 Temporary Redirect" -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:39 - httpcore.http11 - DEBUG - response_closed.started -22:10:39 - httpcore.http11 - DEBUG - response_closed.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'53'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:35 GMT'), (b'ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e7-793defd917b2fff34bb93137;f97df483-7cc7-4061-bccd-166531ee26ec'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'wcnMFG373kN6F6oX2-K4O-ViFZS40NguHUcGU7hYTBIvDZ0Ri3vVHw=='), (b'Age', b'16915144')]) -22:10:39 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json "HTTP/1.1 200 OK" -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:39 - httpcore.http11 - DEBUG - response_closed.started -22:10:39 - httpcore.http11 - DEBUG - response_closed.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'15'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:39 GMT'), (b'ETag', b'W/"f-mY2VvLxuxB7KhsoOdQTlMTccuAQ"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782caf-735116821cd360a77ab232d1;3fe26e8d-c465-4867-9c7d-d7a11e77ba9a'), (b'RateLimit', b'"resolvers";r=2927;t=233'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'MISS'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'Entry not found'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'NR_0QTtEUBmKh_IbSqm4NTRKMlvoyj27xtqmE-18jbZy13NeJmBdog==')]) -22:10:39 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/adapter_config.json "HTTP/1.1 404 Not Found" -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:39 - httpcore.http11 - DEBUG - response_closed.started -22:10:39 - httpcore.http11 - DEBUG - response_closed.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:39 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782caf-210e82914ff86f7419593836;da34ba2c-9e67-4b38-84af-946716f13b00'), (b'RateLimit', b'"resolvers";r=2926;t=233'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-HF-Warning', b'unauthenticated; Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'UKGGx9yLN9sH72VRNApmNLWdRUQOgKdChDB-inuekifchjBy08KO7w==')]) -22:10:39 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:39 - httpcore.http11 - DEBUG - response_closed.started -22:10:39 - httpcore.http11 - DEBUG - response_closed.complete -22:10:39 - huggingface_hub.utils._http - WARNING - Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads. -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'KnQowgDA1tWjltmqr4GjNkoCLmHN-Qn4ACMPXFQg5FMzzYJ74rCFVw=='), (b'Age', b'18608895')]) -22:10:39 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:39 - httpcore.http11 - DEBUG - response_closed.started -22:10:39 - httpcore.http11 - DEBUG - response_closed.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:39 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782caf-3d42e37407b8624a404db222;b9111dd4-a462-41ad-aaba-d833bfa37358'), (b'RateLimit', b'"resolvers";r=2925;t=233'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-HF-Warning', b'unauthenticated; Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'N3XBhFz-9zIh7GnxLAZqKnSH7q-qNBIET_K9SnZxnqQBMliW0Figow==')]) -22:10:39 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:39 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:39 - httpcore.http11 - DEBUG - response_closed.started -22:10:39 - httpcore.http11 - DEBUG - response_closed.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:39 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:39 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:39 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:40 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'iPikyadLrfd2oBWzPpOnBQKS78f2ZsuuZgPYqIbU-uzAovGLeYfRCg=='), (b'Age', b'18608895')]) -22:10:40 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:10:40 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:40 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:40 - httpcore.http11 - DEBUG - response_closed.started -22:10:40 - httpcore.http11 - DEBUG - response_closed.complete -22:10:40 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:40 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:40 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:40 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:40 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:40 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'300'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:39 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Ftokenizer_config.json=&etag=%22c79f2b6a0cea6f4b564fed1938984bace9d30ff0%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782caf-647b5a166c6c13ee3aaeadfc;2a3455a3-bdc8-4090-961f-68a281623b84'), (b'RateLimit', b'"resolvers";r=2924;t=233'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'i68ZyDbvlHi0ruu_Kp5pE_QNwHi0Pvz3OgLIsUz9E9_zwIDVD_NkzA==')]) -22:10:40 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/tokenizer_config.json "HTTP/1.1 307 Temporary Redirect" -22:10:40 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:40 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:40 - httpcore.http11 - DEBUG - response_closed.started -22:10:40 - httpcore.http11 - DEBUG - response_closed.complete -22:10:40 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:40 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:40 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:40 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:40 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:40 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'350'), (b'Connection', b'keep-alive'), (b'Date', b'Fri, 27 Jun 2025 08:23:00 GMT'), (b'ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685e54e4-185fabac3ee499f1325b7683;ac28f8a9-2ca5-4215-a430-8da70930e987'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'V6PqarfIrgFyfzaCadrRItxgZdHJI9IhWuXuQRntaTHuqXOF_tt5wQ=='), (b'Age', b'18470859')]) -22:10:40 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json "HTTP/1.1 200 OK" -22:10:40 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:40 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:40 - httpcore.http11 - DEBUG - response_closed.started -22:10:40 - httpcore.http11 - DEBUG - response_closed.complete -22:10:40 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:40 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:40 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:40 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:40 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:40 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'64'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:39 GMT'), (b'ETag', b'W/"40-09f9IAqP13xarAhQxFS2W8rvRkM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782caf-40358cab75efaf523fab1e4f;e63a8f5e-20d1-4352-820a-76319fec4fdc'), (b'RateLimit', b'"api";r=481;t=233'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'additional_chat_templates does not exist on "main"'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'8CitbySRWndYgEwPTap_XyEKJ26zUUX9vG32OkQr_667sHgh-hDlnQ==')]) -22:10:40 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main/additional_chat_templates?recursive=false&expand=false "HTTP/1.1 404 Not Found" -22:10:40 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:40 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:40 - httpcore.http11 - DEBUG - response_closed.started -22:10:40 - httpcore.http11 - DEBUG - response_closed.complete -22:10:40 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:40 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:40 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:40 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:40 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:40 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6465'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:39 GMT'), (b'ETag', b'W/"1941-m0CqwCT0eLaAYulV6LKBoBypnns"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782caf-3d4e4dd61d52f9e622098f99;43a6eb70-9d44-4af8-9d49-c113fb24df06'), (b'RateLimit', b'"api";r=480;t=233'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'oueRhwMCR8wLjOgtjOTX_mgffjKMKg8AtsRL0SYHxGpC3ljKuXdLNw==')]) -22:10:40 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main?recursive=true&expand=false "HTTP/1.1 200 OK" -22:10:40 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:40 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:40 - httpcore.http11 - DEBUG - response_closed.started -22:10:40 - httpcore.http11 - DEBUG - response_closed.complete -22:10:40 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:40 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:40 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:40 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:40 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:40 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'304'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:39 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2F1_Pooling%2Fconfig.json=&etag=%22d1514c3162bbe87b343f565fadc62e6c06f04f03%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782caf-65172aab1f2de9c400f415c1;32b71d02-14ee-4add-a362-cb77969c4d8b'), (b'RateLimit', b'"resolvers";r=2923;t=233'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'fs9jD96fs1t4S-8Vww-6SCypFvH90z9cj3twfPNr6zp1PxAFkojXNw==')]) -22:10:40 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/1_Pooling/config.json "HTTP/1.1 307 Temporary Redirect" -22:10:40 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:40 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:40 - httpcore.http11 - DEBUG - response_closed.started -22:10:40 - httpcore.http11 - DEBUG - response_closed.complete -22:10:40 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:40 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:40 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:40 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:40 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:40 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'190'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 18 Aug 2025 04:37:11 GMT'), (b'ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-68a2adf7-4d7e79097342d93a4134b829;2f881d9e-e68d-4662-b2f6-33a4aabad755'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'2ZQGkHPGNYlTOvYJU_1V-TrI1_oavK6cKfQxJcc8dIPEJl9cDCcPaw=='), (b'Age', b'13991608')]) -22:10:40 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json "HTTP/1.1 200 OK" -22:10:40 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:40 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:40 - httpcore.http11 - DEBUG - response_closed.started -22:10:40 - httpcore.http11 - DEBUG - response_closed.complete -22:10:40 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:40 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:40 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:40 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:40 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:40 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6825'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:39 GMT'), (b'ETag', b'W/"1aa9-XXTNzHzWlYOmKJGelWoAnligEjM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782caf-6d0258ae619c7bff6f6f52de;2b096f7e-91aa-4833-a72b-2a47fcc9bcef'), (b'RateLimit', b'"api";r=479;t=233'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'HV4Mtl13gyRd1BSJLMS6852oqgPbUpJU-XSxSuBGzFfiNilEgLjNwA==')]) -22:10:40 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2 "HTTP/1.1 200 OK" -22:10:40 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:40 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:40 - httpcore.http11 - DEBUG - response_closed.started -22:10:40 - httpcore.http11 - DEBUG - response_closed.complete -22:10:40 - src.mai.memory.storage - INFO - Embedding model loaded: all-MiniLM-L6-v2 (dim: 384) -22:10:40 - src.mai.memory.storage - INFO - sqlite-vec extension loaded successfully -22:10:40 - src.mai.memory.storage - INFO - Database schema created successfully -22:10:40 - src.mai.memory.storage - INFO - Database schema verification passed -22:10:40 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -22:10:40 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -22:10:40 - src.mai.memory.compression - INFO - MemoryCompressor initialized -22:10:40 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -22:10:40 - mai.memory.manager - INFO - MemoryManager initialized with all components -22:10:40 - mai.core.interface - INFO - Memory system initialized successfully -22:10:40 - mai.core.interface - INFO - Mai interface initialized -22:10:40 - mai.core.interface - INFO - Initializing Mai interface... -22:10:40 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -22:10:40 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -22:10:40 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:40 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:40 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:40 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:40 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:40 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:10:40 GMT'), (b'Content-Length', b'337')]) -22:10:40 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:10:40 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:40 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:40 - httpcore.http11 - DEBUG - response_closed.started -22:10:40 - httpcore.http11 - DEBUG - response_closed.complete -22:10:40 - mai.model.ollama_client - INFO - Found 1 models -22:10:41 - mai.core.interface - WARNING - Git repository health check failed -22:10:41 - mai.core.interface - INFO - Selected initial model: llama3.2:1b -22:10:41 - mai.core.interface - INFO - Mai interface initialized successfully -22:10:41 - src.mai.memory.storage - INFO - Loading embedding model: all-MiniLM-L6-v2 -22:10:41 - sentence_transformers.SentenceTransformer - INFO - Use pytorch device_name: cuda:0 -22:10:41 - sentence_transformers.SentenceTransformer - INFO - Load pretrained SentenceTransformer: all-MiniLM-L6-v2 -22:10:41 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:41 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:41 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:41 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:41 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:41 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:41 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cb1-69af5db528c0107a4e11f313;97c60320-4692-46e4-b823-8e2cfc231f68'), (b'RateLimit', b'"resolvers";r=2922;t=231'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Xv4RY84B3j3Dq-INeMUh7HCHfvczMlmX-lItFxfZ2a0scQDkz7NDsg==')]) -22:10:41 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:10:41 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:41 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:41 - httpcore.http11 - DEBUG - response_closed.started -22:10:41 - httpcore.http11 - DEBUG - response_closed.complete -22:10:41 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:41 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:41 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:41 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:41 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:41 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'0UFCwRfuGwhMePY5ZD2etTp-smkiVTzDbJU_6fvC31Yr7rlM7NMtkw=='), (b'Age', b'16915151')]) -22:10:41 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:10:41 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:41 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:41 - httpcore.http11 - DEBUG - response_closed.started -22:10:41 - httpcore.http11 - DEBUG - response_closed.complete -22:10:41 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:41 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:41 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:41 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:41 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:41 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:41 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cb1-18dda0470b9cc8bc00e70b0a;6cb5aa87-ff99-4e32-9799-c72dec812188'), (b'RateLimit', b'"resolvers";r=2921;t=231'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'oCwQ6xzygpA8BXftzjFpNAJtxGD-IHlom7X84pUfxyHxv3GZuKCIQg==')]) -22:10:41 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:10:41 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:41 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:41 - httpcore.http11 - DEBUG - response_closed.started -22:10:41 - httpcore.http11 - DEBUG - response_closed.complete -22:10:41 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:41 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:41 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:41 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:41 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:41 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'lCPXJv8pzWKmIC1gzmz4_1vrabwNFYc9z27lT3lkOY_DCZ5pNtX10A=='), (b'Age', b'16915150')]) -22:10:41 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:10:41 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:41 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:41 - httpcore.http11 - DEBUG - response_closed.started -22:10:41 - httpcore.http11 - DEBUG - response_closed.complete -22:10:41 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:41 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:41 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:41 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:41 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:41 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:41 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cb1-15aa1e5a512cce801331cb3d;2beda8a6-83d4-4846-915c-5a804c7bc3eb'), (b'RateLimit', b'"resolvers";r=2920;t=231'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'TmNke3bbM4KHMf4T5PzWE70Zn9eJhYIHgyxv_PySco514LrIPKHw-Q==')]) -22:10:41 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:10:41 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:41 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:41 - httpcore.http11 - DEBUG - response_closed.started -22:10:41 - httpcore.http11 - DEBUG - response_closed.complete -22:10:41 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:41 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:41 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:41 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:41 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:41 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'WSf4jVs076OB8XFaf_HJyOke7xn5jQgUgiGTvaJHyjdNxYcb8j1R6w=='), (b'Age', b'16915150')]) -22:10:41 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:10:41 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:41 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:41 - httpcore.http11 - DEBUG - response_closed.started -22:10:41 - httpcore.http11 - DEBUG - response_closed.complete -22:10:41 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:41 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:41 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:41 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:41 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:41 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'276'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:41 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2FREADME.md=&etag=%2258d4a9a45664eb9e12de9549c548c09b6134c17f%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cb1-49c553e3439fc90609189ea5;39e98cc9-b808-43de-8941-88c64218ebbb'), (b'RateLimit', b'"resolvers";r=2919;t=231'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'WipX3lO1vvbtD27bsz1_VxxNx3wEPHJ-sjVecUcFVREHsb2iFCKKkA==')]) -22:10:41 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/README.md "HTTP/1.1 307 Temporary Redirect" -22:10:41 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:41 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:41 - httpcore.http11 - DEBUG - response_closed.started -22:10:41 - httpcore.http11 - DEBUG - response_closed.complete -22:10:41 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:41 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:41 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:41 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:41 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:41 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'10454'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:32 GMT'), (b'ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e4-65f7ce852d1fe6c63dd82d8c;83c3a845-c5a5-4419-abf2-31960223e770'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'fT7WvEdI6-9B1lPPE-HKZIc4eSwRM52nL_sZryXYEZiEC6GKksDVyA=='), (b'Age', b'16915149')]) -22:10:41 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md "HTTP/1.1 200 OK" -22:10:41 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:41 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:41 - httpcore.http11 - DEBUG - response_closed.started -22:10:41 - httpcore.http11 - DEBUG - response_closed.complete -22:10:41 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:41 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:41 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:41 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:41 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:41 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:41 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cb1-2142fbcf56dc11e02b004bc7;4808ca25-1c2e-492f-9744-6d8002ae2edd'), (b'RateLimit', b'"resolvers";r=2918;t=231'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'inHrr7RcUQZI8ySZyG9r81P8aJt0olhjtd0I67G7_znC9YZBQqoqbQ==')]) -22:10:41 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:10:41 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:41 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:41 - httpcore.http11 - DEBUG - response_closed.started -22:10:41 - httpcore.http11 - DEBUG - response_closed.complete -22:10:41 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:41 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:41 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:41 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:41 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:41 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'i_8j7ajo26ksH-WUspgb-Bbrm1tlUVXhhEs5jWPxPnMcmAyM5M6hBA=='), (b'Age', b'16915151')]) -22:10:41 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:10:41 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:41 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:41 - httpcore.http11 - DEBUG - response_closed.started -22:10:41 - httpcore.http11 - DEBUG - response_closed.complete -22:10:41 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:41 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:41 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:41 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:41 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'308'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:41 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fsentence_bert_config.json=&etag=%2259d594003bf59880a884c574bf88ef7555bb0202%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cb1-35f41d725c0a0cc66e4e6cfc;8a5907b8-ca6b-48c2-bf34-44a00b5ecea0'), (b'RateLimit', b'"resolvers";r=2917;t=231'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'jFf79kPWO6jxEjtw8Ge9c0JyI-GwwmbkFFLsRYewMR75sJLdStLctQ==')]) -22:10:42 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/sentence_bert_config.json "HTTP/1.1 307 Temporary Redirect" -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:42 - httpcore.http11 - DEBUG - response_closed.started -22:10:42 - httpcore.http11 - DEBUG - response_closed.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'53'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:35 GMT'), (b'ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e7-793defd917b2fff34bb93137;f97df483-7cc7-4061-bccd-166531ee26ec'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'vI66aGBZTaCdMbFnZtcJQ1QCct9jfQx5wf5jBOsl1C3J9FUXaqn2iA=='), (b'Age', b'16915146')]) -22:10:42 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json "HTTP/1.1 200 OK" -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:42 - httpcore.http11 - DEBUG - response_closed.started -22:10:42 - httpcore.http11 - DEBUG - response_closed.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'15'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:41 GMT'), (b'ETag', b'W/"f-mY2VvLxuxB7KhsoOdQTlMTccuAQ"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cb1-5a3ff6657f27579270fdead1;1ee57dfa-3a48-4d2e-8c58-6d1eafb5a94e'), (b'RateLimit', b'"resolvers";r=2916;t=231'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'MISS'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'Entry not found'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'4M1MYmXOy_8PWF3r_9B3THJbGGsL4f2okxAf0vGUYNFUNfttsOmQZw==')]) -22:10:42 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/adapter_config.json "HTTP/1.1 404 Not Found" -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:42 - httpcore.http11 - DEBUG - response_closed.started -22:10:42 - httpcore.http11 - DEBUG - response_closed.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:41 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cb1-3fb51ce245a9ddfc5dc9d15e;642572b5-f949-4fc5-bddb-d4d6604e1ae1'), (b'RateLimit', b'"resolvers";r=2915;t=231'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'S77Dn3PqUntbour_r8Y2e3CESVqkqYMFzkzur8JTj9B5jAmicC5ztQ==')]) -22:10:42 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:42 - httpcore.http11 - DEBUG - response_closed.started -22:10:42 - httpcore.http11 - DEBUG - response_closed.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'BSwPcBAWGjYoUNKiJqSuv9QHigFlGXkBWdDHgYR6HDqI38QHzhz5RA=='), (b'Age', b'18608897')]) -22:10:42 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:42 - httpcore.http11 - DEBUG - response_closed.started -22:10:42 - httpcore.http11 - DEBUG - response_closed.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:41 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cb1-7b8183443e4b840f68f3fdea;a6c66845-cd4c-49cb-923e-03b19c3972f6'), (b'RateLimit', b'"resolvers";r=2914;t=231'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'eC2ygeyiWcAZo9r1XivphgPWP731y6cDJVL8iMcxUdXXG9mD6dY1Ow==')]) -22:10:42 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:42 - httpcore.http11 - DEBUG - response_closed.started -22:10:42 - httpcore.http11 - DEBUG - response_closed.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'SG7VukHV0f3cUmOGOS2OasHbVZ9U1loWAEX9BvyXKRlWoSXuMZjblQ=='), (b'Age', b'18608897')]) -22:10:42 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:42 - httpcore.http11 - DEBUG - response_closed.started -22:10:42 - httpcore.http11 - DEBUG - response_closed.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'300'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:41 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Ftokenizer_config.json=&etag=%22c79f2b6a0cea6f4b564fed1938984bace9d30ff0%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cb1-0bfbce5b752757c876560657;a79dbf09-d3eb-48fa-adc6-fc19cc8aebdc'), (b'RateLimit', b'"resolvers";r=2913;t=231'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'amnsxZk4zGW8aUrqLnLjlLnfK1iXFJLsCmeub83aNbCBfmlf1oyIHA==')]) -22:10:42 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/tokenizer_config.json "HTTP/1.1 307 Temporary Redirect" -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:42 - httpcore.http11 - DEBUG - response_closed.started -22:10:42 - httpcore.http11 - DEBUG - response_closed.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'350'), (b'Connection', b'keep-alive'), (b'Date', b'Fri, 27 Jun 2025 08:23:00 GMT'), (b'ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685e54e4-185fabac3ee499f1325b7683;ac28f8a9-2ca5-4215-a430-8da70930e987'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'HwhOVquieplPstiNA8TTCisrbhjlCdYu2hk8l06QADJfcxodQcjgrA=='), (b'Age', b'18470861')]) -22:10:42 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json "HTTP/1.1 200 OK" -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:42 - httpcore.http11 - DEBUG - response_closed.started -22:10:42 - httpcore.http11 - DEBUG - response_closed.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'64'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:41 GMT'), (b'ETag', b'W/"40-09f9IAqP13xarAhQxFS2W8rvRkM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cb1-2af9fdca7ffca4e8597f18f3;23f8d0bb-86f9-47c7-9b1b-2393f81f257a'), (b'RateLimit', b'"api";r=478;t=231'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'additional_chat_templates does not exist on "main"'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'dBcUvUNJja1M2kv4esCLnOrAAqrR7Q4HKuHtWU3gooAYn0d0NFtZCg==')]) -22:10:42 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main/additional_chat_templates?recursive=false&expand=false "HTTP/1.1 404 Not Found" -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:42 - httpcore.http11 - DEBUG - response_closed.started -22:10:42 - httpcore.http11 - DEBUG - response_closed.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6465'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:41 GMT'), (b'ETag', b'W/"1941-m0CqwCT0eLaAYulV6LKBoBypnns"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cb1-6280fd44791f35df798e70a6;d81ce726-3195-45a2-95be-f555357d0708'), (b'RateLimit', b'"api";r=477;t=231'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'h_NPcazGB2VmW4l6HenO-mkByeWDynTwEz1Wnr9wY261HhliOGLzfg==')]) -22:10:42 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main?recursive=true&expand=false "HTTP/1.1 200 OK" -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:42 - httpcore.http11 - DEBUG - response_closed.started -22:10:42 - httpcore.http11 - DEBUG - response_closed.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'304'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:41 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2F1_Pooling%2Fconfig.json=&etag=%22d1514c3162bbe87b343f565fadc62e6c06f04f03%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cb1-6642ee7c3652c5b912d97018;f684396f-fd0a-4da4-8dee-c3fe144462c0'), (b'RateLimit', b'"resolvers";r=2912;t=231'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'o2AUKFJOFVMvolMIciR0aNPQyQXE4mHK79OMvjV6oAisFcm-oLi9fQ==')]) -22:10:42 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/1_Pooling/config.json "HTTP/1.1 307 Temporary Redirect" -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:42 - httpcore.http11 - DEBUG - response_closed.started -22:10:42 - httpcore.http11 - DEBUG - response_closed.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'190'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 18 Aug 2025 04:37:11 GMT'), (b'ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-68a2adf7-4d7e79097342d93a4134b829;2f881d9e-e68d-4662-b2f6-33a4aabad755'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'dSWlFoxd938Tn_5v3IwQoqI5e7M1mu3YSJckQrkjyiPYfvsbet_IJg=='), (b'Age', b'13991610')]) -22:10:42 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json "HTTP/1.1 200 OK" -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:42 - httpcore.http11 - DEBUG - response_closed.started -22:10:42 - httpcore.http11 - DEBUG - response_closed.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:42 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:42 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6825'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:10:41 GMT'), (b'ETag', b'W/"1aa9-XXTNzHzWlYOmKJGelWoAnligEjM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cb1-4be749ec214a2982760cb5c2;5edc6150-47ea-4134-8d2e-c35d19f25020'), (b'RateLimit', b'"api";r=476;t=231'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 de8b5f44ffbaf97a58ad36dbe4a4a7c0.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'9k84Mp1oZEUeEEvssM7zMQYYiwUziWgQuX2DmKn0JHofQBtFWStTnw==')]) -22:10:42 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2 "HTTP/1.1 200 OK" -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:42 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:42 - httpcore.http11 - DEBUG - response_closed.started -22:10:42 - httpcore.http11 - DEBUG - response_closed.complete -22:10:42 - src.mai.memory.storage - INFO - Embedding model loaded: all-MiniLM-L6-v2 (dim: 384) -22:10:42 - src.mai.memory.storage - INFO - sqlite-vec extension loaded successfully -22:10:42 - src.mai.memory.storage - INFO - Database schema created successfully -22:10:42 - src.mai.memory.storage - INFO - Database schema verification passed -22:10:42 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -22:10:42 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -22:10:42 - src.mai.memory.compression - INFO - MemoryCompressor initialized -22:10:42 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -22:10:42 - mai.memory.manager - INFO - MemoryManager initialized with all components -22:10:42 - mai.conversation.state - INFO - ConversationState initialized with max 10 turns per conversation -22:10:42 - mai.conversation.timing - INFO - TimingCalculator initialized with 'default' profile -22:10:42 - mai.conversation.reasoning - INFO - ReasoningEngine initialized -22:10:42 - mai.conversation.decomposition - INFO - RequestDecomposer initialized -22:10:42 - mai.conversation.interruption - INFO - InterruptHandler initialized with 30.0s timeout -22:10:42 - mai.conversation.interruption - DEBUG - Conversation state integrated -22:10:42 - mai.conversation.engine - INFO - ConversationEngine initialized with timing_profile='default', debug=False -22:10:43 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:43 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:43 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:43 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:43 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:43 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:10:43 GMT'), (b'Content-Length', b'337')]) -22:10:43 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:10:43 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:43 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:43 - httpcore.http11 - DEBUG - response_closed.started -22:10:43 - httpcore.http11 - DEBUG - response_closed.complete -22:10:43 - mai.model.ollama_client - INFO - Found 1 models -22:10:44 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:44 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:44 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:44 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:44 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:44 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:10:44 GMT'), (b'Content-Length', b'337')]) -22:10:44 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:10:44 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:44 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:44 - httpcore.http11 - DEBUG - response_closed.started -22:10:44 - httpcore.http11 - DEBUG - response_closed.complete -22:10:44 - mai.model.ollama_client - INFO - Found 1 models -22:10:45 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:45 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:45 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:45 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:45 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:45 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:10:45 GMT'), (b'Content-Length', b'337')]) -22:10:45 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:10:45 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:45 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:45 - httpcore.http11 - DEBUG - response_closed.started -22:10:45 - httpcore.http11 - DEBUG - response_closed.complete -22:10:45 - mai.model.ollama_client - INFO - Found 1 models -22:10:45 - mai.conversation.state - INFO - Restored 2 turns to conversation 069aa4eb-b88f-404d-898a-31020deef761 -22:10:46 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:46 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:46 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:46 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:46 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:46 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:10:46 GMT'), (b'Content-Length', b'337')]) -22:10:46 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:10:46 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:46 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:46 - httpcore.http11 - DEBUG - response_closed.started -22:10:46 - httpcore.http11 - DEBUG - response_closed.complete -22:10:46 - mai.model.ollama_client - INFO - Found 1 models -22:10:47 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:47 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:47 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:47 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:47 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:10:47 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:10:47 GMT'), (b'Content-Length', b'337')]) -22:10:47 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:10:47 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:10:47 - httpcore.http11 - DEBUG - receive_response_body.complete -22:10:47 - httpcore.http11 - DEBUG - response_closed.started -22:10:47 - httpcore.http11 - DEBUG - response_closed.complete -22:10:47 - mai.model.ollama_client - INFO - Found 1 models -22:10:47 - mai.conversation.state - DEBUG - Started new conversation: e648a783-b233-4478-a1d2-5eafd433e9a2 -22:10:47 - mai.conversation.engine - INFO - Processing conversation turn for e648a783-b233-4478-a1d2-5eafd433e9a2 -22:10:47 - src.mai.memory.retrieval - INFO - Retrieving context for query: exit... -22:10:47 - src.mai.memory.storage - INFO - Using text search fallback temporarily -22:10:47 - src.mai.memory.storage - DEBUG - Text search fallback found 0 conversations for query: 'exit' -22:10:47 - src.mai.memory.retrieval - DEBUG - Semantic search found 0 results -22:10:47 - src.mai.memory.storage - DEBUG - Retrieved conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -22:10:47 - src.mai.memory.storage - DEBUG - Retrieved conversation '58f4f7b3-3267-434e-becc-b4aac165c08d' with 2 messages -22:10:47 - src.mai.memory.storage - DEBUG - Retrieved conversation '8a40c3e8-fbb2-4029-beca-3513d7e005a8' with 2 messages -22:10:47 - src.mai.memory.storage - DEBUG - Retrieved conversation '96dc6411-4d2e-4bf8-949f-5dcc472e447b' with 2 messages -22:10:47 - src.mai.memory.storage - DEBUG - Retrieved conversation '28e5bdf6-d8bc-45d2-82b4-3a95d09e2bba' with 2 messages -22:10:47 - src.mai.memory.storage - DEBUG - Retrieved conversation 'ae221870-4972-4273-b921-a2dbc4aa474b' with 2 messages -22:10:47 - src.mai.memory.storage - DEBUG - Retrieved conversation '46efb9e2-acb0-425e-8358-320cb07b2226' with 2 messages -22:10:47 - src.mai.memory.storage - DEBUG - Retrieved conversation '9b990be1-6afb-49c2-86e1-8245d5a820c3' with 2 messages -22:10:47 - src.mai.memory.retrieval - DEBUG - Keyword search found 0 results -22:10:47 - src.mai.memory.retrieval - DEBUG - Recency search found 3 results -22:10:47 - mai.memory.manager - ERROR - Failed to get context: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -22:10:47 - mai.conversation.engine - WARNING - Failed to retrieve memory context: Context retrieval failed: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -22:10:47 - mai.conversation.state - DEBUG - Retrieved 0 messages from conversation e648a783-b233-4478-a1d2-5eafd433e9a2 -22:10:47 - mai.conversation.timing - DEBUG - Complexity analysis: score=0.00, words=1, questions=0, technical=0 -22:10:47 - mai.conversation.timing - DEBUG - Delay calculation: simple complexity (0.00) -> 2.04s -22:10:47 - mai.conversation.engine - INFO - Applying 2.04s delay for natural timing -22:10:50 - src.mai.memory.retrieval - INFO - Retrieving context for query: exit... -22:10:50 - src.mai.memory.storage - INFO - Using text search fallback temporarily -22:10:50 - src.mai.memory.storage - DEBUG - Text search fallback found 0 conversations for query: 'exit' -22:10:50 - src.mai.memory.retrieval - DEBUG - Semantic search found 0 results -22:10:50 - src.mai.memory.storage - DEBUG - Retrieved conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -22:10:50 - src.mai.memory.storage - DEBUG - Retrieved conversation '58f4f7b3-3267-434e-becc-b4aac165c08d' with 2 messages -22:10:50 - src.mai.memory.storage - DEBUG - Retrieved conversation '8a40c3e8-fbb2-4029-beca-3513d7e005a8' with 2 messages -22:10:50 - src.mai.memory.storage - DEBUG - Retrieved conversation '96dc6411-4d2e-4bf8-949f-5dcc472e447b' with 2 messages -22:10:50 - src.mai.memory.storage - DEBUG - Retrieved conversation '28e5bdf6-d8bc-45d2-82b4-3a95d09e2bba' with 2 messages -22:10:50 - src.mai.memory.storage - DEBUG - Retrieved conversation 'ae221870-4972-4273-b921-a2dbc4aa474b' with 2 messages -22:10:50 - src.mai.memory.storage - DEBUG - Retrieved conversation '46efb9e2-acb0-425e-8358-320cb07b2226' with 2 messages -22:10:50 - src.mai.memory.storage - DEBUG - Retrieved conversation '9b990be1-6afb-49c2-86e1-8245d5a820c3' with 2 messages -22:10:50 - src.mai.memory.retrieval - DEBUG - Keyword search found 0 results -22:10:50 - src.mai.memory.retrieval - DEBUG - Recency search found 3 results -22:10:50 - mai.memory.manager - ERROR - Failed to get context: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -22:10:50 - mai.core.interface - DEBUG - Failed to retrieve memory context: Context retrieval failed: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -22:10:50 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:10:50 - httpcore.http11 - DEBUG - send_request_headers.complete -22:10:50 - httpcore.http11 - DEBUG - send_request_body.started request= -22:10:50 - httpcore.http11 - DEBUG - send_request_body.complete -22:10:50 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:14 - asyncio - DEBUG - Using selector: EpollSelector -22:11:14 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -22:11:15 - git.util - DEBUG - sys.platform='linux', git_executable='git' -22:11:15 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -22:11:15 - git.util - DEBUG - sys.platform='linux', git_executable='git' -22:11:15 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -22:11:15 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -22:11:15 - docker.utils.config - DEBUG - Trying paths: ['/home/mystiatech/.docker/config.json', '/home/mystiatech/.dockercfg'] -22:11:15 - docker.utils.config - DEBUG - Found file at path: /home/mystiatech/.docker/config.json -22:11:15 - docker.auth - DEBUG - Found 'credsStore' section -22:11:15 - urllib3.connectionpool - DEBUG - http://localhost:None "GET /version HTTP/1.1" 200 None -22:11:15 - urllib3.connectionpool - DEBUG - http://localhost:None "GET /v1.52/_ping HTTP/1.1" 200 None -22:11:15 - src.mai.memory.storage - INFO - Loading embedding model: all-MiniLM-L6-v2 -22:11:15 - sentence_transformers.SentenceTransformer - INFO - Use pytorch device_name: cuda:0 -22:11:15 - sentence_transformers.SentenceTransformer - INFO - Load pretrained SentenceTransformer: all-MiniLM-L6-v2 -22:11:15 - httpcore.connection - DEBUG - connect_tcp.started host='huggingface.co' port=443 local_address=None timeout=10 socket_options=None -22:11:15 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -22:11:15 - httpcore.connection - DEBUG - start_tls.started ssl_context= server_hostname='huggingface.co' timeout=10 -22:11:15 - httpcore.connection - DEBUG - start_tls.complete return_value= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:14 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd2-5a429c1d01c80dcb6ba80ee4;fe241012-39f9-458b-8150-e412cc8a51fb'), (b'RateLimit', b'"resolvers";r=2911;t=198'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'kokkQOUWyD_Fv70vZPemAZtm4e9WtRJP6tIZWCZfKsaXuLtTLhz6hA==')]) -22:11:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:15 - httpcore.http11 - DEBUG - response_closed.started -22:11:15 - httpcore.http11 - DEBUG - response_closed.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Y3ebWFpIADqsbTaWkdaLB2BXlSHmTkLUZ8TbCdTPSOpbdR2FAmPuUA=='), (b'Age', b'16915184')]) -22:11:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:15 - httpcore.http11 - DEBUG - response_closed.started -22:11:15 - httpcore.http11 - DEBUG - response_closed.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:14 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd2-0440052f2a0d22580d8eb976;ef5734fb-f49f-4ddd-94bb-a6728520f7f5'), (b'RateLimit', b'"resolvers";r=2910;t=198'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'2G29igUR3KQetOK3KiBCC14NMTpdb3lURbSxTjXVYfkC-w5GXTUfGA==')]) -22:11:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:15 - httpcore.http11 - DEBUG - response_closed.started -22:11:15 - httpcore.http11 - DEBUG - response_closed.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'bkSL7NI8EnHAxGJ7GesS3pKRYWDigo8kcgDC44pdld-LfWUdMpm4Zg=='), (b'Age', b'16915183')]) -22:11:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:15 - httpcore.http11 - DEBUG - response_closed.started -22:11:15 - httpcore.http11 - DEBUG - response_closed.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:14 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd2-5dc4e79611c773eb0fe2320d;1f268dda-78c0-4bb2-af21-011749b1e4bf'), (b'RateLimit', b'"resolvers";r=2909;t=198'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'v1WzKW-aRHZLcoaLBnwVuPn_iadDklY3QEEZWzAxC5QCTsblerYzCA==')]) -22:11:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:15 - httpcore.http11 - DEBUG - response_closed.started -22:11:15 - httpcore.http11 - DEBUG - response_closed.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'PeCHeWCbM-CZIBcVPkHh0FqcN02stbbIA5Br2pOtBA-WhirHqu1_5g=='), (b'Age', b'16915183')]) -22:11:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:15 - httpcore.http11 - DEBUG - response_closed.started -22:11:15 - httpcore.http11 - DEBUG - response_closed.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'276'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:14 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2FREADME.md=&etag=%2258d4a9a45664eb9e12de9549c548c09b6134c17f%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd2-4b2d4939231c7ff45bf5de02;b767ac5a-5ca5-4ce6-8031-045ef8a01c4c'), (b'RateLimit', b'"resolvers";r=2908;t=198'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-HF-Warning', b'unauthenticated; Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'xO3JxAjgO27CieuuKJQfnb5I8Iaj-XFPdrktRoJUL_w-Xroun4nj_g==')]) -22:11:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/README.md "HTTP/1.1 307 Temporary Redirect" -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:15 - httpcore.http11 - DEBUG - response_closed.started -22:11:15 - httpcore.http11 - DEBUG - response_closed.complete -22:11:15 - huggingface_hub.utils._http - WARNING - Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads. -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'10454'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:32 GMT'), (b'ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e4-65f7ce852d1fe6c63dd82d8c;83c3a845-c5a5-4419-abf2-31960223e770'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'UkQZs3ETRLgjFP68kigdNsb5-qym-qRQuhe8DvHcZRIJHYTlU2QE4g=='), (b'Age', b'16915182')]) -22:11:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md "HTTP/1.1 200 OK" -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:15 - httpcore.http11 - DEBUG - response_closed.started -22:11:15 - httpcore.http11 - DEBUG - response_closed.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:14 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd2-26ea68a10360465b2fd6fe90;557dfd00-e42f-4c3b-9d9a-b0c56deec067'), (b'RateLimit', b'"resolvers";r=2907;t=198'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'BcWbsRufMhSQoLfybq_elpADfGng0D6qQNKg37n_Wze-gcNBr9l83w==')]) -22:11:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:15 - httpcore.http11 - DEBUG - response_closed.started -22:11:15 - httpcore.http11 - DEBUG - response_closed.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'PLiE4AN56npTJ4DgrcSVsKHw1CGHWWJ_zGigJB4VzqAOdG5pv4_M5A=='), (b'Age', b'16915184')]) -22:11:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:15 - httpcore.http11 - DEBUG - response_closed.started -22:11:15 - httpcore.http11 - DEBUG - response_closed.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'308'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:14 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fsentence_bert_config.json=&etag=%2259d594003bf59880a884c574bf88ef7555bb0202%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd2-0490e46e6e292c1201efef6d;06071d73-7d50-4c38-aa58-c1ee44721600'), (b'RateLimit', b'"resolvers";r=2906;t=198'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'-J-tH5RLZH18VUiEuW-YN6tQ8pQ-OBextGu6gltNza_cQIipAmm_oA==')]) -22:11:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/sentence_bert_config.json "HTTP/1.1 307 Temporary Redirect" -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:15 - httpcore.http11 - DEBUG - response_closed.started -22:11:15 - httpcore.http11 - DEBUG - response_closed.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'53'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:35 GMT'), (b'ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e7-793defd917b2fff34bb93137;f97df483-7cc7-4061-bccd-166531ee26ec'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'TiQQi45N6lM2Y8MfenVSm5YGfR3mk8bGgXLE5Bgqw1iFlkZe3SxG5Q=='), (b'Age', b'16915179')]) -22:11:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json "HTTP/1.1 200 OK" -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:15 - httpcore.http11 - DEBUG - response_closed.started -22:11:15 - httpcore.http11 - DEBUG - response_closed.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'15'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:14 GMT'), (b'ETag', b'W/"f-mY2VvLxuxB7KhsoOdQTlMTccuAQ"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd2-39da671b1a1ed0170c08648b;85f5094c-67b5-4d13-aa9e-5abbb5ef1107'), (b'RateLimit', b'"resolvers";r=2905;t=198'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'MISS'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'Entry not found'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'3eH896tb3yfh8TVjpKVZFhX1LydT8bbk9duMvA55gR1aMCeGL7acbg==')]) -22:11:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/adapter_config.json "HTTP/1.1 404 Not Found" -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:15 - httpcore.http11 - DEBUG - response_closed.started -22:11:15 - httpcore.http11 - DEBUG - response_closed.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:14 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd2-06c89a3436037e5b1b9dea35;f9ace967-01ad-49dc-88f1-9231354699dc'), (b'RateLimit', b'"resolvers";r=2904;t=198'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'ot3-KEncqva0U8JlwvLkAxc3LVX84DCx1oQezuOluu221dTZIfUhiQ==')]) -22:11:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:15 - httpcore.http11 - DEBUG - response_closed.started -22:11:15 - httpcore.http11 - DEBUG - response_closed.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'MDcHdSCXSAlCuk_pKqGvo1F3aLUt0kVgx9WjyPoycYfXkZHyNahXlg=='), (b'Age', b'18608930')]) -22:11:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:15 - httpcore.http11 - DEBUG - response_closed.started -22:11:15 - httpcore.http11 - DEBUG - response_closed.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:14 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd2-23ff29f57829edc75131f119;1521ea7d-dec8-474a-9ce6-553de131ea77'), (b'RateLimit', b'"resolvers";r=2903;t=198'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'q7OXyLs0S5E6P6lghkC_yScAQJQoSVqrfVEv0xjOl6naisMBmZMwTg==')]) -22:11:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:15 - httpcore.http11 - DEBUG - response_closed.started -22:11:15 - httpcore.http11 - DEBUG - response_closed.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'lpLNNFVPpcaJ2qgsAjJuSNJQDvNHcCoC99fZPgDJXbzbv3uDccYBAQ=='), (b'Age', b'18608930')]) -22:11:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:15 - httpcore.http11 - DEBUG - response_closed.started -22:11:15 - httpcore.http11 - DEBUG - response_closed.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'300'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:14 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Ftokenizer_config.json=&etag=%22c79f2b6a0cea6f4b564fed1938984bace9d30ff0%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd2-5d48974909a6c4223adf2ab9;2cc6bca1-052d-4d09-ad74-69af1c9542e2'), (b'RateLimit', b'"resolvers";r=2902;t=198'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-HF-Warning', b'unauthenticated; Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'm2GyIt8MA620LDO6CWKh1lWJW_odD60GBKS8cqOaqrLnoAOGyjPNGw==')]) -22:11:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/tokenizer_config.json "HTTP/1.1 307 Temporary Redirect" -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:15 - httpcore.http11 - DEBUG - response_closed.started -22:11:15 - httpcore.http11 - DEBUG - response_closed.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'350'), (b'Connection', b'keep-alive'), (b'Date', b'Fri, 27 Jun 2025 08:23:00 GMT'), (b'ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685e54e4-185fabac3ee499f1325b7683;ac28f8a9-2ca5-4215-a430-8da70930e987'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'ZumWXghJLnrNnS_en-ukEgu__2B_aM5GCmBbWKvOCd_iCqAJdYfb1A=='), (b'Age', b'18470894')]) -22:11:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json "HTTP/1.1 200 OK" -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:15 - httpcore.http11 - DEBUG - response_closed.started -22:11:15 - httpcore.http11 - DEBUG - response_closed.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'64'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:14 GMT'), (b'ETag', b'W/"40-09f9IAqP13xarAhQxFS2W8rvRkM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd2-7515544d70372a6e0b99af79;52e64602-b1ee-4627-8ddf-7daf8a355e92'), (b'RateLimit', b'"api";r=475;t=198'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'additional_chat_templates does not exist on "main"'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'NBqvT3JNpwU9qj5w7o1nn2EbV4n9k48sNo0am4fxJNbmPsQ2Q0Wi3A==')]) -22:11:15 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main/additional_chat_templates?recursive=false&expand=false "HTTP/1.1 404 Not Found" -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:15 - httpcore.http11 - DEBUG - response_closed.started -22:11:15 - httpcore.http11 - DEBUG - response_closed.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6465'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:15 GMT'), (b'ETag', b'W/"1941-m0CqwCT0eLaAYulV6LKBoBypnns"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd3-3f403a4c6a2ebfe5526e316f;34587e03-179c-4c0d-95fd-765b320e70c9'), (b'RateLimit', b'"api";r=474;t=197'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'JqnMCDOB_r3mmX3p7xBWuc3LLLEZzVThUIcn3Rn94WuvL0cpajExFg==')]) -22:11:15 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main?recursive=true&expand=false "HTTP/1.1 200 OK" -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:15 - httpcore.http11 - DEBUG - response_closed.started -22:11:15 - httpcore.http11 - DEBUG - response_closed.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'304'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:15 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2F1_Pooling%2Fconfig.json=&etag=%22d1514c3162bbe87b343f565fadc62e6c06f04f03%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd3-6be7e0731f3cb43700428a98;dcc8b0c1-5f5a-42ce-a618-17846c80d392'), (b'RateLimit', b'"resolvers";r=2901;t=197'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-HF-Warning', b'unauthenticated; Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'mk9pq3b2Lk9WLqEfvTs7Il-aJ-JunH8vXLz5SY9mkOWPgdGKNiC4jA==')]) -22:11:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/1_Pooling/config.json "HTTP/1.1 307 Temporary Redirect" -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:15 - httpcore.http11 - DEBUG - response_closed.started -22:11:15 - httpcore.http11 - DEBUG - response_closed.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'190'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 18 Aug 2025 04:37:11 GMT'), (b'ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-68a2adf7-4d7e79097342d93a4134b829;2f881d9e-e68d-4662-b2f6-33a4aabad755'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'D2TQROv0dHo2XfcSTbNGgTgPfmnI3_4AiqqURpHzWHB82KRsRaVrdw=='), (b'Age', b'13991644')]) -22:11:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json "HTTP/1.1 200 OK" -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:15 - httpcore.http11 - DEBUG - response_closed.started -22:11:15 - httpcore.http11 - DEBUG - response_closed.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:16 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6825'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:15 GMT'), (b'ETag', b'W/"1aa9-XXTNzHzWlYOmKJGelWoAnligEjM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd3-648176a43ef750b20ad92f72;cb82469f-f8e0-4eff-83c4-23597a74ce0c'), (b'RateLimit', b'"api";r=473;t=197'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'CoiRISLLtZYilvQ3eguJ3pUWOAwLAoXWm7mwUI77RxKhS8HDA5SzxQ==')]) -22:11:16 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2 "HTTP/1.1 200 OK" -22:11:16 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:16 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:16 - httpcore.http11 - DEBUG - response_closed.started -22:11:16 - httpcore.http11 - DEBUG - response_closed.complete -22:11:16 - src.mai.memory.storage - INFO - Embedding model loaded: all-MiniLM-L6-v2 (dim: 384) -22:11:16 - src.mai.memory.storage - INFO - sqlite-vec extension loaded successfully -22:11:16 - src.mai.memory.storage - INFO - Database schema created successfully -22:11:16 - src.mai.memory.storage - INFO - Database schema verification passed -22:11:16 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -22:11:16 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -22:11:16 - src.mai.memory.compression - INFO - MemoryCompressor initialized -22:11:16 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -22:11:16 - mai.memory.manager - INFO - MemoryManager initialized with all components -22:11:16 - mai.core.interface - INFO - Memory system initialized successfully -22:11:16 - mai.core.interface - INFO - Mai interface initialized -22:11:16 - mai.core.interface - INFO - Initializing Mai interface... -22:11:16 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -22:11:16 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -22:11:16 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:16 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:16 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:16 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:16 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:16 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:11:16 GMT'), (b'Content-Length', b'337')]) -22:11:16 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:11:16 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:16 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:16 - httpcore.http11 - DEBUG - response_closed.started -22:11:16 - httpcore.http11 - DEBUG - response_closed.complete -22:11:16 - mai.model.ollama_client - INFO - Found 1 models -22:11:17 - mai.core.interface - WARNING - Git repository health check failed -22:11:17 - mai.core.interface - INFO - Selected initial model: llama3.2:1b -22:11:17 - mai.core.interface - INFO - Mai interface initialized successfully -22:11:17 - src.mai.memory.storage - INFO - Loading embedding model: all-MiniLM-L6-v2 -22:11:17 - sentence_transformers.SentenceTransformer - INFO - Use pytorch device_name: cuda:0 -22:11:17 - sentence_transformers.SentenceTransformer - INFO - Load pretrained SentenceTransformer: all-MiniLM-L6-v2 -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:16 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd4-0197bfbe19849a307e8de6de;66984143-6bfb-4bc9-8ff7-ca3ad474b666'), (b'RateLimit', b'"resolvers";r=2900;t=196'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'xZWp7iafumHQHirLgE3--Y538PWsdhTRTnBmOGVh6J5lR6mcGds50Q==')]) -22:11:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:17 - httpcore.http11 - DEBUG - response_closed.started -22:11:17 - httpcore.http11 - DEBUG - response_closed.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'820mx6Uhxrm60-XT22jLmqyGesaR7Ob2IfAHf5d1nRj-byw_FeNCYA=='), (b'Age', b'16915186')]) -22:11:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:17 - httpcore.http11 - DEBUG - response_closed.started -22:11:17 - httpcore.http11 - DEBUG - response_closed.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:16 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd4-1de2600d1541954c006b9594;4e94ddc0-ed8e-4811-ae7d-3256eec2dc40'), (b'RateLimit', b'"resolvers";r=2899;t=196'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'KX7rrtrzm7UilFJw-q_uFjnNMhN-KowIIdB7pmtZqS2BMyq9caG1eg==')]) -22:11:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:17 - httpcore.http11 - DEBUG - response_closed.started -22:11:17 - httpcore.http11 - DEBUG - response_closed.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'5wOFMb4GEXAhb6LTzQdhxyUbctkEFqmEr9u23Dl511UClUVqI9LUuQ=='), (b'Age', b'16915185')]) -22:11:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:17 - httpcore.http11 - DEBUG - response_closed.started -22:11:17 - httpcore.http11 - DEBUG - response_closed.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:16 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd4-6929a911703354fd4fa99771;c8b74582-c78e-4614-9e4f-c90453bbda92'), (b'RateLimit', b'"resolvers";r=2898;t=196'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Y2hA8CuiiryWOOENQuhlI6YBa5jpI___wGIHYujMiD-w7U1l1gSF3w==')]) -22:11:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:17 - httpcore.http11 - DEBUG - response_closed.started -22:11:17 - httpcore.http11 - DEBUG - response_closed.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'DXoYirA-PRyEBp4V_Q6ER823Ozmyu84qi0YjG3T4EKYAdO5RsuDVeQ=='), (b'Age', b'16915185')]) -22:11:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:17 - httpcore.http11 - DEBUG - response_closed.started -22:11:17 - httpcore.http11 - DEBUG - response_closed.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'276'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:16 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2FREADME.md=&etag=%2258d4a9a45664eb9e12de9549c548c09b6134c17f%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd4-48ed3c6f63a99cb97be5fc45;72ea1eec-4781-4578-9039-17d3f4cd5c5b'), (b'RateLimit', b'"resolvers";r=2897;t=196'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'sQ-SmzHrdltXlF3ZJZXD0v-xOcyoxygYeE9QYqaDl2vYq-m1MmXSGQ==')]) -22:11:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/README.md "HTTP/1.1 307 Temporary Redirect" -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:17 - httpcore.http11 - DEBUG - response_closed.started -22:11:17 - httpcore.http11 - DEBUG - response_closed.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'10454'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:32 GMT'), (b'ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e4-65f7ce852d1fe6c63dd82d8c;83c3a845-c5a5-4419-abf2-31960223e770'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'sEE3FA91cbCHhnd8VMRRizdeAVGOlUGg966MaUSt_2uqbZRPAvCTeg=='), (b'Age', b'16915184')]) -22:11:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md "HTTP/1.1 200 OK" -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:17 - httpcore.http11 - DEBUG - response_closed.started -22:11:17 - httpcore.http11 - DEBUG - response_closed.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:16 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd4-2cab6a492d02f9ee50d41a8a;9ddf8e97-d0e3-4f04-9e39-98f6e829466f'), (b'RateLimit', b'"resolvers";r=2896;t=196'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'9JmRP9pENqgyrLK3Yrg7wDcTn6oqRyFV4UmnvOwtevRbfxdcJN7c-Q==')]) -22:11:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:17 - httpcore.http11 - DEBUG - response_closed.started -22:11:17 - httpcore.http11 - DEBUG - response_closed.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'7puD27Ik1k7wnFsF8RYav9VUcLue-edidFlLwi7YgF0AyvYUf_NMQA=='), (b'Age', b'16915186')]) -22:11:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:17 - httpcore.http11 - DEBUG - response_closed.started -22:11:17 - httpcore.http11 - DEBUG - response_closed.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'308'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:16 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fsentence_bert_config.json=&etag=%2259d594003bf59880a884c574bf88ef7555bb0202%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd4-7ab11bed1244db6a21fb64cd;2c1d9b63-16eb-4f04-afd7-37dc11f141ad'), (b'RateLimit', b'"resolvers";r=2895;t=196'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'OuMKPjWTj3L7dZPtwByxgDzzvyKTMm97RSsjgjd4aVR-6UI6BauE5Q==')]) -22:11:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/sentence_bert_config.json "HTTP/1.1 307 Temporary Redirect" -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:17 - httpcore.http11 - DEBUG - response_closed.started -22:11:17 - httpcore.http11 - DEBUG - response_closed.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'53'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:35 GMT'), (b'ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e7-793defd917b2fff34bb93137;f97df483-7cc7-4061-bccd-166531ee26ec'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'EU10Wy294wqxrGMWhlMcpz9HkohztH_w2tcyIBmr4IlaiBXpdjPT4w=='), (b'Age', b'16915181')]) -22:11:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json "HTTP/1.1 200 OK" -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:17 - httpcore.http11 - DEBUG - response_closed.started -22:11:17 - httpcore.http11 - DEBUG - response_closed.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'15'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:16 GMT'), (b'ETag', b'W/"f-mY2VvLxuxB7KhsoOdQTlMTccuAQ"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd4-62411aba15b252767cc02be8;de038889-8444-4e00-9f5c-343ecc42f5bd'), (b'RateLimit', b'"resolvers";r=2894;t=196'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'MISS'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'Entry not found'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'_fIUR1K_l29A7DXx4GxzllUTj-NCZ7GpL3J3-KLK7xbiuq86EL5wyA==')]) -22:11:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/adapter_config.json "HTTP/1.1 404 Not Found" -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:17 - httpcore.http11 - DEBUG - response_closed.started -22:11:17 - httpcore.http11 - DEBUG - response_closed.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:16 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd4-5d15d66250d46e8c5722d0d4;671c7607-28f4-46a5-b1f9-4381c19b7c81'), (b'RateLimit', b'"resolvers";r=2893;t=196'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'EgKVdeCukfnf4Cpjfwr5u50aalIo2Ehx41ppa4_uj34n9GZHM4ydDQ==')]) -22:11:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:17 - httpcore.http11 - DEBUG - response_closed.started -22:11:17 - httpcore.http11 - DEBUG - response_closed.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'rhoSyKhwPyusU0WZDmNclr3EIRC2Tn1rgZ_8pj_K08ooid9CL8EBDg=='), (b'Age', b'18608932')]) -22:11:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:17 - httpcore.http11 - DEBUG - response_closed.started -22:11:17 - httpcore.http11 - DEBUG - response_closed.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:16 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd4-38a6ba0155c27a435196b2eb;973ffadc-9718-4c78-af29-8640e75738aa'), (b'RateLimit', b'"resolvers";r=2892;t=196'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'F_LBcG_0n9fc_G1KIB5c4bTMG28w3fBLgt6cg9rxydtxH3jdho96FA==')]) -22:11:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:17 - httpcore.http11 - DEBUG - response_closed.started -22:11:17 - httpcore.http11 - DEBUG - response_closed.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'zQVyUBxkQKhxUZQJ9PPgAxOlQlGwrxq8VGLTE_PXdqgLvHVlk7rusg=='), (b'Age', b'18608932')]) -22:11:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:17 - httpcore.http11 - DEBUG - response_closed.started -22:11:17 - httpcore.http11 - DEBUG - response_closed.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'300'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:17 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Ftokenizer_config.json=&etag=%22c79f2b6a0cea6f4b564fed1938984bace9d30ff0%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd4-523f2c914e2ad4e07a9f07cf;e1f2c8da-3be7-4147-b5bf-45e1528501a2'), (b'RateLimit', b'"resolvers";r=2891;t=195'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Ny6yDsc7MbcexDStouRl_4aX9xmvznst6rf7PdN-h_uSstef9Sfb5w==')]) -22:11:17 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/tokenizer_config.json "HTTP/1.1 307 Temporary Redirect" -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:17 - httpcore.http11 - DEBUG - response_closed.started -22:11:17 - httpcore.http11 - DEBUG - response_closed.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:18 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'350'), (b'Connection', b'keep-alive'), (b'Date', b'Fri, 27 Jun 2025 08:23:00 GMT'), (b'ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685e54e4-185fabac3ee499f1325b7683;ac28f8a9-2ca5-4215-a430-8da70930e987'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'5V-ij0a4RhHjqkZlQjsGFqylsqEQLf81d-m2SRnVu89Q3UuUCbdsqw=='), (b'Age', b'18470897')]) -22:11:18 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json "HTTP/1.1 200 OK" -22:11:18 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:18 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:18 - httpcore.http11 - DEBUG - response_closed.started -22:11:18 - httpcore.http11 - DEBUG - response_closed.complete -22:11:18 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:18 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:18 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:18 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:18 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:18 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'64'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:17 GMT'), (b'ETag', b'W/"40-09f9IAqP13xarAhQxFS2W8rvRkM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd5-1a1fd14a074caf45636fe3ad;f57faf8c-6088-4eb1-835e-c94230579be5'), (b'RateLimit', b'"api";r=472;t=195'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'additional_chat_templates does not exist on "main"'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'_fBZGPAVau6utRdR_dNlaiYRONzBy1lCpa0Zgq1v6yRXFyK0ECnXeg==')]) -22:11:18 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main/additional_chat_templates?recursive=false&expand=false "HTTP/1.1 404 Not Found" -22:11:18 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:18 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:18 - httpcore.http11 - DEBUG - response_closed.started -22:11:18 - httpcore.http11 - DEBUG - response_closed.complete -22:11:18 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:18 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:18 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:18 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:18 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:18 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6465'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:17 GMT'), (b'ETag', b'W/"1941-m0CqwCT0eLaAYulV6LKBoBypnns"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd5-01a786b351f6fdea6ddf3318;db61ef8b-cbca-4b1e-868f-1002e9488020'), (b'RateLimit', b'"api";r=471;t=195'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'xFKfC1eRHho7CaH4IB5eBamSLNFSKDGQWJwe9J-ZMqH8r3YvYE0G-A==')]) -22:11:18 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main?recursive=true&expand=false "HTTP/1.1 200 OK" -22:11:18 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:18 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:18 - httpcore.http11 - DEBUG - response_closed.started -22:11:18 - httpcore.http11 - DEBUG - response_closed.complete -22:11:18 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:18 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:18 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:18 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:18 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:18 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'304'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:17 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2F1_Pooling%2Fconfig.json=&etag=%22d1514c3162bbe87b343f565fadc62e6c06f04f03%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd5-2cc02f876e5da43933f852b3;ca384196-eae9-45fa-ae26-b410da6d36ea'), (b'RateLimit', b'"resolvers";r=2890;t=195'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'CZdYolY98-f2AdmEjb6HFpx69DBPd0SDTWT8ydfeQfuBSPRbnYYBCQ==')]) -22:11:18 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/1_Pooling/config.json "HTTP/1.1 307 Temporary Redirect" -22:11:18 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:18 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:18 - httpcore.http11 - DEBUG - response_closed.started -22:11:18 - httpcore.http11 - DEBUG - response_closed.complete -22:11:18 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:18 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:18 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:18 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:18 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:18 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'190'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 18 Aug 2025 04:37:11 GMT'), (b'ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-68a2adf7-4d7e79097342d93a4134b829;2f881d9e-e68d-4662-b2f6-33a4aabad755'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'NFoIZx94iDLj9GypCBFhqDCs9o6dklEOaWZhLgD-Ov3ceW53MJ9LaA=='), (b'Age', b'13991646')]) -22:11:18 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json "HTTP/1.1 200 OK" -22:11:18 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:18 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:18 - httpcore.http11 - DEBUG - response_closed.started -22:11:18 - httpcore.http11 - DEBUG - response_closed.complete -22:11:18 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:18 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:18 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:18 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:18 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:18 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6825'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:11:17 GMT'), (b'ETag', b'W/"1aa9-XXTNzHzWlYOmKJGelWoAnligEjM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782cd5-08b734063509c285711e9df9;895eadfc-8690-46ae-8e24-bb40232fcf36'), (b'RateLimit', b'"api";r=470;t=195'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 7ed6222f7e560bc392fd7d47d98df770.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'OrpkdhUBH-zh_Rmy47E525Qo0gmU-qn624TG6kWcWFOArJ6kprVyrw==')]) -22:11:18 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2 "HTTP/1.1 200 OK" -22:11:18 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:18 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:18 - httpcore.http11 - DEBUG - response_closed.started -22:11:18 - httpcore.http11 - DEBUG - response_closed.complete -22:11:18 - src.mai.memory.storage - INFO - Embedding model loaded: all-MiniLM-L6-v2 (dim: 384) -22:11:18 - src.mai.memory.storage - INFO - sqlite-vec extension loaded successfully -22:11:18 - src.mai.memory.storage - INFO - Database schema created successfully -22:11:18 - src.mai.memory.storage - INFO - Database schema verification passed -22:11:18 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -22:11:18 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -22:11:18 - src.mai.memory.compression - INFO - MemoryCompressor initialized -22:11:18 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -22:11:18 - mai.memory.manager - INFO - MemoryManager initialized with all components -22:11:18 - mai.conversation.state - INFO - ConversationState initialized with max 10 turns per conversation -22:11:18 - mai.conversation.timing - INFO - TimingCalculator initialized with 'default' profile -22:11:18 - mai.conversation.reasoning - INFO - ReasoningEngine initialized -22:11:18 - mai.conversation.decomposition - INFO - RequestDecomposer initialized -22:11:18 - mai.conversation.interruption - INFO - InterruptHandler initialized with 30.0s timeout -22:11:18 - mai.conversation.interruption - DEBUG - Conversation state integrated -22:11:18 - mai.conversation.engine - INFO - ConversationEngine initialized with timing_profile='default', debug=False -22:11:19 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:19 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:19 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:19 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:19 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:19 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:11:19 GMT'), (b'Content-Length', b'337')]) -22:11:19 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:11:19 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:19 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:19 - httpcore.http11 - DEBUG - response_closed.started -22:11:19 - httpcore.http11 - DEBUG - response_closed.complete -22:11:19 - mai.model.ollama_client - INFO - Found 1 models -22:11:20 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:20 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:20 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:20 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:20 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:20 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:11:20 GMT'), (b'Content-Length', b'337')]) -22:11:20 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:11:20 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:20 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:20 - httpcore.http11 - DEBUG - response_closed.started -22:11:20 - httpcore.http11 - DEBUG - response_closed.complete -22:11:20 - mai.model.ollama_client - INFO - Found 1 models -22:11:20 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:20 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:20 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:20 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:20 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:20 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:11:20 GMT'), (b'Content-Length', b'337')]) -22:11:20 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:11:20 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:20 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:20 - httpcore.http11 - DEBUG - response_closed.started -22:11:20 - httpcore.http11 - DEBUG - response_closed.complete -22:11:20 - mai.model.ollama_client - INFO - Found 1 models -22:11:20 - mai.conversation.state - INFO - Restored 2 turns to conversation b5365410-0c24-4a95-b4d7-373ddfd3779d -22:11:21 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:21 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:21 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:21 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:21 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:21 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:11:21 GMT'), (b'Content-Length', b'337')]) -22:11:21 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:11:21 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:21 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:21 - httpcore.http11 - DEBUG - response_closed.started -22:11:21 - httpcore.http11 - DEBUG - response_closed.complete -22:11:21 - mai.model.ollama_client - INFO - Found 1 models -22:11:22 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:22 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:22 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:22 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:22 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:22 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:11:22 GMT'), (b'Content-Length', b'337')]) -22:11:22 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:11:22 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:22 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:22 - httpcore.http11 - DEBUG - response_closed.started -22:11:22 - httpcore.http11 - DEBUG - response_closed.complete -22:11:22 - mai.model.ollama_client - INFO - Found 1 models -22:11:22 - mai.conversation.state - DEBUG - Started new conversation: e648a783-b233-4478-a1d2-5eafd433e9a2 -22:11:22 - mai.conversation.engine - INFO - Processing conversation turn for e648a783-b233-4478-a1d2-5eafd433e9a2 -22:11:22 - src.mai.memory.retrieval - INFO - Retrieving context for query: exit... -22:11:22 - src.mai.memory.storage - INFO - Using text search fallback temporarily -22:11:22 - src.mai.memory.storage - DEBUG - Text search fallback found 0 conversations for query: 'exit' -22:11:22 - src.mai.memory.retrieval - DEBUG - Semantic search found 0 results -22:11:22 - src.mai.memory.storage - DEBUG - Retrieved conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -22:11:22 - src.mai.memory.storage - DEBUG - Retrieved conversation '58f4f7b3-3267-434e-becc-b4aac165c08d' with 2 messages -22:11:22 - src.mai.memory.storage - DEBUG - Retrieved conversation '8a40c3e8-fbb2-4029-beca-3513d7e005a8' with 2 messages -22:11:22 - src.mai.memory.storage - DEBUG - Retrieved conversation '96dc6411-4d2e-4bf8-949f-5dcc472e447b' with 2 messages -22:11:22 - src.mai.memory.storage - DEBUG - Retrieved conversation '28e5bdf6-d8bc-45d2-82b4-3a95d09e2bba' with 2 messages -22:11:22 - src.mai.memory.storage - DEBUG - Retrieved conversation 'ae221870-4972-4273-b921-a2dbc4aa474b' with 2 messages -22:11:22 - src.mai.memory.storage - DEBUG - Retrieved conversation '46efb9e2-acb0-425e-8358-320cb07b2226' with 2 messages -22:11:22 - src.mai.memory.storage - DEBUG - Retrieved conversation '9b990be1-6afb-49c2-86e1-8245d5a820c3' with 2 messages -22:11:22 - src.mai.memory.retrieval - DEBUG - Keyword search found 0 results -22:11:22 - src.mai.memory.retrieval - DEBUG - Recency search found 3 results -22:11:22 - mai.memory.manager - ERROR - Failed to get context: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -22:11:22 - mai.conversation.engine - WARNING - Failed to retrieve memory context: Context retrieval failed: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -22:11:22 - mai.conversation.state - DEBUG - Retrieved 0 messages from conversation e648a783-b233-4478-a1d2-5eafd433e9a2 -22:11:22 - mai.conversation.timing - DEBUG - Complexity analysis: score=0.00, words=1, questions=0, technical=0 -22:11:22 - mai.conversation.timing - DEBUG - Delay calculation: simple complexity (0.00) -> 3.23s -22:11:22 - mai.conversation.engine - INFO - Applying 3.23s delay for natural timing -22:11:26 - src.mai.memory.retrieval - INFO - Retrieving context for query: exit... -22:11:26 - src.mai.memory.storage - INFO - Using text search fallback temporarily -22:11:26 - src.mai.memory.storage - DEBUG - Text search fallback found 0 conversations for query: 'exit' -22:11:26 - src.mai.memory.retrieval - DEBUG - Semantic search found 0 results -22:11:26 - src.mai.memory.storage - DEBUG - Retrieved conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -22:11:26 - src.mai.memory.storage - DEBUG - Retrieved conversation '58f4f7b3-3267-434e-becc-b4aac165c08d' with 2 messages -22:11:26 - src.mai.memory.storage - DEBUG - Retrieved conversation '8a40c3e8-fbb2-4029-beca-3513d7e005a8' with 2 messages -22:11:26 - src.mai.memory.storage - DEBUG - Retrieved conversation '96dc6411-4d2e-4bf8-949f-5dcc472e447b' with 2 messages -22:11:26 - src.mai.memory.storage - DEBUG - Retrieved conversation '28e5bdf6-d8bc-45d2-82b4-3a95d09e2bba' with 2 messages -22:11:26 - src.mai.memory.storage - DEBUG - Retrieved conversation 'ae221870-4972-4273-b921-a2dbc4aa474b' with 2 messages -22:11:26 - src.mai.memory.storage - DEBUG - Retrieved conversation '46efb9e2-acb0-425e-8358-320cb07b2226' with 2 messages -22:11:26 - src.mai.memory.storage - DEBUG - Retrieved conversation '9b990be1-6afb-49c2-86e1-8245d5a820c3' with 2 messages -22:11:26 - src.mai.memory.retrieval - DEBUG - Keyword search found 0 results -22:11:26 - src.mai.memory.retrieval - DEBUG - Recency search found 3 results -22:11:26 - mai.memory.manager - ERROR - Failed to get context: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -22:11:26 - mai.core.interface - DEBUG - Failed to retrieve memory context: Context retrieval failed: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -22:11:26 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:11:26 - httpcore.http11 - DEBUG - send_request_headers.complete -22:11:26 - httpcore.http11 - DEBUG - send_request_body.started request= -22:11:26 - httpcore.http11 - DEBUG - send_request_body.complete -22:11:26 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:11:28 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:11:28 GMT'), (b'Content-Length', b'517')]) -22:11:28 - httpx - INFO - HTTP Request: POST http://localhost:11434/api/chat "HTTP/1.1 200 OK" -22:11:28 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:11:28 - httpcore.http11 - DEBUG - receive_response_body.complete -22:11:28 - httpcore.http11 - DEBUG - response_closed.started -22:11:28 - httpcore.http11 - DEBUG - response_closed.complete -22:11:28 - mai.model.ollama_client - DEBUG - Generated response from llama3.2:1b -22:11:28 - src.mai.memory.storage - WARNING - Failed to generate embedding for message ce760f12-4a96-48b4-a4e1-ec04f71dfe09_0: Error binding parameter 2: type 'list' is not supported -22:11:28 - src.mai.memory.storage - WARNING - Failed to generate embedding for message ce760f12-4a96-48b4-a4e1-ec04f71dfe09_1: Error binding parameter 2: type 'list' is not supported -22:11:28 - src.mai.memory.storage - INFO - Stored conversation 'ce760f12-4a96-48b4-a4e1-ec04f71dfe09' with 2 messages -22:11:28 - src.mai.memory.storage - DEBUG - Retrieved conversation 'ce760f12-4a96-48b4-a4e1-ec04f71dfe09' with 2 messages -22:11:28 - mai.memory.manager - INFO - Stored conversation 'ce760f12-4a96-48b4-a4e1-ec04f71dfe09' with 2 messages -22:11:28 - mai.core.interface - DEBUG - Stored conversation in memory: ce760f12-4a96-48b4-a4e1-ec04f71dfe09 -22:11:28 - src.mai.memory.storage - WARNING - Failed to generate embedding for message e648a783-b233-4478-a1d2-5eafd433e9a2_0: Error binding parameter 2: type 'list' is not supported -22:11:28 - src.mai.memory.storage - WARNING - Failed to generate embedding for message e648a783-b233-4478-a1d2-5eafd433e9a2_1: Error binding parameter 2: type 'list' is not supported -22:11:28 - src.mai.memory.storage - INFO - Stored conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -22:11:28 - src.mai.memory.storage - DEBUG - Retrieved conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -22:11:28 - mai.memory.manager - INFO - Stored conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -22:11:28 - mai.conversation.engine - DEBUG - Stored conversation turn in memory: e648a783-b233-4478-a1d2-5eafd433e9a2 -22:11:28 - mai.conversation.state - DEBUG - Added turn to conversation e648a783-b233-4478-a1d2-5eafd433e9a2: 55 tokens, 3.23s -22:11:28 - mai.conversation.timing - DEBUG - Complexity analysis: score=0.00, words=1, questions=0, technical=0 -22:11:28 - mai.conversation.engine - INFO - Conversation turn completed for e648a783-b233-4478-a1d2-5eafd433e9a2 -22:11:28 - httpcore.connection - DEBUG - close.started -22:11:28 - httpcore.connection - DEBUG - close.complete -22:20:22 - asyncio - DEBUG - Using selector: EpollSelector -22:20:22 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -22:20:22 - git.util - DEBUG - sys.platform='linux', git_executable='git' -22:20:22 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -22:20:22 - git.util - DEBUG - sys.platform='linux', git_executable='git' -22:20:22 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -22:20:22 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -22:20:22 - docker.utils.config - DEBUG - Trying paths: ['/home/mystiatech/.docker/config.json', '/home/mystiatech/.dockercfg'] -22:20:22 - docker.utils.config - DEBUG - Found file at path: /home/mystiatech/.docker/config.json -22:20:22 - docker.auth - DEBUG - Found 'credsStore' section -22:20:22 - urllib3.connectionpool - DEBUG - http://localhost:None "GET /version HTTP/1.1" 200 None -22:20:22 - urllib3.connectionpool - DEBUG - http://localhost:None "GET /v1.52/_ping HTTP/1.1" 200 None -22:20:22 - src.mai.memory.storage - INFO - Loading embedding model: all-MiniLM-L6-v2 -22:20:22 - sentence_transformers.SentenceTransformer - INFO - Use pytorch device_name: cuda:0 -22:20:22 - sentence_transformers.SentenceTransformer - INFO - Load pretrained SentenceTransformer: all-MiniLM-L6-v2 -22:20:22 - httpcore.connection - DEBUG - connect_tcp.started host='huggingface.co' port=443 local_address=None timeout=10 socket_options=None -22:20:22 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -22:20:22 - httpcore.connection - DEBUG - start_tls.started ssl_context= server_hostname='huggingface.co' timeout=10 -22:20:22 - httpcore.connection - DEBUG - start_tls.complete return_value= -22:20:22 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:22 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:22 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:22 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:22 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:22 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:22 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef6-19daaf8976cdba794bac9d59;eab53cf1-ad53-4744-a59e-f4f2d2bf9aca'), (b'RateLimit', b'"resolvers";r=2999;t=250'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'jlCiedsHdK7v-6xLa-RAEAjz9syNeJxrfqIiSfGy1DaLNwGH2XOeHQ==')]) -22:20:22 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:20:22 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:22 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:22 - httpcore.http11 - DEBUG - response_closed.started -22:20:22 - httpcore.http11 - DEBUG - response_closed.complete -22:20:22 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:22 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:22 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:22 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:22 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:22 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'-3VZ9Q4rdmDAmEZM4DNUAu8Ek5ilpaFfneDhaRoCHfdcCKi2airrQQ=='), (b'Age', b'16915732')]) -22:20:22 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:20:22 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:22 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:22 - httpcore.http11 - DEBUG - response_closed.started -22:20:22 - httpcore.http11 - DEBUG - response_closed.complete -22:20:22 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:22 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:22 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:22 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:22 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:22 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:22 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef6-411416ab5f3312c46df249df;69b5779e-7d8b-4e33-99ca-64c9254a02a4'), (b'RateLimit', b'"resolvers";r=2998;t=250'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'1ZWep8-a01L61eNFY3uTzSsW1lOFCP4nJgC5l_ngKZS6bm3v-Ea44A==')]) -22:20:22 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:20:22 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:22 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:22 - httpcore.http11 - DEBUG - response_closed.started -22:20:22 - httpcore.http11 - DEBUG - response_closed.complete -22:20:22 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:22 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:22 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:22 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:22 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:22 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'6pO1KMxJKnoqA6zBGI5S5pfiT3_Ie10OkrOmnJfVzIZ1um6Q70jf9A=='), (b'Age', b'16915731')]) -22:20:22 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:20:22 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:22 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:22 - httpcore.http11 - DEBUG - response_closed.started -22:20:22 - httpcore.http11 - DEBUG - response_closed.complete -22:20:22 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:22 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:22 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:22 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:22 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:22 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef6-5c340e3260d5887b38b47da7;945bb48c-902f-4fe4-b18f-ad8791e83bee'), (b'RateLimit', b'"resolvers";r=2997;t=250'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'XNBiGmJK3s7sy8ffc_b5gJJRs5RJssXRrXAq8sFl7rhCXvvOEBMLRw==')]) -22:20:23 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:23 - httpcore.http11 - DEBUG - response_closed.started -22:20:23 - httpcore.http11 - DEBUG - response_closed.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'rHDRtnHJsRAVukapyXY8_5_xgy8OkrApqat_XpBYWBt5gpphff9NOQ=='), (b'Age', b'16915731')]) -22:20:23 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:23 - httpcore.http11 - DEBUG - response_closed.started -22:20:23 - httpcore.http11 - DEBUG - response_closed.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'276'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:22 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2FREADME.md=&etag=%2258d4a9a45664eb9e12de9549c548c09b6134c17f%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef6-126f75921954bcce590f831c;80988022-e6da-4d16-b1e2-6a917a42619e'), (b'RateLimit', b'"resolvers";r=2996;t=250'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'lj_T3i8Z3gMPOIdEkRKVadX-oMjpUxqxyd3vsiBTyJpVjoX26YYbHw==')]) -22:20:23 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/README.md "HTTP/1.1 307 Temporary Redirect" -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:23 - httpcore.http11 - DEBUG - response_closed.started -22:20:23 - httpcore.http11 - DEBUG - response_closed.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'10454'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:32 GMT'), (b'ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e4-65f7ce852d1fe6c63dd82d8c;83c3a845-c5a5-4419-abf2-31960223e770'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'r2_33T7yV-PZcg2kDrfCEr6GZ0DHUYsMxejx5Z5JRLnb_76wU7z16w=='), (b'Age', b'16915730')]) -22:20:23 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md "HTTP/1.1 200 OK" -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:23 - httpcore.http11 - DEBUG - response_closed.started -22:20:23 - httpcore.http11 - DEBUG - response_closed.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:22 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef6-2e2c1d2c7528626a19b8a270;b2c4b274-0ef5-4605-b63e-d248fcf54163'), (b'RateLimit', b'"resolvers";r=2995;t=250'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'_pggYga_LiVn54VbwzIiq2CjUTK8krerDrJ6TV0xEEq9JK-KZzspSw==')]) -22:20:23 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:23 - httpcore.http11 - DEBUG - response_closed.started -22:20:23 - httpcore.http11 - DEBUG - response_closed.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'qCjiENVvCm0jG4OkTQ52sdz3yRGhY5aJTQALEweBB7HYe4ThvQrPtw=='), (b'Age', b'16915732')]) -22:20:23 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:23 - httpcore.http11 - DEBUG - response_closed.started -22:20:23 - httpcore.http11 - DEBUG - response_closed.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'308'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:22 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fsentence_bert_config.json=&etag=%2259d594003bf59880a884c574bf88ef7555bb0202%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef6-5ac3f21f16762b7b3128bc7f;c8cb76e5-e31b-48ce-bbc7-3e413c997694'), (b'RateLimit', b'"resolvers";r=2994;t=250'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'70wKmhiKpvaALEIVU2Ho4wvkeumAcLGlkp8OfRm3bye1yMCmq-yljg==')]) -22:20:23 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/sentence_bert_config.json "HTTP/1.1 307 Temporary Redirect" -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:23 - httpcore.http11 - DEBUG - response_closed.started -22:20:23 - httpcore.http11 - DEBUG - response_closed.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'53'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:35 GMT'), (b'ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e7-793defd917b2fff34bb93137;f97df483-7cc7-4061-bccd-166531ee26ec'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'tkFqRAawPKO22jFVclBtNgiOYZj9HKhxriKzwllVw-k7dNv7Sw8Xkg=='), (b'Age', b'16915727')]) -22:20:23 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json "HTTP/1.1 200 OK" -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:23 - httpcore.http11 - DEBUG - response_closed.started -22:20:23 - httpcore.http11 - DEBUG - response_closed.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'15'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:22 GMT'), (b'ETag', b'W/"f-mY2VvLxuxB7KhsoOdQTlMTccuAQ"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef6-06b17eed044ce20259af889d;f4bf5bc4-d2c7-40fd-af93-52cb6de9d1af'), (b'RateLimit', b'"resolvers";r=2993;t=250'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'MISS'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'Entry not found'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'25shXZXdfydBNKCFMvB0TKyWJaUCwmYlFt-jJ7P-1OrTvRfjJpmfqg==')]) -22:20:23 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/adapter_config.json "HTTP/1.1 404 Not Found" -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:23 - httpcore.http11 - DEBUG - response_closed.started -22:20:23 - httpcore.http11 - DEBUG - response_closed.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:22 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef6-46e8ddfc23a9e667303af305;015908a5-99bb-4524-92fe-80b046bb0e9a'), (b'RateLimit', b'"resolvers";r=2992;t=250'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'j_C6y1EH7qwykR_MwGSwMiovBuNxyY-aQHE793WYwggiqHlr2u5gdg==')]) -22:20:23 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:23 - httpcore.http11 - DEBUG - response_closed.started -22:20:23 - httpcore.http11 - DEBUG - response_closed.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'B9E1ZMmHFEiPvYOjpAISy4lGiYaGImW7L_GF5Ac8-J9Yv-vLNdo2QQ=='), (b'Age', b'18609478')]) -22:20:23 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:23 - httpcore.http11 - DEBUG - response_closed.started -22:20:23 - httpcore.http11 - DEBUG - response_closed.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:22 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef6-32104dd1169f498b5d1d9b71;fbfd0a86-a3af-4aa9-90a9-6c82b0b7afbf'), (b'RateLimit', b'"resolvers";r=2991;t=250'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'jIwIQetYD-VKJOef5S9zTOCfLbVjyeOwE6GO2qvLe8w49N1NsPz2uQ==')]) -22:20:23 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:23 - httpcore.http11 - DEBUG - response_closed.started -22:20:23 - httpcore.http11 - DEBUG - response_closed.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'lLqEiP3_hMZpZkRvq2Wp64jWL9ik3-d8RClzwQlc9i_QQMI8irlhPA=='), (b'Age', b'18609478')]) -22:20:23 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:23 - httpcore.http11 - DEBUG - response_closed.started -22:20:23 - httpcore.http11 - DEBUG - response_closed.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'300'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:22 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Ftokenizer_config.json=&etag=%22c79f2b6a0cea6f4b564fed1938984bace9d30ff0%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef6-18628a640527868879472295;73a0ac83-dc2f-4b8b-8836-1ab2737d6d34'), (b'RateLimit', b'"resolvers";r=2990;t=250'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'G-5lJtFupohX2Ai96qX81mdlbv7FQL_zPlMF2YBj7pi7gdMVUcpxGw==')]) -22:20:23 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/tokenizer_config.json "HTTP/1.1 307 Temporary Redirect" -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:23 - httpcore.http11 - DEBUG - response_closed.started -22:20:23 - httpcore.http11 - DEBUG - response_closed.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'350'), (b'Connection', b'keep-alive'), (b'Date', b'Fri, 27 Jun 2025 08:23:00 GMT'), (b'ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685e54e4-185fabac3ee499f1325b7683;ac28f8a9-2ca5-4215-a430-8da70930e987'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'pWySydmxS0o3vH16GaYI5oKU_xpgjGiBMUnRnAg2xnJo-W30XA4HVw=='), (b'Age', b'18471442')]) -22:20:23 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json "HTTP/1.1 200 OK" -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:23 - httpcore.http11 - DEBUG - response_closed.started -22:20:23 - httpcore.http11 - DEBUG - response_closed.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'64'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:22 GMT'), (b'ETag', b'W/"40-09f9IAqP13xarAhQxFS2W8rvRkM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef6-1209b9273a6de4ba15b298d9;d8c20b47-3124-4a90-ad60-66e342eb0892'), (b'RateLimit', b'"api";r=499;t=250'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'additional_chat_templates does not exist on "main"'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'cLmn3uG3cKmoQOBDwmCSZqbCShCtM5Cq8AYrB21BvGznNz6uRZV8aA==')]) -22:20:23 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main/additional_chat_templates?recursive=false&expand=false "HTTP/1.1 404 Not Found" -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:23 - httpcore.http11 - DEBUG - response_closed.started -22:20:23 - httpcore.http11 - DEBUG - response_closed.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6465'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:22 GMT'), (b'ETag', b'W/"1941-m0CqwCT0eLaAYulV6LKBoBypnns"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef6-0e679d77777bd81f6f609996;28e12a23-5bb2-4fd0-b45b-a3a80c60bbd4'), (b'RateLimit', b'"api";r=498;t=250'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'TeEUNtsAy987C4eG_hEz5IgaCju3KJBFM0XqMqALa5FcPWYPixYL9g==')]) -22:20:23 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main?recursive=true&expand=false "HTTP/1.1 200 OK" -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:23 - httpcore.http11 - DEBUG - response_closed.started -22:20:23 - httpcore.http11 - DEBUG - response_closed.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'304'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:22 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2F1_Pooling%2Fconfig.json=&etag=%22d1514c3162bbe87b343f565fadc62e6c06f04f03%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef6-1cdeebd831fee6451649f8a8;d33c9ea9-2688-4c07-9232-2fd05fb1e76a'), (b'RateLimit', b'"resolvers";r=2989;t=250'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'ih6quH6IpPE85uSJwd7s5DHENy0_h_1xPqTJj80Q7YZRphJMOxIijg==')]) -22:20:23 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/1_Pooling/config.json "HTTP/1.1 307 Temporary Redirect" -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:23 - httpcore.http11 - DEBUG - response_closed.started -22:20:23 - httpcore.http11 - DEBUG - response_closed.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'190'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 18 Aug 2025 04:37:11 GMT'), (b'ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-68a2adf7-4d7e79097342d93a4134b829;2f881d9e-e68d-4662-b2f6-33a4aabad755'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'AESDPZMcpBPRduRzddi4wESK3RSsFAuVSU7XW6I9lgAoKj9xCGJv-w=='), (b'Age', b'13992191')]) -22:20:23 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json "HTTP/1.1 200 OK" -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:23 - httpcore.http11 - DEBUG - response_closed.started -22:20:23 - httpcore.http11 - DEBUG - response_closed.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:23 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:23 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6825'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:22 GMT'), (b'ETag', b'W/"1aa9-XXTNzHzWlYOmKJGelWoAnligEjM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef6-65ba363f4dfc6f021f9e63b4;b35bc1df-7b97-4777-aeeb-d0a70b4c0580'), (b'RateLimit', b'"api";r=497;t=250'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'kjmGHxactMTQSa_zo3y_BIrWDBclBo8PE9GbxAs25pwrFCkNdHVVJA==')]) -22:20:23 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2 "HTTP/1.1 200 OK" -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:23 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:23 - httpcore.http11 - DEBUG - response_closed.started -22:20:23 - httpcore.http11 - DEBUG - response_closed.complete -22:20:24 - src.mai.memory.storage - INFO - Embedding model loaded: all-MiniLM-L6-v2 (dim: 384) -22:20:24 - src.mai.memory.storage - INFO - sqlite-vec extension loaded successfully -22:20:24 - src.mai.memory.storage - INFO - Database schema created successfully -22:20:24 - src.mai.memory.storage - INFO - Database schema verification passed -22:20:24 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -22:20:24 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -22:20:24 - src.mai.memory.compression - INFO - MemoryCompressor initialized -22:20:24 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -22:20:24 - mai.memory.manager - INFO - MemoryManager initialized with all components -22:20:24 - mai.core.interface - INFO - Memory system initialized successfully -22:20:24 - mai.core.interface - INFO - Mai interface initialized -22:20:24 - mai.core.interface - INFO - Initializing Mai interface... -22:20:24 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -22:20:24 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -22:20:24 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:24 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:24 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:24 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:24 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:24 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:20:24 GMT'), (b'Content-Length', b'337')]) -22:20:24 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:20:24 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:24 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:24 - httpcore.http11 - DEBUG - response_closed.started -22:20:24 - httpcore.http11 - DEBUG - response_closed.complete -22:20:24 - mai.model.ollama_client - INFO - Found 1 models -22:20:25 - mai.core.interface - WARNING - Git repository health check failed -22:20:25 - mai.core.interface - INFO - Selected initial model: llama3.2:1b -22:20:25 - mai.core.interface - INFO - Mai interface initialized successfully -22:20:25 - src.mai.memory.storage - INFO - Loading embedding model: all-MiniLM-L6-v2 -22:20:25 - sentence_transformers.SentenceTransformer - INFO - Use pytorch device_name: cuda:0 -22:20:25 - sentence_transformers.SentenceTransformer - INFO - Load pretrained SentenceTransformer: all-MiniLM-L6-v2 -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:24 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef8-2f3382724f17f1570137ed83;adfdb8f5-6496-446c-98a1-5ed569862d18'), (b'RateLimit', b'"resolvers";r=2988;t=248'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'F8suaRAP7e0v5J7pfJXb-dMLpjGdD6dbJVHggit3tAsd4UMuP9o6yQ==')]) -22:20:25 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:25 - httpcore.http11 - DEBUG - response_closed.started -22:20:25 - httpcore.http11 - DEBUG - response_closed.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Q76CmguNNt7d26rjMuP-fDnnj_5JWeoUtVsqmFxD6D01QtBk6Lajxw=='), (b'Age', b'16915734')]) -22:20:25 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:25 - httpcore.http11 - DEBUG - response_closed.started -22:20:25 - httpcore.http11 - DEBUG - response_closed.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:24 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef8-74b117273b65c25630018e95;18cc0a57-187b-488f-a338-c121fc8f0441'), (b'RateLimit', b'"resolvers";r=2987;t=248'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'JLEKsgwyRED3VSg2OHcabFz_qPNAmSAtjqUpgHdI27sXTYqg8mnhCA==')]) -22:20:25 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:25 - httpcore.http11 - DEBUG - response_closed.started -22:20:25 - httpcore.http11 - DEBUG - response_closed.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'-SwL4Go9qGzMXrLnPr0N5D305suH8vfqckGLCd_7UIif5I7MqcR8EQ=='), (b'Age', b'16915733')]) -22:20:25 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:25 - httpcore.http11 - DEBUG - response_closed.started -22:20:25 - httpcore.http11 - DEBUG - response_closed.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:24 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef8-3a352ea20fed6f47358aea1f;6a5eafce-9630-46be-ba9d-0f9a24048e58'), (b'RateLimit', b'"resolvers";r=2986;t=248'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'hw0P94TSs1uycjkBZKxzpsWkHI7mWMQVQdn3ANFVESI8feCzZCILTg==')]) -22:20:25 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:25 - httpcore.http11 - DEBUG - response_closed.started -22:20:25 - httpcore.http11 - DEBUG - response_closed.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'eZnVcHM2iSQLI3Vkyst8o7JzVMDY8ekANSKYJod10IhDvCeCaKz2uA=='), (b'Age', b'16915733')]) -22:20:25 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:25 - httpcore.http11 - DEBUG - response_closed.started -22:20:25 - httpcore.http11 - DEBUG - response_closed.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'276'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:24 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2FREADME.md=&etag=%2258d4a9a45664eb9e12de9549c548c09b6134c17f%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef8-3b003aea051331531d840af1;0bfa9d19-ee06-4291-966a-fc1feed11059'), (b'RateLimit', b'"resolvers";r=2985;t=248'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'899zlRk-dsGWCrqMT7g8ErmkYoDwb_quAZkn3m114H6w8LyCfJ5BoA==')]) -22:20:25 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/README.md "HTTP/1.1 307 Temporary Redirect" -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:25 - httpcore.http11 - DEBUG - response_closed.started -22:20:25 - httpcore.http11 - DEBUG - response_closed.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'10454'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:32 GMT'), (b'ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e4-65f7ce852d1fe6c63dd82d8c;83c3a845-c5a5-4419-abf2-31960223e770'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'nE03eSQh7xDiah5xmubowtbum9Wqyf8ynXsQ4SOliEBYdpkwnMxQRg=='), (b'Age', b'16915732')]) -22:20:25 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md "HTTP/1.1 200 OK" -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:25 - httpcore.http11 - DEBUG - response_closed.started -22:20:25 - httpcore.http11 - DEBUG - response_closed.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:24 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef8-783238632114749d4a684ed5;95c3e7c2-00b2-4644-84c6-402a8c1fa5ea'), (b'RateLimit', b'"resolvers";r=2984;t=248'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-HF-Warning', b'unauthenticated; Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'PfmtA7h8oZEApwOzXo0Xfe0t1q7JPvkeo2OIKS_pfb-MPuIdHpiF1g==')]) -22:20:25 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:25 - httpcore.http11 - DEBUG - response_closed.started -22:20:25 - httpcore.http11 - DEBUG - response_closed.complete -22:20:25 - huggingface_hub.utils._http - WARNING - Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads. -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'FXp4mH08ysYgnD1kpvU0wvwUD1U9nZ0sqw_q2I5yqiUc0S8Aoisczg=='), (b'Age', b'16915734')]) -22:20:25 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:25 - httpcore.http11 - DEBUG - response_closed.started -22:20:25 - httpcore.http11 - DEBUG - response_closed.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'308'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:24 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fsentence_bert_config.json=&etag=%2259d594003bf59880a884c574bf88ef7555bb0202%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef8-1c237c583102a5de0de100ce;686e0d3e-bc0f-4d69-9bac-1fe4e5f8c0bb'), (b'RateLimit', b'"resolvers";r=2983;t=248'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'TUXcyEW9a06U3FBs8c7UQ28TDz6n6UEuoARdhz_Gzhqbxd-vksob3g==')]) -22:20:25 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/sentence_bert_config.json "HTTP/1.1 307 Temporary Redirect" -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:25 - httpcore.http11 - DEBUG - response_closed.started -22:20:25 - httpcore.http11 - DEBUG - response_closed.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'53'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:35 GMT'), (b'ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e7-793defd917b2fff34bb93137;f97df483-7cc7-4061-bccd-166531ee26ec'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'KAGzh2WNPSpUq1CN0EM5a6tyCd3zny1Cv2l3p4G_gT1yrqAQ5msl-g=='), (b'Age', b'16915729')]) -22:20:25 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json "HTTP/1.1 200 OK" -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:25 - httpcore.http11 - DEBUG - response_closed.started -22:20:25 - httpcore.http11 - DEBUG - response_closed.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'15'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:24 GMT'), (b'ETag', b'W/"f-mY2VvLxuxB7KhsoOdQTlMTccuAQ"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef8-249df4c232ae598e035b7eaf;cae75e08-6c6a-491b-8561-05e0f3c57115'), (b'RateLimit', b'"resolvers";r=2982;t=248'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'MISS'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'Entry not found'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'jZsh1kgFCqa1DuXooMwn7SR-ta7I2YitXMxY7PXfPYSOVBoihVqvKw==')]) -22:20:25 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/adapter_config.json "HTTP/1.1 404 Not Found" -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:25 - httpcore.http11 - DEBUG - response_closed.started -22:20:25 - httpcore.http11 - DEBUG - response_closed.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:24 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef8-556e2a2d74af585c6150ad42;c602461c-3688-40f0-81f2-504706f5c75b'), (b'RateLimit', b'"resolvers";r=2981;t=248'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'B2QlZ4-BTmiEjt5TLwbBSCZCEXEqz0tc9ZrfOD6iPrEA5QjI0o_SKw==')]) -22:20:25 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:25 - httpcore.http11 - DEBUG - response_closed.started -22:20:25 - httpcore.http11 - DEBUG - response_closed.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'KzkKJcR2qcC_Pw6WzHZEKSZ0IqXdkgyIUeRY2aqtw2PftoLKZDVjqA=='), (b'Age', b'18609480')]) -22:20:25 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:25 - httpcore.http11 - DEBUG - response_closed.started -22:20:25 - httpcore.http11 - DEBUG - response_closed.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:24 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef8-575c9c882b19ce7f5d026a0f;9ce99322-b7e4-415e-bb23-c547444c381c'), (b'RateLimit', b'"resolvers";r=2980;t=248'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'v70728mnPvPg-t8SH9986tnJ_NjjaZfB8AmNjofsdrgSvaHo7dY6-A==')]) -22:20:25 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:25 - httpcore.http11 - DEBUG - response_closed.started -22:20:25 - httpcore.http11 - DEBUG - response_closed.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'nVi6MNYe31QX6-OPqAWObmip-N7jOndxYogokbbtDQzGn0hsZTNUGQ=='), (b'Age', b'18609480')]) -22:20:25 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:25 - httpcore.http11 - DEBUG - response_closed.started -22:20:25 - httpcore.http11 - DEBUG - response_closed.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'300'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:24 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Ftokenizer_config.json=&etag=%22c79f2b6a0cea6f4b564fed1938984bace9d30ff0%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef8-1c8e03c47c088ebc58831cec;3c435e70-1498-4279-abb9-a5352941b1db'), (b'RateLimit', b'"resolvers";r=2979;t=248'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'8vldLbL3VOAiVgb-bdSlHspa1kanLbKKD8E1zlkh2h91437V71gnEg==')]) -22:20:25 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/tokenizer_config.json "HTTP/1.1 307 Temporary Redirect" -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:25 - httpcore.http11 - DEBUG - response_closed.started -22:20:25 - httpcore.http11 - DEBUG - response_closed.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'350'), (b'Connection', b'keep-alive'), (b'Date', b'Fri, 27 Jun 2025 08:23:00 GMT'), (b'ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685e54e4-185fabac3ee499f1325b7683;ac28f8a9-2ca5-4215-a430-8da70930e987'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'dSHtgIh1kCeko4CWlyoreUJzbAo0kMTjOMAdseMLv4zGBHer0EkbRg=='), (b'Age', b'18471444')]) -22:20:25 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json "HTTP/1.1 200 OK" -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:25 - httpcore.http11 - DEBUG - response_closed.started -22:20:25 - httpcore.http11 - DEBUG - response_closed.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'64'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:24 GMT'), (b'ETag', b'W/"40-09f9IAqP13xarAhQxFS2W8rvRkM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef8-5d1fc4466cd4555930e54c35;91b3fe9a-76c7-48c9-b6ab-758f58a166c0'), (b'RateLimit', b'"api";r=496;t=248'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'additional_chat_templates does not exist on "main"'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'G6OU9HnPkrG5D5f2pq37zpo4xgZULUQIOz0Vim4393dYZ3eeTTOKkQ==')]) -22:20:25 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main/additional_chat_templates?recursive=false&expand=false "HTTP/1.1 404 Not Found" -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:25 - httpcore.http11 - DEBUG - response_closed.started -22:20:25 - httpcore.http11 - DEBUG - response_closed.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6465'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:24 GMT'), (b'ETag', b'W/"1941-m0CqwCT0eLaAYulV6LKBoBypnns"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef8-7cc10e7523004922020746b1;7036ad92-718c-4dab-9072-e3be845ed500'), (b'RateLimit', b'"api";r=495;t=248'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'37mjY3BOr1Fz1ArBLiZyrFBmPXp59Zr1hSs-Ju-ZzO3or9diXzddgg==')]) -22:20:25 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main?recursive=true&expand=false "HTTP/1.1 200 OK" -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:25 - httpcore.http11 - DEBUG - response_closed.started -22:20:25 - httpcore.http11 - DEBUG - response_closed.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'304'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:25 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2F1_Pooling%2Fconfig.json=&etag=%22d1514c3162bbe87b343f565fadc62e6c06f04f03%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef8-5b502e712ac93d5713ead430;96ffd4fd-b69b-4fd3-b110-00b0ee0bceb5'), (b'RateLimit', b'"resolvers";r=2978;t=248'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-HF-Warning', b'unauthenticated; Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'RTqUrc93xDXbPVSa8b-qMbaWvd3cxYUFSC_c5iYCzZrwMPV-Ltuh_g==')]) -22:20:25 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/1_Pooling/config.json "HTTP/1.1 307 Temporary Redirect" -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:25 - httpcore.http11 - DEBUG - response_closed.started -22:20:25 - httpcore.http11 - DEBUG - response_closed.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'190'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 18 Aug 2025 04:37:11 GMT'), (b'ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-68a2adf7-4d7e79097342d93a4134b829;2f881d9e-e68d-4662-b2f6-33a4aabad755'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Vq9babPDPWfO5sCn818Of4WKL4_Ggvt823z_e40_ydg5IYcPk5NFgg=='), (b'Age', b'13992194')]) -22:20:25 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json "HTTP/1.1 200 OK" -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:25 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:25 - httpcore.http11 - DEBUG - response_closed.started -22:20:25 - httpcore.http11 - DEBUG - response_closed.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:25 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:25 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:25 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:26 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6825'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:20:25 GMT'), (b'ETag', b'W/"1aa9-XXTNzHzWlYOmKJGelWoAnligEjM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782ef9-40fd65327f256d2947388547;8c5e5ad0-91ad-414d-9d14-7ac2ccf51fe5'), (b'RateLimit', b'"api";r=494;t=247'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 9c8267a15d9ba974cf1dfcbe6981ef96.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'8XG6fyW1GRAW8Mm0-GgaweYxGvymcuK-KelXJ3evAz3ZwmoFqcjQiQ==')]) -22:20:26 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2 "HTTP/1.1 200 OK" -22:20:26 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:26 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:26 - httpcore.http11 - DEBUG - response_closed.started -22:20:26 - httpcore.http11 - DEBUG - response_closed.complete -22:20:26 - src.mai.memory.storage - INFO - Embedding model loaded: all-MiniLM-L6-v2 (dim: 384) -22:20:26 - src.mai.memory.storage - INFO - sqlite-vec extension loaded successfully -22:20:26 - src.mai.memory.storage - INFO - Database schema created successfully -22:20:26 - src.mai.memory.storage - INFO - Database schema verification passed -22:20:26 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -22:20:26 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -22:20:26 - src.mai.memory.compression - INFO - MemoryCompressor initialized -22:20:26 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -22:20:26 - mai.memory.manager - INFO - MemoryManager initialized with all components -22:20:26 - mai.conversation.state - INFO - ConversationState initialized with max 10 turns per conversation -22:20:26 - mai.conversation.timing - INFO - TimingCalculator initialized with 'default' profile -22:20:26 - mai.conversation.reasoning - INFO - ReasoningEngine initialized -22:20:26 - mai.conversation.decomposition - INFO - RequestDecomposer initialized -22:20:26 - mai.conversation.interruption - INFO - InterruptHandler initialized with 30.0s timeout -22:20:26 - mai.conversation.interruption - DEBUG - Conversation state integrated -22:20:26 - mai.conversation.engine - INFO - ConversationEngine initialized with timing_profile='default', debug=True -22:20:27 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:27 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:27 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:27 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:27 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:27 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:20:27 GMT'), (b'Content-Length', b'337')]) -22:20:27 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:20:27 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:27 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:27 - httpcore.http11 - DEBUG - response_closed.started -22:20:27 - httpcore.http11 - DEBUG - response_closed.complete -22:20:27 - mai.model.ollama_client - INFO - Found 1 models -22:20:28 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:28 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:28 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:28 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:28 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:28 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:20:28 GMT'), (b'Content-Length', b'337')]) -22:20:28 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:20:28 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:28 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:28 - httpcore.http11 - DEBUG - response_closed.started -22:20:28 - httpcore.http11 - DEBUG - response_closed.complete -22:20:28 - mai.model.ollama_client - INFO - Found 1 models -22:20:29 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:29 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:29 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:29 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:29 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:29 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:20:29 GMT'), (b'Content-Length', b'337')]) -22:20:29 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:20:29 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:29 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:29 - httpcore.http11 - DEBUG - response_closed.started -22:20:29 - httpcore.http11 - DEBUG - response_closed.complete -22:20:29 - mai.model.ollama_client - INFO - Found 1 models -22:20:29 - mai.conversation.state - WARNING - Expected assistant message at index 1, skipping -22:20:29 - mai.conversation.state - INFO - Restored 0 turns to conversation 9f97189f-aa72-4892-885c-54db67b763b4 -22:20:29 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:29 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:29 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:29 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:29 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:29 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:20:29 GMT'), (b'Content-Length', b'337')]) -22:20:29 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:20:29 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:29 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:29 - httpcore.http11 - DEBUG - response_closed.started -22:20:29 - httpcore.http11 - DEBUG - response_closed.complete -22:20:29 - mai.model.ollama_client - INFO - Found 1 models -22:20:30 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:30 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:30 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:30 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:30 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:30 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:20:30 GMT'), (b'Content-Length', b'337')]) -22:20:30 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:20:30 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:30 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:30 - httpcore.http11 - DEBUG - response_closed.started -22:20:30 - httpcore.http11 - DEBUG - response_closed.complete -22:20:30 - mai.model.ollama_client - INFO - Found 1 models -22:20:30 - mai.conversation.state - DEBUG - Started new conversation: 6c41b303-949c-486f-93da-acf932b04b07 -22:20:30 - mai.conversation.engine - INFO - Processing conversation turn for 6c41b303-949c-486f-93da-acf932b04b07 -22:20:30 - src.mai.memory.retrieval - INFO - Retrieving context for query: test... -22:20:30 - src.mai.memory.storage - INFO - Using text search fallback temporarily -22:20:30 - src.mai.memory.storage - DEBUG - Text search fallback found 2 conversations for query: 'test' -22:20:30 - src.mai.memory.retrieval - DEBUG - Semantic search found 2 results -22:20:30 - src.mai.memory.storage - DEBUG - Retrieved conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -22:20:30 - src.mai.memory.storage - DEBUG - Retrieved conversation 'ce760f12-4a96-48b4-a4e1-ec04f71dfe09' with 2 messages -22:20:30 - src.mai.memory.storage - DEBUG - Retrieved conversation '58f4f7b3-3267-434e-becc-b4aac165c08d' with 2 messages -22:20:30 - src.mai.memory.storage - DEBUG - Retrieved conversation '8a40c3e8-fbb2-4029-beca-3513d7e005a8' with 2 messages -22:20:30 - src.mai.memory.storage - DEBUG - Retrieved conversation '96dc6411-4d2e-4bf8-949f-5dcc472e447b' with 2 messages -22:20:30 - src.mai.memory.storage - DEBUG - Retrieved conversation '28e5bdf6-d8bc-45d2-82b4-3a95d09e2bba' with 2 messages -22:20:30 - src.mai.memory.storage - DEBUG - Retrieved conversation 'ae221870-4972-4273-b921-a2dbc4aa474b' with 2 messages -22:20:30 - src.mai.memory.storage - DEBUG - Retrieved conversation '46efb9e2-acb0-425e-8358-320cb07b2226' with 2 messages -22:20:30 - src.mai.memory.storage - DEBUG - Retrieved conversation '9b990be1-6afb-49c2-86e1-8245d5a820c3' with 2 messages -22:20:30 - src.mai.memory.retrieval - DEBUG - Keyword search found 2 results -22:20:30 - src.mai.memory.retrieval - DEBUG - Recency search found 3 results -22:20:30 - mai.memory.manager - ERROR - Failed to get context: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -22:20:30 - mai.conversation.engine - WARNING - Failed to retrieve memory context: Context retrieval failed: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -22:20:30 - mai.conversation.state - DEBUG - Retrieved 0 messages from conversation 6c41b303-949c-486f-93da-acf932b04b07 -22:20:30 - mai.conversation.timing - DEBUG - Complexity analysis: score=0.00, words=1, questions=0, technical=0 -22:20:30 - mai.conversation.timing - DEBUG - Delay calculation: simple complexity (0.00) -> 2.24s -22:20:31 - src.mai.memory.retrieval - INFO - Retrieving context for query: test... -22:20:31 - src.mai.memory.storage - INFO - Using text search fallback temporarily -22:20:31 - src.mai.memory.storage - DEBUG - Text search fallback found 2 conversations for query: 'test' -22:20:31 - src.mai.memory.retrieval - DEBUG - Semantic search found 2 results -22:20:31 - src.mai.memory.storage - DEBUG - Retrieved conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -22:20:31 - src.mai.memory.storage - DEBUG - Retrieved conversation 'ce760f12-4a96-48b4-a4e1-ec04f71dfe09' with 2 messages -22:20:31 - src.mai.memory.storage - DEBUG - Retrieved conversation '58f4f7b3-3267-434e-becc-b4aac165c08d' with 2 messages -22:20:31 - src.mai.memory.storage - DEBUG - Retrieved conversation '8a40c3e8-fbb2-4029-beca-3513d7e005a8' with 2 messages -22:20:31 - src.mai.memory.storage - DEBUG - Retrieved conversation '96dc6411-4d2e-4bf8-949f-5dcc472e447b' with 2 messages -22:20:31 - src.mai.memory.storage - DEBUG - Retrieved conversation '28e5bdf6-d8bc-45d2-82b4-3a95d09e2bba' with 2 messages -22:20:31 - src.mai.memory.storage - DEBUG - Retrieved conversation 'ae221870-4972-4273-b921-a2dbc4aa474b' with 2 messages -22:20:31 - src.mai.memory.storage - DEBUG - Retrieved conversation '46efb9e2-acb0-425e-8358-320cb07b2226' with 2 messages -22:20:31 - src.mai.memory.storage - DEBUG - Retrieved conversation '9b990be1-6afb-49c2-86e1-8245d5a820c3' with 2 messages -22:20:31 - src.mai.memory.retrieval - DEBUG - Keyword search found 2 results -22:20:31 - src.mai.memory.retrieval - DEBUG - Recency search found 3 results -22:20:31 - mai.memory.manager - ERROR - Failed to get context: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -22:20:31 - mai.core.interface - DEBUG - Failed to retrieve memory context: Context retrieval failed: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -22:20:31 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:20:31 - httpcore.http11 - DEBUG - send_request_headers.complete -22:20:31 - httpcore.http11 - DEBUG - send_request_body.started request= -22:20:31 - httpcore.http11 - DEBUG - send_request_body.complete -22:20:31 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:20:32 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:20:32 GMT'), (b'Content-Length', b'330')]) -22:20:32 - httpx - INFO - HTTP Request: POST http://localhost:11434/api/chat "HTTP/1.1 200 OK" -22:20:32 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:20:32 - httpcore.http11 - DEBUG - receive_response_body.complete -22:20:32 - httpcore.http11 - DEBUG - response_closed.started -22:20:32 - httpcore.http11 - DEBUG - response_closed.complete -22:20:32 - mai.model.ollama_client - DEBUG - Generated response from llama3.2:1b -22:20:32 - src.mai.memory.storage - WARNING - Failed to generate embedding for message eec91a1d-39e7-4fb2-bab0-983c68912054_0: Error binding parameter 2: type 'list' is not supported -22:20:32 - src.mai.memory.storage - WARNING - Failed to generate embedding for message eec91a1d-39e7-4fb2-bab0-983c68912054_1: Error binding parameter 2: type 'list' is not supported -22:20:32 - src.mai.memory.storage - INFO - Stored conversation 'eec91a1d-39e7-4fb2-bab0-983c68912054' with 2 messages -22:20:32 - src.mai.memory.storage - DEBUG - Retrieved conversation 'eec91a1d-39e7-4fb2-bab0-983c68912054' with 2 messages -22:20:32 - mai.memory.manager - INFO - Stored conversation 'eec91a1d-39e7-4fb2-bab0-983c68912054' with 2 messages -22:20:32 - mai.core.interface - DEBUG - Stored conversation in memory: eec91a1d-39e7-4fb2-bab0-983c68912054 -22:20:32 - src.mai.memory.storage - WARNING - Failed to generate embedding for message 6c41b303-949c-486f-93da-acf932b04b07_0: Error binding parameter 2: type 'list' is not supported -22:20:32 - src.mai.memory.storage - WARNING - Failed to generate embedding for message 6c41b303-949c-486f-93da-acf932b04b07_1: Error binding parameter 2: type 'list' is not supported -22:20:32 - src.mai.memory.storage - INFO - Stored conversation '6c41b303-949c-486f-93da-acf932b04b07' with 2 messages -22:20:32 - src.mai.memory.storage - DEBUG - Retrieved conversation '6c41b303-949c-486f-93da-acf932b04b07' with 2 messages -22:20:32 - mai.memory.manager - INFO - Stored conversation '6c41b303-949c-486f-93da-acf932b04b07' with 2 messages -22:20:32 - mai.conversation.engine - DEBUG - Stored conversation turn in memory: 6c41b303-949c-486f-93da-acf932b04b07 -22:20:32 - mai.conversation.state - DEBUG - Added turn to conversation 6c41b303-949c-486f-93da-acf932b04b07: 9 tokens, 2.24s -22:20:32 - mai.conversation.timing - DEBUG - Complexity analysis: score=0.00, words=1, questions=0, technical=0 -22:20:32 - mai.conversation.engine - INFO - Conversation turn completed for 6c41b303-949c-486f-93da-acf932b04b07 -22:20:32 - httpcore.connection - DEBUG - close.started -22:20:32 - httpcore.connection - DEBUG - close.complete -22:21:12 - asyncio - DEBUG - Using selector: EpollSelector -22:21:12 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -22:21:12 - git.util - DEBUG - sys.platform='linux', git_executable='git' -22:21:12 - mai.git.workflow - INFO - Staging workflow initialized for /home/mystiatech/projects/Mai -22:21:12 - git.util - DEBUG - sys.platform='linux', git_executable='git' -22:21:12 - mai.git.committer - INFO - Auto committer initialized for /home/mystiatech/projects/Mai -22:21:12 - mai.git.health_check - INFO - Health checker initialized for /home/mystiatech/projects/Mai -22:21:12 - docker.utils.config - DEBUG - Trying paths: ['/home/mystiatech/.docker/config.json', '/home/mystiatech/.dockercfg'] -22:21:12 - docker.utils.config - DEBUG - Found file at path: /home/mystiatech/.docker/config.json -22:21:12 - docker.auth - DEBUG - Found 'credsStore' section -22:21:12 - urllib3.connectionpool - DEBUG - http://localhost:None "GET /version HTTP/1.1" 200 None -22:21:12 - urllib3.connectionpool - DEBUG - http://localhost:None "GET /v1.52/_ping HTTP/1.1" 200 None -22:21:12 - src.mai.memory.storage - INFO - Loading embedding model: all-MiniLM-L6-v2 -22:21:12 - sentence_transformers.SentenceTransformer - INFO - Use pytorch device_name: cuda:0 -22:21:12 - sentence_transformers.SentenceTransformer - INFO - Load pretrained SentenceTransformer: all-MiniLM-L6-v2 -22:21:12 - httpcore.connection - DEBUG - connect_tcp.started host='huggingface.co' port=443 local_address=None timeout=10 socket_options=None -22:21:12 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -22:21:12 - httpcore.connection - DEBUG - start_tls.started ssl_context= server_hostname='huggingface.co' timeout=10 -22:21:12 - httpcore.connection - DEBUG - start_tls.complete return_value= -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:12 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f28-63b077e50366f4280922d6c2;50ddd4c2-b5de-47de-8e98-ba5e706a3027'), (b'RateLimit', b'"resolvers";r=2977;t=200'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'nPMnqeD2-ngBcNYZ3fdHlaRySV5NO7rWJMzsH7XT-IwDv4ST892pog==')]) -22:21:12 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:12 - httpcore.http11 - DEBUG - response_closed.started -22:21:12 - httpcore.http11 - DEBUG - response_closed.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'w05UwLNFFNWnjfg6uqlzgNnbCeu7roG8O-VchoDrIiYeih9Fb8e1pA=='), (b'Age', b'16915782')]) -22:21:12 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:12 - httpcore.http11 - DEBUG - response_closed.started -22:21:12 - httpcore.http11 - DEBUG - response_closed.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:12 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f28-3af9d6c0298f8f971ba952e9;59b0d3ea-0cb1-4ac3-877a-be16b609738f'), (b'RateLimit', b'"resolvers";r=2976;t=200'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'A-vjUUJ7Z9cQv2eKte3w8CMtsAhVsGCtMqjtjhxvS6Yb6m0MtFJV-A==')]) -22:21:12 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:12 - httpcore.http11 - DEBUG - response_closed.started -22:21:12 - httpcore.http11 - DEBUG - response_closed.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'qPmDwLXAgnyE78GXrEpSLafhdXWwHfM0XW102leX4YiDreQWClofuA=='), (b'Age', b'16915781')]) -22:21:12 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:12 - httpcore.http11 - DEBUG - response_closed.started -22:21:12 - httpcore.http11 - DEBUG - response_closed.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:12 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f28-1987da14336bcc1a767fdeec;cff6dfb9-be05-4bc7-84b0-f2418b755259'), (b'RateLimit', b'"resolvers";r=2975;t=200'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'26YAtjcmqL55xr4smg9DIPLIrqEJ95QMD8Ebt8NJhVfIdpPwML128w==')]) -22:21:12 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:12 - httpcore.http11 - DEBUG - response_closed.started -22:21:12 - httpcore.http11 - DEBUG - response_closed.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'BP8AnfxHchXPr-SQW2kkIo1EKao5l1-MlzanQCxiCNGeBLCqwvfcEA=='), (b'Age', b'16915781')]) -22:21:12 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:12 - httpcore.http11 - DEBUG - response_closed.started -22:21:12 - httpcore.http11 - DEBUG - response_closed.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'276'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:12 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2FREADME.md=&etag=%2258d4a9a45664eb9e12de9549c548c09b6134c17f%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f28-05725cda6818c7df66c5c386;55288ce6-a43b-499f-86fb-04af3dffb908'), (b'RateLimit', b'"resolvers";r=2974;t=200'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Pk7jIiCyl4v-KBFN74nK1kC66M71kP4gBZUAhVKee068fm7av2Y8Xg==')]) -22:21:12 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/README.md "HTTP/1.1 307 Temporary Redirect" -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:12 - httpcore.http11 - DEBUG - response_closed.started -22:21:12 - httpcore.http11 - DEBUG - response_closed.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'10454'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:32 GMT'), (b'ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e4-65f7ce852d1fe6c63dd82d8c;83c3a845-c5a5-4419-abf2-31960223e770'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'8Q8jbk3jtQ6CYyBPb8w3AnVhsLz8sBKTdmIvVFa28gHcoXedXYdZsA=='), (b'Age', b'16915780')]) -22:21:12 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md "HTTP/1.1 200 OK" -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:12 - httpcore.http11 - DEBUG - response_closed.started -22:21:12 - httpcore.http11 - DEBUG - response_closed.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:12 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f28-705c6ec57f0d38041f6bc39b;627c6d22-a404-49fc-9fee-3fdc72dbadb6'), (b'RateLimit', b'"resolvers";r=2973;t=200'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-HF-Warning', b'unauthenticated; Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'oqkUBYbgJFvcK-quBMUm7b5XQPWqEtwymSj7N89t--Eh-r1VXRoO9Q==')]) -22:21:12 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:12 - httpcore.http11 - DEBUG - response_closed.started -22:21:12 - httpcore.http11 - DEBUG - response_closed.complete -22:21:12 - huggingface_hub.utils._http - WARNING - Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads. -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'AqNWqcK6TiZgmBRg5VXmkLT3Qyk-JwufJ3oWLiorPqT0pf5M0iYpYQ=='), (b'Age', b'16915782')]) -22:21:12 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:12 - httpcore.http11 - DEBUG - response_closed.started -22:21:12 - httpcore.http11 - DEBUG - response_closed.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'308'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:12 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fsentence_bert_config.json=&etag=%2259d594003bf59880a884c574bf88ef7555bb0202%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f28-04ced13730bde0756abad3f5;cb06d0a5-d0de-4a40-925c-49d5912d7a4c'), (b'RateLimit', b'"resolvers";r=2972;t=200'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'-HB-HiHkr6HyUgaGAAzRT7JAhQ3mA5dXTHVwI-9Z0bwK6_gdEzWEvw==')]) -22:21:12 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/sentence_bert_config.json "HTTP/1.1 307 Temporary Redirect" -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:12 - httpcore.http11 - DEBUG - response_closed.started -22:21:12 - httpcore.http11 - DEBUG - response_closed.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'53'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:35 GMT'), (b'ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e7-793defd917b2fff34bb93137;f97df483-7cc7-4061-bccd-166531ee26ec'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'V3RUSRHmup6I9LjTl6EybSAfgRe-GitxZlTnOAB96kNaDCEcifJpMw=='), (b'Age', b'16915777')]) -22:21:12 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json "HTTP/1.1 200 OK" -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:12 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:12 - httpcore.http11 - DEBUG - response_closed.started -22:21:12 - httpcore.http11 - DEBUG - response_closed.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:12 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:12 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:12 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'15'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:12 GMT'), (b'ETag', b'W/"f-mY2VvLxuxB7KhsoOdQTlMTccuAQ"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f28-425e01810425e99022302e43;8c135108-64ef-460b-8915-493f03fcc9dd'), (b'RateLimit', b'"resolvers";r=2971;t=200'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'MISS'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'Entry not found'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'C1wHeLqOg_ww6AYLRJykbd1hYJM6RkUgRA-TL0jpnlxhBpd4TZDYlg==')]) -22:21:13 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/adapter_config.json "HTTP/1.1 404 Not Found" -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:13 - httpcore.http11 - DEBUG - response_closed.started -22:21:13 - httpcore.http11 - DEBUG - response_closed.complete -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:13 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:12 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f28-1ec31e5c62596e5f315c28b6;4b429ca0-14a5-4ca9-be4b-f392f3486b80'), (b'RateLimit', b'"resolvers";r=2970;t=200'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'Sq8YZ-CSxRIXN6RHiGAK1uR6dIm_5BbPU67bxYBBCVAo2MdvP3LPFQ==')]) -22:21:13 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:13 - httpcore.http11 - DEBUG - response_closed.started -22:21:13 - httpcore.http11 - DEBUG - response_closed.complete -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:13 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'kQxdHfgGuq2coSL1lGmYscCnHoQVJM5DVsPwJYUastJqfke42TzleQ=='), (b'Age', b'18609528')]) -22:21:13 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:13 - httpcore.http11 - DEBUG - response_closed.started -22:21:13 - httpcore.http11 - DEBUG - response_closed.complete -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:13 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:12 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f28-2420760a63492bc710bd3378;393e1d3a-3053-4219-9177-62c2ba81e357'), (b'RateLimit', b'"resolvers";r=2969;t=200'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'd4v6OluupmMt-j46Gse9L4bQsMrMuf352D7FQOMYDTF8t7HIuJtvnA==')]) -22:21:13 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:13 - httpcore.http11 - DEBUG - response_closed.started -22:21:13 - httpcore.http11 - DEBUG - response_closed.complete -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:13 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'iVTDWzk0giv9py70ytVde-EnqIE48x2sLhHj8TFWineI_pb2sfjWuA=='), (b'Age', b'18609528')]) -22:21:13 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:13 - httpcore.http11 - DEBUG - response_closed.started -22:21:13 - httpcore.http11 - DEBUG - response_closed.complete -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:13 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'300'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:12 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Ftokenizer_config.json=&etag=%22c79f2b6a0cea6f4b564fed1938984bace9d30ff0%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f28-64eaf5f732209be76158b9d2;6a6f1e61-7e8f-4910-af97-0a9ab45dbab3'), (b'RateLimit', b'"resolvers";r=2968;t=200'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-HF-Warning', b'unauthenticated; Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'3RX9u4g3UAnpZX7MxxOPO2K9RTGjt0D065VVHK3xF2iKEHR6sFm3QA==')]) -22:21:13 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/tokenizer_config.json "HTTP/1.1 307 Temporary Redirect" -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:13 - httpcore.http11 - DEBUG - response_closed.started -22:21:13 - httpcore.http11 - DEBUG - response_closed.complete -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:13 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'350'), (b'Connection', b'keep-alive'), (b'Date', b'Fri, 27 Jun 2025 08:23:00 GMT'), (b'ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685e54e4-185fabac3ee499f1325b7683;ac28f8a9-2ca5-4215-a430-8da70930e987'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'6Rmfz0YlpPIrddT7B53Q0PoYT_Rg7NkK-lFE6mQuKenGy9QDxsreFw=='), (b'Age', b'18471492')]) -22:21:13 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json "HTTP/1.1 200 OK" -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:13 - httpcore.http11 - DEBUG - response_closed.started -22:21:13 - httpcore.http11 - DEBUG - response_closed.complete -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:13 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'64'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:12 GMT'), (b'ETag', b'W/"40-09f9IAqP13xarAhQxFS2W8rvRkM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f28-70cba30d222b19ca5d3249a5;fdf9efc6-91cb-4955-b679-bb94d4dadfa9'), (b'RateLimit', b'"api";r=493;t=200'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'additional_chat_templates does not exist on "main"'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'TKhI9_48Ub9hjUVHwqhvCrYwWZpMyKXWDLV7dgmsiKevwlyfHTFlJQ==')]) -22:21:13 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main/additional_chat_templates?recursive=false&expand=false "HTTP/1.1 404 Not Found" -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:13 - httpcore.http11 - DEBUG - response_closed.started -22:21:13 - httpcore.http11 - DEBUG - response_closed.complete -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:13 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6465'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:12 GMT'), (b'ETag', b'W/"1941-m0CqwCT0eLaAYulV6LKBoBypnns"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f28-0f1166a82a3fe45c49f1d742;1e0be0b5-4773-493e-889f-ba6bb5011e80'), (b'RateLimit', b'"api";r=492;t=200'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'dQ6si0LiE4qfzj2NVf8G3aXrvoyX8-RuL4mqIymSPe2ysZQbx9CsIQ==')]) -22:21:13 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main?recursive=true&expand=false "HTTP/1.1 200 OK" -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:13 - httpcore.http11 - DEBUG - response_closed.started -22:21:13 - httpcore.http11 - DEBUG - response_closed.complete -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:13 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'304'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:12 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2F1_Pooling%2Fconfig.json=&etag=%22d1514c3162bbe87b343f565fadc62e6c06f04f03%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f28-012f7fad5bd61ad44731f5b9;1844ab41-6312-4aa5-a1b6-f5b1afcef800'), (b'RateLimit', b'"resolvers";r=2967;t=200'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'AkjwpgJK0l9E8AoWeOXm34n7WXygjqB35kYCxnTzyTg8AoaCC_4_IA==')]) -22:21:13 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/1_Pooling/config.json "HTTP/1.1 307 Temporary Redirect" -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:13 - httpcore.http11 - DEBUG - response_closed.started -22:21:13 - httpcore.http11 - DEBUG - response_closed.complete -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:13 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'190'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 18 Aug 2025 04:37:11 GMT'), (b'ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-68a2adf7-4d7e79097342d93a4134b829;2f881d9e-e68d-4662-b2f6-33a4aabad755'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'PRmVrKxxedojTQ-kVj7Xs3zqJg9KvtEGOBg4L2DtlYnTU8kFihh4Rw=='), (b'Age', b'13992241')]) -22:21:13 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json "HTTP/1.1 200 OK" -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:13 - httpcore.http11 - DEBUG - response_closed.started -22:21:13 - httpcore.http11 - DEBUG - response_closed.complete -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:13 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6825'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:12 GMT'), (b'ETag', b'W/"1aa9-XXTNzHzWlYOmKJGelWoAnligEjM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f28-5b5a2fed52e11c771d8d415a;9c61d3c4-95c0-4627-9458-5953d5440315'), (b'RateLimit', b'"api";r=491;t=200'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b't4Z1tH_oqJOkEpdrpPosCAyQ3WDoDtwVpNqGSmRqG1KdT_JMChqLeg==')]) -22:21:13 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2 "HTTP/1.1 200 OK" -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:13 - httpcore.http11 - DEBUG - response_closed.started -22:21:13 - httpcore.http11 - DEBUG - response_closed.complete -22:21:13 - src.mai.memory.storage - INFO - Embedding model loaded: all-MiniLM-L6-v2 (dim: 384) -22:21:13 - src.mai.memory.storage - INFO - sqlite-vec extension loaded successfully -22:21:13 - src.mai.memory.storage - INFO - Database schema created successfully -22:21:13 - src.mai.memory.storage - INFO - Database schema verification passed -22:21:13 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -22:21:13 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -22:21:13 - src.mai.memory.compression - INFO - MemoryCompressor initialized -22:21:13 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -22:21:13 - mai.memory.manager - INFO - MemoryManager initialized with all components -22:21:13 - mai.core.interface - INFO - Memory system initialized successfully -22:21:13 - mai.core.interface - INFO - Mai interface initialized -22:21:13 - mai.core.interface - INFO - Initializing Mai interface... -22:21:13 - httpcore.connection - DEBUG - connect_tcp.started host='localhost' port=11434 local_address=None timeout=30 socket_options=None -22:21:13 - httpcore.connection - DEBUG - connect_tcp.complete return_value= -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:13 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:13 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:21:13 GMT'), (b'Content-Length', b'337')]) -22:21:13 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:13 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:13 - httpcore.http11 - DEBUG - response_closed.started -22:21:13 - httpcore.http11 - DEBUG - response_closed.complete -22:21:13 - mai.model.ollama_client - INFO - Found 1 models -22:21:14 - mai.core.interface - WARNING - Git repository health check failed -22:21:14 - mai.core.interface - INFO - Selected initial model: llama3.2:1b -22:21:14 - mai.core.interface - INFO - Mai interface initialized successfully -22:21:14 - src.mai.memory.storage - INFO - Loading embedding model: all-MiniLM-L6-v2 -22:21:14 - sentence_transformers.SentenceTransformer - INFO - Use pytorch device_name: cuda:0 -22:21:14 - sentence_transformers.SentenceTransformer - INFO - Load pretrained SentenceTransformer: all-MiniLM-L6-v2 -22:21:14 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:14 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:14 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:14 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:14 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:14 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:14 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f2a-2f87fed5255102d5528c001e;07ef6079-1592-42ad-98a2-b8b3b50d2552'), (b'RateLimit', b'"resolvers";r=2966;t=198'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-HF-Warning', b'unauthenticated; Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'6uKjKIbJtS4JJa68qofuXP8GSfc-mOH5mLkmvtJIXyEhERnbhgANcw==')]) -22:21:14 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:21:14 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:14 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:14 - httpcore.http11 - DEBUG - response_closed.started -22:21:14 - httpcore.http11 - DEBUG - response_closed.complete -22:21:14 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:14 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:14 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:14 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:14 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'4VEU1q1VVgvuIvR9QX_15N_xf3NkpUZAZX5_e8fwu_jZE3GHIeICEQ=='), (b'Age', b'16915784')]) -22:21:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:15 - httpcore.http11 - DEBUG - response_closed.started -22:21:15 - httpcore.http11 - DEBUG - response_closed.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:14 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f2a-2fa7097d688780a6413d202f;b706845d-1556-488f-89e7-9f1f25a929de'), (b'RateLimit', b'"resolvers";r=2965;t=198'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'kiXkrX8wTAA1fk_lplTDtbArD4uv0G5_XvfLngVGqI8bPWOOAZFPyA==')]) -22:21:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:15 - httpcore.http11 - DEBUG - response_closed.started -22:21:15 - httpcore.http11 - DEBUG - response_closed.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'3F7Wmao3jTcokOjAxLKsSjBpxjWN36R3DzafJ497f8Bh1C3qxbx3Rw=='), (b'Age', b'16915783')]) -22:21:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:15 - httpcore.http11 - DEBUG - response_closed.started -22:21:15 - httpcore.http11 - DEBUG - response_closed.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'324'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:14 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig_sentence_transformers.json=&etag=%22fd1b291129c607e5d49799f87cb219b27f98acdf%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f2a-50cd59bc113e97a33757a1f4;3c1e6bb8-b37a-4629-8e9e-725cf8806b46'), (b'RateLimit', b'"resolvers";r=2964;t=198'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'JIgCw9GoAjF6vopuUDEVxqfpgO0z6m6KSKdnklZiLbSwNHZJHdZzww==')]) -22:21:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config_sentence_transformers.json "HTTP/1.1 307 Temporary Redirect" -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:15 - httpcore.http11 - DEBUG - response_closed.started -22:21:15 - httpcore.http11 - DEBUG - response_closed.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'116'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:31 GMT'), (b'ETag', b'"fd1b291129c607e5d49799f87cb219b27f98acdf"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e3-09fb6cd20e159ec927dcbfd2;f95f4156-a559-405c-9b7e-8c583def7c2b'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config_sentence_transformers.json; filename="config_sentence_transformers.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'FM1fhTX696bjMkBoFvey8JFc2vOUxYy8w_oSLDMkuiHjCDWIOq_dYw=='), (b'Age', b'16915783')]) -22:21:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config_sentence_transformers.json "HTTP/1.1 200 OK" -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:15 - httpcore.http11 - DEBUG - response_closed.started -22:21:15 - httpcore.http11 - DEBUG - response_closed.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'276'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:14 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2FREADME.md=&etag=%2258d4a9a45664eb9e12de9549c548c09b6134c17f%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f2a-7e5f4f2c0f5bbd954cc40b59;12619cf9-3dc2-4505-9cc6-c703252c7bef'), (b'RateLimit', b'"resolvers";r=2963;t=198'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'u8D2eEUIzJrtbV7np2BODUsZWkiknTLTVFQMIHHDcWpoOmX8Wpfnkw==')]) -22:21:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/README.md "HTTP/1.1 307 Temporary Redirect" -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:15 - httpcore.http11 - DEBUG - response_closed.started -22:21:15 - httpcore.http11 - DEBUG - response_closed.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'10454'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:32 GMT'), (b'ETag', b'"58d4a9a45664eb9e12de9549c548c09b6134c17f"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e4-65f7ce852d1fe6c63dd82d8c;83c3a845-c5a5-4419-abf2-31960223e770'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'README.md; filename="README.md";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'yaRCU5CGySWxlHZGydE4XLAhs1sw4V-36MB1Dfl5F1SwlcUCtpNzEA=='), (b'Age', b'16915782')]) -22:21:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/README.md "HTTP/1.1 200 OK" -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:15 - httpcore.http11 - DEBUG - response_closed.started -22:21:15 - httpcore.http11 - DEBUG - response_closed.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'282'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:14 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fmodules.json=&etag=%22952a9b81c0bfd99800fabf352f69c7ccd46c5e43%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f2a-40b174385faee6a15e8b3dd4;1fff39af-bcf6-4239-85ee-afd8ea95de64'), (b'RateLimit', b'"resolvers";r=2962;t=198'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'iovnZ2toXjpZdN91ttNT7HwoHbOWHj4GxE0SLRtAvhjGKqKTdeIhOg==')]) -22:21:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/modules.json "HTTP/1.1 307 Temporary Redirect" -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:15 - httpcore.http11 - DEBUG - response_closed.started -22:21:15 - httpcore.http11 - DEBUG - response_closed.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'349'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:30 GMT'), (b'ETag', b'"952a9b81c0bfd99800fabf352f69c7ccd46c5e43"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e2-0e5c4a6f3a7a81e16582368a;558224e4-3f00-4ed5-9949-3d9bc5397e40'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'modules.json; filename="modules.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'rDglViL5fA4E2xGlmjuS1hV79Xm5vbRcaamZPpBhcISUHNNoqpRiHg=='), (b'Age', b'16915784')]) -22:21:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/modules.json "HTTP/1.1 200 OK" -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:15 - httpcore.http11 - DEBUG - response_closed.started -22:21:15 - httpcore.http11 - DEBUG - response_closed.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'308'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:14 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fsentence_bert_config.json=&etag=%2259d594003bf59880a884c574bf88ef7555bb0202%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f2a-172dbc3e5fabb78d7dd58a3d;a1e2f03f-86ea-4609-af3e-157df6911d1b'), (b'RateLimit', b'"resolvers";r=2961;t=198'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-HF-Warning', b'unauthenticated; Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'WR3V8JREpa3GmR3TNLTZEWaUbnovJqcYTIZ3-NcBcFpCZIkQI0p94Q==')]) -22:21:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/sentence_bert_config.json "HTTP/1.1 307 Temporary Redirect" -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:15 - httpcore.http11 - DEBUG - response_closed.started -22:21:15 - httpcore.http11 - DEBUG - response_closed.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'53'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 15 Jul 2025 08:31:35 GMT'), (b'ETag', b'"59d594003bf59880a884c574bf88ef7555bb0202"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-687611e7-793defd917b2fff34bb93137;f97df483-7cc7-4061-bccd-166531ee26ec'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'sentence_bert_config.json; filename="sentence_bert_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'IDsb8d32ixYOIFEM3FlPxdvHkzwpVA0zCgcUkN8-bNmpTenFQPMxxA=='), (b'Age', b'16915779')]) -22:21:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/sentence_bert_config.json "HTTP/1.1 200 OK" -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:15 - httpcore.http11 - DEBUG - response_closed.started -22:21:15 - httpcore.http11 - DEBUG - response_closed.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'15'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:14 GMT'), (b'ETag', b'W/"f-mY2VvLxuxB7KhsoOdQTlMTccuAQ"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f2a-49716e645506ef304191e2b4;0671556c-658e-4016-bae6-14aba17d5fb0'), (b'RateLimit', b'"resolvers";r=2960;t=198'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'MISS'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'Entry not found'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'N24BT_rwUimpQp1Q_PrjApl_4-EVd3iVcT5p_l6vbh4r3qv0_SZFDw==')]) -22:21:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/adapter_config.json "HTTP/1.1 404 Not Found" -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:15 - httpcore.http11 - DEBUG - response_closed.started -22:21:15 - httpcore.http11 - DEBUG - response_closed.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:14 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f2a-7e19bc295a5a133c4dd726b2;6b3cbe71-25e2-4edf-ac70-9e5a56e94815'), (b'RateLimit', b'"resolvers";r=2959;t=198'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'OgIcJNpEfXV8wA9m55pzkyZ5hgeMV5dFgSAQXuy1TzyaZRHb-mwCAA==')]) -22:21:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:15 - httpcore.http11 - DEBUG - response_closed.started -22:21:15 - httpcore.http11 - DEBUG - response_closed.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'2fL3mcc5VA1YgA5Wgsg6U1VN1ulKfBjomqE4SviONUSRjEwTQecFJg=='), (b'Age', b'18609530')]) -22:21:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:15 - httpcore.http11 - DEBUG - response_closed.started -22:21:15 - httpcore.http11 - DEBUG - response_closed.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'280'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:14 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Fconfig.json=&etag=%2272b987fd805cfa2b58c4c8c952b274a11bfd5a00%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f2a-5e89ab310d35330b7b616264;4968a196-2873-4163-aed8-03b800741144'), (b'RateLimit', b'"resolvers";r=2958;t=198'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'y8P0RBcCkH6UHUOdXu1a2Upt7sGTFhxTQPMvDZKLBL0G77-SkQFFfg==')]) -22:21:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json "HTTP/1.1 307 Temporary Redirect" -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:15 - httpcore.http11 - DEBUG - response_closed.started -22:21:15 - httpcore.http11 - DEBUG - response_closed.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'612'), (b'Connection', b'keep-alive'), (b'Date', b'Wed, 25 Jun 2025 18:02:24 GMT'), (b'ETag', b'"72b987fd805cfa2b58c4c8c952b274a11bfd5a00"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685c39b0-1a7ea5081b0617e01b07efac;2b7abf77-45bb-4bde-a5c0-ca0c114a6574'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'MyczXyOcK0xlEMMywGjfQ0W3odkYuwuLRZgYBvnlTopXbaamHOJFEw=='), (b'Age', b'18609530')]) -22:21:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/config.json "HTTP/1.1 200 OK" -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:15 - httpcore.http11 - DEBUG - response_closed.started -22:21:15 - httpcore.http11 - DEBUG - response_closed.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'300'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:14 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2Ftokenizer_config.json=&etag=%22c79f2b6a0cea6f4b564fed1938984bace9d30ff0%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f2a-358bd8244cdb38266b88f29d;ffafeecf-1cf3-49c6-ad2d-b29fcb0444d2'), (b'RateLimit', b'"resolvers";r=2957;t=198'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'sMIOqhE0zshJw32MZRNKM6iCVDjrilYwc_51VZo2w1YTokdKdvnihA==')]) -22:21:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/tokenizer_config.json "HTTP/1.1 307 Temporary Redirect" -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:15 - httpcore.http11 - DEBUG - response_closed.started -22:21:15 - httpcore.http11 - DEBUG - response_closed.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'350'), (b'Connection', b'keep-alive'), (b'Date', b'Fri, 27 Jun 2025 08:23:00 GMT'), (b'ETag', b'"c79f2b6a0cea6f4b564fed1938984bace9d30ff0"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-685e54e4-185fabac3ee499f1325b7683;ac28f8a9-2ca5-4215-a430-8da70930e987'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'tokenizer_config.json; filename="tokenizer_config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'fMCg4eGkruX9gkU-TvWIBD9MosxA6SgibX5AmfDzdmRjT7LWzgOG5g=='), (b'Age', b'18471494')]) -22:21:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/tokenizer_config.json "HTTP/1.1 200 OK" -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:15 - httpcore.http11 - DEBUG - response_closed.started -22:21:15 - httpcore.http11 - DEBUG - response_closed.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 404, b'Not Found', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'64'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:14 GMT'), (b'ETag', b'W/"40-09f9IAqP13xarAhQxFS2W8rvRkM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f2a-1db24ccc0e5179d615aea04b;74b8a8b2-782d-42d0-8b10-2d8d7baba9bc'), (b'RateLimit', b'"api";r=490;t=198'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Error-Code', b'EntryNotFound'), (b'X-Error-Message', b'additional_chat_templates does not exist on "main"'), (b'X-Cache', b'Error from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'TK1nNMhjfksI0KtvQ2K7IqAOapi8yypMLcs5Fpqo2RUGtvFo8nzA0A==')]) -22:21:15 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main/additional_chat_templates?recursive=false&expand=false "HTTP/1.1 404 Not Found" -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:15 - httpcore.http11 - DEBUG - response_closed.started -22:21:15 - httpcore.http11 - DEBUG - response_closed.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6465'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:14 GMT'), (b'ETag', b'W/"1941-m0CqwCT0eLaAYulV6LKBoBypnns"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f2a-55afb7c038d8a5fb5aa401b5;fa32d88b-4294-46b4-b89e-741603e8853f'), (b'RateLimit', b'"api";r=489;t=198'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'IoL4kG5XhmkxksD2UuOSuLyz_rQod3vtNydORsh8ccOWXwhkluzncQ==')]) -22:21:15 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2/tree/main?recursive=true&expand=false "HTTP/1.1 200 OK" -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:15 - httpcore.http11 - DEBUG - response_closed.started -22:21:15 - httpcore.http11 - DEBUG - response_closed.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 307, b'Temporary Redirect', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'304'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:14 GMT'), (b'Location', b'/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json?%2Fsentence-transformers%2Fall-MiniLM-L6-v2%2Fresolve%2Fmain%2F1_Pooling%2Fconfig.json=&etag=%22d1514c3162bbe87b343f565fadc62e6c06f04f03%22'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f2a-546580e3734751df1eeb7fb4;57e6edc4-a3d8-42dd-9d95-c5e8cf56abd6'), (b'RateLimit', b'"resolvers";r=2956;t=198'), (b'RateLimit-Policy', b'"fixed window";"resolvers";q=3000;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin, Accept'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'X-HF-Warning', b'unauthenticated; Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.'), (b'X-Hub-Cache', b'HIT'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'X-Linked-ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'WtWAMBuokFfUR3EB-dBWqxZvfFPKFDLp4bwE9TXx46xfKmOUE2EYUg==')]) -22:21:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/1_Pooling/config.json "HTTP/1.1 307 Temporary Redirect" -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:15 - httpcore.http11 - DEBUG - response_closed.started -22:21:15 - httpcore.http11 - DEBUG - response_closed.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'text/plain; charset=utf-8'), (b'Content-Length', b'190'), (b'Connection', b'keep-alive'), (b'Date', b'Mon, 18 Aug 2025 04:37:11 GMT'), (b'ETag', b'"d1514c3162bbe87b343f565fadc62e6c06f04f03"'), (b'X-Powered-By', b'huggingface-moon'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'X-Request-Id', b'Root=1-68a2adf7-4d7e79097342d93a4134b829;2f881d9e-e68d-4662-b2f6-33a4aabad755'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'Set-Cookie', b'token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=None'), (b'Set-Cookie', b'token=; Domain=huggingface.co; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; SameSite=Lax'), (b'X-Repo-Commit', b'c9745ed1d9f207416be6d2e6f8de32d1f16199bf'), (b'Accept-Ranges', b'bytes'), (b'Content-Disposition', b'inline; filename*=UTF-8\'\'config.json; filename="config.json";'), (b'Content-Security-Policy', b"default-src 'none'; sandbox"), (b'Vary', b'Origin'), (b'X-Cache', b'Hit from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'I3flOHHn-nZHhl9a6Qfhwns3TKNBBLq-Ym0mDR0ORo_NO93tEd4wqw=='), (b'Age', b'13992243')]) -22:21:15 - httpx - INFO - HTTP Request: HEAD https://huggingface.co/api/resolve-cache/models/sentence-transformers/all-MiniLM-L6-v2/c9745ed1d9f207416be6d2e6f8de32d1f16199bf/1_Pooling%2Fconfig.json "HTTP/1.1 200 OK" -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:15 - httpcore.http11 - DEBUG - response_closed.started -22:21:15 - httpcore.http11 - DEBUG - response_closed.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:15 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:15 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Content-Length', b'6825'), (b'Connection', b'keep-alive'), (b'Date', b'Tue, 27 Jan 2026 03:21:15 GMT'), (b'ETag', b'W/"1aa9-XXTNzHzWlYOmKJGelWoAnligEjM"'), (b'X-Powered-By', b'huggingface-moon'), (b'X-Request-Id', b'Root=1-69782f2b-2fed228770a092cc4bc05a2d;43a08098-5b73-4b33-99af-2022acc9e604'), (b'RateLimit', b'"api";r=488;t=197'), (b'RateLimit-Policy', b'"fixed window";"api";q=500;w=300'), (b'cross-origin-opener-policy', b'same-origin'), (b'Referrer-Policy', b'strict-origin-when-cross-origin'), (b'Access-Control-Max-Age', b'86400'), (b'Access-Control-Allow-Origin', b'https://huggingface.co'), (b'Vary', b'Origin'), (b'Access-Control-Expose-Headers', b'X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Linked-Size,X-Linked-ETag,X-Xet-Hash'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 1e5d213252e38a8aa2e2a927fd3c3754.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'IAD55-P8'), (b'X-Amz-Cf-Id', b'tj9g4SNhyAHO0ACAWKw5px7Xog7D4o_Pl0eYawNXW0ctclqV405lsA==')]) -22:21:15 - httpx - INFO - HTTP Request: GET https://huggingface.co/api/models/sentence-transformers/all-MiniLM-L6-v2 "HTTP/1.1 200 OK" -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:15 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:15 - httpcore.http11 - DEBUG - response_closed.started -22:21:15 - httpcore.http11 - DEBUG - response_closed.complete -22:21:15 - src.mai.memory.storage - INFO - Embedding model loaded: all-MiniLM-L6-v2 (dim: 384) -22:21:15 - src.mai.memory.storage - INFO - sqlite-vec extension loaded successfully -22:21:15 - src.mai.memory.storage - INFO - Database schema created successfully -22:21:15 - src.mai.memory.storage - INFO - Database schema verification passed -22:21:15 - src.mai.memory.storage - INFO - MemoryStorage initialized with database: /home/mystiatech/projects/Mai/data/mai_memory.db -22:21:15 - src.mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -22:21:15 - src.mai.memory.compression - INFO - MemoryCompressor initialized -22:21:15 - src.mai.memory.retrieval - INFO - ContextRetriever initialized with multi-faceted search -22:21:15 - mai.memory.manager - INFO - MemoryManager initialized with all components -22:21:15 - mai.conversation.state - INFO - ConversationState initialized with max 10 turns per conversation -22:21:15 - mai.conversation.timing - INFO - TimingCalculator initialized with 'default' profile -22:21:15 - mai.conversation.reasoning - INFO - ReasoningEngine initialized -22:21:15 - mai.conversation.decomposition - INFO - RequestDecomposer initialized -22:21:15 - mai.conversation.interruption - INFO - InterruptHandler initialized with 30.0s timeout -22:21:15 - mai.conversation.interruption - DEBUG - Conversation state integrated -22:21:15 - mai.conversation.engine - INFO - ConversationEngine initialized with timing_profile='default', debug=False -22:21:16 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:16 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:16 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:16 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:16 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:16 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:21:16 GMT'), (b'Content-Length', b'337')]) -22:21:16 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:21:16 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:16 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:16 - httpcore.http11 - DEBUG - response_closed.started -22:21:16 - httpcore.http11 - DEBUG - response_closed.complete -22:21:16 - mai.model.ollama_client - INFO - Found 1 models -22:21:17 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:17 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:17 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:17 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:17 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:17 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:21:17 GMT'), (b'Content-Length', b'337')]) -22:21:17 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:21:17 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:17 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:17 - httpcore.http11 - DEBUG - response_closed.started -22:21:17 - httpcore.http11 - DEBUG - response_closed.complete -22:21:17 - mai.model.ollama_client - INFO - Found 1 models -22:21:18 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:18 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:18 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:18 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:18 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:18 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:21:18 GMT'), (b'Content-Length', b'337')]) -22:21:18 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:21:18 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:18 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:18 - httpcore.http11 - DEBUG - response_closed.started -22:21:18 - httpcore.http11 - DEBUG - response_closed.complete -22:21:18 - mai.model.ollama_client - INFO - Found 1 models -22:21:18 - mai.conversation.state - WARNING - Expected assistant message at index 1, skipping -22:21:18 - mai.conversation.state - INFO - Restored 1 turns to conversation c3f90536-e0bb-470d-9270-33d2d72e8331 -22:21:19 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:19 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:19 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:19 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:19 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:19 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:21:19 GMT'), (b'Content-Length', b'337')]) -22:21:19 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:21:19 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:19 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:19 - httpcore.http11 - DEBUG - response_closed.started -22:21:19 - httpcore.http11 - DEBUG - response_closed.complete -22:21:19 - mai.model.ollama_client - INFO - Found 1 models -22:21:20 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:20 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:20 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:20 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:20 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:20 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:21:20 GMT'), (b'Content-Length', b'337')]) -22:21:20 - httpx - INFO - HTTP Request: GET http://localhost:11434/api/tags "HTTP/1.1 200 OK" -22:21:20 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:20 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:20 - httpcore.http11 - DEBUG - response_closed.started -22:21:20 - httpcore.http11 - DEBUG - response_closed.complete -22:21:20 - mai.model.ollama_client - INFO - Found 1 models -22:21:20 - mai.conversation.state - DEBUG - Started new conversation: 6c41b303-949c-486f-93da-acf932b04b07 -22:21:20 - mai.conversation.engine - INFO - Processing conversation turn for 6c41b303-949c-486f-93da-acf932b04b07 -22:21:20 - src.mai.memory.retrieval - INFO - Retrieving context for query: what resources are available?... -22:21:20 - src.mai.memory.storage - INFO - Using text search fallback temporarily -22:21:20 - src.mai.memory.storage - DEBUG - Text search fallback found 0 conversations for query: 'what resources are available?' -22:21:20 - src.mai.memory.retrieval - DEBUG - Semantic search found 0 results -22:21:20 - src.mai.memory.storage - DEBUG - Retrieved conversation '6c41b303-949c-486f-93da-acf932b04b07' with 2 messages -22:21:20 - src.mai.memory.storage - DEBUG - Retrieved conversation 'eec91a1d-39e7-4fb2-bab0-983c68912054' with 2 messages -22:21:20 - src.mai.memory.storage - DEBUG - Retrieved conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -22:21:20 - src.mai.memory.storage - DEBUG - Retrieved conversation 'ce760f12-4a96-48b4-a4e1-ec04f71dfe09' with 2 messages -22:21:20 - src.mai.memory.storage - DEBUG - Retrieved conversation '58f4f7b3-3267-434e-becc-b4aac165c08d' with 2 messages -22:21:20 - src.mai.memory.storage - DEBUG - Retrieved conversation '8a40c3e8-fbb2-4029-beca-3513d7e005a8' with 2 messages -22:21:20 - src.mai.memory.storage - DEBUG - Retrieved conversation '96dc6411-4d2e-4bf8-949f-5dcc472e447b' with 2 messages -22:21:20 - src.mai.memory.storage - DEBUG - Retrieved conversation '28e5bdf6-d8bc-45d2-82b4-3a95d09e2bba' with 2 messages -22:21:20 - src.mai.memory.storage - DEBUG - Retrieved conversation 'ae221870-4972-4273-b921-a2dbc4aa474b' with 2 messages -22:21:20 - src.mai.memory.storage - DEBUG - Retrieved conversation '46efb9e2-acb0-425e-8358-320cb07b2226' with 2 messages -22:21:20 - src.mai.memory.storage - DEBUG - Retrieved conversation '9b990be1-6afb-49c2-86e1-8245d5a820c3' with 2 messages -22:21:20 - src.mai.memory.retrieval - DEBUG - Keyword search found 2 results -22:21:20 - src.mai.memory.retrieval - DEBUG - Recency search found 3 results -22:21:20 - mai.memory.manager - ERROR - Failed to get context: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -22:21:20 - mai.conversation.engine - WARNING - Failed to retrieve memory context: Context retrieval failed: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -22:21:20 - mai.conversation.state - DEBUG - Retrieved 0 messages from conversation 6c41b303-949c-486f-93da-acf932b04b07 -22:21:20 - mai.conversation.timing - DEBUG - Complexity analysis: score=0.10, words=4, questions=1, technical=0 -22:21:20 - mai.conversation.timing - DEBUG - Delay calculation: simple complexity (0.10) -> 2.91s -22:21:20 - mai.conversation.engine - INFO - Applying 2.91s delay for natural timing -22:21:24 - src.mai.memory.retrieval - INFO - Retrieving context for query: what resources are available?... -22:21:24 - src.mai.memory.storage - INFO - Using text search fallback temporarily -22:21:24 - src.mai.memory.storage - DEBUG - Text search fallback found 0 conversations for query: 'what resources are available?' -22:21:24 - src.mai.memory.retrieval - DEBUG - Semantic search found 0 results -22:21:24 - src.mai.memory.storage - DEBUG - Retrieved conversation '6c41b303-949c-486f-93da-acf932b04b07' with 2 messages -22:21:24 - src.mai.memory.storage - DEBUG - Retrieved conversation 'eec91a1d-39e7-4fb2-bab0-983c68912054' with 2 messages -22:21:24 - src.mai.memory.storage - DEBUG - Retrieved conversation 'e648a783-b233-4478-a1d2-5eafd433e9a2' with 2 messages -22:21:24 - src.mai.memory.storage - DEBUG - Retrieved conversation 'ce760f12-4a96-48b4-a4e1-ec04f71dfe09' with 2 messages -22:21:24 - src.mai.memory.storage - DEBUG - Retrieved conversation '58f4f7b3-3267-434e-becc-b4aac165c08d' with 2 messages -22:21:24 - src.mai.memory.storage - DEBUG - Retrieved conversation '8a40c3e8-fbb2-4029-beca-3513d7e005a8' with 2 messages -22:21:24 - src.mai.memory.storage - DEBUG - Retrieved conversation '96dc6411-4d2e-4bf8-949f-5dcc472e447b' with 2 messages -22:21:24 - src.mai.memory.storage - DEBUG - Retrieved conversation '28e5bdf6-d8bc-45d2-82b4-3a95d09e2bba' with 2 messages -22:21:24 - src.mai.memory.storage - DEBUG - Retrieved conversation 'ae221870-4972-4273-b921-a2dbc4aa474b' with 2 messages -22:21:24 - src.mai.memory.storage - DEBUG - Retrieved conversation '46efb9e2-acb0-425e-8358-320cb07b2226' with 2 messages -22:21:24 - src.mai.memory.storage - DEBUG - Retrieved conversation '9b990be1-6afb-49c2-86e1-8245d5a820c3' with 2 messages -22:21:24 - src.mai.memory.retrieval - DEBUG - Keyword search found 2 results -22:21:24 - src.mai.memory.retrieval - DEBUG - Recency search found 3 results -22:21:24 - mai.memory.manager - ERROR - Failed to get context: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -22:21:24 - mai.core.interface - DEBUG - Failed to retrieve memory context: Context retrieval failed: Context retrieval failed: 'RetrievalResult' object has no attribute 'relevance_score' -22:21:24 - httpcore.http11 - DEBUG - send_request_headers.started request= -22:21:24 - httpcore.http11 - DEBUG - send_request_headers.complete -22:21:24 - httpcore.http11 - DEBUG - send_request_body.started request= -22:21:24 - httpcore.http11 - DEBUG - send_request_body.complete -22:21:24 - httpcore.http11 - DEBUG - receive_response_headers.started request= -22:21:27 - httpcore.http11 - DEBUG - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=utf-8'), (b'Date', b'Tue, 27 Jan 2026 03:21:27 GMT'), (b'Transfer-Encoding', b'chunked')]) -22:21:27 - httpx - INFO - HTTP Request: POST http://localhost:11434/api/chat "HTTP/1.1 200 OK" -22:21:27 - httpcore.http11 - DEBUG - receive_response_body.started request= -22:21:27 - httpcore.http11 - DEBUG - receive_response_body.complete -22:21:27 - httpcore.http11 - DEBUG - response_closed.started -22:21:27 - httpcore.http11 - DEBUG - response_closed.complete -22:21:27 - mai.model.ollama_client - DEBUG - Generated response from llama3.2:1b -22:21:27 - src.mai.memory.storage - WARNING - Failed to generate embedding for message 82e031b7-f329-4c51-9cb7-cc1e6ddc30ae_0: Error binding parameter 2: type 'list' is not supported -22:21:27 - src.mai.memory.storage - WARNING - Failed to generate embedding for message 82e031b7-f329-4c51-9cb7-cc1e6ddc30ae_1: Error binding parameter 2: type 'list' is not supported -22:21:27 - src.mai.memory.storage - INFO - Stored conversation '82e031b7-f329-4c51-9cb7-cc1e6ddc30ae' with 2 messages -22:21:27 - src.mai.memory.storage - DEBUG - Retrieved conversation '82e031b7-f329-4c51-9cb7-cc1e6ddc30ae' with 2 messages -22:21:27 - mai.memory.manager - INFO - Stored conversation '82e031b7-f329-4c51-9cb7-cc1e6ddc30ae' with 2 messages -22:21:27 - mai.core.interface - DEBUG - Stored conversation in memory: 82e031b7-f329-4c51-9cb7-cc1e6ddc30ae -22:21:27 - src.mai.memory.storage - WARNING - Failed to generate embedding for message 6c41b303-949c-486f-93da-acf932b04b07_0: Error binding parameter 2: type 'list' is not supported -22:21:27 - src.mai.memory.storage - WARNING - Failed to generate embedding for message 6c41b303-949c-486f-93da-acf932b04b07_1: Error binding parameter 2: type 'list' is not supported -22:21:27 - src.mai.memory.storage - INFO - Stored conversation '6c41b303-949c-486f-93da-acf932b04b07' with 2 messages -22:21:27 - src.mai.memory.storage - DEBUG - Retrieved conversation '6c41b303-949c-486f-93da-acf932b04b07' with 2 messages -22:21:27 - mai.memory.manager - INFO - Stored conversation '6c41b303-949c-486f-93da-acf932b04b07' with 2 messages -22:21:27 - mai.conversation.engine - DEBUG - Stored conversation turn in memory: 6c41b303-949c-486f-93da-acf932b04b07 -22:21:27 - mai.conversation.state - DEBUG - Added turn to conversation 6c41b303-949c-486f-93da-acf932b04b07: 731 tokens, 2.91s -22:21:27 - mai.conversation.timing - DEBUG - Complexity analysis: score=0.10, words=4, questions=1, technical=0 -22:21:27 - mai.conversation.engine - INFO - Conversation turn completed for 6c41b303-949c-486f-93da-acf932b04b07 -22:21:27 - httpcore.connection - DEBUG - close.started -22:21:27 - httpcore.connection - DEBUG - close.complete diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 9323ecc..0000000 --- a/pyproject.toml +++ /dev/null @@ -1,35 +0,0 @@ -[project] -name = "Mai" -version = "0.1.0" -description = "GSD-native Python template" -readme = "README.md" -requires-python = ">=3.10" -dependencies = [ - "ollama>=0.6.1", - "psutil>=6.0.0", - "GitPython>=3.1.46", - "tiktoken>=0.8.0", - "docker>=6.0.0", - "sqlite-vec>=0.1.6", - "sentence-transformers>=3.0.0", - "blessed>=1.27.0", - "rich>=13.0.0", -] - -[project.optional-dependencies] -dev = [ - "pytest>=8.0", - "ruff>=0.6", - "pre-commit>=3.0", -] - -[tool.ruff] -line-length = 100 -target-version = "py310" - -[tool.ruff.lint] -select = ["E", "F", "I", "B", "UP"] -ignore = [] - -[tool.pytest.ini_options] -testpaths = ["tests"] diff --git a/scripts/bootstrap.ps1 b/scripts/bootstrap.ps1 deleted file mode 100644 index 5f71c71..0000000 --- a/scripts/bootstrap.ps1 +++ /dev/null @@ -1,9 +0,0 @@ -python -m venv .venv -.\.venv\Scripts\Activate.ps1 - -python -m pip install --upgrade pip -python -m pip install -e ".[dev]" - -pre-commit install - -Write-Host "✅ Bootstrapped (.venv created, dev deps installed)" diff --git a/scripts/bootstrap.sh b/scripts/bootstrap.sh deleted file mode 100755 index 60baa27..0000000 --- a/scripts/bootstrap.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -PY=python -command -v python >/dev/null 2>&1 || PY=python3 - -$PY -m venv .venv -source .venv/bin/activate - -python -m pip install --upgrade pip -python -m pip install -e ".[dev]" - -pre-commit install || true - -echo "✅ Bootstrapped (.venv created, dev deps installed)" diff --git a/scripts/check.ps1 b/scripts/check.ps1 deleted file mode 100644 index aa6773c..0000000 --- a/scripts/check.ps1 +++ /dev/null @@ -1,7 +0,0 @@ -.\.venv\Scripts\Activate.ps1 - -ruff check . -ruff format --check . -pytest -q - -Write-Host "✅ Checks passed" diff --git a/scripts/check.sh b/scripts/check.sh deleted file mode 100755 index da1d912..0000000 --- a/scripts/check.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -source .venv/bin/activate - -ruff check . -ruff format --check . -pytest -q - -echo "✅ Checks passed" diff --git a/scripts/contextpack.py b/scripts/contextpack.py deleted file mode 100755 index 81ca19d..0000000 --- a/scripts/contextpack.py +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env python3 -from __future__ import annotations - -import subprocess -from pathlib import Path -from datetime import datetime - -ROOT = Path(".").resolve() -OUT = ROOT / ".planning" / "CONTEXTPACK.md" - -IGNORE_DIRS = { - ".git", - ".venv", - "venv", - "__pycache__", - ".pytest_cache", - ".ruff_cache", - "dist", - "build", - "node_modules", -} - -KEY_FILES = [ - "CLAUDE.md", - "PROJECT.md", - "REQUIREMENTS.md", - "ROADMAP.md", - "STATE.md", - "pyproject.toml", - ".pre-commit-config.yaml", -] - -def run(cmd: list[str]) -> str: - try: - return subprocess.check_output(cmd, cwd=ROOT, stderr=subprocess.STDOUT, text=True).strip() - except Exception as e: - return f"(failed: {' '.join(cmd)}): {e}" - -def tree(max_depth: int = 3) -> str: - lines: list[str] = [] - - def walk(path: Path, depth: int) -> None: - if depth > max_depth: - return - for p in sorted(path.iterdir(), key=lambda x: (x.is_file(), x.name.lower())): - if p.name in IGNORE_DIRS: - continue - rel = p.relative_to(ROOT) - indent = " " * depth - if p.is_dir(): - lines.append(f"{indent}📁 {rel}/") - walk(p, depth + 1) - else: - lines.append(f"{indent}📄 {rel}") - - walk(ROOT, 0) - return "\n".join(lines) - -def head(path: Path, n: int = 160) -> str: - try: - return "\n".join(path.read_text(encoding="utf-8", errors="replace").splitlines()[:n]) - except Exception as e: - return f"(failed reading {path}): {e}" - -def main() -> None: - OUT.parent.mkdir(parents=True, exist_ok=True) - - parts: list[str] = [] - parts.append("# Context Pack") - parts.append(f"_Generated: {datetime.now().isoformat(timespec='seconds')}_\n") - - parts.append("## Repo tree\n```text\n" + tree() + "\n```") - parts.append("## Git status\n```text\n" + run(["git", "status"]) + "\n```") - parts.append("## Recent commits\n```text\n" + run(["git", "--no-pager", "log", "-10", "--oneline"]) + "\n```") - - parts.append("## Key files (head)") - for f in KEY_FILES: - p = ROOT / f - if p.exists(): - parts.append(f"### {f}\n```text\n{head(p)}\n```") - - OUT.write_text("\n\n".join(parts) + "\n", encoding="utf-8") - print(f"✅ Wrote {OUT.relative_to(ROOT)}") - -if __name__ == "__main__": - main() diff --git a/src/Mai.egg-info/PKG-INFO b/src/Mai.egg-info/PKG-INFO deleted file mode 100644 index 08651de..0000000 --- a/src/Mai.egg-info/PKG-INFO +++ /dev/null @@ -1,17 +0,0 @@ -Metadata-Version: 2.4 -Name: Mai -Version: 0.1.0 -Summary: GSD-native Python template -Requires-Python: >=3.10 -Description-Content-Type: text/markdown -Requires-Dist: ollama>=0.6.1 -Requires-Dist: psutil>=6.0.0 -Requires-Dist: GitPython>=3.1.46 -Requires-Dist: tiktoken>=0.8.0 -Requires-Dist: docker>=6.0.0 -Requires-Dist: sqlite-vec>=0.1.6 -Requires-Dist: sentence-transformers>=3.0.0 -Provides-Extra: dev -Requires-Dist: pytest>=8.0; extra == "dev" -Requires-Dist: ruff>=0.6; extra == "dev" -Requires-Dist: pre-commit>=3.0; extra == "dev" diff --git a/src/Mai.egg-info/SOURCES.txt b/src/Mai.egg-info/SOURCES.txt deleted file mode 100644 index 1496381..0000000 --- a/src/Mai.egg-info/SOURCES.txt +++ /dev/null @@ -1,42 +0,0 @@ -pyproject.toml -src/Mai.egg-info/PKG-INFO -src/Mai.egg-info/SOURCES.txt -src/Mai.egg-info/dependency_links.txt -src/Mai.egg-info/requires.txt -src/Mai.egg-info/top_level.txt -src/app/__init__.py -src/app/__main__.py -src/mai/core/__init__.py -src/mai/core/config.py -src/mai/core/exceptions.py -src/mai/core/interface.py -src/mai/git/__init__.py -src/mai/git/committer.py -src/mai/git/health_check.py -src/mai/git/workflow.py -src/mai/memory/__init__.py -src/mai/memory/compression.py -src/mai/memory/manager.py -src/mai/memory/retrieval.py -src/mai/memory/storage.py -src/mai/model/__init__.py -src/mai/model/compression.py -src/mai/model/ollama_client.py -src/mai/model/resource_detector.py -src/mai/model/switcher.py -src/mai/models/__init__.py -src/mai/models/conversation.py -src/mai/models/memory.py -src/mai/sandbox/__init__.py -src/mai/sandbox/approval_system.py -src/mai/sandbox/audit_logger.py -src/mai/sandbox/docker_executor.py -src/mai/sandbox/manager.py -src/mai/sandbox/resource_enforcer.py -src/mai/sandbox/risk_analyzer.py -tests/test_docker_executor.py -tests/test_docker_integration.py -tests/test_integration.py -tests/test_sandbox_approval.py -tests/test_sandbox_docker_integration.py -tests/test_smoke.py \ No newline at end of file diff --git a/src/Mai.egg-info/dependency_links.txt b/src/Mai.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/src/Mai.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/Mai.egg-info/requires.txt b/src/Mai.egg-info/requires.txt deleted file mode 100644 index 2025761..0000000 --- a/src/Mai.egg-info/requires.txt +++ /dev/null @@ -1,12 +0,0 @@ -ollama>=0.6.1 -psutil>=6.0.0 -GitPython>=3.1.46 -tiktoken>=0.8.0 -docker>=6.0.0 -sqlite-vec>=0.1.6 -sentence-transformers>=3.0.0 - -[dev] -pytest>=8.0 -ruff>=0.6 -pre-commit>=3.0 diff --git a/src/Mai.egg-info/top_level.txt b/src/Mai.egg-info/top_level.txt deleted file mode 100644 index 99e2125..0000000 --- a/src/Mai.egg-info/top_level.txt +++ /dev/null @@ -1,2 +0,0 @@ -app -mai diff --git a/src/app/__init__.py b/src/app/__init__.py deleted file mode 100644 index a9a2c5b..0000000 --- a/src/app/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__all__ = [] diff --git a/src/app/__main__.py b/src/app/__main__.py deleted file mode 100644 index 36b047e..0000000 --- a/src/app/__main__.py +++ /dev/null @@ -1,1882 +0,0 @@ -""" -Mai CLI Application - -Command-line interface for interacting with Mai and accessing Phase 1 capabilities. -""" - -import argparse -import asyncio -import json -import logging -import sys -import time -import uuid -from dataclasses import dataclass, asdict -from datetime import datetime -from typing import Optional, Dict, Any, List -from pathlib import Path -import threading -import os - -# Import rich components for resource display -try: - from rich.table import Table - from rich.progress import Progress, BarColumn, TextColumn - from rich.console import Group, Console - from rich.layout import Layout - from rich.panel import Panel - from rich.live import Live - from rich.align import Align - - RICH_AVAILABLE = True -except ImportError: - # Create dummy classes for fallback - class Table: - pass - - class Progress: - pass - - class BarColumn: - pass - - class TextColumn: - pass - - class Group: - pass - - class Panel: - pass - - class Live: - pass - - class Console: - def print(self, *args, **kwargs): - print(*args) - - class Align: - pass - - RICH_AVAILABLE = False - -# Import blessed for terminal size detection -try: - from blessed import Terminal - - BLESSED_AVAILABLE = True -except ImportError: - # Create dummy Terminal for fallback - class Terminal: - def __init__(self): - self.width = None - self.height = None - - BLESSED_AVAILABLE = False - -# Add src to path for imports -sys.path.insert(0, str(Path(__file__).parent.parent.parent)) - -# Handle missing dependencies gracefully -try: - from mai.core.interface import MaiInterface, ModelState - from mai.core.config import get_config - from mai.core.exceptions import MaiError, ModelError, ModelConnectionError - from mai.conversation.engine import ConversationEngine - from mai.memory.manager import MemoryManager - from mai.sandbox.approval_system import ApprovalSystem, ApprovalDecision, RiskLevel - - INTERFACE_AVAILABLE = True -except ImportError as e: - print(f"Warning: Some dependencies not available: {e}") - print("Limited functionality mode - some features may not work") - MaiInterface = None - ModelState = None - get_config = None - MaiError = Exception - ModelError = Exception - ModelConnectionError = Exception - ConversationEngine = None - MemoryManager = None - ApprovalSystem = None - ApprovalDecision = None - - # Mock RiskLevel for fallback - from enum import Enum - - class MockRiskLevel(Enum): - LOW = "low" - MEDIUM = "medium" - HIGH = "high" - BLOCKED = "blocked" - - RiskLevel = MockRiskLevel - - INTERFACE_AVAILABLE = False - - -class Colors: - """ANSI color codes for terminal output.""" - - RESET = "\033[0m" - RED = "\033[91m" - GREEN = "\033[92m" - YELLOW = "\033[93m" - BLUE = "\033[94m" - MAGENTA = "\033[95m" - CYAN = "\033[96m" - WHITE = "\033[97m" - BOLD = "\033[1m" - DIM = "\033[2m" - - -class ResourceDisplayManager: - """Manages real-time resource display with responsive layouts.""" - - def __init__(self): - self.console = Console(force_terminal=True) if RICH_AVAILABLE else None - self.terminal = Terminal() if BLESSED_AVAILABLE else None - self.last_width = None - self.current_layout = None - - def get_terminal_width(self) -> int: - """Get terminal width with fallback methods.""" - try: - # Try blessed first (most reliable) - if BLESSED_AVAILABLE and self.terminal: - width = self.terminal.width or 80 - return width - except: - pass - - try: - # Try os.get_terminal_size - import shutil - - size = shutil.get_terminal_size() - return size.columns or 80 - except: - pass - - # Fallback - return 80 - - def determine_layout(self, width: int) -> str: - """Determine layout based on terminal width.""" - if width >= 120: - return "full" - elif width >= 80: - return "compact" - else: - return "minimal" - - def create_resource_table(self, interface): - """Create rich table with resource information.""" - if not RICH_AVAILABLE or not self.console: - return None - - try: - status = interface.get_system_status() - resources = status.resources - model_info = { - "name": status.current_model, - "state": status.model_state.value if status.model_state else "unknown", - "tokens": getattr(status, "tokens_used", 0), - } - - # Use a more defensive approach for Table creation - table = None - try: - table = Table(show_header=True, header_style="bold blue") - table.add_column("Metric", style="cyan", width=15) - table.add_column("Usage", style="white", width=20) - table.add_column("Status", style="bold", width=10) - except: - return None - - # CPU usage with color coding - cpu_percent = resources.cpu_percent if hasattr(resources, "cpu_percent") else 0 - cpu_color = "green" if cpu_percent < 60 else "yellow" if cpu_percent < 80 else "red" - try: - table.add_row("CPU", f"{cpu_percent:.1f}%", f"[{cpu_color}]●[/{cpu_color}]") - except: - pass - - # Memory usage with color coding - if hasattr(resources, "memory_total_gb") and hasattr(resources, "memory_available_gb"): - ram_used = resources.memory_total_gb - resources.memory_available_gb - ram_percent = ( - (ram_used / resources.memory_total_gb * 100) - if resources.memory_total_gb > 0 - else 0 - ) - ram_color = "green" if ram_percent < 70 else "yellow" if ram_percent < 85 else "red" - try: - table.add_row( - "RAM", - f"{ram_used:.1f}/{resources.memory_total_gb:.1f}GB", - f"[{ram_color}]●[/{ram_color}]", - ) - except: - pass - else: - try: - table.add_row("RAM", "Unknown", "[yellow]●[/yellow]") - except: - pass - - # GPU usage if available - if hasattr(resources, "gpu_available") and resources.gpu_available: - gpu_usage = ( - resources.gpu_usage_percent if hasattr(resources, "gpu_usage_percent") else 0 - ) - gpu_vram = ( - f"{resources.gpu_memory_gb:.1f}GB" - if hasattr(resources, "gpu_memory_gb") and resources.gpu_memory_gb - else "Unknown" - ) - gpu_color = "green" if gpu_usage < 60 else "yellow" if gpu_usage < 80 else "red" - try: - table.add_row( - "GPU", f"{gpu_usage:.1f}% ({gpu_vram})", f"[{gpu_color}]●[/{gpu_color}]" - ) - except: - pass - else: - try: - table.add_row("GPU", "Not Available", "[dim]○[/dim]") - except: - pass - - # Model and token info - try: - table.add_row("Model", model_info["name"], "[blue]●[/blue]") - except: - pass - if hasattr(status, "tokens_used"): - tokens_color = ( - "green" - if status.tokens_used < 1000 - else "yellow" - if status.tokens_used < 4000 - else "red" - ) - try: - table.add_row( - "Tokens", str(status.tokens_used), f"[{tokens_color}]●[/{tokens_color}]" - ) - except: - pass - - return table - - except Exception as e: - if RICH_AVAILABLE and hasattr(self.console, "print"): - self.console.print(f"[red]Error creating resource table: {e}[/red]") - return None - - try: - status = interface.get_system_status() - resources = status.resources - model_info = { - "name": status.current_model, - "state": status.model_state.value if status.model_state else "unknown", - "tokens": getattr(status, "tokens_used", 0), - } - - table = Table(show_header=True, header_style="bold blue") - table.add_column("Metric", style="cyan", width=15) - table.add_column("Usage", style="white", width=20) - table.add_column("Status", style="bold", width=10) - - # CPU usage with color coding - cpu_percent = resources.cpu_percent if hasattr(resources, "cpu_percent") else 0 - cpu_color = "green" if cpu_percent < 60 else "yellow" if cpu_percent < 80 else "red" - table.add_row("CPU", f"{cpu_percent:.1f}%", f"[{cpu_color}]●[/{cpu_color}]") - - # Memory usage with color coding - if hasattr(resources, "memory_total_gb") and hasattr(resources, "memory_available_gb"): - ram_used = resources.memory_total_gb - resources.memory_available_gb - ram_percent = ( - (ram_used / resources.memory_total_gb * 100) - if resources.memory_total_gb > 0 - else 0 - ) - ram_color = "green" if ram_percent < 70 else "yellow" if ram_percent < 85 else "red" - table.add_row( - "RAM", - f"{ram_used:.1f}/{resources.memory_total_gb:.1f}GB", - f"[{ram_color}]●[/{ram_color}]", - ) - else: - table.add_row("RAM", "Unknown", "[yellow]●[/yellow]") - - # GPU usage if available - if hasattr(resources, "gpu_available") and resources.gpu_available: - gpu_usage = ( - resources.gpu_usage_percent if hasattr(resources, "gpu_usage_percent") else 0 - ) - gpu_vram = ( - f"{resources.gpu_memory_gb:.1f}GB" - if hasattr(resources, "gpu_memory_gb") and resources.gpu_memory_gb - else "Unknown" - ) - gpu_color = "green" if gpu_usage < 60 else "yellow" if gpu_usage < 80 else "red" - table.add_row( - "GPU", f"{gpu_usage:.1f}% ({gpu_vram})", f"[{gpu_color}]●[/{gpu_color}]" - ) - else: - table.add_row("GPU", "Not Available", "[dim]○[/dim]") - - # Model and token info - table.add_row("Model", model_info["name"], "[blue]●[/blue]") - if hasattr(status, "tokens_used"): - tokens_color = ( - "green" - if status.tokens_used < 1000 - else "yellow" - if status.tokens_used < 4000 - else "red" - ) - table.add_row( - "Tokens", str(status.tokens_used), f"[{tokens_color}]●[/{tokens_color}]" - ) - - return table - - except Exception as e: - if RICH_AVAILABLE: - self.console.print(f"[red]Error creating resource table: {e}[/red]") - return None - - def create_resource_progress(self, interface): - """Create progress bars for visual resource consumption.""" - if not RICH_AVAILABLE or not self.console: - return None - - try: - status = interface.get_system_status() - resources = status.resources - - progress_items = [] - - # CPU Progress - if hasattr(resources, "cpu_percent"): - try: - cpu_progress = Progress( - TextColumn("CPU"), - BarColumn(bar_width=None), - TextColumn("[progress.percentage]{task.percentage:>3.0f}%"), - console=self.console, - ) - task = cpu_progress.add_task("CPU", total=100) - cpu_progress.update(task, completed=resources.cpu_percent) - progress_items.append(cpu_progress) - except: - pass - - # Memory Progress - if hasattr(resources, "memory_total_gb") and hasattr(resources, "memory_available_gb"): - ram_used = resources.memory_total_gb - resources.memory_available_gb - ram_percent = ( - (ram_used / resources.memory_total_gb * 100) - if resources.memory_total_gb > 0 - else 0 - ) - try: - ram_progress = Progress( - TextColumn("RAM"), - BarColumn(bar_width=None), - TextColumn("[progress.percentage]{task.percentage:>3.0f}%"), - console=self.console, - ) - task = ram_progress.add_task("RAM", total=100) - ram_progress.update(task, completed=ram_percent) - progress_items.append(ram_progress) - except: - pass - - # GPU Progress - if ( - hasattr(resources, "gpu_available") - and resources.gpu_available - and hasattr(resources, "gpu_usage_percent") - ): - try: - gpu_progress = Progress( - TextColumn("GPU"), - BarColumn(bar_width=None), - TextColumn("[progress.percentage]{task.percentage:>3.0f}%"), - console=self.console, - ) - task = gpu_progress.add_task("GPU", total=100) - gpu_progress.update(task, completed=resources.gpu_usage_percent) - progress_items.append(gpu_progress) - except: - pass - - return Group(*progress_items) if progress_items else None - - except Exception as e: - if RICH_AVAILABLE and hasattr(self.console, "print"): - self.console.print(f"[red]Error creating resource progress: {e}[/red]") - return None - - try: - status = interface.get_system_status() - resources = status.resources - - progress_items = [] - - # CPU Progress - if hasattr(resources, "cpu_percent"): - cpu_color = ( - "green" - if resources.cpu_percent < 60 - else "yellow" - if resources.cpu_percent < 80 - else "red" - ) - cpu_progress = Progress( - TextColumn("CPU"), - BarColumn(bar_width=None), - TextColumn("[progress.percentage]{task.percentage:>3.0f}%"), - console=self.console, - ) - task = cpu_progress.add_task("CPU", total=100) - cpu_progress.update(task, completed=resources.cpu_percent) - progress_items.append(cpu_progress) - - # Memory Progress - if hasattr(resources, "memory_total_gb") and hasattr(resources, "memory_available_gb"): - ram_used = resources.memory_total_gb - resources.memory_available_gb - ram_percent = ( - (ram_used / resources.memory_total_gb * 100) - if resources.memory_total_gb > 0 - else 0 - ) - ram_color = "green" if ram_percent < 70 else "yellow" if ram_percent < 85 else "red" - ram_progress = Progress( - TextColumn("RAM"), - BarColumn(bar_width=None), - TextColumn("[progress.percentage]{task.percentage:>3.0f}%"), - console=self.console, - ) - task = ram_progress.add_task("RAM", total=100) - ram_progress.update(task, completed=ram_percent) - progress_items.append(ram_progress) - - # GPU Progress - if ( - hasattr(resources, "gpu_available") - and resources.gpu_available - and hasattr(resources, "gpu_usage_percent") - ): - gpu_progress = Progress( - TextColumn("GPU"), - BarColumn(bar_width=None), - TextColumn("[progress.percentage]{task.percentage:>3.0f}%"), - console=self.console, - ) - task = gpu_progress.add_task("GPU", total=100) - gpu_progress.update(task, completed=resources.gpu_usage_percent) - progress_items.append(gpu_progress) - - return Group(*progress_items) if progress_items else None - - except Exception as e: - if RICH_AVAILABLE: - self.console.print(f"[red]Error creating resource progress: {e}[/red]") - return None - - def format_resource_alerts(self, interface): - """Check resource levels and format warning alerts.""" - if not RICH_AVAILABLE or not self.console: - return None - - try: - status = interface.get_system_status() - resources = status.resources - alerts = [] - - # CPU alerts - if hasattr(resources, "cpu_percent") and resources.cpu_percent > 85: - alerts.append(f"🔥 High CPU usage: {resources.cpu_percent:.1f}%") - elif hasattr(resources, "cpu_percent") and resources.cpu_percent > 70: - alerts.append(f"⚠️ Moderate CPU usage: {resources.cpu_percent:.1f}%") - - # Memory alerts - if hasattr(resources, "memory_total_gb") and hasattr(resources, "memory_available_gb"): - ram_used = resources.memory_total_gb - resources.memory_available_gb - ram_percent = ( - (ram_used / resources.memory_total_gb * 100) - if resources.memory_total_gb > 0 - else 0 - ) - if ram_percent > 90: - alerts.append(f"🔥 Critical memory usage: {ram_percent:.1f}%") - elif ram_percent > 75: - alerts.append(f"⚠️ High memory usage: {ram_percent:.1f}%") - - # GPU alerts - if hasattr(resources, "gpu_available") and resources.gpu_available: - if hasattr(resources, "gpu_usage_percent") and resources.gpu_usage_percent > 90: - alerts.append(f"🔥 Very high GPU usage: {resources.gpu_usage_percent:.1f}%") - - if alerts: - alert_text = "\n".join(alerts) - try: - return Panel( - alert_text, - title="⚠️ Resource Alerts", - border_style="yellow" if "Critical" not in alert_text else "red", - title_align="left", - ) - except: - return None - - return None - - except Exception as e: - if RICH_AVAILABLE and hasattr(self.console, "print"): - self.console.print(f"[red]Error creating resource alerts: {e}[/red]") - return None - - try: - status = interface.get_system_status() - resources = status.resources - alerts = [] - - # CPU alerts - if hasattr(resources, "cpu_percent") and resources.cpu_percent > 85: - alerts.append(f"🔥 High CPU usage: {resources.cpu_percent:.1f}%") - elif hasattr(resources, "cpu_percent") and resources.cpu_percent > 70: - alerts.append(f"⚠️ Moderate CPU usage: {resources.cpu_percent:.1f}%") - - # Memory alerts - if hasattr(resources, "memory_total_gb") and hasattr(resources, "memory_available_gb"): - ram_used = resources.memory_total_gb - resources.memory_available_gb - ram_percent = ( - (ram_used / resources.memory_total_gb * 100) - if resources.memory_total_gb > 0 - else 0 - ) - if ram_percent > 90: - alerts.append(f"🔥 Critical memory usage: {ram_percent:.1f}%") - elif ram_percent > 75: - alerts.append(f"⚠️ High memory usage: {ram_percent:.1f}%") - - # GPU alerts - if hasattr(resources, "gpu_available") and resources.gpu_available: - if hasattr(resources, "gpu_usage_percent") and resources.gpu_usage_percent > 90: - alerts.append(f"🔥 Very high GPU usage: {resources.gpu_usage_percent:.1f}%") - - if alerts: - alert_text = "\n".join(alerts) - return Panel( - alert_text, - title="⚠️ Resource Alerts", - border_style="yellow" if "Critical" not in alert_text else "red", - title_align="left", - ) - - return None - - except Exception as e: - if RICH_AVAILABLE: - self.console.print(f"[red]Error creating resource alerts: {e}[/red]") - return None - - def format_minimal_resources(self, interface) -> str: - """Format minimal resource display for narrow terminals.""" - try: - status = interface.get_system_status() - resources = status.resources - - info = [] - - # CPU - if hasattr(resources, "cpu_percent"): - cpu_indicator = "●" if resources.cpu_percent < 70 else "○" - info.append(f"CPU:{cpu_indicator}{resources.cpu_percent:.0f}%") - - # Memory - if hasattr(resources, "memory_total_gb") and hasattr(resources, "memory_available_gb"): - ram_used = resources.memory_total_gb - resources.memory_available_gb - ram_percent = ( - (ram_used / resources.memory_total_gb * 100) - if resources.memory_total_gb > 0 - else 0 - ) - mem_indicator = "●" if ram_percent < 75 else "○" - info.append(f"RAM:{mem_indicator}{ram_percent:.0f}%") - - # Model - model_short = ( - status.current_model.split(":")[0] - if ":" in status.current_model - else status.current_model[:8] - ) - info.append(f"M:{model_short}") - - return " | ".join(info) - - except Exception: - return "Resources: Unknown" - - def should_update_display(self) -> bool: - """Check if display needs updating based on terminal resize.""" - current_width = self.get_terminal_width() - new_layout = self.determine_layout(current_width) - - if current_width != self.last_width or new_layout != self.current_layout: - self.last_width = current_width - self.current_layout = new_layout - return True - - return False - - -@dataclass -class SessionState: - """Session state for persistent conversation storage.""" - - conversation_id: str - messages: List[Dict[str, str]] - timestamp: float - user_id: Optional[str] = None - context: Optional[str] = None - - -# Session file paths -SESSION_DIR = Path.home() / ".mai" -SESSION_FILE = SESSION_DIR / "session.json" -SESSION_LOCK_FILE = SESSION_DIR / ".session.lock" - - -def _acquire_session_lock() -> bool: - """Acquire session lock to prevent concurrent access.""" - try: - SESSION_DIR.mkdir(exist_ok=True) - # Try to create lock file (atomic operation) - lock_fd = os.open(SESSION_LOCK_FILE, os.O_CREAT | os.O_EXCL | os.O_WRONLY) - os.close(lock_fd) - return True - except FileExistsError: - # Lock already exists - return False - except (OSError, PermissionError): - # Cannot create lock file - return False - - -def _release_session_lock() -> None: - """Release session lock.""" - try: - if SESSION_LOCK_FILE.exists(): - SESSION_LOCK_FILE.unlink() - except (OSError, PermissionError): - pass # Best effort - - -def save_session(session_state: SessionState, verbose: bool = False) -> None: - """Save session state to file with error handling and history truncation.""" - try: - # Acquire lock to prevent concurrent access - if not _acquire_session_lock(): - # Could not acquire lock, skip saving this time - print( - f"{Colors.YELLOW}Warning: Could not acquire session lock, skipping save{Colors.RESET}" - ) - return - - try: - # Handle large conversation histories (truncate if needed) - max_messages = 100 # Keep last 50 exchanges (100 messages) - if len(session_state.messages) > max_messages: - # Keep recent messages, add truncation notice - old_messages_count = len(session_state.messages) - max_messages - session_state.messages = session_state.messages[-max_messages:] - session_state.context = f"Note: {old_messages_count} older messages were truncated to manage session size." - - # Convert to dictionary and save as JSON - session_dict = asdict(session_state) - with open(SESSION_FILE, "w", encoding="utf-8") as f: - json.dump(session_dict, f, indent=2, ensure_ascii=False) - - # Provide feedback if verbose - if verbose: - print(f"{Colors.DIM}Session saved to: {SESSION_FILE}{Colors.RESET}") - finally: - # Always release lock - _release_session_lock() - - except (OSError, IOError, PermissionError) as e: - # Don't fail the CLI, just log the error - print(f"{Colors.YELLOW}Warning: Could not save session: {e}{Colors.RESET}") - except Exception as e: - print(f"{Colors.YELLOW}Warning: Unexpected error saving session: {e}{Colors.RESET}") - - -def load_session() -> Optional[SessionState]: - """Load session state from file with validation and error handling.""" - try: - if not SESSION_FILE.exists(): - return None - - with open(SESSION_FILE, "r", encoding="utf-8") as f: - session_dict = json.load(f) - - # Validate required fields - required_fields = ["conversation_id", "messages", "timestamp"] - for field in required_fields: - if field not in session_dict: - print( - f"{Colors.YELLOW}Warning: Session file missing required field: {field}{Colors.RESET}" - ) - return None - - # Create SessionState object - return SessionState( - conversation_id=session_dict["conversation_id"], - messages=session_dict["messages"], - timestamp=session_dict["timestamp"], - user_id=session_dict.get("user_id"), - context=session_dict.get("context"), - ) - - except (json.JSONDecodeError, OSError, IOError, PermissionError) as e: - print(f"{Colors.YELLOW}Warning: Could not load session: {e}{Colors.RESET}") - return None - except Exception as e: - print(f"{Colors.YELLOW}Warning: Unexpected error loading session: {e}{Colors.RESET}") - return None - - -def cleanup_session() -> None: - """Clean up session files if needed.""" - try: - if SESSION_FILE.exists(): - SESSION_FILE.unlink() - except (OSError, PermissionError) as e: - print(f"{Colors.YELLOW}Warning: Could not cleanup session file: {e}{Colors.RESET}") - - -def calculate_session_context(session_timestamp: float) -> str: - """Calculate contextual message based on time since last session.""" - try: - current_time = datetime.now().timestamp() - hours_since = (current_time - session_timestamp) / 3600 - - if hours_since < 1: - return "Welcome back! Continuing our conversation..." - elif hours_since < 24: - hours_int = int(hours_since) - return f"Welcome back! It's been {hours_int} hours since we last spoke." - elif hours_since < 168: # 7 days - days_int = int(hours_since / 24) - return f"Welcome back! It's been {days_int} days since our last conversation." - else: - return "Welcome back! It's been a while since we last talked." - - except Exception: - return "Welcome back!" - - -def setup_logging(verbose: bool = False) -> None: - """Configure logging levels and output format.""" - level = logging.DEBUG if verbose else logging.INFO - - # Create formatter - formatter = logging.Formatter( - "%(asctime)s - %(name)s - %(levelname)s - %(message)s", datefmt="%H:%M:%S" - ) - - # Setup console handler with colors - console_handler = logging.StreamHandler() - console_handler.setLevel(level) - console_handler.setFormatter(ColoredFormatter()) - - # Setup file handler for debugging - file_handler = logging.FileHandler("mai.log") - file_handler.setLevel(logging.DEBUG) - file_handler.setFormatter(formatter) - - # Configure root logger - root_logger = logging.getLogger() - root_logger.setLevel(logging.DEBUG) - root_logger.addHandler(console_handler) - root_logger.addHandler(file_handler) - - -class ColoredFormatter(logging.Formatter): - """Custom formatter with colors for different log levels.""" - - COLORS = { - logging.DEBUG: Colors.DIM, - logging.INFO: Colors.WHITE, - logging.WARNING: Colors.YELLOW, - logging.ERROR: Colors.RED, - logging.CRITICAL: Colors.RED + Colors.BOLD, - } - - def format(self, record): - """Format log record with appropriate color.""" - color = self.COLORS.get(record.levelno, Colors.WHITE) - record.levelname = f"{color}{record.levelname}{Colors.RESET}" - return super().format(record) - - -def format_approval_request(approval_decision) -> str: - """Format approval request for CLI display with rich styling.""" - if not INTERFACE_AVAILABLE or not hasattr(approval_decision, "request"): - return "Approval request data unavailable" - - request = approval_decision.request - risk_level = request.risk_analysis.risk_level - - # Color coding based on risk level - risk_colors = { - RiskLevel.LOW: Colors.GREEN, - RiskLevel.MEDIUM: Colors.YELLOW, - RiskLevel.HIGH: Colors.RED, - RiskLevel.BLOCKED: Colors.RED + Colors.BOLD, - } - - color = risk_colors.get(risk_level, Colors.WHITE) - - formatted = [] - formatted.append(f"\n{color}━━━ APPROVAL REQUEST ━━━{Colors.RESET}") - formatted.append( - f"{Colors.BOLD}Operation Type:{Colors.RESET} {_get_operation_type(request.code)}" - ) - formatted.append( - f"{Colors.BOLD}Risk Level:{Colors.RESET} {color}{risk_level.value.upper()}{Colors.RESET}" - ) - - if request.risk_analysis.reasons: - formatted.append(f"{Colors.BOLD}Risk Factors:{Colors.RESET}") - for reason in request.risk_analysis.reasons[:3]: - formatted.append(f" • {reason}") - - if request.risk_analysis.affected_resources: - formatted.append( - f"{Colors.BOLD}Affected Resources:{Colors.RESET} {', '.join(request.risk_analysis.affected_resources)}" - ) - - # Code preview - code_preview = request.code[:150] + "..." if len(request.code) > 150 else request.code - formatted.append(f"{Colors.BOLD}Code Preview:{Colors.RESET}") - formatted.append(f"{Colors.DIM}{code_preview}{Colors.RESET}") - - formatted.append(f"\n{Colors.BOLD}Options:{Colors.RESET} [Y]es, [N]o, [D]etails, [Q]uit") - formatted.append(f"{color}{'━' * 30}{Colors.RESET}\n") - - return "\n".join(formatted) - - -def display_approval_diff(code: str, risk_level) -> None: - """Display detailed diff in scrollable format with syntax highlighting.""" - print(f"\n{Colors.BOLD}─── DETAILED CODE VIEW ───{Colors.RESET}") - print(f"{Colors.BOLD}Risk Level:{Colors.RESET} {risk_level.value.upper()}") - print(f"{Colors.DIM}{'=' * 50}{Colors.RESET}") - - # Display code with line numbers - lines = code.split("\n") - for i, line in enumerate(lines, 1): - print(f"{Colors.DIM}{i:3d}:{Colors.RESET} {line}") - - print(f"{Colors.DIM}{'=' * 50}{Colors.RESET}") - print(f"{Colors.BOLD}End of code preview{Colors.RESET}\n") - - -def interactive_approval_prompt(approval_decision) -> str: - """Accept user input for approval decision with validation.""" - if not INTERFACE_AVAILABLE: - return "denied" - - while True: - try: - user_input = ( - input(f"{Colors.CYAN}Your decision [Y/n/d/q]:{Colors.RESET} ").strip().lower() - ) - - if not user_input or user_input in ["y", "yes"]: - return "approved" - elif user_input in ["n", "no"]: - return "denied" - elif user_input in ["d", "details"]: - return "details" - elif user_input in ["q", "quit"]: - return "quit" - else: - print(f"{Colors.YELLOW}Invalid input. Please use Y/n/d/q{Colors.RESET}") - - except KeyboardInterrupt: - print(f"\n{Colors.YELLOW}Approval cancelled by user{Colors.RESET}") - return "denied" - except EOFError: - print(f"\n{Colors.YELLOW}Approval cancelled by user{Colors.RESET}") - return "denied" - - -def process_approval_result(approval_decision, user_response: str) -> bool: - """Process approval result and execute appropriate action.""" - if not INTERFACE_AVAILABLE: - return False - - if user_response == "approved": - print(f"{Colors.GREEN}✓ Approved - executing code...{Colors.RESET}") - # Here we would integrate with actual execution - # For now, just simulate successful execution - print(f"{Colors.GREEN}✓ Code executed successfully{Colors.RESET}") - return True - elif user_response == "denied": - print(f"{Colors.YELLOW}✗ Rejected{Colors.RESET}") - - # Ask for feedback - try: - feedback = input( - f"{Colors.CYAN}What should I change differently? (optional):{Colors.RESET} " - ).strip() - if feedback: - print(f"{Colors.GREEN}✓ Feedback recorded for improvement{Colors.RESET}") - else: - print(f"{Colors.DIM}No feedback provided{Colors.RESET}") - except (KeyboardInterrupt, EOFError): - print(f"\n{Colors.DIM}Skipping feedback{Colors.RESET}") - - return False - else: - print(f"{Colors.RED}✗ Invalid response: {user_response}{Colors.RESET}") - return False - - -def _get_operation_type(code: str) -> str: - """Extract operation type from code (simplified version).""" - if "import" in code: - return "module_import" - elif "os.system" in code or "subprocess" in code: - return "system_command" - elif "open(" in code: - return "file_operation" - elif "print(" in code: - return "output_operation" - else: - return "code_execution" - - -class MaiCLI: - """Mai Command Line Interface.""" - - def __init__(self, verbose: bool = False): - """Initialize CLI with Mai interface.""" - self.verbose = verbose - self.interface = None # type: Optional[MaiInterface] - self.conversation_engine = None # type: Optional[ConversationEngine] - self.logger = logging.getLogger(__name__) - self.session_state = None # type: Optional[SessionState] - self.approval_system = None # type: Optional[ApprovalSystem] - self.resource_display = ResourceDisplayManager() # Resource display manager - - def initialize_interface(self) -> bool: - """Initialize Mai interface and ConversationEngine.""" - try: - print(f"{Colors.CYAN}Initializing Mai...{Colors.RESET}") - - # Initialize MaiInterface first - if MaiInterface is not None: - self.interface = MaiInterface() - else: - print(f"{Colors.RED}✗ MaiInterface not available{Colors.RESET}") - return False - - if self.interface is None or not self.interface.initialize(): - print(f"{Colors.RED}✗ Failed to initialize Mai{Colors.RESET}") - return False - - # Initialize ConversationEngine with or without MemoryManager - if INTERFACE_AVAILABLE and ConversationEngine is not None: - print(f"{Colors.CYAN}Initializing Conversation Engine...{Colors.RESET}") - - # Try to initialize MemoryManager, but don't fail if it doesn't work - memory_manager = None - if MemoryManager is not None: - try: - memory_manager = MemoryManager(config={}) - print(f"{Colors.GREEN}✓ MemoryManager initialized{Colors.RESET}") - except Exception as e: - print( - f"{Colors.YELLOW}⚠ MemoryManager failed, continuing without memory: {e}{Colors.RESET}" - ) - memory_manager = None - - self.conversation_engine = ConversationEngine( - mai_interface=self.interface, - memory_manager=memory_manager, - timing_profile="default", - debug_mode=self.verbose, - enable_metrics=True, - ) - print(f"{Colors.GREEN}✓ Conversation Engine ready{Colors.RESET}") - else: - print( - f"{Colors.YELLOW}⚠ Conversation Engine unavailable - falling back to direct interface{Colors.RESET}" - ) - self.conversation_engine = None - - # Initialize approval system if available - if ApprovalSystem is not None: - self.approval_system = ApprovalSystem() - print(f"{Colors.GREEN}✓ Approval System ready{Colors.RESET}") - else: - print(f"{Colors.YELLOW}⚠ Approval System unavailable{Colors.RESET}") - - return True - - except ModelConnectionError as e: - print(f"{Colors.RED}✗ Cannot connect to Ollama: {e}{Colors.RESET}") - print(f"{Colors.YELLOW}Please ensure Ollama is running and accessible{Colors.RESET}") - return False - - except Exception as e: - print(f"{Colors.RED}✗ Unexpected error during initialization: {e}{Colors.RESET}") - if self.verbose: - import traceback - - traceback.print_exc() - return False - - def list_models_command(self) -> None: - """List available models with their capabilities.""" - if not self.ensure_interface(): - return - - interface = self.interface - try: - models = interface.list_models() - status = interface.get_system_status() - resources = status.resources - - for i, model in enumerate(models, 1): - # Model name and current indicator - current_indicator = ( - f"{Colors.GREEN}[CURRENT]{Colors.RESET}" if model["current"] else f" " - ) - model_name = f"{Colors.BOLD}{model['name']}{Colors.RESET}" - - # Capability indicator - cap_colors = {"full": Colors.GREEN, "limited": Colors.YELLOW, "minimal": Colors.RED} - cap_color = cap_colors.get(model["capability"], Colors.WHITE) - capability = f"{cap_color}{model['capability'].upper()}{Colors.RESET}" - - print(f"{i:2d}. {current_indicator} {model_name:25} {capability}") - - # Model details - print( - f" {Colors.DIM}Size: {model['size']}GB | Context: {model['context_window']}{Colors.RESET}" - ) - - # Resource requirements - reqs = model["resource_requirements"] - print( - f" {Colors.DIM}RAM: {reqs['ram_gb']:.1f}GB | Storage: {reqs['storage_gb']}GB{Colors.RESET}" - ) - - if model["recommended"]: - print(f" {Colors.GREEN}★ Recommended for current system{Colors.RESET}") - - print() - - # System resources - print(f"{Colors.BOLD}{Colors.BLUE}System Resources{Colors.RESET}") - print(f"{Colors.DIM}{'=' * 60}{Colors.RESET}") - ram_used = resources.memory_total_gb - resources.memory_available_gb - print( - f"RAM: {ram_used:.1f}/{resources.memory_total_gb:.1f}GB ({resources.memory_percent:.1f}%)" - ) - print(f"Available: {resources.memory_available_gb:.1f}GB") - - if resources.gpu_available: - gpu_vram = ( - f"{resources.gpu_memory_gb:.1f}GB" if resources.gpu_memory_gb else "Unknown" - ) - gpu_usage = ( - f" ({resources.gpu_usage_percent:.1f}%)" if resources.gpu_usage_percent else "" - ) - print(f"GPU: Available ({gpu_vram} VRAM{gpu_usage})") - else: - print(f"{Colors.YELLOW}GPU: Not available{Colors.RESET}") - - except Exception as e: - print(f"{Colors.RED}Error listing models: {e}{Colors.RESET}") - if self.verbose: - import traceback - - traceback.print_exc() - - def status_command(self) -> None: - """Show current system status and resource usage.""" - if not self.ensure_interface(): - return - - interface = self.interface # Local variable for type checker - try: - status = interface.get_system_status() - - print(f"\n{Colors.BOLD}{Colors.BLUE}Mai System Status{Colors.RESET}") - print(f"{Colors.DIM}{'=' * 60}{Colors.RESET}\n") - - # Model status - model_state_colors = { - ModelState.IDLE: Colors.GREEN, - ModelState.THINKING: Colors.YELLOW, - ModelState.RESPONDING: Colors.BLUE, - ModelState.SWITCHING: Colors.MAGENTA, - ModelState.ERROR: Colors.RED, - } - state_color = model_state_colors.get(status.model_state, Colors.WHITE) - - print(f"{Colors.BOLD}Model Status:{Colors.RESET}") - print(f" Current: {status.current_model}") - print(f" State: {state_color}{status.model_state.value.upper()}{Colors.RESET}") - print(f" Available: {len(status.available_models)} models\n") - - # Resource usage - print(f"{Colors.BOLD}Resource Usage:{Colors.RESET}") - ram_used = status.resources.memory_total_gb - status.resources.memory_available_gb - print( - f" RAM: {ram_used:.1f}/{status.resources.memory_total_gb:.1f}GB ({status.resources.memory_percent:.1f}%)" - ) - print(f" Available: {status.resources.memory_available_gb:.1f}GB") - - if status.resources.gpu_available: - print(f" GPU: Available") - gpu_vram = ( - f"{status.resources.gpu_memory_gb:.1f}GB" - if status.resources.gpu_memory_gb - else "Unknown" - ) - gpu_usage = ( - f" ({status.resources.gpu_usage_percent:.1f}%)" - if status.resources.gpu_usage_percent - else "" - ) - print(f" VRAM: {gpu_vram}{gpu_usage}") - else: - print(f" GPU: {Colors.YELLOW}Not available{Colors.RESET}") - - # Conversation info - print(f"\n{Colors.BOLD}Conversation:{Colors.RESET}") - print(f" Length: {status.conversation_length} turns") - print( - f" Context compression: {'Enabled' if status.compression_enabled else 'Disabled'}" - ) - - # Git state - print(f"\n{Colors.BOLD}Git State:{Colors.RESET}") - if status.git_state["repository_exists"]: - print(f" Repository: {Colors.GREEN}✓{Colors.RESET}") - print(f" Branch: {status.git_state['current_branch']}") - print(f" Changes: {'Yes' if status.git_state['has_changes'] else 'No'}") - print( - f" Last commit: {status.git_state.get('last_commit', {}).get('hash', 'Unknown')[:8]}" - ) - else: - print(f" Repository: {Colors.RED}✗ Not a git repository{Colors.RESET}") - - # Performance metrics - metrics = status.performance_metrics - print(f"\n{Colors.BOLD}Performance Metrics:{Colors.RESET}") - print(f" Uptime: {metrics['uptime_seconds'] / 60:.1f} minutes") - print(f" Messages: {metrics['total_messages']}") - print(f" Model switches: {metrics['total_model_switches']}") - print(f" Compressions: {metrics['total_compressions']}") - print(f" Avg response time: {metrics['avg_response_time']:.2f}s") - print(f" Messages/min: {metrics['messages_per_minute']:.1f}") - - # Resource constraints - constraints = interface.handle_resource_constraints() - if constraints["constraints"]: - print(f"\n{Colors.YELLOW}{Colors.BOLD}Resource Constraints:{Colors.RESET}") - for constraint in constraints["constraints"]: - print(f" • {constraint}") - - if constraints["recommendations"]: - print(f"\n{Colors.CYAN}{Colors.BOLD}Recommendations:{Colors.RESET}") - for rec in constraints["recommendations"]: - print(f" • {rec}") - - except Exception as e: - print(f"{Colors.RED}Error getting status: {e}{Colors.RESET}") - if self.verbose: - import traceback - - traceback.print_exc() - - def display_resource_info(self, interface, show_header: bool = False) -> None: - """Display resource information based on terminal width.""" - if not interface: - return - - try: - # Check terminal width and determine layout - width = self.resource_display.get_terminal_width() - layout = self.resource_display.determine_layout(width) - - if layout == "full" and RICH_AVAILABLE: - # Full layout: Rich table + progress bars - if show_header: - print(f"{Colors.DIM}─ Resources ─{Colors.RESET}") - - table = self.resource_display.create_resource_table(interface) - progress = self.resource_display.create_resource_progress(interface) - alerts = self.resource_display.format_resource_alerts(interface) - - if self.resource_display.console: - if table: - self.resource_display.console.print(table) - if progress: - self.resource_display.console.print(progress) - if alerts: - self.resource_display.console.print(alerts) - - elif layout == "compact" and RICH_AVAILABLE: - # Compact layout: Just table - if show_header: - print(f"{Colors.DIM}─ Resources ─{Colors.RESET}") - - table = self.resource_display.create_resource_table(interface) - alerts = self.resource_display.format_resource_alerts(interface) - - if self.resource_display.console: - if table: - self.resource_display.console.print(table) - if alerts: - self.resource_display.console.print(alerts) - - else: - # Minimal layout: Simple text - minimal_text = self.resource_display.format_minimal_resources(interface) - if minimal_text: - if show_header: - print(f"{Colors.DIM}─ Resources ─{Colors.RESET}") - print(f"{Colors.DIM}{minimal_text}{Colors.RESET}") - - except Exception as e: - if self.verbose: - print(f"{Colors.YELLOW}Resource display error: {e}{Colors.RESET}") - - async def chat_command(self, model_override: Optional[str] = None) -> None: - """Start interactive conversation loop with ConversationEngine.""" - if not self.ensure_interface(): - return - - interface = self.interface # Local variable for type checker - try: - # Load existing session or create new one - self.session_state = load_session() - - # Show initial status with resource info - status = interface.get_system_status() - print(f"\n{Colors.BOLD}{Colors.CYAN}Mai Chat Interface{Colors.RESET}") - print(f"{Colors.DIM}{'=' * 60}{Colors.RESET}") - print(f"Model: {status.current_model}") - - # Display initial resource info - self.display_resource_info(interface, show_header=True) - print() # Add spacing - - # Show session context or welcome - if self.session_state: - context_msg = calculate_session_context(self.session_state.timestamp) - print(f"{Colors.GREEN}{context_msg}{Colors.RESET}") - if self.verbose: - print(f"{Colors.DIM}Session file: {SESSION_FILE}{Colors.RESET}") - else: - print(f"{Colors.CYAN}Starting new conversation...{Colors.RESET}") - if self.verbose: - print(f"{Colors.DIM}New session will be saved to: {SESSION_FILE}{Colors.RESET}") - - # Show ConversationEngine status - if self.conversation_engine: - print( - f"{Colors.GREEN}✓ Conversation Engine enabled with natural timing{Colors.RESET}" - ) - else: - print( - f"{Colors.YELLOW}⚠ Conversation Engine unavailable - using direct interface{Colors.RESET}" - ) - - print( - f"Type '{Colors.YELLOW}/help{Colors.RESET}' for commands, '{Colors.YELLOW}/quit{Colors.RESET}' to exit\n" - ) - - # Override model if requested - if model_override: - result = interface.switch_model(model_override) - if result["success"]: - print(f"{Colors.GREEN}✓ Switched to model: {model_override}{Colors.RESET}") - else: - print( - f"{Colors.RED}✗ Failed to switch model: {result.get('error', 'Unknown error')}{Colors.RESET}" - ) - return - - # Use existing conversation ID or create new one - if self.session_state: - conversation_id = self.session_state.conversation_id - else: - conversation_id = str(uuid.uuid4()) - self.session_state = SessionState( - conversation_id=conversation_id, - messages=[], - timestamp=datetime.now().timestamp(), - ) - if self.verbose: - print( - f"{Colors.DIM}Created new session (ID: {conversation_id[:8]}...){Colors.RESET}" - ) - - while True: - try: - # Get user input - user_input = input(f"{Colors.BLUE}You:{Colors.RESET} ").strip() - - if not user_input: - continue - - # Handle commands - if user_input.startswith("/"): - if not await self._handle_chat_command_async(user_input, interface): - break - continue - - # Add user message to session history - if self.session_state: - self.session_state.messages.append({"role": "user", "content": user_input}) - - # Process using ConversationEngine or fallback to direct interface - if self.conversation_engine: - # Show thinking indicator with resource info - print(f"{Colors.YELLOW}Mai is thinking...{Colors.RESET}") - # Update resource display during thinking - self.display_resource_info(interface, show_header=False) - print() # Add spacing - - # Process with ConversationEngine (includes natural timing) - response_data = self.conversation_engine.process_turn( - user_input, conversation_id - ) - - # Display response with timing info - print(f"{Colors.GREEN}Mai ({response_data.model_used}):{Colors.RESET}") - print(response_data.response) - - # Check if response contains approval request - if ( - hasattr(response_data, "requires_approval") - and response_data.requires_approval - ): - if not await self._handle_approval_workflow(user_input, interface): - continue # Continue conversation after approval/rejection - - # Add assistant response to session history - if self.session_state: - self.session_state.messages.append( - {"role": "assistant", "content": response_data.response} - ) - - # Update session timestamp and save - if self.session_state: - self.session_state.timestamp = datetime.now().timestamp() - save_session(self.session_state, verbose=self.verbose) - - # Show metadata if verbose - if self.verbose: - print(f"\n{Colors.DIM}--- Metadata ---{Colors.RESET}") - print(f"Model: {response_data.model_used}") - print(f"Tokens: {response_data.tokens_used}") - print(f"Response time: {response_data.response_time:.2f}s") - print(f"Timing category: {response_data.timing_category}") - print(f"Memory context: {response_data.memory_context_used} items") - print(f"Conversation ID: {response_data.conversation_id}") - else: - # Fallback to direct interface - print(f"{Colors.YELLOW}Mai is thinking...{Colors.RESET}") - # Update resource display during thinking - self.display_resource_info(interface, show_header=False) - print() # Add spacing - - # Simple history for fallback mode - if not hasattr(self, "_conversation_history"): - self._conversation_history = [] - - response_data = interface.send_message( - user_input, self._conversation_history - ) - - # Display response - print(f"{Colors.GREEN}Mai ({response_data['model_used']}):{Colors.RESET}") - print(response_data["response"]) - - # Check if response contains approval request - if response_data.get("requires_approval"): - if not await self._handle_approval_workflow(user_input, interface): - continue # Continue conversation after approval/rejection - - # Add assistant response to session history - if self.session_state: - self.session_state.messages.append( - {"role": "assistant", "content": response_data["response"]} - ) - - # Update session timestamp and save - if self.session_state: - self.session_state.timestamp = datetime.now().timestamp() - save_session(self.session_state, verbose=self.verbose) - - # Update conversation history for fallback - self._conversation_history.append({"role": "user", "content": user_input}) - self._conversation_history.append( - {"role": "assistant", "content": response_data["response"]} - ) - - # Show metadata if verbose - if self.verbose: - print(f"\n{Colors.DIM}--- Metadata ---{Colors.RESET}") - print(f"Model: {response_data['model_used']}") - print(f"Tokens: {response_data['tokens']}") - print(f"Response time: {response_data['response_time']:.2f}s") - - print() # Add spacing - - except KeyboardInterrupt: - print(f"\n{Colors.YELLOW}Saving session and exiting...{Colors.RESET}") - # Save final session state before exit - if self.session_state: - self.session_state.timestamp = datetime.now().timestamp() - save_session(self.session_state, verbose=self.verbose) - break - - except EOFError: - print(f"\n{Colors.YELLOW}Saving session and exiting...{Colors.RESET}") - # Save final session state before exit - if self.session_state: - self.session_state.timestamp = datetime.now().timestamp() - save_session(self.session_state, verbose=self.verbose) - break - - except Exception as e: - print(f"{Colors.RED}Error in chat mode: {e}{Colors.RESET}") - if self.verbose: - import traceback - - traceback.print_exc() - - def test_command(self) -> None: - """Run integration tests and provide clear results.""" - print(f"{Colors.CYAN}Running Phase 1 Integration Tests...{Colors.RESET}") - print(f"{Colors.DIM}Testing all Phase 1 components and requirements{Colors.RESET}") - print() - - try: - # Try to use pytest first - import subprocess - import sys - from pathlib import Path - - # Find test file - test_file = Path(__file__).parent.parent.parent / "tests" / "test_integration.py" - project_root = Path(__file__).parent.parent.parent - - if not test_file.exists(): - print( - f"{Colors.RED}Error: Integration tests not found at {test_file}{Colors.RESET}" - ) - return - - # Try pytest first - try: - print(f"{Colors.DIM}Attempting to run tests with pytest...{Colors.RESET}") - result = subprocess.run( - [sys.executable, "-m", "pytest", str(test_file), "-v", "--tb=short"], - cwd=project_root, - capture_output=True, - text=True, - ) - - # Print pytest output - if result.stdout: - print(result.stdout) - if result.stderr: - print(f"{Colors.RED}pytest errors:{Colors.RESET}") - print(result.stderr) - - except (subprocess.CalledProcessError, FileNotFoundError): - # Fallback to running directly with python - print( - f"{Colors.YELLOW}pytest not available, running tests directly...{Colors.RESET}" - ) - - # Run tests using subprocess to capture output properly - result = subprocess.run( - [sys.executable, str(test_file)], - cwd=project_root, - capture_output=True, - text=True, - ) - - # Print output with appropriate formatting - if result.stdout: - # Color code success/failure lines - lines = result.stdout.split("\n") - for line in lines: - if "✓" in line or "PASSED" in line or "OK" in line: - print(f"{Colors.GREEN}{line}{Colors.RESET}") - elif "✗" in line or "FAILED" in line or "ERROR" in line: - print(f"{Colors.RED}{line}{Colors.RESET}") - elif "Import Error" in line or "IMPORT_ERROR" in line: - print(f"{Colors.YELLOW}{line}{Colors.RESET}") - else: - print(line) - - if result.stderr: - print(f"{Colors.RED}Errors:{Colors.RESET}") - print(result.stderr) - - print() - print(f"{Colors.BOLD}Test Summary:{Colors.RESET}") - if result.returncode == 0: - print(f"{Colors.GREEN}✓ All tests passed successfully!{Colors.RESET}") - else: - print( - f"{Colors.RED}✗ Some tests failed. Return code: {result.returncode}{Colors.RESET}" - ) - - # Extract success rate if available - if "Success Rate:" in result.stdout: - import re - - match = re.search(r"Success Rate: (\d+\.?\d*)%", result.stdout) - if match: - success_rate = float(match.group(1)) - if success_rate >= 80: - print( - f"{Colors.GREEN}✓ Phase 1 Validation: PASSED ({success_rate:.1f}%){Colors.RESET}" - ) - else: - print( - f"{Colors.YELLOW}⚠ Phase 1 Validation: MARGINAL ({success_rate:.1f}%){Colors.RESET}" - ) - elif "Ran" in result.stdout and "tests in" in result.stdout: - # Extract from pytest output - import re - import sys - - # Check if pytest showed all passed - if ( - "passed" in result.stdout - and "failed" not in result.stdout - and "error" not in result.stdout - ): - print(f"{Colors.GREEN}✓ Phase 1 Validation: PASSED (pytest){Colors.RESET}") - else: - print(f"{Colors.YELLOW}⚠ Phase 1 Validation: MIXED RESULTS{Colors.RESET}") - - except Exception as e: - print(f"{Colors.RED}Error running tests: {e}{Colors.RESET}") - print( - f"{Colors.YELLOW}Alternative: Run manually with: python3 tests/test_integration.py{Colors.RESET}" - ) - if self.verbose: - import traceback - - traceback.print_exc() - - def _handle_chat_command(self, command: str, interface) -> bool: - """Handle chat commands. Returns False to quit, True to continue.""" - cmd = command.lower().strip() - - if cmd == "/quit" or cmd == "/exit": - print(f"{Colors.CYAN}Goodbye!{Colors.RESET}") - return False - - elif cmd == "/help": - print(f"\n{Colors.BOLD}Available Commands:{Colors.RESET}") - print(f" {Colors.YELLOW}/help{Colors.RESET} - Show this help") - print(f" {Colors.YELLOW}/status{Colors.RESET} - Show current system status") - print(f" {Colors.YELLOW}/models{Colors.RESET} - List available models") - print(f" {Colors.YELLOW}/switch X{Colors.RESET} - Switch to model X") - print(f" {Colors.YELLOW}/clear{Colors.RESET} - Clear conversation history") - print(f" {Colors.YELLOW}/session{Colors.RESET} - Show session information") - print(f" {Colors.YELLOW}/quit{Colors.RESET} - Exit chat") - print() - - elif cmd == "/status": - self.status_command() - - elif cmd == "/models": - self.list_models_command() - - elif cmd.startswith("/switch "): - model_name = cmd[8:].strip() - result = interface.switch_model(model_name) - if result["success"]: - print(f"{Colors.GREEN}✓ Switched to: {model_name}{Colors.RESET}") - else: - print( - f"{Colors.RED}✗ Failed to switch: {result.get('error', 'Unknown error')}{Colors.RESET}" - ) - - elif cmd == "/clear": - # Clear session and conversation history - if self.session_state: - self.session_state.messages = [] - self.session_state.timestamp = datetime.now().timestamp() - save_session(self.session_state, verbose=self.verbose) - print(f"{Colors.GREEN}✓ Conversation history cleared{Colors.RESET}") - else: - print(f"{Colors.YELLOW}No active session to clear{Colors.RESET}") - - elif cmd == "/session": - # Show session information - if self.session_state: - print(f"\n{Colors.BOLD}{Colors.CYAN}Session Information{Colors.RESET}") - print(f"{Colors.DIM}{'=' * 40}{Colors.RESET}") - print(f"Conversation ID: {self.session_state.conversation_id}") - print(f"Messages: {len(self.session_state.messages)}") - print(f"Session file: {SESSION_FILE}") - print(f"File exists: {'Yes' if SESSION_FILE.exists() else 'No'}") - if SESSION_FILE.exists(): - import os - - size_bytes = os.path.getsize(SESSION_FILE) - print(f"File size: {size_bytes} bytes") - - # Show last activity time - last_activity = datetime.fromtimestamp(self.session_state.timestamp) - print(f"Last activity: {last_activity.strftime('%Y-%m-%d %H:%M:%S')}") - - # Show session age - hours_since = (datetime.now().timestamp() - self.session_state.timestamp) / 3600 - if hours_since < 1: - age_str = f"{int(hours_since * 60)} minutes ago" - elif hours_since < 24: - age_str = f"{int(hours_since)} hours ago" - else: - age_str = f"{int(hours_since / 24)} days ago" - print(f"Session age: {age_str}") - - # Show recent messages - if self.session_state.messages: - print(f"\n{Colors.BOLD}Recent Messages:{Colors.RESET}") - recent_msgs = self.session_state.messages[-6:] # Show last 3 exchanges - for i, msg in enumerate(recent_msgs): - role_color = Colors.BLUE if msg["role"] == "user" else Colors.GREEN - role_name = "You" if msg["role"] == "user" else "Mai" - content_preview = ( - msg["content"][:80] + "..." - if len(msg["content"]) > 80 - else msg["content"] - ) - print(f" {role_color}{role_name}:{Colors.RESET} {content_preview}") - print() - else: - print(f"{Colors.YELLOW}No active session{Colors.RESET}") - - else: - print(f"{Colors.RED}Unknown command: {command}{Colors.RESET}") - print(f"Type {Colors.YELLOW}/help{Colors.RESET} for available commands") - - return True - - async def _handle_chat_command_async(self, command: str, interface) -> bool: - """Async version of _handle_chat_command for use in async chat_command.""" - # For now, just call the sync version - return self._handle_chat_command(command, interface) - - def _check_approval_needed(self, user_input: str) -> bool: - """Check if user input might trigger approval request.""" - # Simple heuristic - in real implementation, this would be detected - # from MaiInterface response indicating approval request - approval_keywords = [ - "create file", - "write file", - "execute code", - "run command", - "import os", - "subprocess", - "system call", - "file operation", - ] - - user_input_lower = user_input.lower() - return any(keyword in user_input_lower for keyword in approval_keywords) - - async def _handle_approval_workflow(self, user_input: str, interface) -> bool: - """Handle approval workflow for code execution within chat context.""" - if not self.approval_system: - print( - f"{Colors.YELLOW}⚠ Approval system unavailable - allowing execution{Colors.RESET}" - ) - return True - - try: - print(f"\n{Colors.CYAN}─── Approval Requested ───{Colors.RESET}") - print(f"{Colors.BOLD}Your request requires approval before execution{Colors.RESET}") - print(f"{Colors.DIM}This helps keep your system safe{Colors.RESET}\n") - - # Simulate code that would need approval (comes from MaiInterface in real implementation) - sample_code = f"# Simulated code based on: {user_input}\nprint('Hello, World!')" - - # Request approval from approval system - approval_result, decision = self.approval_system.request_approval(sample_code) - - if approval_result.value in ["blocked"]: - print( - f"{Colors.RED}🚫 This operation is blocked for security reasons{Colors.RESET}" - ) - print( - f"{Colors.YELLOW}Type your request differently or choose a safer approach{Colors.RESET}\n" - ) - return False - - # Display formatted approval request - formatted_request = format_approval_request(decision) - print(formatted_request) - - # Get user decision - user_response = interactive_approval_prompt(decision) - - # Process the result with appropriate context - if user_response == "details": - display_approval_diff(sample_code, decision.request.risk_analysis.risk_level) - # Re-prompt after showing details - user_response = interactive_approval_prompt(decision) - - success = process_approval_result(decision, user_response) - - if success: - print(f"\n{Colors.GREEN}✓ Approved - executing your request...{Colors.RESET}") - # Simulate execution with a brief delay - import time - - time.sleep(1) - print(f"{Colors.GREEN}✓ Execution completed successfully{Colors.RESET}\n") - else: - print( - f"\n{Colors.YELLOW}✓ Request rejected - your feedback helps me improve{Colors.RESET}\n" - ) - - return True # Always continue conversation after approval workflow - - except Exception as e: - print(f"{Colors.RED}Error in approval workflow: {e}{Colors.RESET}") - return True # Continue conversation even on error - - # Display formatted approval request - formatted_request = format_approval_request(decision) - print(formatted_request) - - # Get user decision - user_response = interactive_approval_prompt(decision) - - # Process the result - success = process_approval_result(decision, user_response) - - if success: - print(f"{Colors.GREEN}✓ Code executed successfully{Colors.RESET}") - return True - else: - print(f"{Colors.YELLOW}✓ Feedback recorded - conversation continues{Colors.RESET}") - return True # Continue conversation even after rejection - - except Exception as e: - print(f"{Colors.RED}Error in approval workflow: {e}{Colors.RESET}") - return False - - def ensure_interface(self) -> bool: - """Ensure interface is initialized.""" - if not self.interface: - if not self.initialize_interface(): - return False - return True - - -def main() -> None: - """Main CLI entry point.""" - parser = argparse.ArgumentParser( - description="Mai - Your AI collaborator", - formatter_class=argparse.RawDescriptionHelpFormatter, - epilog=""" -Examples: - %(prog)s --models List available models - %(prog)s --chat Start interactive chat - %(prog)s --chat --model llama3.2:1b Chat with specific model - %(prog)s --status Show system status - %(prog)s --test Run integration tests (placeholder) - """, - ) - - parser.add_argument( - "--models", action="store_true", help="List available models with capabilities" - ) - - parser.add_argument("--chat", action="store_true", help="Start interactive conversation mode") - - parser.add_argument( - "--status", action="store_true", help="Show system status and resource usage" - ) - - parser.add_argument( - "--test", action="store_true", help="Run integration tests (placeholder for now)" - ) - - parser.add_argument("--model", type=str, help="Specify model to use (overrides auto-selection)") - - parser.add_argument( - "--verbose", action="store_true", help="Enable detailed logging and debugging output" - ) - - parser.add_argument("--config", type=str, help="Path to configuration file") - - args = parser.parse_args() - - # Setup logging - setup_logging(args.verbose) - - # Create CLI instance - cli = MaiCLI(verbose=args.verbose) - - # Route to appropriate command - try: - if args.models: - cli.list_models_command() - elif args.chat: - # Run async chat_command with asyncio.run() - asyncio.run(cli.chat_command(model_override=args.model)) - elif args.status: - cli.status_command() - elif args.test: - cli.test_command() - else: - # Show help if no command specified - parser.print_help() - - except KeyboardInterrupt: - print(f"\n{Colors.YELLOW}Interrupted by user{Colors.RESET}") - sys.exit(0) - - except Exception as e: - print(f"{Colors.RED}Fatal error: {e}{Colors.RESET}") - if args.verbose: - import traceback - - traceback.print_exc() - sys.exit(1) - - -if __name__ == "__main__": - main() diff --git a/src/mai.log b/src/mai.log deleted file mode 100644 index 82930f7..0000000 --- a/src/mai.log +++ /dev/null @@ -1,2 +0,0 @@ -19:49:18 - mai.model.ollama_client - INFO - Ollama client initialized for http://localhost:11434 -19:49:18 - git.util - DEBUG - sys.platform='linux', git_executable='git' diff --git a/src/mai/conversation/__init__.py b/src/mai/conversation/__init__.py deleted file mode 100644 index ef51c4a..0000000 --- a/src/mai/conversation/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -""" -Conversation Engine Module for Mai - -This module provides a core conversation engine that orchestrates -multi-turn conversations with memory integration and natural timing. -""" - -from .engine import ConversationEngine -from .state import ConversationState -from .timing import TimingCalculator -from .reasoning import ReasoningEngine -from .decomposition import RequestDecomposer - -__all__ = [ - "ConversationEngine", - "ConversationState", - "TimingCalculator", - "ReasoningEngine", - "RequestDecomposer", -] diff --git a/src/mai/conversation/decomposition.py b/src/mai/conversation/decomposition.py deleted file mode 100644 index da640f8..0000000 --- a/src/mai/conversation/decomposition.py +++ /dev/null @@ -1,458 +0,0 @@ -""" -Request Decomposition and Clarification Engine for Mai - -Analyzes request complexity and generates appropriate clarifying questions -when user requests are ambiguous or overly complex. -""" - -import logging -import re -from typing import Dict, List, Optional, Any, Tuple - -logger = logging.getLogger(__name__) - - -class RequestDecomposer: - """ - Analyzes request complexity and generates clarifying questions. - - This engine identifies ambiguous requests, assesses complexity, - and generates specific clarifying questions to improve understanding. - """ - - def __init__(self): - """Initialize request decomposer with analysis patterns.""" - self.logger = logging.getLogger(__name__) - - # Ambiguity patterns to detect - self._ambiguity_patterns = { - "pronouns_without_antecedents": [ - r"\b(it|that|this|they|them|these|those)\b", - r"\b(he|she|it)\s+(?:is|was|were|will|would|could|should)", - ], - "vague_quantifiers": [ - r"\b(some|few|many|several|multiple|various|better|faster|more|less)\b", - r"\b(a bit|a little|quite|very|really|somewhat)\b", - ], - "missing_context": [ - r"\b(the|that|this|there)\s+(?:here|there)", - r"\b(?:from|about|regarding|concerning)\s+(?:it|that|this)", - ], - "undefined_references": [ - r"\b(?:fix|improve|update|change|modify)\s+(?:it|that|this)", - r"\b(?:do|make|create|build)\s+(?:it|that|this)", - ], - } - - # Complexity indicators - self._complexity_indicators = { - "technical_keywords": [ - "function", - "algorithm", - "database", - "api", - "class", - "method", - "variable", - "loop", - "conditional", - "recursion", - "optimization", - "debug", - "implement", - "integrate", - "configure", - "deploy", - ], - "multiple_tasks": [ - r"\band\b", - r"\bthen\b", - r"\bafter\b", - r"\balso\b", - r"\bnext\b", - r"\bfinally\b", - r"\badditionally\b", - ], - "question_density": r"[?!]", - "length_threshold": 150, # characters - } - - self.logger.info("RequestDecomposer initialized") - - def analyze_request(self, message: str) -> Dict[str, Any]: - """ - Analyze request for complexity and ambiguity. - - Args: - message: User message to analyze - - Returns: - Dictionary with analysis results including: - - needs_clarification: boolean - - complexity_score: float (0-1) - - estimated_steps: int - - clarification_questions: list - - ambiguity_indicators: list - """ - message_lower = message.lower().strip() - - # Detect ambiguities - ambiguity_indicators = self._detect_ambiguities(message_lower) - needs_clarification = len(ambiguity_indicators) > 0 - - # Calculate complexity score - complexity_score = self._calculate_complexity(message) - - # Estimate steps needed - estimated_steps = self._estimate_steps(message, complexity_score) - - # Generate clarification questions - clarification_questions = [] - if needs_clarification: - clarification_questions = self._generate_clarifications(message, ambiguity_indicators) - - return { - "needs_clarification": needs_clarification, - "complexity_score": complexity_score, - "estimated_steps": estimated_steps, - "clarification_questions": clarification_questions, - "ambiguity_indicators": ambiguity_indicators, - "message_length": len(message), - "word_count": len(message.split()), - } - - def _detect_ambiguities(self, message: str) -> List[Dict[str, Any]]: - """ - Detect specific ambiguity indicators in the message. - - Args: - message: Lowercase message to analyze - - Returns: - List of ambiguity indicators with details - """ - ambiguities = [] - - for category, patterns in self._ambiguity_patterns.items(): - for pattern in patterns: - matches = re.finditer(pattern, message, re.IGNORECASE) - for match in matches: - ambiguities.append( - { - "type": category, - "pattern": pattern, - "match": match.group(), - "position": match.start(), - "context": self._get_context(message, match.start(), match.end()), - } - ) - - return ambiguities - - def _get_context(self, message: str, start: int, end: int, window: int = 20) -> str: - """Get context around a match.""" - context_start = max(0, start - window) - context_end = min(len(message), end + window) - return message[context_start:context_end] - - def _calculate_complexity(self, message: str) -> float: - """ - Calculate complexity score based on multiple factors. - - Args: - message: Message to analyze - - Returns: - Complexity score between 0.0 (simple) and 1.0 (complex) - """ - complexity = 0.0 - - # Technical content (0.3 weight) - technical_count = sum( - 1 - for keyword in self._complexity_indicators["technical_keywords"] - if keyword.lower() in message.lower() - ) - technical_score = min(technical_count * 0.1, 0.3) - complexity += technical_score - - # Multiple tasks (0.25 weight) - task_matches = 0 - for pattern in self._complexity_indicators["multiple_tasks"]: - matches = len(re.findall(pattern, message, re.IGNORECASE)) - task_matches += matches - task_score = min(task_matches * 0.08, 0.25) - complexity += task_score - - # Question density (0.2 weight) - question_count = len(re.findall(self._complexity_indicators["question_density"], message)) - question_score = min(question_count * 0.05, 0.2) - complexity += question_score - - # Message length (0.15 weight) - length_score = min(len(message) / 500, 0.15) - complexity += length_score - - # Sentence complexity (0.1 weight) - sentences = message.split(".") - avg_sentence_length = sum(len(s.strip()) for s in sentences if s.strip()) / max( - len(sentences), 1 - ) - sentence_score = min(avg_sentence_length / 100, 0.1) - complexity += sentence_score - - return min(complexity, 1.0) - - def _estimate_steps(self, message: str, complexity_score: float) -> int: - """ - Estimate number of steps needed to fulfill request. - - Args: - message: Original message - complexity_score: Calculated complexity score - - Returns: - Estimated number of steps - """ - base_steps = 1 - - # Add steps for multiple tasks - task_count = 0 - for pattern in self._complexity_indicators["multiple_tasks"]: - matches = len(re.findall(pattern, message, re.IGNORECASE)) - task_count += matches - base_steps += max(0, task_count - 1) # First task is step 1 - - # Add steps for complexity - if complexity_score > 0.7: - base_steps += 3 # Complex requests need planning - elif complexity_score > 0.5: - base_steps += 2 # Medium complexity needs some breakdown - elif complexity_score > 0.3: - base_steps += 1 # Slightly complex might need clarification - - return max(1, base_steps) - - def _generate_clarifications( - self, message: str, ambiguity_indicators: List[Dict[str, Any]] - ) -> List[str]: - """ - Generate specific clarifying questions for detected ambiguities. - - Args: - message: Original message - ambiguity_indicators: List of detected ambiguities - - Returns: - List of clarifying questions - """ - questions = [] - seen_types = set() - - for indicator in ambiguity_indicators: - ambiguity_type = indicator["type"] - match = indicator["match"] - - # Avoid duplicate questions for same ambiguity type - if ambiguity_type in seen_types: - continue - seen_types.add(ambiguity_type) - - if ambiguity_type == "pronouns_without_antecedents": - if match.lower() in ["it", "that", "this"]: - questions.append(f"Could you clarify what '{match}' refers to specifically?") - elif match.lower() in ["they", "them", "these", "those"]: - questions.append(f"Could you specify who or what '{match}' refers to?") - - elif ambiguity_type == "vague_quantifiers": - if match.lower() in ["better", "faster", "more", "less"]: - questions.append(f"Could you quantify what '{match}' means in this context?") - elif match.lower() in ["some", "few", "many", "several"]: - questions.append( - f"Could you provide a specific number or amount instead of '{match}'?" - ) - else: - questions.append(f"Could you be more specific about what '{match}' means?") - - elif ambiguity_type == "missing_context": - questions.append(f"Could you provide more context about what '{match}' refers to?") - - elif ambiguity_type == "undefined_references": - questions.append(f"Could you clarify what you'd like me to {match} specifically?") - - return questions - - def suggest_breakdown( - self, - message: str, - complexity_score: float, - ollama_client=None, - current_model: str = "default", - ) -> Dict[str, Any]: - """ - Suggest logical breakdown for complex requests. - - Args: - message: Original user message - complexity_score: Calculated complexity - ollama_client: Optional OllamaClient for semantic analysis - current_model: Current model name - - Returns: - Dictionary with breakdown suggestions - """ - estimated_steps = self._estimate_steps(message, complexity_score) - - # Extract potential tasks from message - tasks = self._extract_tasks(message) - - breakdown = { - "estimated_steps": estimated_steps, - "complexity_level": self._get_complexity_level(complexity_score), - "suggested_approach": [], - "potential_tasks": tasks, - "effort_estimate": self._estimate_effort(complexity_score), - } - - # Generate approach suggestions - if complexity_score > 0.6: - breakdown["suggested_approach"].append( - "Start by clarifying requirements and breaking into smaller tasks" - ) - breakdown["suggested_approach"].append( - "Consider if this needs to be done in sequence or can be parallelized" - ) - elif complexity_score > 0.3: - breakdown["suggested_approach"].append( - "Break down into logical sub-tasks before starting" - ) - - # Use semantic analysis if available and request is very complex - if ollama_client and complexity_score > 0.7: - try: - semantic_breakdown = self._semantic_breakdown(message, ollama_client, current_model) - breakdown["semantic_analysis"] = semantic_breakdown - except Exception as e: - self.logger.warning(f"Semantic breakdown failed: {e}") - - return breakdown - - def _extract_tasks(self, message: str) -> List[str]: - """Extract potential tasks from message.""" - # Simple task extraction based on verbs and patterns - task_patterns = [ - r"(?:please\s+)?(?:can\s+you\s+)?(\w+)\s+(.+?)(?:\s+(?:and|then|after)\s+|$)", - r"(?:I\s+need|want)\s+(?:you\s+to\s+)?(.+?)(?:\s+(?:and|then|after)\s+|$)", - r"(?:help\s+me\s+)?(\w+)\s+(.+?)(?:\s+(?:and|then|after)\s+|$)", - ] - - tasks = [] - for pattern in task_patterns: - matches = re.findall(pattern, message, re.IGNORECASE) - for match in matches: - if isinstance(match, tuple): - # Take the verb/object combination - task = " ".join(filter(None, match)) - else: - task = str(match) - if len(task.strip()) > 3: # Filter out very short matches - tasks.append(task.strip()) - - return list(set(tasks)) # Remove duplicates - - def _get_complexity_level(self, score: float) -> str: - """Convert complexity score to human-readable level.""" - if score >= 0.7: - return "High" - elif score >= 0.4: - return "Medium" - else: - return "Low" - - def _estimate_effort(self, complexity_score: float) -> str: - """Estimate effort based on complexity.""" - if complexity_score >= 0.7: - return "Significant - may require multiple iterations" - elif complexity_score >= 0.4: - return "Moderate - should be straightforward with some planning" - else: - return "Minimal - should be quick to implement" - - def _semantic_breakdown(self, message: str, ollama_client, current_model: str) -> str: - """ - Use AI to perform semantic breakdown of complex request. - - Args: - message: User message to analyze - ollama_client: OllamaClient instance - current_model: Current model name - - Returns: - AI-generated breakdown suggestions - """ - semantic_prompt = f""" -Analyze this complex request and suggest a logical breakdown: "{message}" - -Provide a structured approach: -1. Identify the main objectives -2. Break down into logical steps -3. Note any dependencies or prerequisites -4. Suggest an order of execution - -Keep it concise and actionable. -""" - - try: - response = ollama_client.generate_response(semantic_prompt, current_model, []) - return self._clean_semantic_output(response) - except Exception as e: - self.logger.error(f"Semantic breakdown failed: {e}") - return "Unable to generate semantic breakdown" - - def _clean_semantic_output(self, output: str) -> str: - """Clean semantic breakdown output.""" - # Remove common AI response prefixes - prefixes_to_remove = [ - "Here's a breakdown:", - "Let me break this down:", - "I would approach this by:", - "Here's how I would break this down:", - ] - - for prefix in prefixes_to_remove: - if output.startswith(prefix): - output = output[len(prefix) :].strip() - break - - return output - - def get_analysis_summary(self, analysis: Dict[str, Any]) -> str: - """ - Get human-readable summary of request analysis. - - Args: - analysis: Result from analyze_request() - - Returns: - Formatted summary string - """ - summary_parts = [] - - if analysis["needs_clarification"]: - summary_parts.append("🤔 **Needs Clarification**") - summary_parts.append(f"- Questions: {len(analysis['clarification_questions'])}") - else: - summary_parts.append("✅ **Clear Request**") - - complexity_level = self._get_complexity_level(analysis["complexity_score"]) - summary_parts.append( - f"📊 **Complexity**: {complexity_level} ({analysis['complexity_score']:.2f})" - ) - summary_parts.append(f"📋 **Estimated Steps**: {analysis['estimated_steps']}") - - if analysis["ambiguity_indicators"]: - summary_parts.append( - f"⚠️ **Ambiguities Found**: {len(analysis['ambiguity_indicators'])}" - ) - - return "\n".join(summary_parts) diff --git a/src/mai/conversation/engine.py b/src/mai/conversation/engine.py deleted file mode 100644 index 3031340..0000000 --- a/src/mai/conversation/engine.py +++ /dev/null @@ -1,648 +0,0 @@ -""" -Core Conversation Engine for Mai - -This module provides the main conversation engine that orchestrates -multi-turn conversations with memory integration and natural timing. -""" - -import logging -import time -import uuid -from typing import Dict, List, Optional, Any, Tuple -from threading import Thread, Event -from dataclasses import dataclass - -from ..core.interface import MaiInterface -from ..memory.manager import MemoryManager -from ..models.conversation import Conversation as ModelConversation, Message -from .state import ConversationState, ConversationTurn -from .timing import TimingCalculator -from .reasoning import ReasoningEngine -from .decomposition import RequestDecomposer -from .interruption import InterruptHandler, TurnType - - -logger = logging.getLogger(__name__) - - -@dataclass -class ConversationResponse: - """Response from conversation processing with metadata.""" - - response: str - model_used: str - tokens_used: int - response_time: float - memory_context_used: int - timing_category: str - conversation_id: str - interruption_handled: bool = False - memory_integrated: bool = False - - -class ConversationEngine: - """ - Main conversation engine orchestrating multi-turn conversations. - - Integrates memory context retrieval, natural timing calculation, - reasoning transparency, request decomposition, interruption handling, - personality consistency, and conversation state management. - """ - - def __init__( - self, - mai_interface: Optional[MaiInterface] = None, - memory_manager: Optional[MemoryManager] = None, - timing_profile: str = "default", - debug_mode: bool = False, - enable_metrics: bool = True, - ): - """ - Initialize conversation engine with all subsystems. - - Args: - mai_interface: MaiInterface for model interaction - memory_manager: MemoryManager for context management - timing_profile: Timing profile ("default", "fast", "slow") - debug_mode: Enable debug logging and verbose output - enable_metrics: Enable performance metrics collection - """ - self.logger = logging.getLogger(__name__) - - # Configuration - self.timing_profile = timing_profile - self.debug_mode = debug_mode - self.enable_metrics = enable_metrics - - # Initialize components - self.mai_interface = mai_interface or MaiInterface() - self.memory_manager = memory_manager or MemoryManager() - - # Conversation state management - self.conversation_state = ConversationState() - - # Timing calculator for natural delays - self.timing_calculator = TimingCalculator(profile=timing_profile) - - # Reasoning engine for step-by-step explanations - self.reasoning_engine = ReasoningEngine() - - # Request decomposer for complex request analysis - self.request_decomposer = RequestDecomposer() - - # Interruption handler for graceful recovery - self.interrupt_handler = InterruptHandler() - - # Link conversation state with interrupt handler - self.interrupt_handler.set_conversation_state(self.conversation_state) - - # Processing state for thread safety - self.processing_threads: Dict[str, Thread] = {} - self.interruption_events: Dict[str, Event] = {} - self.current_processing: Dict[str, bool] = {} - - # Performance tracking - self.total_conversations = 0 - self.total_interruptions = 0 - self.start_time = time.time() - - self.logger.info( - f"ConversationEngine initialized with timing_profile='{timing_profile}', debug={debug_mode}" - ) - - def process_turn( - self, user_message: str, conversation_id: Optional[str] = None - ) -> ConversationResponse: - """ - Process a single conversation turn with complete subsystem integration. - - Args: - user_message: User's input message - conversation_id: Optional conversation ID for continuation - - Returns: - ConversationResponse with generated response and metadata - """ - start_time = time.time() - - # Start or get conversation - if conversation_id is None: - conversation_id = self.conversation_state.start_conversation() - else: - conversation_id = self.conversation_state.start_conversation(conversation_id) - - # Handle interruption if already processing - if self.conversation_state.is_processing(conversation_id): - return self._handle_interruption(conversation_id, user_message, start_time) - - # Set processing lock - self.conversation_state.set_processing(conversation_id, True) - self.current_processing[conversation_id] = True - - try: - self.logger.info(f"Processing conversation turn for {conversation_id}") - - # Check for reasoning request - is_reasoning_request = self.reasoning_engine.is_reasoning_request(user_message) - - # Analyze request complexity and decomposition needs - request_analysis = self.request_decomposer.analyze_request(user_message) - - # Handle clarification needs if request is ambiguous - if request_analysis["needs_clarification"] and not is_reasoning_request: - clarification_response = self._generate_clarification_response(request_analysis) - return ConversationResponse( - response=clarification_response, - model_used="clarification", - tokens_used=0, - response_time=time.time() - start_time, - memory_context_used=0, - timing_category="clarification", - conversation_id=conversation_id, - interruption_handled=False, - memory_integrated=False, - ) - - # Retrieve memory context with 1000 token budget - memory_context = self._retrieve_memory_context(user_message) - - # Build conversation history from state (last 10 turns) - conversation_history = self.conversation_state.get_history(conversation_id) - - # Build memory-augmented prompt - augmented_prompt = self._build_augmented_prompt( - user_message, memory_context, conversation_history - ) - - # Calculate natural response delay based on cognitive load - context_complexity = len(str(memory_context)) if memory_context else 0 - response_delay = self.timing_calculator.calculate_response_delay( - user_message, context_complexity - ) - - # Apply natural delay for human-like interaction - if not self.debug_mode: - self.logger.info(f"Applying {response_delay:.2f}s delay for natural timing") - time.sleep(response_delay) - - # Generate response with optional reasoning - if is_reasoning_request: - # Use reasoning engine for reasoning requests - current_model = getattr(self.mai_interface, "current_model", "unknown") - if current_model is None: - current_model = "unknown" - reasoning_response = self.reasoning_engine.generate_response_with_reasoning( - user_message, - self.mai_interface.ollama_client, - current_model, - conversation_history, - ) - interface_response = { - "response": reasoning_response["response"], - "model_used": reasoning_response["model_used"], - "tokens": reasoning_response.get("tokens_used", 0), - "response_time": response_delay, - } - else: - # Standard response generation - interface_response = self.mai_interface.send_message( - user_message, conversation_history - ) - - # Extract response details - ai_response = interface_response.get( - "response", "I apologize, but I couldn't generate a response." - ) - model_used = interface_response.get("model_used", "unknown") - tokens_used = interface_response.get("tokens", 0) - - # Store conversation turn in memory - self._store_conversation_turn( - conversation_id, user_message, ai_response, interface_response - ) - - # Create conversation turn with all metadata - turn = ConversationTurn( - conversation_id=conversation_id, - user_message=user_message, - ai_response=ai_response, - timestamp=start_time, - model_used=model_used, - tokens_used=tokens_used, - response_time=response_delay, - memory_context_applied=bool(memory_context), - ) - - # Add turn to conversation state - self.conversation_state.add_turn(turn) - - # Calculate response time and timing category - total_response_time = time.time() - start_time - complexity_score = self.timing_calculator.get_complexity_score( - user_message, context_complexity - ) - if complexity_score < 0.3: - timing_category = "simple" - elif complexity_score < 0.7: - timing_category = "medium" - else: - timing_category = "complex" - - # Create comprehensive response object - response = ConversationResponse( - response=ai_response, - model_used=model_used, - tokens_used=tokens_used, - response_time=total_response_time, - memory_context_used=len(memory_context) if memory_context else 0, - timing_category=timing_category, - conversation_id=conversation_id, - memory_integrated=bool(memory_context), - interruption_handled=False, - ) - - self.total_conversations += 1 - self.logger.info(f"Conversation turn completed for {conversation_id}") - - return response - - except Exception as e: - return ConversationResponse( - response=f"I understand you want to move on. Let me help you with that.", - model_used="error", - tokens_used=0, - response_time=time.time() - start_time, - memory_context_used=0, - timing_category="interruption", - conversation_id=conversation_id, - interruption_handled=True, - memory_integrated=False, - ) - - def _generate_clarification_response(self, request_analysis: Dict[str, Any]) -> str: - """ - Generate clarifying response for ambiguous requests. - - Args: - request_analysis: Analysis from RequestDecomposer - - Returns: - Clarifying response string - """ - questions = request_analysis.get("clarification_questions", []) - if not questions: - return "Could you please provide more details about your request?" - - response_parts = ["I need some clarification to help you better:"] - for i, question in enumerate(questions, 1): - response_parts.append(f"{i}. {question}") - - response_parts.append("\nPlease provide the missing information and I'll be happy to help!") - return "\n".join(response_parts) - - def _retrieve_memory_context(self, user_message: str) -> Optional[Dict[str, Any]]: - """ - Retrieve relevant memory context for user message. - - Uses 1000 token budget as specified in requirements. - """ - try: - if not self.memory_manager: - return None - - # Get context with 1000 token budget and 3 max results - context = self.memory_manager.get_context( - query=user_message, max_tokens=1000, max_results=3 - ) - - self.logger.debug( - f"Retrieved {len(context.get('relevant_conversations', []))} relevant conversations" - ) - return context - - except Exception as e: - self.logger.warning(f"Failed to retrieve memory context: {e}") - return None - - def _build_augmented_prompt( - self, - user_message: str, - memory_context: Optional[Dict[str, Any]], - conversation_history: List[Dict[str, str]], - ) -> str: - """ - Build memory-augmented prompt for model interaction. - - Integrates context and history as specified in requirements. - """ - prompt_parts = [] - - # Add memory context if available - if memory_context and memory_context.get("relevant_conversations"): - context_text = "Context from previous conversations:\n" - for conv in memory_context["relevant_conversations"][:2]: # Limit to 2 most relevant - context_text += f"- {conv['title']}: {conv['excerpt']}\n" - prompt_parts.append(context_text) - - # Add conversation history - if conversation_history: - history_text = "\nRecent conversation:\n" - for msg in conversation_history[-10:]: # Last 10 turns - role = msg["role"] - content = msg["content"][:200] # Truncate long messages - history_text += f"{role}: {content}\n" - prompt_parts.append(history_text) - - # Add current user message - prompt_parts.append(f"User: {user_message}") - - return "\n\n".join(prompt_parts) - - def _store_conversation_turn( - self, - conversation_id: str, - user_message: str, - ai_response: str, - interface_response: Dict[str, Any], - ) -> None: - """ - Store conversation turn in memory using MemoryManager. - - Creates structured conversation data for persistence. - """ - try: - if not self.memory_manager: - return - - # Build conversation messages for storage - conversation_messages = [] - - # Add context and history if available - if interface_response.get("memory_context_used", 0) > 0: - memory_context_msg = { - "role": "system", - "content": "Using memory context from previous conversations", - } - conversation_messages.append(memory_context_msg) - - # Add current turn - conversation_messages.extend( - [ - {"role": "user", "content": user_message}, - {"role": "assistant", "content": ai_response}, - ] - ) - - # Store in memory with metadata - turn_metadata = { - "conversation_id": conversation_id, - "model_used": interface_response.get("model_used", "unknown"), - "response_time": interface_response.get("response_time", 0), - "tokens": interface_response.get("tokens", 0), - "memory_context_applied": interface_response.get("memory_context_used", 0) > 0, - "timestamp": time.time(), - "engine_version": "conversation-engine-v1", - } - - conv_id = self.memory_manager.store_conversation( - messages=conversation_messages, metadata=turn_metadata - ) - - self.logger.debug(f"Stored conversation turn in memory: {conv_id}") - - except Exception as e: - self.logger.warning(f"Failed to store conversation turn: {e}") - - def _handle_interruption( - self, conversation_id: str, new_message: str, start_time: float - ) -> ConversationResponse: - """ - Handle user interruption during processing. - - Clears pending response and restarts with new context using InterruptHandler. - """ - self.logger.info(f"Handling interruption for conversation {conversation_id}") - self.total_interruptions += 1 - - # Create interruption context - interrupt_context = self.interrupt_handler.interrupt_and_restart( - new_message=new_message, - conversation_id=conversation_id, - turn_type=TurnType.USER_INPUT, - reason="user_input", - ) - - # Restart processing with new message (immediate response for interruption) - try: - interface_response = self.mai_interface.send_message( - new_message, self.conversation_state.get_history(conversation_id) - ) - - return ConversationResponse( - response=interface_response.get( - "response", "I understand you want to move on. How can I help you?" - ), - model_used=interface_response.get("model_used", "unknown"), - tokens_used=interface_response.get("tokens", 0), - response_time=time.time() - start_time, - memory_context_used=0, - timing_category="interruption", - conversation_id=conversation_id, - interruption_handled=True, - memory_integrated=False, - ) - - except Exception as e: - return ConversationResponse( - response=f"I understand you want to move on. Let me help you with that.", - model_used="error", - tokens_used=0, - response_time=time.time() - start_time, - memory_context_used=0, - timing_category="interruption", - conversation_id=conversation_id, - interruption_handled=True, - memory_integrated=False, - ) - - def get_conversation_history( - self, conversation_id: str, limit: int = 10 - ) -> List[ConversationTurn]: - """Get conversation history for a specific conversation.""" - return self.conversation_state.get_conversation_turns(conversation_id)[-limit:] - - def get_engine_stats(self) -> Dict[str, Any]: - """Get engine performance statistics.""" - uptime = time.time() - self.start_time - - return { - "uptime_seconds": uptime, - "total_conversations": self.total_conversations, - "total_interruptions": self.total_interruptions, - "active_conversations": len(self.conversation_state.conversations), - "average_response_time": 0.0, # Would be calculated from actual responses - "memory_integration_rate": 0.0, # Would be calculated from actual responses - } - - def calculate_response_delay( - self, user_message: str, context_complexity: Optional[int] = None - ) -> float: - """ - Calculate natural response delay using TimingCalculator. - - Args: - user_message: User message to analyze - context_complexity: Optional context complexity - - Returns: - Response delay in seconds - """ - return self.timing_calculator.calculate_response_delay(user_message, context_complexity) - - def is_reasoning_request(self, user_message: str) -> bool: - """ - Check if user is requesting reasoning explanation. - - Args: - user_message: User message to analyze - - Returns: - True if this appears to be a reasoning request - """ - return self.reasoning_engine.is_reasoning_request(user_message) - - def generate_response_with_reasoning( - self, user_message: str, conversation_history: List[Dict[str, str]] - ) -> Dict[str, Any]: - """ - Generate response with step-by-step reasoning explanation. - - Args: - user_message: Original user message - conversation_history: Conversation context - - Returns: - Dictionary with reasoning-enhanced response - """ - current_model = getattr(self.mai_interface, "current_model", "unknown") - if current_model is None: - current_model = "unknown" - - return self.reasoning_engine.generate_response_with_reasoning( - user_message, self.mai_interface.ollama_client, current_model, conversation_history - ) - - def analyze_request_complexity(self, user_message: str) -> Dict[str, Any]: - """ - Analyze request complexity and decomposition needs. - - Args: - user_message: User message to analyze - - Returns: - Request analysis dictionary - """ - return self.request_decomposer.analyze_request(user_message) - - def check_interruption(self, conversation_id: str) -> bool: - """ - Check if interruption has occurred for a conversation. - - Args: - conversation_id: ID of conversation to check - - Returns: - True if interruption detected - """ - return self.interrupt_handler.check_interruption(conversation_id) - - def interrupt_and_restart( - self, new_message: str, conversation_id: str, reason: str = "user_input" - ) -> Dict[str, Any]: - """ - Handle interruption and restart conversation. - - Args: - new_message: New message that triggered interruption - conversation_id: ID of conversation - reason: Reason for interruption - - Returns: - Interruption context dictionary - """ - interrupt_context = self.interrupt_handler.interrupt_and_restart( - new_message=new_message, - conversation_id=conversation_id, - turn_type=TurnType.USER_INPUT, - reason=reason, - ) - return interrupt_context.to_dict() - - def needs_clarification(self, request_analysis: Dict[str, Any]) -> bool: - """ - Check if request needs clarification. - - Args: - request_analysis: Request analysis result - - Returns: - True if clarification is needed - """ - return request_analysis.get("needs_clarification", False) - - def suggest_breakdown(self, user_message: str, complexity_score: float) -> Dict[str, Any]: - """ - Suggest logical breakdown for complex requests. - - Args: - user_message: Original user message - complexity_score: Complexity score from analysis - - Returns: - Breakdown suggestions dictionary - """ - return self.request_decomposer.suggest_breakdown( - user_message, - complexity_score, - self.mai_interface.ollama_client, - getattr(self.mai_interface, "current_model", "default"), - ) - - def adapt_response_with_personality( - self, response: str, user_message: str, context_type: Optional[str] = None - ) -> str: - """ - Adapt response based on personality guidelines. - - Args: - response: Generated response to adapt - user_message: Original user message for context - context_type: Type of conversation context - - Returns: - Personality-adapted response - """ - # For now, return original response - # Personality integration will be implemented in Phase 9 - return response - - def cleanup(self, max_age_hours: int = 24) -> None: - """Clean up old conversations and resources.""" - self.conversation_state.cleanup_old_conversations(max_age_hours) - self.logger.info(f"Cleaned up conversations older than {max_age_hours} hours") - - def shutdown(self) -> None: - """Shutdown conversation engine gracefully.""" - self.logger.info("Shutting down ConversationEngine...") - - # Cancel any processing threads - for conv_id, thread in self.processing_threads.items(): - if thread.is_alive(): - if conv_id in self.interruption_events: - self.interruption_events[conv_id].set() - thread.join(timeout=1.0) - - # Cleanup resources - self.cleanup() - - self.logger.info("ConversationEngine shutdown complete") diff --git a/src/mai/conversation/interruption.py b/src/mai/conversation/interruption.py deleted file mode 100644 index 573c536..0000000 --- a/src/mai/conversation/interruption.py +++ /dev/null @@ -1,333 +0,0 @@ -""" -Interruption Handling for Mai Conversations - -Provides graceful interruption handling during conversation processing -with thread-safe operations and conversation restart capabilities. -""" - -import logging -import threading -import time -import uuid -from typing import Dict, List, Optional, Any, Callable -from dataclasses import dataclass -from enum import Enum - -# Import conversation state for integration -try: - from .state import ConversationState -except ImportError: - # Fallback for standalone usage - ConversationState = None - -logger = logging.getLogger(__name__) - - -class TurnType(Enum): - """Types of conversation turns for different input sources.""" - - USER_INPUT = "user_input" - SELF_REFLECTION = "self_reflection" - CODE_EXECUTION = "code_execution" - SYSTEM_NOTIFICATION = "system_notification" - - -@dataclass -class InterruptionContext: - """Context for conversation interruption and restart.""" - - interruption_id: str - original_message: str - new_message: str - conversation_id: str - turn_type: TurnType - timestamp: float - processing_time: float - reason: str = "user_input" - - def to_dict(self) -> Dict[str, Any]: - """Convert to dictionary for serialization.""" - return { - "interruption_id": self.interruption_id, - "original_message": self.original_message, - "new_message": self.new_message, - "conversation_id": self.conversation_id, - "turn_type": self.turn_type.value, - "timestamp": self.timestamp, - "processing_time": self.processing_time, - "reason": self.reason, - } - - -class InterruptHandler: - """ - Manages graceful conversation interruptions and restarts. - - Provides thread-safe interruption detection, context preservation, - and timeout-based protection for long-running operations. - """ - - def __init__(self, timeout_seconds: float = 30.0): - """ - Initialize interruption handler. - - Args: - timeout_seconds: Maximum processing time before auto-interruption - """ - self.timeout_seconds = timeout_seconds - self.interrupt_flag = False - self.processing_lock = threading.RLock() - self.state_lock = threading.RLock() - - # Track active processing contexts - self.active_contexts: Dict[str, Dict[str, Any]] = {} - - # Conversation state integration - self.conversation_state: Optional[ConversationState] = None - - # Statistics - self.interruption_count = 0 - self.timeout_count = 0 - - self.logger = logging.getLogger(__name__) - self.logger.info(f"InterruptHandler initialized with {timeout_seconds}s timeout") - - def set_conversation_state(self, conversation_state: ConversationState) -> None: - """ - Set conversation state for integration. - - Args: - conversation_state: ConversationState instance for context management - """ - with self.state_lock: - self.conversation_state = conversation_state - self.logger.debug("Conversation state integrated") - - def start_processing( - self, - message: str, - conversation_id: str, - turn_type: TurnType = TurnType.USER_INPUT, - context: Optional[Dict[str, Any]] = None, - ) -> str: - """ - Start processing a conversation turn. - - Args: - message: Message being processed - conversation_id: ID of conversation - turn_type: Type of conversation turn - context: Additional processing context - - Returns: - Processing context ID for tracking - """ - processing_id = str(uuid.uuid4()) - start_time = time.time() - - with self.processing_lock: - self.active_contexts[processing_id] = { - "message": message, - "conversation_id": conversation_id, - "turn_type": turn_type, - "context": context or {}, - "start_time": start_time, - "timeout_timer": None, - } - - # Reset interruption flag for new processing - self.interrupt_flag = False - - self.logger.debug( - f"Started processing {processing_id}: {turn_type.value} for conversation {conversation_id}" - ) - return processing_id - - def check_interruption(self, processing_id: Optional[str] = None) -> bool: - """ - Check if interruption occurred during processing. - - Args: - processing_id: Specific processing context to check (optional) - - Returns: - True if interruption detected, False otherwise - """ - with self.processing_lock: - # Check global interruption flag - was_interrupted = self.interrupt_flag - - # Check timeout for active contexts - if processing_id and processing_id in self.active_contexts: - context = self.active_contexts[processing_id] - elapsed = time.time() - context["start_time"] - - if elapsed > self.timeout_seconds: - self.logger.info(f"Processing timeout for {processing_id} after {elapsed:.1f}s") - self.timeout_count += 1 - was_interrupted = True - - # Reset flag after checking - if was_interrupted: - self.interrupt_flag = False - self.interruption_count += 1 - - return was_interrupted - - def interrupt_and_restart( - self, - new_message: str, - conversation_id: str, - turn_type: TurnType = TurnType.USER_INPUT, - reason: str = "user_input", - ) -> InterruptionContext: - """ - Handle interruption and prepare for restart. - - Args: - new_message: New message that triggered interruption - conversation_id: ID of conversation - turn_type: Type of new conversation turn - reason: Reason for interruption - - Returns: - InterruptionContext with restart information - """ - interruption_id = str(uuid.uuid4()) - current_time = time.time() - - with self.processing_lock: - # Find the active processing context for this conversation - active_context = None - original_message = "" - processing_time = 0.0 - - for proc_id, context in self.active_contexts.items(): - if context["conversation_id"] == conversation_id: - active_context = context - processing_time = current_time - context["start_time"] - original_message = context["message"] - break - - # Set interruption flag - self.interrupt_flag = True - - # Clear pending response from conversation state - if self.conversation_state: - self.conversation_state.clear_pending_response(conversation_id) - - # Create interruption context - interruption_context = InterruptionContext( - interruption_id=interruption_id, - original_message=original_message, - new_message=new_message, - conversation_id=conversation_id, - turn_type=turn_type, - timestamp=current_time, - processing_time=processing_time, - reason=reason, - ) - - self.logger.info( - f"Interruption {interruption_id} for conversation {conversation_id}: {reason}" - ) - - return interruption_context - - def finish_processing(self, processing_id: str) -> None: - """ - Mark processing as complete and cleanup context. - - Args: - processing_id: Processing context ID to finish - """ - with self.processing_lock: - if processing_id in self.active_contexts: - context = self.active_contexts[processing_id] - elapsed = time.time() - context["start_time"] - - del self.active_contexts[processing_id] - - self.logger.debug(f"Finished processing {processing_id} in {elapsed:.2f}s") - - def get_active_processing(self, conversation_id: Optional[str] = None) -> List[Dict[str, Any]]: - """ - Get currently active processing contexts. - - Args: - conversation_id: Filter by specific conversation (optional) - - Returns: - List of active processing contexts - """ - with self.processing_lock: - active = [] - for proc_id, context in self.active_contexts.items(): - if conversation_id is None or context["conversation_id"] == conversation_id: - active_context = context.copy() - active_context["processing_id"] = proc_id - active_context["elapsed"] = time.time() - context["start_time"] - active.append(active_context) - - return active - - def cleanup_stale_processing(self, max_age_seconds: float = 300.0) -> int: - """ - Clean up stale processing contexts. - - Args: - max_age_seconds: Maximum age before cleanup - - Returns: - Number of contexts cleaned up - """ - current_time = time.time() - stale_contexts = [] - - with self.processing_lock: - for proc_id, context in self.active_contexts.items(): - elapsed = current_time - context["start_time"] - if elapsed > max_age_seconds: - stale_contexts.append(proc_id) - - for proc_id in stale_contexts: - del self.active_contexts[proc_id] - - if stale_contexts: - self.logger.info(f"Cleaned up {len(stale_contexts)} stale processing contexts") - - return len(stale_contexts) - - def get_statistics(self) -> Dict[str, Any]: - """ - Get interruption handler statistics. - - Returns: - Dictionary with performance and usage statistics - """ - with self.processing_lock: - return { - "interruption_count": self.interruption_count, - "timeout_count": self.timeout_count, - "active_processing_count": len(self.active_contexts), - "timeout_seconds": self.timeout_seconds, - "last_activity": time.time(), - } - - def configure_timeout(self, timeout_seconds: float) -> None: - """ - Update timeout configuration. - - Args: - timeout_seconds: New timeout value in seconds - """ - with self.state_lock: - self.timeout_seconds = max(5.0, timeout_seconds) # Minimum 5 seconds - self.logger.info(f"Timeout updated to {self.timeout_seconds}s") - - def reset_statistics(self) -> None: - """Reset interruption handler statistics.""" - with self.state_lock: - self.interruption_count = 0 - self.timeout_count = 0 - self.logger.info("Interruption statistics reset") diff --git a/src/mai/conversation/reasoning.py b/src/mai/conversation/reasoning.py deleted file mode 100644 index a720d6e..0000000 --- a/src/mai/conversation/reasoning.py +++ /dev/null @@ -1,284 +0,0 @@ -""" -Reasoning Transparency Engine for Mai - -Provides step-by-step reasoning explanations when explicitly requested -by users, with caching for performance optimization. -""" - -import logging -import hashlib -import time -from typing import Dict, List, Optional, Any, Tuple -from datetime import datetime, timedelta - -logger = logging.getLogger(__name__) - - -class ReasoningEngine: - """ - Provides reasoning transparency and step-by-step explanations. - - This engine detects when users explicitly ask for reasoning explanations - and generates detailed step-by-step breakdowns of Mai's thought process. - """ - - def __init__(self): - """Initialize reasoning engine with caching.""" - self.logger = logging.getLogger(__name__) - - # Cache for reasoning explanations to avoid recomputation - self._reasoning_cache: Dict[str, Dict[str, Any]] = {} - self._cache_duration = timedelta(hours=24) - - # Keywords that indicate reasoning requests - self._reasoning_keywords = [ - "how did you", - "explain your reasoning", - "step by step", - "why", - "process", - "how do you know", - "what makes you think", - "show your work", - "walk through", - "break down", - "explain your logic", - "how did you arrive", - "what's your reasoning", - "explain yourself", - ] - - self.logger.info("ReasoningEngine initialized") - - def is_reasoning_request(self, message: str) -> bool: - """ - Detect when user explicitly asks for reasoning explanation. - - Args: - message: User message to analyze - - Returns: - True if this appears to be a reasoning request - """ - message_lower = message.lower().strip() - - # Check for reasoning keywords - for keyword in self._reasoning_keywords: - if keyword in message_lower: - self.logger.debug(f"Reasoning request detected via keyword: {keyword}") - return True - - # Check for question patterns asking about process - reasoning_patterns = [ - r"how did you", - r"why.*you.*\?", - r"what.*your.*process", - r"can you.*explain.*your", - r"show.*your.*work", - r"explain.*how.*you", - r"what.*your.*reasoning", - r"walk.*through.*your", - ] - - import re - - for pattern in reasoning_patterns: - if re.search(pattern, message_lower): - self.logger.debug(f"Reasoning request detected via pattern: {pattern}") - return True - - return False - - def _get_cache_key(self, message: str) -> str: - """Generate cache key based on message content hash.""" - return hashlib.md5(message.encode()).hexdigest() - - def _is_cache_valid(self, cache_entry: Optional[Dict[str, Any]]) -> bool: - """Check if cache entry is still valid.""" - if not cache_entry: - return False - - cached_time = cache_entry.get("timestamp") - if not cached_time: - return False - - return datetime.now() - cached_time < self._cache_duration - - def generate_response_with_reasoning( - self, - user_message: str, - ollama_client, - current_model: str, - context: Optional[List[Dict[str, Any]]] = None, - show_reasoning: bool = False, - ) -> Dict[str, Any]: - """ - Generate response with optional step-by-step reasoning explanation. - - Args: - user_message: Original user message - ollama_client: OllamaClient instance for generating responses - current_model: Current model name - context: Conversation context - show_reasoning: Whether to include reasoning explanation - - Returns: - Dictionary with response, reasoning (if requested), and metadata - """ - # Check cache first - cache_key = self._get_cache_key(user_message) - cached_entry = self._reasoning_cache.get(cache_key) - - if ( - cached_entry - and self._is_cache_valid(cached_entry) - and cached_entry.get("message") == user_message - ): - self.logger.debug("Using cached reasoning response") - return cached_entry["response"] - - # Detect if this is a reasoning request - is_reasoning = show_reasoning or self.is_reasoning_request(user_message) - - try: - # Generate standard response - standard_response = ollama_client.generate_response( - user_message, current_model, context or [] - ) - - response_data = { - "response": standard_response, - "model_used": current_model, - "show_reasoning": is_reasoning, - "reasoning": None, - "format": "standard", - } - - # Generate reasoning explanation if requested - if is_reasoning: - reasoning = self._generate_reasoning_explanation( - user_message, standard_response, ollama_client, current_model - ) - response_data["reasoning"] = reasoning - response_data["format"] = "with_reasoning" - - # Format response with reasoning - formatted_response = self.format_reasoning_response(standard_response, reasoning) - response_data["response"] = formatted_response - - # Cache the response - self._reasoning_cache[cache_key] = { - "message": user_message, - "response": response_data, - "timestamp": datetime.now(), - } - - self.logger.info(f"Generated response with reasoning={is_reasoning}") - return response_data - - except Exception as e: - self.logger.error(f"Failed to generate response with reasoning: {e}") - raise - - def _generate_reasoning_explanation( - self, user_message: str, standard_response: str, ollama_client, current_model: str - ) -> str: - """ - Generate step-by-step reasoning explanation. - - Args: - user_message: Original user question - standard_response: The response that was generated - ollama_client: OllamaClient for generating reasoning - current_model: Current model name - - Returns: - Formatted reasoning explanation as numbered steps - """ - reasoning_prompt = f""" -Explain your reasoning step by step for answering: "{user_message}" - -Your final answer was: "{standard_response}" - -Please explain your reasoning process: -1. Start by understanding what the user is asking -2. Break down the key components of the question -3. Explain your thought process step by step -4. Show how you arrived at your conclusion -5. End with "Final answer:" followed by your actual response - -Format as clear numbered steps. Be detailed but concise. -""" - - try: - reasoning = ollama_client.generate_response(reasoning_prompt, current_model, []) - return self._clean_reasoning_output(reasoning) - - except Exception as e: - self.logger.error(f"Failed to generate reasoning explanation: {e}") - return f"I apologize, but I encountered an error generating my reasoning explanation. My response was: {standard_response}" - - def _clean_reasoning_output(self, reasoning: str) -> str: - """Clean and format reasoning output.""" - # Remove any redundant prefixes - reasoning = reasoning.strip() - - # Remove common AI response prefixes - prefixes_to_remove = [ - "Here's my reasoning:", - "My reasoning is:", - "Let me explain my reasoning:", - "I'll explain my reasoning step by step:", - ] - - for prefix in prefixes_to_remove: - if reasoning.startswith(prefix): - reasoning = reasoning[len(prefix) :].strip() - break - - return reasoning - - def format_reasoning_response(self, response: str, reasoning: str) -> str: - """ - Format reasoning with clear separation from main answer. - - Args: - response: The actual response - reasoning: The reasoning explanation - - Returns: - Formatted response with reasoning section - """ - # Clean up any existing formatting - reasoning = self._clean_reasoning_output(reasoning) - - # Format with clear separation - formatted = f"""## 🧠 My Reasoning Process - -{reasoning} - ---- -## 💬 My Response - -{response}""" - - return formatted - - def clear_cache(self) -> None: - """Clear reasoning cache.""" - self._reasoning_cache.clear() - self.logger.info("Reasoning cache cleared") - - def get_cache_stats(self) -> Dict[str, Any]: - """Get reasoning cache statistics.""" - total_entries = len(self._reasoning_cache) - valid_entries = sum( - 1 for entry in self._reasoning_cache.values() if self._is_cache_valid(entry) - ) - - return { - "total_entries": total_entries, - "valid_entries": valid_entries, - "cache_duration_hours": self._cache_duration.total_seconds() / 3600, - "last_cleanup": datetime.now().isoformat(), - } diff --git a/src/mai/conversation/state.py b/src/mai/conversation/state.py deleted file mode 100644 index 93b5fbc..0000000 --- a/src/mai/conversation/state.py +++ /dev/null @@ -1,386 +0,0 @@ -""" -Conversation State Management for Mai - -Provides turn-by-turn conversation history with proper session isolation, -interruption handling, and context window management. -""" - -import logging -import time -import threading -import uuid -from typing import Dict, List, Optional, Any -from dataclasses import dataclass, field -from datetime import datetime - -# Import existing conversation models for consistency -try: - from ..models.conversation import Message, Conversation -except ImportError: - # Fallback if models not available yet - Message = None - Conversation = None - -logger = logging.getLogger(__name__) - - -@dataclass -class ConversationTurn: - """Single conversation turn with comprehensive metadata.""" - - conversation_id: str - user_message: str - ai_response: str - timestamp: float - model_used: str - tokens_used: int - response_time: float - memory_context_applied: bool - - def to_dict(self) -> Dict[str, Any]: - """Convert to dictionary for serialization.""" - return { - "conversation_id": self.conversation_id, - "user_message": self.user_message, - "ai_response": self.ai_response, - "timestamp": self.timestamp, - "model_used": self.model_used, - "tokens_used": self.tokens_used, - "response_time": self.response_time, - "memory_context_applied": self.memory_context_applied, - } - - -class ConversationState: - """ - Manages conversation state across multiple sessions with proper isolation. - - Provides turn-by-turn history tracking, automatic cleanup, - thread-safe operations, and Ollama-compatible formatting. - """ - - def __init__(self, max_turns_per_conversation: int = 10): - """ - Initialize conversation state manager. - - Args: - max_turns_per_conversation: Maximum turns to keep per conversation - """ - self.conversations: Dict[str, List[ConversationTurn]] = {} - self.max_turns = max_turns_per_conversation - self._lock = threading.RLock() # Reentrant lock for nested calls - self.logger = logging.getLogger(__name__) - - self.logger.info( - f"ConversationState initialized with max {max_turns_per_conversation} turns per conversation" - ) - - def add_turn(self, turn: ConversationTurn) -> None: - """ - Add a conversation turn with automatic timestamp and cleanup. - - Args: - turn: ConversationTurn to add - """ - with self._lock: - conversation_id = turn.conversation_id - - # Initialize conversation if doesn't exist - if conversation_id not in self.conversations: - self.conversations[conversation_id] = [] - self.logger.debug(f"Created new conversation: {conversation_id}") - - # Add the turn - self.conversations[conversation_id].append(turn) - self.logger.debug( - f"Added turn to conversation {conversation_id}: {turn.tokens_used} tokens, {turn.response_time:.2f}s" - ) - - # Automatic cleanup: maintain last N turns - if len(self.conversations[conversation_id]) > self.max_turns: - # Remove oldest turns to maintain limit - excess_count = len(self.conversations[conversation_id]) - self.max_turns - removed_turns = self.conversations[conversation_id][:excess_count] - self.conversations[conversation_id] = self.conversations[conversation_id][ - excess_count: - ] - - self.logger.debug( - f"Cleaned up {excess_count} old turns from conversation {conversation_id}" - ) - - # Log removed turns for debugging - for removed_turn in removed_turns: - self.logger.debug( - f"Removed turn: {removed_turn.timestamp} - {removed_turn.user_message[:50]}..." - ) - - def get_history(self, conversation_id: str) -> List[Dict[str, str]]: - """ - Get conversation history in Ollama-compatible format. - - Args: - conversation_id: ID of conversation to retrieve - - Returns: - List of message dictionaries formatted for Ollama API - """ - with self._lock: - turns = self.conversations.get(conversation_id, []) - - # Convert to Ollama format: alternating user/assistant roles - history = [] - for turn in turns: - history.append({"role": "user", "content": turn.user_message}) - history.append({"role": "assistant", "content": turn.ai_response}) - - self.logger.debug( - f"Retrieved {len(history)} messages from conversation {conversation_id}" - ) - return history - - def set_conversation_history( - self, messages: List[Dict[str, str]], conversation_id: Optional[str] = None - ) -> None: - """ - Restore conversation history from session storage. - - Args: - messages: List of message dictionaries in Ollama format [{"role": "user/assistant", "content": "..."}] - conversation_id: Optional conversation ID to restore to (creates new if None) - """ - with self._lock: - if conversation_id is None: - conversation_id = str(uuid.uuid4()) - - # Clear existing conversation for this ID - self.conversations[conversation_id] = [] - - # Convert messages back to ConversationTurn objects - # Messages should be in pairs: user, assistant, user, assistant, ... - i = 0 - while i < len(messages): - # Expect user message first - if i >= len(messages) or messages[i].get("role") != "user": - self.logger.warning(f"Expected user message at index {i}, skipping") - i += 1 - continue - - user_message = messages[i].get("content", "") - i += 1 - - # Expect assistant message next - if i >= len(messages) or messages[i].get("role") != "assistant": - self.logger.warning(f"Expected assistant message at index {i}, skipping") - continue - - ai_response = messages[i].get("content", "") - i += 1 - - # Create ConversationTurn with estimated metadata - turn = ConversationTurn( - conversation_id=conversation_id, - user_message=user_message, - ai_response=ai_response, - timestamp=time.time(), # Use current time as approximation - model_used="restored", # Indicate this is from restoration - tokens_used=0, # Token count not available from session - response_time=0.0, # Response time not available from session - memory_context_applied=False, # Memory context not tracked in session - ) - - self.conversations[conversation_id].append(turn) - - self.logger.info( - f"Restored {len(self.conversations[conversation_id])} turns to conversation {conversation_id}" - ) - - def get_last_n_turns(self, conversation_id: str, n: int = 5) -> List[ConversationTurn]: - """ - Get the last N turns from a conversation. - - Args: - conversation_id: ID of conversation - n: Number of recent turns to retrieve - - Returns: - List of last N ConversationTurn objects - """ - with self._lock: - turns = self.conversations.get(conversation_id, []) - return turns[-n:] if n > 0 else [] - - def clear_pending_response(self, conversation_id: str) -> None: - """ - Clear any pending response for interruption handling. - - Args: - conversation_id: ID of conversation to clear - """ - with self._lock: - if conversation_id in self.conversations: - # Find and remove incomplete turns (those without AI response) - original_count = len(self.conversations[conversation_id]) - self.conversations[conversation_id] = [ - turn - for turn in self.conversations[conversation_id] - if turn.ai_response.strip() # Must have AI response - ] - - removed_count = original_count - len(self.conversations[conversation_id]) - if removed_count > 0: - self.logger.info( - f"Cleared {removed_count} incomplete turns from conversation {conversation_id}" - ) - - def start_conversation(self, conversation_id: Optional[str] = None) -> str: - """ - Start a new conversation or return existing ID. - - Args: - conversation_id: Optional existing conversation ID - - Returns: - Conversation ID (new or existing) - """ - with self._lock: - if conversation_id is None: - conversation_id = str(uuid.uuid4()) - - if conversation_id not in self.conversations: - self.conversations[conversation_id] = [] - self.logger.debug(f"Started new conversation: {conversation_id}") - - return conversation_id - - def is_processing(self, conversation_id: str) -> bool: - """ - Check if conversation is currently being processed. - - Args: - conversation_id: ID of conversation - - Returns: - True if currently processing, False otherwise - """ - with self._lock: - return hasattr(self, "_processing_locks") and conversation_id in getattr( - self, "_processing_locks", {} - ) - - def set_processing(self, conversation_id: str, processing: bool) -> None: - """ - Set processing lock for conversation. - - Args: - conversation_id: ID of conversation - processing: Processing state - """ - with self._lock: - if not hasattr(self, "_processing_locks"): - self._processing_locks = {} - self._processing_locks[conversation_id] = processing - - def get_conversation_turns(self, conversation_id: str) -> List[ConversationTurn]: - """ - Get all turns for a conversation. - - Args: - conversation_id: ID of conversation - - Returns: - List of ConversationTurn objects - """ - with self._lock: - return self.conversations.get(conversation_id, []) - - def delete_conversation(self, conversation_id: str) -> bool: - """ - Delete a conversation completely. - - Args: - conversation_id: ID of conversation to delete - - Returns: - True if conversation was deleted, False if not found - """ - with self._lock: - if conversation_id in self.conversations: - del self.conversations[conversation_id] - self.logger.info(f"Deleted conversation: {conversation_id}") - return True - return False - - def list_conversations(self) -> List[str]: - """ - List all active conversation IDs. - - Returns: - List of conversation IDs - """ - with self._lock: - return list(self.conversations.keys()) - - def get_conversation_stats(self, conversation_id: str) -> Dict[str, Any]: - """ - Get statistics for a specific conversation. - - Args: - conversation_id: ID of conversation - - Returns: - Dictionary with conversation statistics - """ - with self._lock: - turns = self.conversations.get(conversation_id, []) - - if not turns: - return { - "turn_count": 0, - "total_tokens": 0, - "total_response_time": 0.0, - "average_response_time": 0.0, - "average_tokens": 0.0, - } - - total_tokens = sum(turn.tokens_used for turn in turns) - total_response_time = sum(turn.response_time for turn in turns) - avg_response_time = total_response_time / len(turns) - avg_tokens = total_tokens / len(turns) - - return { - "turn_count": len(turns), - "total_tokens": total_tokens, - "total_response_time": total_response_time, - "average_response_time": avg_response_time, - "average_tokens": avg_tokens, - "oldest_timestamp": min(turn.timestamp for turn in turns), - "newest_timestamp": max(turn.timestamp for turn in turns), - } - - def cleanup_old_conversations(self, max_age_hours: float = 24.0) -> int: - """ - Clean up conversations older than specified age. - - Args: - max_age_hours: Maximum age in hours before cleanup - - Returns: - Number of conversations cleaned up - """ - with self._lock: - current_time = time.time() - cutoff_time = current_time - (max_age_hours * 3600) - - conversations_to_remove = [] - for conv_id, turns in self.conversations.items(): - if turns and turns[-1].timestamp < cutoff_time: - conversations_to_remove.append(conv_id) - - for conv_id in conversations_to_remove: - del self.conversations[conv_id] - - if conversations_to_remove: - self.logger.info(f"Cleaned up {len(conversations_to_remove)} old conversations") - - return len(conversations_to_remove) diff --git a/src/mai/conversation/timing.py b/src/mai/conversation/timing.py deleted file mode 100644 index 4e29460..0000000 --- a/src/mai/conversation/timing.py +++ /dev/null @@ -1,281 +0,0 @@ -""" -Natural Timing Calculation for Mai - -Provides human-like response delays based on cognitive load analysis -with natural variation to avoid robotic consistency. -""" - -import time -import random -import logging -from typing import Dict, Any, Optional - -logger = logging.getLogger(__name__) - - -class TimingCalculator: - """ - Calculates natural response delays based on cognitive load analysis. - - Generates human-like timing variation considering message complexity, - question count, technical content, and context depth. - """ - - def __init__(self, profile: str = "default"): - """ - Initialize timing calculator with specified profile. - - Args: - profile: Timing profile - "default", "fast", or "slow" - """ - self.profile = profile - self.logger = logging.getLogger(__name__) - - # Profile-specific multipliers - self.profiles = { - "default": {"base": 1.0, "variation": 0.3}, - "fast": {"base": 0.6, "variation": 0.2}, - "slow": {"base": 1.4, "variation": 0.4}, - } - - if profile not in self.profiles: - self.logger.warning(f"Unknown profile '{profile}', using 'default'") - self.profile = "default" - - self.profile_config = self.profiles[self.profile] - self.logger.info(f"TimingCalculator initialized with '{self.profile}' profile") - - def calculate_response_delay( - self, message: str, context_complexity: Optional[int] = None - ) -> float: - """ - Calculate natural response delay based on cognitive load. - - Args: - message: User message to analyze - context_complexity: Optional context complexity score - - Returns: - Response delay in seconds (1.0-8.0 range) - """ - # Analyze message complexity - complexity_score = self.get_complexity_score(message, context_complexity) - - # Determine base delay based on complexity category - if complexity_score < 0.3: - # Simple (low complexity) - base_delay = random.uniform(1.5, 2.5) - category = "simple" - elif complexity_score < 0.7: - # Medium (moderate complexity) - base_delay = random.uniform(2.0, 4.0) - category = "medium" - else: - # Complex (high complexity) - base_delay = random.uniform(3.0, 8.0) - category = "complex" - - # Apply profile multiplier - adjusted_delay = base_delay * self.profile_config["base"] - - # Add natural variation/jitter - variation_amount = adjusted_delay * self.profile_config["variation"] - jitter = random.uniform(-0.2, 0.2) # +/-0.2 seconds - final_delay = max(0.5, adjusted_delay + variation_amount + jitter) # Minimum 0.5s - - self.logger.debug( - f"Delay calculation: {category} complexity ({complexity_score:.2f}) -> {final_delay:.2f}s" - ) - - # Ensure within reasonable bounds - return min(max(final_delay, 0.5), 10.0) # 0.5s to 10s range - - def get_complexity_score(self, message: str, context_complexity: Optional[int] = None) -> float: - """ - Analyze message content for complexity indicators. - - Args: - message: Message to analyze - context_complexity: Optional context complexity from conversation history - - Returns: - Complexity score from 0.0 (simple) to 1.0 (complex) - """ - score = 0.0 - - # 1. Message length factor (0-0.3) - word_count = len(message.split()) - if word_count > 50: - score += 0.3 - elif word_count > 25: - score += 0.2 - elif word_count > 10: - score += 0.1 - - # 2. Question count factor (0-0.3) - question_count = message.count("?") - if question_count >= 3: - score += 0.3 - elif question_count >= 2: - score += 0.2 - elif question_count >= 1: - score += 0.1 - - # 3. Technical content indicators (0-0.3) - technical_keywords = [ - "function", - "class", - "algorithm", - "debug", - "implement", - "fix", - "error", - "optimization", - "performance", - "database", - "api", - "endpoint", - "method", - "parameter", - "variable", - "constant", - "import", - "export", - "async", - "await", - "promise", - "callback", - "recursive", - "iterative", - "hash", - "encryption", - "authentication", - "authorization", - "token", - "session", - ] - - technical_count = sum( - 1 for keyword in technical_keywords if keyword.lower() in message.lower() - ) - if technical_count >= 5: - score += 0.3 - elif technical_count >= 3: - score += 0.2 - elif technical_count >= 1: - score += 0.1 - - # 4. Code pattern indicators (0-0.2) - code_indicators = 0 - if "```" in message: - code_indicators += 1 - if "`" in message and message.count("`") >= 2: - code_indicators += 1 - if any( - word in message.lower() for word in ["def", "function", "class", "var", "let", "const"] - ): - code_indicators += 1 - if any(char in message for char in ["{}()\[\];"]): - code_indicators += 1 - - if code_indicators >= 1: - score += 0.1 - if code_indicators >= 2: - score += 0.1 - - # 5. Context complexity integration (0-0.2) - if context_complexity is not None: - if context_complexity > 1000: # High token context - score += 0.2 - elif context_complexity > 500: # Medium token context - score += 0.1 - - # Normalize to 0-1 range - normalized_score = min(score, 1.0) - - self.logger.debug( - f"Complexity analysis: score={normalized_score:.2f}, words={word_count}, questions={question_count}, technical={technical_count}" - ) - - return normalized_score - - def set_profile(self, profile: str) -> None: - """ - Change timing profile. - - Args: - profile: New profile name ("default", "fast", "slow") - """ - if profile in self.profiles: - self.profile = profile - self.profile_config = self.profiles[profile] - self.logger.info(f"Timing profile changed to '{profile}'") - else: - self.logger.warning( - f"Unknown profile '{profile}', keeping current profile '{self.profile}'" - ) - - def get_timing_stats(self, messages: list) -> Dict[str, Any]: - """ - Calculate timing statistics for a list of messages. - - Args: - messages: List of message dictionaries with timing info - - Returns: - Dictionary with timing statistics - """ - if not messages: - return { - "message_count": 0, - "average_delay": 0.0, - "min_delay": 0.0, - "max_delay": 0.0, - "total_delay": 0.0, - } - - delays = [] - total_delay = 0.0 - - for msg in messages: - if "response_time" in msg: - delays.append(msg["response_time"]) - total_delay += msg["response_time"] - - if delays: - return { - "message_count": len(messages), - "average_delay": total_delay / len(delays), - "min_delay": min(delays), - "max_delay": max(delays), - "total_delay": total_delay, - "profile": self.profile, - } - else: - return { - "message_count": len(messages), - "average_delay": 0.0, - "min_delay": 0.0, - "max_delay": 0.0, - "total_delay": 0.0, - "profile": self.profile, - } - - def get_profile_info(self) -> Dict[str, Any]: - """ - Get information about current timing profile. - - Returns: - Dictionary with profile configuration - """ - return { - "current_profile": self.profile, - "base_multiplier": self.profile_config["base"], - "variation_range": self.profile_config["variation"], - "available_profiles": list(self.profiles.keys()), - "description": { - "default": "Natural human-like timing with moderate variation", - "fast": "Reduced delays for quick interactions and testing", - "slow": "Extended delays for thoughtful, deliberate responses", - }.get(self.profile, "Unknown profile"), - } diff --git a/src/mai/core/__init__.py b/src/mai/core/__init__.py deleted file mode 100644 index e62239e..0000000 --- a/src/mai/core/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -""" -Mai Core Module - -This module provides core functionality and utilities for Mai, -including configuration management, exception handling, and shared -utilities used across the application. -""" - -# Import the real implementations instead of defining placeholders -from .exceptions import MaiError, ConfigurationError, ModelError -from .config import get_config - -__all__ = ["MaiError", "ConfigurationError", "ModelError", "get_config"] diff --git a/src/mai/core/config.py b/src/mai/core/config.py deleted file mode 100644 index 69e9010..0000000 --- a/src/mai/core/config.py +++ /dev/null @@ -1,738 +0,0 @@ -""" -Configuration management system for Mai. - -Handles loading, validation, and management of all Mai settings -with proper defaults and runtime updates. -""" - -import os -import json -import yaml -from typing import Dict, Any, Optional, Union -from dataclasses import dataclass, field, asdict -from pathlib import Path -import copy -import threading - -# Import exceptions -try: - from .exceptions import ConfigFileError, ConfigValidationError, ConfigMissingError -except ImportError: - # Define placeholder exceptions if module not available - class ConfigFileError(Exception): - pass - - class ConfigValidationError(Exception): - pass - - class ConfigMissingError(Exception): - pass - - -@dataclass -class ModelConfig: - """Model-specific configuration.""" - - preferred_models: list = field( - default_factory=lambda: ["llama2", "mistral", "codellama", "vicuna"] - ) - fallback_models: list = field(default_factory=lambda: ["llama2:7b", "mistral:7b", "phi"]) - resource_thresholds: Dict[str, float] = field( - default_factory=lambda: { - "cpu_warning": 0.8, - "cpu_critical": 0.95, - "ram_warning": 0.8, - "ram_critical": 0.95, - "gpu_warning": 0.9, - "gpu_critical": 0.98, - } - ) - context_windows: Dict[str, int] = field( - default_factory=lambda: { - "llama2": 4096, - "mistral": 8192, - "codellama": 16384, - "vicuna": 4096, - "phi": 2048, - } - ) - auto_switch: bool = True - switch_threshold: float = 0.7 # Performance degradation threshold - - -@dataclass -class ResourceConfig: - """Resource monitoring configuration.""" - - monitoring_enabled: bool = True - check_interval: float = 5.0 # seconds - trend_window: int = 60 # seconds for trend analysis - performance_history_size: int = 100 - gpu_detection: bool = True - fallback_detection: bool = True - resource_warnings: bool = True - conservative_estimates: bool = True - memory_buffer: float = 0.5 # 50% buffer for context overhead - - -@dataclass -class ContextConfig: - """Context management configuration.""" - - compression_enabled: bool = True - warning_threshold: float = 0.75 # Warn at 75% of context - critical_threshold: float = 0.90 # Critical at 90% - budget_ratio: float = 0.9 # Budget at 90% of context - max_conversation_length: int = 100 - preserve_key_elements: bool = True - compression_cache_ttl: int = 3600 # 1 hour - min_quality_score: float = 0.7 - - -@dataclass -class GitConfig: - """Git workflow configuration.""" - - auto_commit: bool = True - commit_grouping: bool = True - natural_language_messages: bool = True - staging_branch: str = "mai-staging" - auto_merge: bool = True - health_checks: bool = True - stability_test_duration: int = 300 # 5 minutes - auto_revert: bool = True - commit_delay: float = 10.0 # seconds between commits - - -@dataclass -class LoggingConfig: - """Logging and debugging configuration.""" - - level: str = "INFO" - file_logging: bool = True - console_logging: bool = True - log_file: str = "logs/mai.log" - max_file_size: int = 10 * 1024 * 1024 # 10MB - backup_count: int = 5 - debug_mode: bool = False - performance_logging: bool = True - error_tracking: bool = True - - -@dataclass -class MemoryConfig: - """Memory system and compression configuration.""" - - # Compression thresholds - message_count: int = 50 - age_days: int = 30 - memory_limit_mb: int = 500 - - # Summarization settings - summarization_model: str = "llama2" - preserve_elements: list = field( - default_factory=lambda: ["preferences", "decisions", "patterns", "key_facts"] - ) - min_quality_score: float = 0.7 - max_summary_length: int = 1000 - context_messages: int = 30 - - # Adaptive weighting - importance_decay_days: int = 90 - pattern_weight: float = 1.5 - technical_weight: float = 1.2 - planning_weight: float = 1.3 - recency_boost: float = 1.2 - keyword_boost: float = 1.5 - - # Strategy settings - keep_recent_count: int = 10 - max_patterns_extracted: int = 5 - topic_extraction_method: str = "keyword" - pattern_confidence_threshold: float = 0.6 - - # Retrieval settings - similarity_threshold: float = 0.7 - max_results: int = 5 - include_content: bool = False - semantic_weight: float = 0.4 - keyword_weight: float = 0.3 - recency_weight: float = 0.2 - user_pattern_weight: float = 0.1 - - # Performance settings - max_memory_usage_mb: int = 200 - max_cpu_usage_percent: int = 80 - max_compression_time_seconds: int = 30 - enable_background_compression: bool = True - compression_interval_hours: int = 6 - batch_size: int = 5 - - -@dataclass -class Config: - """Main configuration class for Mai.""" - - models: ModelConfig = field(default_factory=ModelConfig) - resources: ResourceConfig = field(default_factory=ResourceConfig) - context: ContextConfig = field(default_factory=ContextConfig) - git: GitConfig = field(default_factory=GitConfig) - logging: LoggingConfig = field(default_factory=LoggingConfig) - memory: MemoryConfig = field(default_factory=MemoryConfig) - - # Runtime state - config_file: Optional[str] = None - last_modified: Optional[float] = None - _lock: threading.RLock = field(default_factory=threading.RLock) - - def __post_init__(self): - """Initialize configuration after dataclass creation.""" - # Ensure log directory exists - if self.logging.file_logging: - log_path = Path(self.logging.log_file) - log_path.parent.mkdir(parents=True, exist_ok=True) - - -class ConfigManager: - """ - Configuration manager with loading, validation, and hot-reload capabilities. - """ - - def __init__(self, config_path: Optional[str] = None): - """ - Initialize configuration manager. - - Args: - config_path: Path to configuration file (YAML or JSON) - """ - self.config_path = config_path - self.config = Config() - self._observers = [] - self._lock = threading.RLock() - - # Load configuration if path provided - if config_path: - self.load_config(config_path) - - # Apply environment variable overrides - self._apply_env_overrides() - - def load_config(self, config_path: Optional[str] = None) -> Config: - """ - Load configuration from file. - - Args: - config_path: Path to configuration file - - Returns: - Loaded Config object - - Raises: - ConfigFileError: If file cannot be loaded - ConfigValidationError: If configuration is invalid - """ - if config_path: - self.config_path = config_path - - if not self.config_path or not os.path.exists(self.config_path): - # Use default configuration - self.config = Config() - return self.config - - try: - with open(self.config_path, "r", encoding="utf-8") as f: - if self.config_path.endswith(".yaml") or self.config_path.endswith(".yml"): - data = yaml.safe_load(f) - elif self.config_path.endswith(".json"): - data = json.load(f) - else: - raise ConfigFileError(f"Unsupported config format: {self.config_path}") - - # Merge with defaults - self.config = self._merge_with_defaults(data) - self.config.config_file = self.config_path - self.config.last_modified = os.path.getmtime(self.config_path) - - # Validate configuration - self._validate_config() - - # Apply environment overrides - self._apply_env_overrides() - - # Notify observers - self._notify_observers("config_loaded", self.config) - - return self.config - - except (yaml.YAMLError, json.JSONDecodeError) as e: - raise ConfigFileError(f"Invalid configuration file format: {e}") - except Exception as e: - raise ConfigFileError(f"Error loading configuration: {e}") - - def save_config(self, config_path: Optional[str] = None) -> bool: - """ - Save current configuration to file. - - Args: - config_path: Path to save configuration (uses current if None) - - Returns: - True if saved successfully - - Raises: - ConfigFileError: If file cannot be saved - """ - if config_path: - self.config_path = config_path - - if not self.config_path: - raise ConfigFileError("No configuration path specified") - - try: - # Ensure directory exists - config_dir = os.path.dirname(self.config_path) - if config_dir: - os.makedirs(config_dir, exist_ok=True) - - # Convert to dictionary - config_dict = asdict(self.config) - - # Remove runtime state - config_dict.pop("config_file", None) - config_dict.pop("last_modified", None) - config_dict.pop("_lock", None) - - # Save with comments (YAML format preferred) - with open(self.config_path, "w", encoding="utf-8") as f: - if self.config_path.endswith(".yaml") or self.config_path.endswith(".yml"): - # Add comments for documentation - yaml.dump(config_dict, f, default_flow_style=False, indent=2) - else: - json.dump(config_dict, f, indent=2) - - self.config.last_modified = os.path.getmtime(self.config_path) - - # Notify observers - self._notify_observers("config_saved", self.config) - - return True - - except Exception as e: - raise ConfigFileError(f"Error saving configuration: {e}") - - def get_model_config(self) -> ModelConfig: - """Get model-specific configuration.""" - return self.config.models - - def get_resource_config(self) -> ResourceConfig: - """Get resource monitoring configuration.""" - return self.config.resources - - def get_context_config(self) -> ContextConfig: - """Get context management configuration.""" - return self.config.context - - def get_git_config(self) -> GitConfig: - """Get git workflow configuration.""" - return self.config.git - - def get_logging_config(self) -> LoggingConfig: - """Get logging configuration.""" - return self.config.logging - - def get_memory_config(self) -> MemoryConfig: - """Get memory configuration.""" - return self.config.memory - - def update_config(self, updates: Dict[str, Any], section: Optional[str] = None) -> bool: - """ - Update configuration with new values. - - Args: - updates: Dictionary of updates to apply - section: Configuration section to update (optional) - - Returns: - True if updated successfully - - Raises: - ConfigValidationError: If updates are invalid - """ - with self._lock: - # Store old values for rollback - old_values = {} - - try: - # Apply updates - if section: - if hasattr(self.config, section): - section_config = getattr(self.config, section) - for key, value in updates.items(): - if hasattr(section_config, key): - old_values[f"{section}.{key}"] = getattr(section_config, key) - setattr(section_config, key, value) - else: - raise ConfigValidationError(f"Invalid config key: {section}.{key}") - else: - raise ConfigValidationError(f"Invalid config section: {section}") - else: - # Apply to root config - for key, value in updates.items(): - if hasattr(self.config, key): - old_values[key] = getattr(self.config, key) - setattr(self.config, key, value) - else: - raise ConfigValidationError(f"Invalid config key: {key}") - - # Validate updated configuration - self._validate_config() - - # Save if file path available - if self.config_path: - self.save_config() - - # Notify observers - self._notify_observers("config_updated", self.config, old_values) - - return True - - except Exception as e: - # Rollback changes on error - for path, value in old_values.items(): - if "." in path: - section, key = path.split(".", 1) - if hasattr(self.config, section): - setattr(getattr(self.config, section), key, value) - else: - setattr(self.config, path, value) - raise ConfigValidationError(f"Invalid configuration update: {e}") - - def reload_config(self) -> bool: - """ - Reload configuration from file. - - Returns: - True if reloaded successfully - """ - if not self.config_path: - return False - - try: - return self.load_config(self.config_path) is not None - except Exception: - return False - - def add_observer(self, callback): - """ - Add observer for configuration changes. - - Args: - callback: Function to call on config changes - """ - with self._lock: - self._observers.append(callback) - - def remove_observer(self, callback): - """ - Remove observer for configuration changes. - - Args: - callback: Function to remove - """ - with self._lock: - if callback in self._observers: - self._observers.remove(callback) - - def _merge_with_defaults(self, data: Dict[str, Any]) -> Config: - """ - Merge loaded data with default configuration. - - Args: - data: Loaded configuration data - - Returns: - Merged Config object - """ - # Start with defaults - default_dict = asdict(Config()) - - # Recursively merge - merged = self._deep_merge(default_dict, data) - - # Create Config from merged dict - return Config(**merged) - - def _deep_merge(self, default: Dict[str, Any], override: Dict[str, Any]) -> Dict[str, Any]: - """ - Deep merge two dictionaries. - - Args: - default: Default values - override: Override values - - Returns: - Merged dictionary - """ - result = copy.deepcopy(default) - - for key, value in override.items(): - if key in result and isinstance(result[key], dict) and isinstance(value, dict): - result[key] = self._deep_merge(result[key], value) - else: - result[key] = value - - return result - - def _validate_config(self): - """ - Validate configuration values. - - Raises: - ConfigValidationError: If configuration is invalid - """ - # Validate model config - if not self.config.models.preferred_models: - raise ConfigValidationError("No preferred models configured") - - if not 0 <= self.config.models.switch_threshold <= 1: - raise ConfigValidationError("Model switch threshold must be between 0 and 1") - - # Validate resource config - if not 0 < self.config.resources.check_interval <= 60: - raise ConfigValidationError("Resource check interval must be between 0 and 60 seconds") - - # Validate context config - if not 0 < self.config.context.budget_ratio <= 1: - raise ConfigValidationError("Context budget ratio must be between 0 and 1") - - if ( - not 0 - < self.config.context.warning_threshold - < self.config.context.critical_threshold - <= 1 - ): - raise ConfigValidationError("Invalid context thresholds: warning < critical <= 1") - - # Validate logging config - valid_levels = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"] - if self.config.logging.level not in valid_levels: - raise ConfigValidationError(f"Invalid log level: {self.config.logging.level}") - - def _apply_env_overrides(self): - """Apply environment variable overrides.""" - # Model overrides - if "MAI_PREFERRED_MODELS" in os.environ: - models = [m.strip() for m in os.environ["MAI_PREFERRED_MODELS"].split(",")] - self.config.models.preferred_models = models - - if "MAI_AUTO_SWITCH" in os.environ: - self.config.models.auto_switch = os.environ["MAI_AUTO_SWITCH"].lower() == "true" - - # Resource overrides - if "MAI_RESOURCE_MONITORING" in os.environ: - self.config.resources.monitoring_enabled = ( - os.environ["MAI_RESOURCE_MONITORING"].lower() == "true" - ) - - # Context overrides - if "MAI_CONTEXT_BUDGET_RATIO" in os.environ: - try: - ratio = float(os.environ["MAI_CONTEXT_BUDGET_RATIO"]) - if 0 < ratio <= 1: - self.config.context.budget_ratio = ratio - except ValueError: - pass - - # Logging overrides - if "MAI_DEBUG_MODE" in os.environ: - self.config.logging.debug_mode = os.environ["MAI_DEBUG_MODE"].lower() == "true" - - # Memory overrides - if "MAI_MEMORY_LIMIT_MB" in os.environ: - try: - limit = int(os.environ["MAI_MEMORY_LIMIT_MB"]) - if limit > 0: - self.config.memory.memory_limit_mb = limit - except ValueError: - pass - - if "MAI_COMPRESSION_MODEL" in os.environ: - self.config.memory.summarization_model = os.environ["MAI_COMPRESSION_MODEL"] - - if "MAI_ENABLE_BACKGROUND_COMPRESSION" in os.environ: - self.config.memory.enable_background_compression = ( - os.environ["MAI_ENABLE_BACKGROUND_COMPRESSION"].lower() == "true" - ) - - def _notify_observers(self, event: str, *args): - """Notify observers of configuration changes.""" - for observer in self._observers: - try: - observer(event, *args) - except Exception: - # Don't let observer errors break config management - pass - - def get_config_summary(self) -> Dict[str, Any]: - """ - Get summary of current configuration. - - Returns: - Dictionary with configuration summary - """ - return { - "config_file": self.config.config_file, - "last_modified": self.config.last_modified, - "models": { - "preferred_count": len(self.config.models.preferred_models), - "auto_switch": self.config.models.auto_switch, - "switch_threshold": self.config.models.switch_threshold, - }, - "resources": { - "monitoring_enabled": self.config.resources.monitoring_enabled, - "check_interval": self.config.resources.check_interval, - "gpu_detection": self.config.resources.gpu_detection, - }, - "context": { - "compression_enabled": self.config.context.compression_enabled, - "budget_ratio": self.config.context.budget_ratio, - "warning_threshold": self.config.context.warning_threshold, - }, - "git": { - "auto_commit": self.config.git.auto_commit, - "staging_branch": self.config.git.staging_branch, - "auto_merge": self.config.git.auto_merge, - }, - "logging": { - "level": self.config.logging.level, - "file_logging": self.config.logging.file_logging, - "debug_mode": self.config.logging.debug_mode, - }, - "memory": { - "message_count": self.config.memory.message_count, - "age_days": self.config.memory.age_days, - "memory_limit_mb": self.config.memory.memory_limit_mb, - "summarization_model": self.config.memory.summarization_model, - "enable_background_compression": self.config.memory.enable_background_compression, - }, - } - - -# Global configuration manager instance -_config_manager = None - - -def get_config_manager(config_path: Optional[str] = None) -> ConfigManager: - """ - Get global configuration manager instance. - - Args: - config_path: Path to configuration file (only used on first call) - - Returns: - ConfigManager instance - """ - global _config_manager - if _config_manager is None: - _config_manager = ConfigManager(config_path) - return _config_manager - - -def get_config(config_path: Optional[str] = None) -> Config: - """ - Get current configuration. - - Args: - config_path: Optional path to configuration file (only used on first call) - - Returns: - Current Config object - """ - return get_config_manager(config_path).config - - -def load_memory_config(config_path: Optional[str] = None) -> Dict[str, Any]: - """ - Load memory-specific configuration from YAML file. - - Args: - config_path: Path to memory configuration file - - Returns: - Dictionary with memory configuration settings - """ - # Default memory config path - if config_path is None: - config_path = os.path.join(".mai", "config", "memory.yaml") - - # If file doesn't exist, return default settings - if not os.path.exists(config_path): - return { - "compression": { - "thresholds": {"message_count": 50, "age_days": 30, "memory_limit_mb": 500} - } - } - - try: - with open(config_path, "r", encoding="utf-8") as f: - if config_path.endswith((".yaml", ".yml")): - config_data = yaml.safe_load(f) - else: - config_data = json.load(f) - - # Validate and merge with defaults - default_config = { - "compression": { - "thresholds": {"message_count": 50, "age_days": 30, "memory_limit_mb": 500}, - "summarization": { - "model": "llama2", - "preserve_elements": ["preferences", "decisions", "patterns", "key_facts"], - "min_quality_score": 0.7, - "max_summary_length": 1000, - "context_messages": 30, - }, - } - } - - # Deep merge with defaults - merged_config = _deep_merge(default_config, config_data) - - # Validate key memory settings - compression_config = merged_config.get("compression", {}) - thresholds = compression_config.get("thresholds", {}) - - if thresholds.get("message_count", 0) < 10: - raise ConfigValidationError( - field_name="message_count", - field_value=thresholds.get("message_count"), - validation_error="must be at least 10", - ) - - if thresholds.get("age_days", 0) < 1: - raise ConfigValidationError( - field_name="age_days", - field_value=thresholds.get("age_days"), - validation_error="must be at least 1 day", - ) - - if thresholds.get("memory_limit_mb", 0) < 100: - raise ConfigValidationError( - field_name="memory_limit_mb", - field_value=thresholds.get("memory_limit_mb"), - validation_error="must be at least 100MB", - ) - - return merged_config - - except (yaml.YAMLError, json.JSONDecodeError) as e: - raise ConfigFileError( - file_path=config_path, - operation="load_memory_config", - error_details=f"Invalid format: {e}", - ) - except Exception as e: - raise ConfigFileError( - file_path=config_path, - operation="load_memory_config", - error_details=f"Error loading: {e}", - ) diff --git a/src/mai/core/exceptions.py b/src/mai/core/exceptions.py deleted file mode 100644 index 70ab46d..0000000 --- a/src/mai/core/exceptions.py +++ /dev/null @@ -1,834 +0,0 @@ -""" -Custom exception hierarchy for Mai error handling. - -Provides clear, actionable error information for all Mai components -with context data and resolution suggestions. -""" - -from typing import Dict, Any, Optional, List -from dataclasses import dataclass, field -import traceback -import time - - -@dataclass -class ErrorContext: - """Context information for errors.""" - - component: str # Component where error occurred - operation: str # Operation being performed - data: Dict[str, Any] # Relevant context data - timestamp: float = field(default_factory=time.time) # When error occurred - user_friendly: bool = True # Whether to show to users - - -class MaiError(Exception): - """ - Base exception for all Mai-specific errors. - - All Mai exceptions should inherit from this class to provide - consistent error handling and context. - """ - - def __init__( - self, - message: str, - error_code: Optional[str] = None, - context: Optional[ErrorContext] = None, - suggestions: Optional[List[str]] = None, - cause: Optional[Exception] = None, - ): - """ - Initialize Mai error. - - Args: - message: Error message - error_code: Unique error code for programmatic handling - context: Error context information - suggestions: Suggestions for resolution - cause: Original exception that caused this error - """ - super().__init__(message) - self.message = message - self.error_code = error_code or self.__class__.__name__ - self.context = context or ErrorContext( - component="unknown", operation="unknown", data={}, timestamp=time.time() - ) - self.suggestions = suggestions or [] - self.cause = cause - self.severity = self._determine_severity() - - def _determine_severity(self) -> str: - """Determine error severity based on type and context.""" - if ( - "Critical" in self.__class__.__name__ - or self.error_code - and "CRITICAL" in self.error_code - ): - return "critical" - elif ( - "Warning" in self.__class__.__name__ or self.error_code and "WARNING" in self.error_code - ): - return "warning" - else: - return "error" - - def to_dict(self) -> Dict[str, Any]: - """Convert error to dictionary for serialization.""" - return { - "error_type": self.__class__.__name__, - "message": self.message, - "error_code": self.error_code, - "severity": self.severity, - "context": { - "component": self.context.component, - "operation": self.context.operation, - "data": self.context.data, - "timestamp": self.context.timestamp, - "user_friendly": self.context.user_friendly, - }, - "suggestions": self.suggestions, - "cause": str(self.cause) if self.cause else None, - "traceback": traceback.format_exc() if self.severity == "critical" else None, - } - - def __str__(self) -> str: - """String representation of error.""" - return self.message - - -class ModelError(MaiError): - """Base class for model-related errors.""" - - def __init__(self, message: str, model_name: Optional[str] = None, **kwargs): - kwargs.setdefault( - "context", - ErrorContext( - component="model_interface", - operation="model_operation", - data={"model_name": model_name} if model_name else {}, - ), - ) - super().__init__(message, **kwargs) - self.model_name = model_name - - -class ModelNotFoundError(ModelError): - """Raised when requested model is not available.""" - - def __init__(self, model_name: str, available_models: Optional[List[str]] = None): - suggestions = [ - f"Check if '{model_name}' is installed in Ollama", - "Run 'ollama list' to see available models", - "Try downloading the model with 'ollama pull'", - ] - if available_models: - suggestions.append(f"Available models: {', '.join(available_models[:5])}") - - super().__init__( - f"Model '{model_name}' not found", - model_name=model_name, - error_code="MODEL_NOT_FOUND", - suggestions=suggestions, - ) - self.available_models = available_models or [] - - -class ModelSwitchError(ModelError): - """Raised when model switching fails.""" - - def __init__(self, from_model: str, to_model: str, reason: Optional[str] = None): - message = f"Failed to switch from '{from_model}' to '{to_model}'" - if reason: - message += f": {reason}" - - suggestions = [ - "Check if target model is available", - "Verify sufficient system resources for target model", - "Try switching to a smaller model first", - ] - - super().__init__( - message, - model_name=to_model, - error_code="MODEL_SWITCH_FAILED", - context=ErrorContext( - component="model_switcher", - operation="switch_model", - data={"from_model": from_model, "to_model": to_model, "reason": reason}, - ), - suggestions=suggestions, - ) - self.from_model = from_model - self.to_model = to_model - - -class ModelConnectionError(ModelError): - """Raised when cannot connect to Ollama or model service.""" - - def __init__(self, service_url: str, timeout: Optional[float] = None): - message = f"Cannot connect to model service at {service_url}" - if timeout: - message += f" (timeout: {timeout}s)" - - suggestions = [ - "Check if Ollama is running", - f"Verify service URL: {service_url}", - "Check network connectivity", - "Try restarting Ollama service", - ] - - super().__init__( - message, - error_code="MODEL_CONNECTION_FAILED", - context=ErrorContext( - component="ollama_client", - operation="connect", - data={"service_url": service_url, "timeout": timeout}, - ), - suggestions=suggestions, - ) - self.service_url = service_url - self.timeout = timeout - - -class ModelInferenceError(ModelError): - """Raised when model inference request fails.""" - - def __init__(self, model_name: str, prompt_length: int, error_details: Optional[str] = None): - message = f"Inference failed for model '{model_name}'" - if error_details: - message += f": {error_details}" - - suggestions = [ - "Check if model is loaded properly", - "Try with a shorter prompt", - "Verify model context window limits", - "Check available system memory", - ] - - super().__init__( - message, - model_name=model_name, - error_code="MODEL_INFERENCE_FAILED", - context=ErrorContext( - component="model_interface", - operation="inference", - data={ - "model_name": model_name, - "prompt_length": prompt_length, - "error_details": error_details, - }, - ), - suggestions=suggestions, - ) - self.prompt_length = prompt_length - self.error_details = error_details - - -class ResourceError(MaiError): - """Base class for resource-related errors.""" - - def __init__(self, message: str, **kwargs): - kwargs.setdefault( - "context", - ErrorContext(component="resource_monitor", operation="resource_check", data={}), - ) - super().__init__(message, **kwargs) - - -class ResourceExhaustedError(ResourceError): - """Raised when system resources are depleted.""" - - def __init__(self, resource_type: str, current_usage: float, limit: float): - message = ( - f"Resource '{resource_type}' exhausted: {current_usage:.1%} used (limit: {limit:.1%})" - ) - - suggestions = [ - "Close other applications to free up resources", - "Try using a smaller model", - "Wait for resources to become available", - "Consider upgrading system resources", - ] - - super().__init__( - message, - error_code="RESOURCE_EXHAUSTED", - context=ErrorContext( - component="resource_monitor", - operation="check_resources", - data={ - "resource_type": resource_type, - "current_usage": current_usage, - "limit": limit, - "excess": current_usage - limit, - }, - ), - suggestions=suggestions, - ) - self.resource_type = resource_type - self.current_usage = current_usage - self.limit = limit - - -class ResourceMonitorError(ResourceError): - """Raised when resource monitoring fails.""" - - def __init__(self, operation: str, error_details: Optional[str] = None): - message = f"Resource monitoring failed during {operation}" - if error_details: - message += f": {error_details}" - - suggestions = [ - "Check if monitoring dependencies are installed", - "Verify system permissions for resource access", - "Try using fallback monitoring methods", - "Restart the application", - ] - - super().__init__( - message, - error_code="RESOURCE_MONITOR_FAILED", - context=ErrorContext( - component="resource_monitor", - operation=operation, - data={"error_details": error_details}, - ), - suggestions=suggestions, - ) - self.operation = operation - self.error_details = error_details - - -class InsufficientMemoryError(ResourceError): - """Raised when insufficient memory for operation.""" - - def __init__(self, required_memory: int, available_memory: int, operation: str): - message = f"Insufficient memory for {operation}: need {required_memory}MB, have {available_memory}MB" - - suggestions = [ - "Close other applications to free memory", - "Try with a smaller model or context", - "Increase swap space if available", - "Consider using a model with lower memory requirements", - ] - - super().__init__( - message, - error_code="INSUFFICIENT_MEMORY", - context=ErrorContext( - component="memory_manager", - operation="allocate_memory", - data={ - "required_memory": required_memory, - "available_memory": available_memory, - "shortfall": required_memory - available_memory, - "operation": operation, - }, - ), - suggestions=suggestions, - ) - self.required_memory = required_memory - self.available_memory = available_memory - self.operation = operation - - -class ContextError(MaiError): - """Base class for context-related errors.""" - - def __init__(self, message: str, **kwargs): - kwargs.setdefault( - "context", - ErrorContext(component="context_manager", operation="context_operation", data={}), - ) - super().__init__(message, **kwargs) - - -class ContextTooLongError(ContextError): - """Raised when conversation exceeds context window limits.""" - - def __init__(self, current_tokens: int, max_tokens: int, model_name: str): - message = ( - f"Conversation too long for {model_name}: {current_tokens} tokens (max: {max_tokens})" - ) - - suggestions = [ - "Enable context compression", - "Remove older messages from conversation", - "Use a model with larger context window", - "Split conversation into smaller parts", - ] - - super().__init__( - message, - error_code="CONTEXT_TOO_LONG", - context=ErrorContext( - component="context_compressor", - operation="validate_context", - data={ - "current_tokens": current_tokens, - "max_tokens": max_tokens, - "excess": current_tokens - max_tokens, - "model_name": model_name, - }, - ), - suggestions=suggestions, - ) - self.current_tokens = current_tokens - self.max_tokens = max_tokens - self.model_name = model_name - - -class ContextCompressionError(ContextError): - """Raised when context compression fails.""" - - def __init__( - self, original_tokens: int, target_ratio: float, error_details: Optional[str] = None - ): - message = ( - f"Context compression failed: {original_tokens} tokens → target {target_ratio:.1%}" - ) - if error_details: - message += f": {error_details}" - - suggestions = [ - "Try with a higher compression ratio", - "Check if conversation contains valid text", - "Verify compression quality thresholds", - "Use manual message removal instead", - ] - - super().__init__( - message, - error_code="CONTEXT_COMPRESSION_FAILED", - context=ErrorContext( - component="context_compressor", - operation="compress", - data={ - "original_tokens": original_tokens, - "target_ratio": target_ratio, - "error_details": error_details, - }, - ), - suggestions=suggestions, - ) - self.original_tokens = original_tokens - self.target_ratio = target_ratio - self.error_details = error_details - - -class ContextCorruptionError(ContextError): - """Raised when context data is invalid or corrupted.""" - - def __init__(self, context_type: str, corruption_details: Optional[str] = None): - message = f"Context corruption detected in {context_type}" - if corruption_details: - message += f": {corruption_details}" - - suggestions = [ - "Clear conversation history and start fresh", - "Verify context serialization format", - "Check for data encoding issues", - "Rebuild context from valid messages", - ] - - super().__init__( - message, - error_code="CONTEXT_CORRUPTION", - context=ErrorContext( - component="context_manager", - operation="validate_context", - data={"context_type": context_type, "corruption_details": corruption_details}, - ), - suggestions=suggestions, - ) - self.context_type = context_type - self.corruption_details = corruption_details - - -class GitError(MaiError): - """Base class for Git-related errors.""" - - def __init__(self, message: str, **kwargs): - kwargs.setdefault( - "context", ErrorContext(component="git_interface", operation="git_operation", data={}) - ) - super().__init__(message, **kwargs) - - -class GitRepositoryError(GitError): - """Raised for Git repository issues.""" - - def __init__(self, repo_path: str, error_details: Optional[str] = None): - message = f"Git repository error in {repo_path}" - if error_details: - message += f": {error_details}" - - suggestions = [ - "Verify directory is a Git repository", - "Check Git repository permissions", - "Run 'git status' to diagnose issues", - "Initialize repository with 'git init' if needed", - ] - - super().__init__( - message, - error_code="GIT_REPOSITORY_ERROR", - context=ErrorContext( - component="git_interface", - operation="validate_repository", - data={"repo_path": repo_path, "error_details": error_details}, - ), - suggestions=suggestions, - ) - self.repo_path = repo_path - self.error_details = error_details - - -class GitCommitError(GitError): - """Raised when commit operation fails.""" - - def __init__( - self, operation: str, files: Optional[List[str]] = None, error_details: Optional[str] = None - ): - message = f"Git {operation} failed" - if error_details: - message += f": {error_details}" - - suggestions = [ - "Check if files exist and are readable", - "Verify write permissions for repository", - "Run 'git status' to check repository state", - "Stage files with 'git add' before committing", - ] - - super().__init__( - message, - error_code="GIT_COMMIT_FAILED", - context=ErrorContext( - component="git_committer", - operation=operation, - data={"files": files or [], "error_details": error_details}, - ), - suggestions=suggestions, - ) - self.operation = operation - self.files = files or [] - self.error_details = error_details - - -class GitMergeError(GitError): - """Raised for merge conflicts or failures.""" - - def __init__( - self, - branch_name: str, - conflict_files: Optional[List[str]] = None, - error_details: Optional[str] = None, - ): - message = f"Git merge failed for branch '{branch_name}'" - if error_details: - message += f": {error_details}" - - suggestions = [ - "Resolve merge conflicts manually", - "Use 'git status' to see conflicted files", - "Consider using 'git merge --abort' to cancel", - "Pull latest changes before merging", - ] - - super().__init__( - message, - error_code="GIT_MERGE_FAILED", - context=ErrorContext( - component="git_workflow", - operation="merge", - data={ - "branch_name": branch_name, - "conflict_files": conflict_files or [], - "error_details": error_details, - }, - ), - suggestions=suggestions, - ) - self.branch_name = branch_name - self.conflict_files = conflict_files or [] - self.error_details = error_details - - -class ConfigurationError(MaiError): - """Base class for configuration-related errors.""" - - def __init__(self, message: str, **kwargs): - kwargs.setdefault( - "context", - ErrorContext(component="config_manager", operation="config_operation", data={}), - ) - super().__init__(message, **kwargs) - - -class ConfigFileError(ConfigurationError): - """Raised for configuration file issues.""" - - def __init__(self, file_path: str, operation: str, error_details: Optional[str] = None): - message = f"Configuration file error during {operation}: {file_path}" - if error_details: - message += f": {error_details}" - - suggestions = [ - "Verify file path and permissions", - "Check file format (YAML/JSON)", - "Ensure file contains valid configuration", - "Create default configuration file if missing", - ] - - super().__init__( - message, - error_code="CONFIG_FILE_ERROR", - context=ErrorContext( - component="config_manager", - operation=operation, - data={"file_path": file_path, "error_details": error_details}, - ), - suggestions=suggestions, - ) - self.file_path = file_path - self.operation = operation - self.error_details = error_details - - -class ConfigValidationError(ConfigurationError): - """Raised for invalid configuration values.""" - - def __init__(self, field_name: str, field_value: Any, validation_error: str): - message = ( - f"Invalid configuration value for '{field_name}': {field_value} - {validation_error}" - ) - - suggestions = [ - "Check configuration documentation for valid values", - "Verify value type and range constraints", - "Use default configuration values", - "Check for typos in field names", - ] - - super().__init__( - message, - error_code="CONFIG_VALIDATION_FAILED", - context=ErrorContext( - component="config_manager", - operation="validate_config", - data={ - "field_name": field_name, - "field_value": str(field_value), - "validation_error": validation_error, - }, - ), - suggestions=suggestions, - ) - self.field_name = field_name - self.field_value = field_value - self.validation_error = validation_error - - -class ConfigMissingError(ConfigurationError): - """Raised when required configuration is missing.""" - - def __init__(self, missing_keys: List[str], config_section: Optional[str] = None): - section_msg = f" in section '{config_section}'" if config_section else "" - message = f"Required configuration missing{section_msg}: {', '.join(missing_keys)}" - - suggestions = [ - "Add missing keys to configuration file", - "Check configuration documentation for required fields", - "Use default configuration as template", - "Verify configuration file is being loaded correctly", - ] - - super().__init__( - message, - error_code="CONFIG_MISSING_REQUIRED", - context=ErrorContext( - component="config_manager", - operation="check_requirements", - data={"missing_keys": missing_keys, "config_section": config_section}, - ), - suggestions=suggestions, - ) - self.missing_keys = missing_keys - self.config_section = config_section - - -# Error handling utilities - - -def format_error_for_user(error: MaiError) -> str: - """ - Convert technical error to user-friendly message. - - Args: - error: MaiError instance - - Returns: - User-friendly error message - """ - if not isinstance(error, MaiError): - return f"Unexpected error: {str(error)}" - - # Use the message if it's user-friendly - if error.context.user_friendly: - return str(error) - - # Create user-friendly version - friendly_message = error.message - - # Remove technical details - technical_terms = ["traceback", "exception", "error_code", "context"] - for term in technical_terms: - friendly_message = friendly_message.lower().replace(term, "") - - # Add top suggestion - if error.suggestions: - friendly_message += f"\n\nSuggestion: {error.suggestions[0]}" - - return friendly_message.strip() - - -def is_retriable_error(error: Exception) -> bool: - """ - Determine if error can be retried. - - Args: - error: Exception instance - - Returns: - True if error is retriable - """ - if isinstance(error, MaiError): - retriable_codes = [ - "MODEL_CONNECTION_FAILED", - "RESOURCE_MONITOR_FAILED", - "CONTEXT_COMPRESSION_FAILED", - ] - return error.error_code in retriable_codes - - # Non-Mai errors: only retry network/connection issues - error_str = str(error).lower() - retriable_patterns = ["connection", "timeout", "network", "temporary", "unavailable"] - - return any(pattern in error_str for pattern in retriable_patterns) - - -def get_error_severity(error: Exception) -> str: - """ - Classify error severity. - - Args: - error: Exception instance - - Returns: - Severity level: 'warning', 'error', or 'critical' - """ - if isinstance(error, MaiError): - return error.severity - - # Classify non-Mai errors - error_str = str(error).lower() - - if any(pattern in error_str for pattern in ["critical", "fatal"]): - return "critical" - elif any(pattern in error_str for pattern in ["warning"]): - return "warning" - else: - return "error" - - -def create_error_context(component: str, operation: str, **data) -> ErrorContext: - """ - Create error context with current timestamp. - - Args: - component: Component name - operation: Operation name - **data: Additional context data - - Returns: - ErrorContext instance - """ - return ErrorContext(component=component, operation=operation, data=data, timestamp=time.time()) - - -# Exception handler for logging and monitoring - - -class ErrorHandler: - """ - Central error handler for Mai components. - - Provides consistent error logging, metrics, and user notification. - """ - - def __init__(self, logger=None): - """ - Initialize error handler. - - Args: - logger: Logger instance for error reporting - """ - self.logger = logger - self.error_counts = {} - self.last_errors = {} - - def handle_error(self, error: Exception, component: str = "unknown"): - """ - Handle error with logging and metrics. - - Args: - error: Exception to handle - component: Component where error occurred - """ - # Count errors - error_type = error.__class__.__name__ - self.error_counts[error_type] = self.error_counts.get(error_type, 0) + 1 - self.last_errors[error_type] = { - "error": error, - "component": component, - "timestamp": time.time(), - } - - # Log error - if self.logger: - severity = get_error_severity(error) - if severity == "critical": - self.logger.critical(f"Critical error in {component}: {error}") - elif severity == "error": - self.logger.error(f"Error in {component}: {error}") - else: - self.logger.warning(f"Warning in {component}: {error}") - - # Return formatted error for user - if isinstance(error, MaiError): - return format_error_for_user(error) - else: - return f"An error occurred in {component}: {str(error)}" - - def get_error_stats(self) -> Dict[str, Any]: - """ - Get error statistics. - - Returns: - Dictionary with error statistics - """ - return { - "error_counts": self.error_counts.copy(), - "last_errors": { - k: { - "error": str(v["error"]), - "component": v["component"], - "timestamp": v["timestamp"], - } - for k, v in self.last_errors.items() - }, - "total_errors": sum(self.error_counts.values()), - } diff --git a/src/mai/core/interface.py b/src/mai/core/interface.py deleted file mode 100644 index 1ac2ec3..0000000 --- a/src/mai/core/interface.py +++ /dev/null @@ -1,1015 +0,0 @@ -""" -Mai Main Interface - -This module provides the main Mai interface that integrates all components -including model interface, resource monitoring, and git automation. -""" - -import logging -import time -from typing import Dict, List, Optional, Tuple, Any -from dataclasses import dataclass -from enum import Enum - -from ..model.ollama_client import OllamaClient -from ..model.resource_detector import ResourceDetector, ResourceInfo -from ..model.compression import ContextCompressor -from ..core.config import Config, get_config -from ..core.exceptions import MaiError, ModelError, ConfigurationError, ModelConnectionError -from ..git.workflow import StagingWorkflow -from ..git.committer import AutoCommitter -from ..git.health_check import HealthChecker -from ..sandbox.manager import SandboxManager -from ..sandbox.approval_system import ApprovalSystem, ApprovalResult -from ..sandbox.audit_logger import AuditLogger -from ..memory.manager import MemoryManager, MemoryManagerError - - -class ModelState(Enum): - """Model operational state.""" - - IDLE = "idle" - THINKING = "thinking" - RESPONDING = "responding" - SWITCHING = "switching" - ERROR = "error" - - -@dataclass -class ConversationTurn: - """Single conversation turn with metadata.""" - - message: str - response: str - model_used: str - tokens: int - timestamp: float - resources: ResourceInfo - response_time: float - - -@dataclass -class SystemStatus: - """Current system status.""" - - current_model: str - available_models: List[str] - model_state: ModelState - resources: ResourceInfo - conversation_length: int - compression_enabled: bool - git_state: Dict[str, Any] - performance_metrics: Dict[str, float] - recent_activity: List[ConversationTurn] - memory_status: Optional[Dict[str, Any]] = None - - -class MaiInterface: - """Main Mai interface integrating all components.""" - - def __init__(self, config_path: Optional[str] = None): - """Initialize Mai interface with all components.""" - self.logger = logging.getLogger(__name__) - - # Load configuration - self.config = get_config(config_path) - - # Initialize core components - self.ollama_client = OllamaClient() - self.resource_detector = ResourceDetector() - self.context_compressor = ContextCompressor() - - # Initialize git components - self.staging_workflow = StagingWorkflow() - self.auto_committer = AutoCommitter() - self.health_checker = HealthChecker() - - # Initialize sandbox components - self.sandbox_manager = SandboxManager() - self.approval_system = ApprovalSystem() - self.audit_logger = AuditLogger() - - # Initialize memory system - self.memory_manager: Optional[MemoryManager] = None - try: - self.memory_manager = MemoryManager() - self.logger.info("Memory system initialized successfully") - except Exception as e: - self.logger.warning(f"Memory system initialization failed: {e}") - self.memory_manager = None - - # State tracking - self.conversation_history: List[ConversationTurn] = [] - self.current_model: Optional[str] = None - self.model_state = ModelState.IDLE - self.initialized = False - self.last_resource_check = 0 - self.resource_check_interval = 5.0 # seconds - - # Performance metrics - self.total_messages = 0 - self.total_model_switches = 0 - self.total_compressions = 0 - self.start_time = time.time() - - self.logger.info("Mai interface initialized") - - def initialize(self) -> bool: - """Initialize all components and verify system state.""" - try: - self.logger.info("Initializing Mai interface...") - - # Initialize Ollama connection - models = self.ollama_client.list_models() - if not models: - self.logger.warning("No models available in Ollama") - return False - - # Initialize resource monitoring - resources = self.resource_detector.get_current_resources() - - # Check git repository - try: - self.health_checker.get_current_branch() - except: - self.logger.warning("Git repository health check failed") - - # Set initial model - use first available (skip empty names) - self.current_model = None - for model in models: - model_name = model.get("name", "").strip() - if model_name: - self.current_model = model_name - break - - if not self.current_model: - # Fallback: use a default model name - self.current_model = "default-model" - self.logger.warning("No valid model names found, using fallback") - - self.logger.info(f"Selected initial model: {self.current_model}") - - self.initialized = True - self.logger.info("Mai interface initialized successfully") - - # Report status - print(f"✓ Mai initialized with {len(models)} models available") - print(f"✓ Current model: {self.current_model}") - print( - f"✓ Resources: {resources.memory_total_gb - resources.memory_available_gb:.1f}GB RAM used" - ) - - return True - - except Exception as e: - self.logger.error(f"Initialization failed: {e}") - print(f"✗ Initialization failed: {e}") - return False - - def list_models(self) -> List[Dict[str, Any]]: - """Get available models with capabilities and resource analysis.""" - if not self.initialized: - raise MaiError("Interface not initialized") - - try: - models = self.ollama_client.list_models() - resources = self.resource_detector.get_current_resources() - - model_list = [] - for model in models: - # Simple capability analysis based on resources and model size - size_gb = model.get("size", 0) / (1024 * 1024 * 1024) # Convert bytes to GB - ram_needed = size_gb * 2 # Rough estimate - is_recommended = ram_needed < resources.memory_available_gb * 0.7 - - model_info = { - "name": model.get("name", ""), - "size": size_gb, - "parameters": model.get("parameters", "unknown"), - "context_window": model.get("context_window", 4096), - "capability": "full" - if is_recommended - else "limited" - if ram_needed < resources.memory_available_gb - else "minimal", - "recommended": is_recommended, - "resource_requirements": self._get_model_resource_requirements(model), - "current": model.get("name", "") == self.current_model, - } - model_list.append(model_info) - - # Sort by recommendation and name - model_list.sort(key=lambda x: (-x["recommended"], x["name"])) - - return model_list - - except Exception as e: - self.logger.error(f"Failed to list models: {e}") - raise ModelError(f"Cannot list models: {e}") - - def send_message( - self, message: str, conversation_context: Optional[List[Dict]] = None - ) -> Dict[str, Any]: - """Send message to model with automatic selection and resource handling.""" - if not self.initialized: - raise MaiError("Interface not initialized") - - start_time = time.time() - - try: - self.model_state = ModelState.THINKING - - # Get current resources - resources = self.resource_detector.get_current_resources() - - # Retrieve memory context if available - memory_context = [] - if self.memory_manager: - try: - # Get relevant context from memory - memory_result = self.memory_manager.get_context( - query=message, - max_tokens=1000, # Limit memory context - max_results=3, - ) - - # Convert memory results to context format - if memory_result.get("relevant_conversations"): - memory_context = [ - { - "role": "system", - "content": f"Relevant context from previous conversations: {conv['title']} - {conv['excerpt']}", - } - for conv in memory_result["relevant_conversations"][:2] - ] - except Exception as e: - self.logger.debug(f"Failed to retrieve memory context: {e}") - - # Combine conversation context with memory context - full_context = [] - if memory_context: - full_context.extend(memory_context) - if conversation_context: - full_context.extend(conversation_context) - - # Compress context if needed - if full_context and self.config.context.compression_enabled: - context_size = len(str(full_context)) - if context_size > self.config.context.max_conversation_length * 100: - # Context is too large, would need to implement compress_context method - self.total_compressions += 1 - - # Send message to current model - self.model_state = ModelState.RESPONDING - response = self.ollama_client.generate_response( - message, self.current_model, full_context - ) - - # Calculate metrics - response_time = time.time() - start_time - tokens_estimated = self._estimate_tokens(message + response) - - # Store conversation in memory if available - if self.memory_manager: - try: - # Create conversation messages for storage - conversation_messages = [] - if memory_context: - conversation_messages.extend(memory_context) - if conversation_context: - conversation_messages.extend(conversation_context) - - # Add current turn - conversation_messages.extend( - [ - {"role": "user", "content": message}, - {"role": "assistant", "content": response}, - ] - ) - - # Store in memory - conv_id = self.memory_manager.store_conversation( - messages=conversation_messages, - metadata={ - "model_used": self.current_model, - "response_time": response_time, - "tokens": tokens_estimated, - "context_from_memory": bool(memory_context), - }, - ) - - self.logger.debug(f"Stored conversation in memory: {conv_id}") - - except Exception as e: - self.logger.debug(f"Failed to store conversation in memory: {e}") - - # Record conversation turn - turn = ConversationTurn( - message=message, - response=response, - model_used=self.current_model or "unknown", - tokens=tokens_estimated, - timestamp=start_time, - resources=resources, - response_time=response_time, - ) - self.conversation_history.append(turn) - self.total_messages += 1 - - self.model_state = ModelState.IDLE - - return { - "response": response, - "model_used": self.current_model, - "tokens": tokens_estimated, - "response_time": response_time, - "resources": resources.__dict__, - "model_switched": False, - "memory_context_used": len(memory_context) if memory_context else 0, - } - - except Exception as e: - self.model_state = ModelState.ERROR - self.logger.error(f"Failed to send message: {e}") - raise ModelError(f"Cannot send message: {e}") - - def get_system_status(self) -> SystemStatus: - """Get comprehensive system status.""" - if not self.initialized: - raise MaiError("Interface not initialized") - - try: - resources = self.resource_detector.get_current_resources() - models = self.ollama_client.list_models() - - # Get git state - git_state = { - "repository_exists": True, - "has_changes": False, - "current_branch": "main", - "last_commit": {"hash": "unknown"}, - } - try: - git_state["current_branch"] = self.health_checker.get_current_branch() - except: - pass - - # Calculate performance metrics - uptime = time.time() - self.start_time - avg_response_time = ( - sum(turn.response_time for turn in self.conversation_history[-10:]) - / min(10, len(self.conversation_history)) - if self.conversation_history - else 0 - ) - - performance_metrics = { - "uptime_seconds": uptime, - "total_messages": self.total_messages, - "total_model_switches": self.total_model_switches, - "total_compressions": self.total_compressions, - "avg_response_time": avg_response_time, - "messages_per_minute": (self.total_messages / uptime * 60) if uptime > 0 else 0, - } - - # Get memory status - memory_status = None - if self.memory_manager: - memory_status = self.show_memory_status() - - return SystemStatus( - current_model=self.current_model or "None", - available_models=[m.get("name", "") for m in models], - model_state=self.model_state, - resources=resources, - conversation_length=len(self.conversation_history), - compression_enabled=self.config.context.compression_enabled, - git_state=git_state, - performance_metrics=performance_metrics, - recent_activity=self.conversation_history[-5:] if self.conversation_history else [], - memory_status=memory_status, - ) - - except Exception as e: - self.logger.error(f"Failed to get system status: {e}") - raise MaiError(f"Cannot get system status: {e}") - - def switch_model(self, model_name: Optional[str] = None) -> Dict[str, Any]: - """Switch to specified model or auto-select best model.""" - if not self.initialized: - raise MaiError("Interface not initialized") - - try: - old_model = self.current_model - - if model_name: - # Switch to specific model - models = self.ollama_client.list_models() - model_names = [m.get("name", "") for m in models] - if model_name not in model_names: - raise ModelError(f"Model '{model_name}' not available") - else: - # Use first available model - models = self.ollama_client.list_models() - if not models: - raise ModelError("No models available") - model_name = models[0].get("name", "") - - # Perform switch - self.current_model = model_name - self.total_model_switches += 1 - - return { - "old_model": old_model, - "new_model": model_name, - "success": True, - "performance_impact": "minimal", - "resources": self.resource_detector.get_current_resources().__dict__, - } - - except Exception as e: - self.logger.error(f"Failed to switch model: {e}") - return { - "old_model": self.current_model, - "new_model": model_name, - "success": False, - "error": str(e), - } - - def handle_resource_constraints(self) -> Dict[str, Any]: - """Handle resource constraints and provide recommendations.""" - if not self.initialized: - raise MaiError("Interface not initialized") - - try: - resources = self.resource_detector.get_current_resources() - constraints = [] - recommendations = [] - - # Check memory constraints - if resources.memory_percent > 85: - constraints.append("High memory usage") - recommendations.append("Consider switching to smaller model") - - if resources.memory_available_gb < 2: - constraints.append("Low available memory") - recommendations.append("Close other applications or switch to lighter model") - - return { - "constraints": constraints, - "recommendations": recommendations, - "resources": resources.__dict__, - "urgency": "high" if len(constraints) > 2 else "medium" if constraints else "low", - } - - except Exception as e: - self.logger.error(f"Failed to handle resource constraints: {e}") - raise MaiError(f"Cannot handle resource constraints: {e}") - - def shutdown(self) -> None: - """Gracefully shutdown all components.""" - try: - self.logger.info("Shutting down Mai interface...") - - self.model_state = ModelState.IDLE - self.initialized = False - - # Close memory system - if self.memory_manager: - self.memory_manager.close() - self.logger.info("Memory system shutdown complete") - - self.logger.info("Mai interface shutdown complete") - - except Exception as e: - self.logger.error(f"Error during shutdown: {e}") - - # Private helper methods - - def _get_model_resource_requirements(self, model: Dict[str, Any]) -> Dict[str, float]: - """Estimate resource requirements for a model.""" - size_gb = model.get("size", 0) / (1024 * 1024 * 1024) # Convert bytes to GB if needed - context_window = model.get("context_window", 4096) - - base_ram_gb = size_gb * 2 # Model typically needs 2x size in RAM - context_ram_gb = context_window / 100000 # Rough estimate - - return { - "ram_gb": base_ram_gb + context_ram_gb, - "storage_gb": size_gb, - "vram_gb": base_ram_gb * 0.8, # Estimate 80% can be in VRAM - } - - def _estimate_tokens(self, text: str) -> int: - """Estimate token count for text.""" - # Rough estimation: ~4 characters per token - return len(text) // 4 - - # Sandbox Integration Methods - - def execute_code_safely( - self, code: str, environment: Optional[Dict[str, Any]] = None - ) -> Tuple[bool, str, Optional[Dict[str, Any]]]: - """Execute code safely through sandbox with approval workflow.""" - try: - # Request approval for code execution - context = { - "user_level": "known", # Could be determined from user history - "environment": environment or {}, - "request_source": "cli", - } - - approval_result, decision = self.approval_system.request_approval(code, context) - - if approval_result == ApprovalResult.BLOCKED: - return False, "Operation blocked for security reasons", decision - - if approval_result == ApprovalResult.DENIED: - return False, "Operation denied by user", decision - - # Log execution attempt - execution_id = self.audit_logger.log_execution_attempt( - code=code, - risk_level=decision.request.risk_analysis.risk_level.value, - user_decision=decision.result.value, - context=context, - ) - - # Execute in sandbox - execution_result = self.sandbox_manager.execute_code(code, environment) - - # Log execution result - self.audit_logger.log_execution_result( - execution_id=execution_id, - success=execution_result.get("success", False), - output=execution_result.get("output", ""), - error=execution_result.get("error", ""), - execution_time=execution_result.get("execution_time", 0.0), - ) - - return ( - execution_result.get("success", False), - execution_result.get("output", ""), - execution_result, - ) - - except Exception as e: - self.logger.error(f"Error in safe code execution: {e}") - return False, f"Execution error: {str(e)}", None - - def show_sandbox_status(self) -> Dict[str, Any]: - """Show current sandbox status and configuration.""" - try: - sandbox_config = self.config.get("sandbox", {}) - - status = { - "sandbox_enabled": True, - "resource_limits": { - "cpu_percent": sandbox_config.get("cpu_percent", 70), - "memory_percent": sandbox_config.get("memory_percent", 70), - "timeout_seconds": sandbox_config.get("timeout_seconds", 30), - "bandwidth_mbps": sandbox_config.get("bandwidth_mbps", 50), - }, - "approval_settings": { - "auto_approve_low_risk": sandbox_config.get("auto_approve_low_risk", True), - "require_approval_high_risk": sandbox_config.get( - "require_approval_high_risk", True - ), - "remember_preferences": sandbox_config.get("remember_preferences", True), - }, - "docker_settings": { - "image_name": sandbox_config.get("docker.image_name", "python:3.11-slim"), - "network_access": sandbox_config.get("docker.network_access", False), - "mount_points": sandbox_config.get("docker.mount_points", []), - }, - "audit_settings": { - "log_level": sandbox_config.get("audit.log_level", "INFO"), - "retention_days": sandbox_config.get("audit.retention_days", 30), - "mask_sensitive_data": sandbox_config.get("audit.mask_sensitive_data", True), - }, - "risk_thresholds": sandbox_config.get( - "risk_thresholds", - {"low_threshold": 0.3, "medium_threshold": 0.6, "high_threshold": 0.8}, - ), - "user_preferences": len(self.approval_system.user_preferences), - "approval_history": len(self.approval_system.approval_history), - } - - return status - - except Exception as e: - self.logger.error(f"Error getting sandbox status: {e}") - return {"error": str(e), "sandbox_enabled": False} - - def review_audit_logs(self, count: int = 10) -> List[Dict[str, Any]]: - """Review recent audit logs.""" - try: - # Get recent approval decisions - approval_history = self.approval_system.get_approval_history(count) - - # Get audit logs from audit logger - recent_logs = self.audit_logger.get_recent_logs(count) - - # Combine and format - logs = [] - - # Add approval decisions - for decision in approval_history: - logs.append( - { - "timestamp": decision.timestamp.isoformat(), - "type": "approval", - "request_id": decision.request.request_id, - "risk_level": decision.request.risk_analysis.risk_level.value, - "severity_score": decision.request.risk_analysis.severity_score, - "result": decision.result.value, - "user_input": decision.user_input, - "operation_type": self.approval_system._get_operation_type( - decision.request.code - ), - "code_preview": decision.request.code[:100] + "..." - if len(decision.request.code) > 100 - else decision.request.code, - } - ) - - # Add execution logs - for log in recent_logs: - logs.append( - { - "timestamp": log.get("timestamp", ""), - "type": "execution", - "execution_id": log.get("execution_id", ""), - "risk_level": log.get("risk_level", ""), - "success": log.get("success", False), - "execution_time": log.get("execution_time", 0.0), - "has_error": bool(log.get("error")), - "output_preview": (log.get("output", "")[:100] + "...") - if len(log.get("output", "")) > 100 - else log.get("output", ""), - } - ) - - # Sort by timestamp and limit - logs.sort(key=lambda x: x["timestamp"], reverse=True) - return logs[:count] - - except Exception as e: - self.logger.error(f"Error reviewing audit logs: {e}") - return [{"error": str(e), "type": "error"}] - - def configure_sandbox(self) -> bool: - """Interactive sandbox configuration.""" - try: - print("\n🔧 Sandbox Configuration") - print("=" * 40) - - current_config = self.config.get("sandbox", {}) - - # Resource limits - print("\n📊 Resource Limits:") - cpu = input(f"CPU limit percent [{current_config.get('cpu_percent', 70)}]: ").strip() - memory = input( - f"Memory limit percent [{current_config.get('memory_percent', 70)}]: " - ).strip() - timeout = input( - f"Timeout seconds [{current_config.get('timeout_seconds', 30)}]: " - ).strip() - - # Approval settings - print("\n🔐 Approval Settings:") - auto_low = ( - input( - f"Auto-approve low risk? [{current_config.get('auto_approve_low_risk', True)}]: " - ) - .strip() - .lower() - ) - require_high = ( - input( - f"Require approval for high risk? [{current_config.get('require_approval_high_risk', True)}]: " - ) - .strip() - .lower() - ) - - # Update configuration - updates = { - "cpu_percent": int(cpu) if cpu.isdigit() else current_config.get("cpu_percent", 70), - "memory_percent": int(memory) - if memory.isdigit() - else current_config.get("memory_percent", 70), - "timeout_seconds": int(timeout) - if timeout.isdigit() - else current_config.get("timeout_seconds", 30), - "auto_approve_low_risk": auto_low in ["true", "yes", "1"] - if auto_low - else current_config.get("auto_approve_low_risk", True), - "require_approval_high_risk": require_high in ["true", "yes", "1"] - if require_high - else current_config.get("require_approval_high_risk", True), - } - - # Note: In a full implementation, this would save to config file - print("\n✓ Configuration updated (changes apply to current session)") - print("Note: Permanent configuration changes require config file update") - - return True - - except Exception as e: - self.logger.error(f"Error configuring sandbox: {e}") - print(f"\n✗ Configuration error: {e}") - return False - - def reset_sandbox_preferences(self) -> bool: - """Reset all sandbox user preferences.""" - try: - self.approval_system.reset_preferences() - print("✓ All sandbox preferences reset to defaults") - return True - except Exception as e: - self.logger.error(f"Error resetting preferences: {e}") - print(f"✗ Error resetting preferences: {e}") - return False - - def get_sandbox_health(self) -> Dict[str, Any]: - """Get sandbox system health status.""" - try: - # Check Docker availability - docker_status = self.sandbox_manager.check_docker_availability() - - # Check audit log integrity - log_health = self.audit_logger.check_log_integrity() - - # Get recent approval patterns - trust_patterns = self.approval_system.get_trust_patterns() - - health = { - "overall_status": "healthy" if docker_status and log_health else "degraded", - "docker_available": docker_status, - "audit_logs_healthy": log_health, - "trust_patterns": trust_patterns, - "total_approvals": len(self.approval_system.approval_history), - "user_preferences": len(self.approval_system.user_preferences), - "last_check": time.time(), - } - - return health - - except Exception as e: - self.logger.error(f"Error checking sandbox health: {e}") - return {"overall_status": "error", "error": str(e), "last_check": time.time()} - - # Memory System Integration Methods - - def show_memory_status(self) -> Dict[str, Any]: - """Show current memory system status and statistics.""" - if not self.memory_manager: - return { - "memory_enabled": False, - "error": "Memory system not initialized", - "components": {"storage": False, "compression": False, "retrieval": False}, - } - - try: - # Get comprehensive memory statistics - memory_stats = self.memory_manager.get_memory_stats() - - # Convert to dictionary for display - status = { - "memory_enabled": True, - "overall_health": memory_stats.system_health, - "components": { - "storage": { - "enabled": memory_stats.storage_enabled, - "conversations": memory_stats.total_conversations, - "messages": memory_stats.total_messages, - "size_mb": round(memory_stats.database_size_mb, 2), - }, - "compression": { - "enabled": memory_stats.compression_enabled, - "total_compressions": memory_stats.total_compressions, - "average_ratio": round(memory_stats.average_compression_ratio, 2), - "compressed_conversations": memory_stats.compressed_conversations, - }, - "retrieval": { - "enabled": memory_stats.retrieval_enabled, - "recent_searches": memory_stats.recent_searches, - "average_search_time": round( - memory_stats.average_search_time * 1000, 2 - ), # Convert to ms - }, - }, - "health": { - "status": memory_stats.system_health, - "last_error": memory_stats.last_error, - "last_activity": memory_stats.last_activity, - }, - "auto_compression": { - "enabled": self.memory_manager.auto_compression_enabled, - "check_interval": self.memory_manager.compression_check_interval, - "message_counter": self.memory_manager.message_counter, - }, - } - - return status - - except Exception as e: - self.logger.error(f"Error getting memory status: {e}") - return {"memory_enabled": False, "error": str(e), "overall_health": "error"} - - def search_memory(self, query: str, **kwargs) -> Dict[str, Any]: - """Search memory for conversations matching the query.""" - if not self.memory_manager: - return {"success": False, "error": "Memory system not available", "results": []} - - try: - # Extract search parameters - limit = kwargs.get("limit", 10) - filters = kwargs.get("filters", {}) - conversation_type = kwargs.get("conversation_type", None) - - # Perform search - if conversation_type: - # Use context retrieval for typed search - context_result = self.memory_manager.get_context( - query=query, conversation_type=conversation_type, max_results=limit - ) - results = [ - { - "conversation_id": conv["conversation_id"], - "title": conv["title"], - "similarity_score": conv["similarity_score"], - "excerpt": conv["excerpt"], - "relevance_type": conv["relevance_type"], - } - for conv in context_result["relevant_conversations"] - ] - metadata = { - "total_conversations": context_result["total_conversations"], - "estimated_tokens": context_result["estimated_tokens"], - "search_time": context_result["search_time"], - "query_metadata": context_result["metadata"], - } - else: - # Use basic search - results = self.memory_manager.search_conversations( - query=query, filters=filters, limit=limit - ) - metadata = { - "query": query, - "filters_applied": bool(filters), - "result_count": len(results), - } - - return { - "success": True, - "query": query, - "results": results, - "metadata": metadata, - "timestamp": time.time(), - } - - except Exception as e: - self.logger.error(f"Error searching memory: {e}") - return {"success": False, "error": str(e), "results": []} - - def manage_memory(self, action: str, target: Optional[str] = None, **kwargs) -> Dict[str, Any]: - """Manage memory with various actions (cleanup, compress, etc.).""" - if not self.memory_manager: - return {"success": False, "error": "Memory system not available", "action": action} - - try: - if action == "cleanup": - # Clean up old memories - days_old = kwargs.get("days_old", 90) - result = self.memory_manager.cleanup_old_memories(days_old=days_old) - return { - "success": True, - "action": action, - "result": result, - "message": f"Cleaned up {result['deleted_count']} conversations older than {days_old} days", - } - - elif action == "compress_check": - # Check compression triggers - triggered = self.memory_manager.check_compression_triggers() - return { - "success": True, - "action": action, - "result": {"triggered_conversations": triggered, "count": len(triggered)}, - "message": f"Found {len(triggered)} conversations needing compression", - } - - elif action == "compress_all": - # Force compression check on all conversations - triggered = self.memory_manager.check_compression_triggers() - compressed_count = 0 - errors = [] - - for conv_id in triggered: - try: - # Note: This would need compressor.compress_conversation() method - # For now, just count triggered conversations - compressed_count += 1 - except Exception as e: - errors.append(f"Failed to compress {conv_id}: {e}") - - return { - "success": len(errors) == 0, - "action": action, - "result": { - "attempted": len(triggered), - "compressed": compressed_count, - "errors": errors, - }, - "message": f"Attempted compression on {len(triggered)} conversations", - } - - elif action == "stats": - # Get detailed statistics - stats = self.memory_manager.get_memory_stats() - return { - "success": True, - "action": action, - "result": stats.to_dict(), - "message": "Retrieved memory system statistics", - } - - elif action == "reset_counters": - # Reset performance counters - self.memory_manager.search_times.clear() - self.memory_manager.compression_history.clear() - self.memory_manager.message_counter = 0 - - return { - "success": True, - "action": action, - "result": {"counters_reset": True}, - "message": "Reset all memory performance counters", - } - - else: - return { - "success": False, - "error": f"Unknown action: {action}", - "action": action, - "available_actions": [ - "cleanup", - "compress_check", - "compress_all", - "stats", - "reset_counters", - ], - } - - except Exception as e: - self.logger.error(f"Error managing memory: {e}") - return {"success": False, "error": str(e), "action": action} - - -# Standalone CLI functions for memory management -# These provide direct access to memory functionality without requiring MaiInterface instance - - -def show_memory_status() -> Dict[str, Any]: - """Show current memory system status and statistics.""" - try: - # Create a temporary interface instance to access memory system - interface = MaiInterface() - if interface.memory_manager: - return interface.show_memory_status() - else: - return { - "memory_enabled": False, - "error": "Memory system not initialized", - "components": {"storage": False, "compression": False, "retrieval": False}, - } - except Exception as e: - return {"memory_enabled": False, "error": str(e), "overall_health": "error"} - - -def search_memory(query: str, **kwargs) -> Dict[str, Any]: - """Search memory for conversations matching query.""" - try: - # Create a temporary interface instance to access memory system - interface = MaiInterface() - if interface.memory_manager: - return interface.search_memory(query, **kwargs) - else: - return {"success": False, "error": "Memory system not available", "results": []} - except Exception as e: - return {"success": False, "error": str(e), "results": []} - - -def manage_memory(action: str, target: Optional[str] = None, **kwargs) -> Dict[str, Any]: - """Manage memory with various actions (cleanup, compress, etc.).""" - try: - # Create a temporary interface instance to access memory system - interface = MaiInterface() - if interface.memory_manager: - return interface.manage_memory(action, target, **kwargs) - else: - return {"success": False, "error": "Memory system not available", "action": action} - except Exception as e: - return {"success": False, "error": str(e), "action": action} diff --git a/src/mai/git/__init__.py b/src/mai/git/__init__.py deleted file mode 100644 index 71daf4e..0000000 --- a/src/mai/git/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -""" -Git workflow management for Mai's self-improvement system. - -Provides staging branch management, validation, and cleanup -capabilities for safe code improvements. -""" - -from .workflow import StagingWorkflow -from .committer import AutoCommitter -from .health_check import HealthChecker - -__all__ = ["StagingWorkflow", "AutoCommitter", "HealthChecker"] diff --git a/src/mai/git/committer.py b/src/mai/git/committer.py deleted file mode 100644 index be0de50..0000000 --- a/src/mai/git/committer.py +++ /dev/null @@ -1,499 +0,0 @@ -""" -Automated commit generation and management for Mai's self-improvement system. - -Handles staging changes, generating user-focused commit messages, -and managing commit history with proper validation. -""" - -import os -import re -import logging -from datetime import datetime -from typing import List, Dict, Optional, Any, Set -from pathlib import Path - -try: - from git import Repo, InvalidGitRepositoryError, GitCommandError, Diff, GitError -except ImportError: - raise ImportError("GitPython is required. Install with: pip install GitPython") - -from ..core import MaiError, ConfigurationError - - -class AutoCommitterError(MaiError): - """Raised when automated commit operations fail.""" - - pass - - -class AutoCommitter: - """ - Automates commit generation and management for Mai's improvements. - - Provides staging, commit message generation, and history management - with user-focused impact descriptions. - """ - - def __init__(self, project_path: str = "."): - """ - Initialize auto committer. - - Args: - project_path: Path to git repository - - Raises: - ConfigurationError: If not a git repository - """ - self.project_path = Path(project_path).resolve() - self.logger = logging.getLogger(__name__) - - try: - self.repo = Repo(self.project_path) - except InvalidGitRepositoryError: - raise ConfigurationError(f"Not a git repository: {self.project_path}") - - # Commit message templates and patterns - self.templates = { - "performance": "Faster {operation} for {scenario}", - "bugfix": "Fixed {issue} - {impact on user}", - "feature": "Added {capability} - now you can {user benefit}", - "optimization": "Improved {system} - {performance gain}", - "refactor": "Cleaned up {component} - {improvement}", - "security": "Enhanced security for {area} - {protection}", - "compatibility": "Made Mai work better with {environment} - {benefit}", - } - - # File patterns to ignore - self.ignore_patterns = { - "*.pyc", - "*.pyo", - "*.pyd", - "__pycache__", - ".git", - ".pytest_cache", - ".coverage", - "htmlcov", - "*.log", - ".env", - "*.tmp", - "*.temp", - "*.bak", - ".DS_Store", - "*.swp", - "*~", - } - - # Group patterns by system - self.group_patterns = { - "model": ["src/mai/model/", "*.model.*"], - "git": ["src/mai/git/", "*.git.*"], - "core": ["src/mai/core/", "*.core.*"], - "memory": ["src/mai/memory/", "*.memory.*"], - "safety": ["src/mai/safety/", "*.safety.*"], - "personality": ["src/mai/personality/", "*.personality.*"], - "interface": ["src/mai/interface/", "*.interface.*"], - "config": ["*.toml", "*.yaml", "*.yml", "*.conf", ".env*"], - } - - # Initialize user information - self._init_user_info() - - self.logger.info(f"Auto committer initialized for {self.project_path}") - - def stage_changes( - self, file_patterns: Optional[List[str]] = None, group_by: str = "system" - ) -> Dict[str, Any]: - """ - Stage changed files for commit with optional grouping. - - Args: - file_patterns: Specific file patterns to stage - group_by: How to group changes ("system", "directory", "none") - - Returns: - Dictionary with staging results and groups - """ - try: - # Get changed files - changed_files = self._get_changed_files() - - # Filter by patterns if specified - if file_patterns: - changed_files = [ - f for f in changed_files if self._matches_pattern(f, file_patterns) - ] - - # Filter out ignored files - staged_files = [f for f in changed_files if not self._should_ignore_file(f)] - - # Stage the files - self.repo.index.add(staged_files) - - # Group changes - groups = self._group_changes(staged_files, group_by) if group_by != "none" else {} - - self.logger.info(f"Staged {len(staged_files)} files in {len(groups)} groups") - - return { - "staged_files": staged_files, - "groups": groups, - "total_files": len(staged_files), - "message": f"Staged {len(staged_files)} files for commit", - } - - except (GitError, GitCommandError) as e: - raise AutoCommitterError(f"Failed to stage changes: {e}") - - def generate_commit_message( - self, changes: List[str], impact_description: str, improvement_type: str = "feature" - ) -> str: - """ - Generate user-focused commit message. - - Args: - changes: List of changed files - impact_description: Description of impact on user - improvement_type: Type of improvement - - Returns: - User-focused commit message - """ - # Try to use template - if improvement_type in self.templates: - template = self.templates[improvement_type] - - # Extract context from changes - context = self._extract_context_from_files(changes) - - # Fill template - try: - message = template.format(**context, **{"user benefit": impact_description}) - except KeyError: - # Fall back to impact description - message = impact_description - else: - message = impact_description - - # Ensure user-focused language - message = self._make_user_focused(message) - - # Add technical details as second line - if len(changes) <= 5: - tech_details = f"Files: {', '.join([Path(f).name for f in changes[:3]])}" - if len(changes) > 3: - tech_details += f" (+{len(changes) - 3} more)" - message = f"{message}\n\n{tech_details}" - - # Limit length - if len(message) > 100: - message = message[:97] + "..." - - return message - - def commit_changes( - self, message: str, files: Optional[List[str]] = None, validate_before: bool = True - ) -> Dict[str, Any]: - """ - Create commit with generated message and optional validation. - - Args: - message: Commit message - files: Specific files to commit (stages all if None) - validate_before: Run validation before committing - - Returns: - Dictionary with commit results - """ - try: - # Validate if requested - if validate_before: - validation = self._validate_commit(message, files) - if not validation["valid"]: - return { - "success": False, - "message": "Commit validation failed", - "validation": validation, - "commit_hash": None, - } - - # Stage files if specified - if files: - self.repo.index.add(files) - - # Check if there are staged changes - if not self.repo.is_dirty(untracked_files=True) and not self.repo.index.diff("HEAD"): - return {"success": False, "message": "No changes to commit", "commit_hash": None} - - # Create commit with metadata - commit = self.repo.index.commit( - message=message, author_date=datetime.now(), committer_date=datetime.now() - ) - - commit_hash = commit.hexsha - - self.logger.info(f"Created commit: {commit_hash[:8]} - {message[:50]}") - - return { - "success": True, - "message": f"Committed {commit_hash[:8]}", - "commit_hash": commit_hash, - "short_hash": commit_hash[:8], - "full_message": message, - } - - except (GitError, GitCommandError) as e: - raise AutoCommitterError(f"Failed to create commit: {e}") - - def get_commit_history( - self, limit: int = 10, filter_by: Optional[Dict[str, Any]] = None - ) -> List[Dict[str, Any]]: - """ - Retrieve commit history with metadata. - - Args: - limit: Maximum number of commits to retrieve - filter_by: Filter criteria (author, date range, patterns) - - Returns: - List of commit information - """ - try: - commits = [] - - for commit in self.repo.iter_commits(max_count=limit): - # Apply filters - if filter_by: - if "author" in filter_by and filter_by["author"] not in commit.author.name: - continue - if "since" in filter_by and commit.committed_date < filter_by["since"]: - continue - if "until" in filter_by and commit.committed_date > filter_by["until"]: - continue - if "pattern" in filter_by and not re.search( - filter_by["pattern"], commit.message - ): - continue - - commits.append( - { - "hash": commit.hexsha, - "short_hash": commit.hexsha[:8], - "message": commit.message.strip(), - "author": commit.author.name, - "date": datetime.fromtimestamp(commit.committed_date).isoformat(), - "files_changed": len(commit.stats.files), - "insertions": commit.stats.total["insertions"], - "deletions": commit.stats.total["deletions"], - "impact": self._extract_impact_from_message(commit.message), - } - ) - - return commits - - except (GitError, GitCommandError) as e: - raise AutoCommitterError(f"Failed to get commit history: {e}") - - def revert_commit(self, commit_hash: str, create_branch: bool = True) -> Dict[str, Any]: - """ - Safely revert specified commit. - - Args: - commit_hash: Hash of commit to revert - create_branch: Create backup branch before reverting - - Returns: - Dictionary with revert results - """ - try: - # Validate commit exists - try: - commit = self.repo.commit(commit_hash) - except Exception: - return { - "success": False, - "message": f"Commit {commit_hash[:8]} not found", - "commit_hash": None, - } - - # Create backup branch if requested - backup_branch = None - if create_branch: - timestamp = datetime.now().strftime("%Y%m%d-%H%M%S") - backup_branch = f"backup/before-revert-{commit_hash[:8]}-{timestamp}" - self.repo.create_head(backup_branch, self.repo.active_branch.commit) - self.logger.info(f"Created backup branch: {backup_branch}") - - # Perform revert - revert_commit = self.repo.git.revert("--no-edit", commit_hash) - - # Get new commit hash - new_commit_hash = self.repo.head.commit.hexsha - - self.logger.info(f"Reverted commit {commit_hash[:8]} -> {new_commit_hash[:8]}") - - return { - "success": True, - "message": f"Reverted {commit_hash[:8]} successfully", - "original_commit": commit_hash, - "new_commit_hash": new_commit_hash, - "new_short_hash": new_commit_hash[:8], - "backup_branch": backup_branch, - "original_message": commit.message.strip(), - } - - except (GitError, GitCommandError) as e: - raise AutoCommitterError(f"Failed to revert commit: {e}") - - def _get_changed_files(self) -> List[str]: - """Get list of changed files in working directory.""" - changed_files = set() - - # Unstaged changes - for item in self.repo.index.diff(None): - changed_files.add(item.a_path) - - # Staged changes - for item in self.repo.index.diff("HEAD"): - changed_files.add(item.a_path) - - # Untracked files - changed_files.update(self.repo.untracked_files) - - return list(changed_files) - - def _should_ignore_file(self, file_path: str) -> bool: - """Check if file should be ignored.""" - file_name = Path(file_path).name - - for pattern in self.ignore_patterns: - if self._matches_pattern(file_path, [pattern]): - return True - - return False - - def _matches_pattern(self, file_path: str, patterns: List[str]) -> bool: - """Check if file path matches any pattern.""" - import fnmatch - - for pattern in patterns: - if fnmatch.fnmatch(file_path, pattern) or fnmatch.fnmatch( - Path(file_path).name, pattern - ): - return True - return False - - def _group_changes(self, files: List[str], group_by: str) -> Dict[str, List[str]]: - """Group files by system or directory.""" - groups = {} - - if group_by == "system": - for file_path in files: - group = "other" - for system, patterns in self.group_patterns.items(): - if self._matches_pattern(file_path, patterns): - group = system - break - - if group not in groups: - groups[group] = [] - groups[group].append(file_path) - - elif group_by == "directory": - for file_path in files: - directory = str(Path(file_path).parent) - if directory not in groups: - groups[directory] = [] - groups[directory].append(file_path) - - return groups - - def _extract_context_from_files(self, files: List[str]) -> Dict[str, str]: - """Extract context from changed files.""" - context = {} - - # Analyze file paths for context - model_files = [f for f in files if "model" in f.lower()] - git_files = [f for f in files if "git" in f.lower()] - core_files = [f for f in files if "core" in f.lower()] - - if model_files: - context["system"] = "model interface" - context["operation"] = "model operations" - elif git_files: - context["system"] = "git workflows" - context["operation"] = "version control" - elif core_files: - context["system"] = "core functionality" - context["operation"] = "system stability" - else: - context["system"] = "Mai" - context["operation"] = "functionality" - - # Default scenario - context["scenario"] = "your conversations" - context["area"] = "Mai's capabilities" - - return context - - def _make_user_focused(self, message: str) -> str: - """Convert message to be user-focused.""" - # Remove technical jargon - replacements = { - "feat:": "", - "fix:": "", - "refactor:": "", - "optimize:": "", - "implementation": "new capability", - "functionality": "features", - "module": "component", - "code": "improvements", - "api": "interface", - "backend": "core system", - } - - for old, new in replacements.items(): - message = message.replace(old, new) - - # Start with action verb if needed - if not message[0].isupper(): - message = message[0].upper() + message[1:] - - return message.strip() - - def _validate_commit(self, message: str, files: Optional[List[str]]) -> Dict[str, Any]: - """Validate commit before creation.""" - issues = [] - - # Check message length - if len(message) > 100: - issues.append("Commit message too long (>100 characters)") - - # Check message has content - if not message.strip(): - issues.append("Empty commit message") - - # Check for files if specified - if files and not files: - issues.append("No files specified for commit") - - return {"valid": len(issues) == 0, "issues": issues} - - def _extract_impact_from_message(self, message: str) -> str: - """Extract impact description from commit message.""" - # Split by lines and take first non-empty line - lines = message.strip().split("\n") - for line in lines: - line = line.strip() - if line and not line.startswith("Files:"): - return line - return message - - def _init_user_info(self) -> None: - """Initialize user information from git config.""" - try: - config = self.repo.config_reader() - self.user_name = config.get_value("user", "name", "Mai") - self.user_email = config.get_value("user", "email", "mai@local") - except Exception: - self.user_name = "Mai" - self.user_email = "mai@local" diff --git a/src/mai/git/health_check.py b/src/mai/git/health_check.py deleted file mode 100644 index d5d99e6..0000000 --- a/src/mai/git/health_check.py +++ /dev/null @@ -1,1011 +0,0 @@ -""" -Health check and validation system for Mai's self-improvement code. - -Provides comprehensive testing, validation, and regression detection -to ensure code changes are safe before merging. -""" - -import os -import sys -import time -import importlib -import subprocess -import logging -import traceback -from datetime import datetime, timedelta -from typing import List, Dict, Optional, Any, Tuple, Callable -from pathlib import Path - -from ..core import MaiError, ConfigurationError - - -class HealthCheckError(MaiError): - """Raised when health check operations fail.""" - - pass - - -class HealthChecker: - """ - Comprehensive health validation for Mai's code improvements. - - Provides syntax checking, functionality testing, performance - validation, and Mai-specific behavior validation. - """ - - def __init__(self, project_path: str = ".", timeout: int = 60): - """ - Initialize health checker. - - Args: - project_path: Path to project directory - timeout: Timeout for health check operations - """ - self.project_path = Path(project_path).resolve() - self.timeout = timeout - self.logger = logging.getLogger(__name__) - - # Health check categories - self.categories = { - "basic": self._basic_health_checks, - "extended": self._extended_health_checks, - "mai-specific": self._mai_specific_tests, - "performance": self._performance_tests, - } - - # Configure retry and timeout policies - self.max_retries = 3 - self.retry_delay = 2 - - # Performance baseline tracking - self.performance_baseline = {} - self._load_performance_baseline() - - self.logger.info(f"Health checker initialized for {self.project_path}") - - def run_basic_health_checks(self) -> Dict[str, Any]: - """ - Execute essential system validation tests. - - Returns: - Detailed results with suggestions for any issues found - """ - results = { - "category": "basic", - "timestamp": datetime.now().isoformat(), - "checks": [], - "passed": 0, - "failed": 0, - "warnings": 0, - "overall_status": "unknown", - } - - checks = [ - ("Python Syntax", self._check_python_syntax), - ("Import Validation", self._check_imports), - ("Configuration Files", self._check_configuration), - ("Core Functionality", self._check_core_functionality), - ("Dependencies", self._check_dependencies), - ] - - for check_name, check_func in checks: - self.logger.info(f"Running basic check: {check_name}") - - try: - check_result = check_func() - results["checks"].append( - { - "name": check_name, - "status": check_result["status"], - "message": check_result["message"], - "details": check_result.get("details", {}), - "suggestions": check_result.get("suggestions", []), - } - ) - - if check_result["status"] == "pass": - results["passed"] += 1 - elif check_result["status"] == "warning": - results["warnings"] += 1 - else: - results["failed"] += 1 - - except Exception as e: - self.logger.error(f"Basic check '{check_name}' failed: {e}") - results["checks"].append( - { - "name": check_name, - "status": "error", - "message": f"Check failed with error: {e}", - "details": {"traceback": traceback.format_exc()}, - "suggestions": ["Check system configuration and permissions"], - } - ) - results["failed"] += 1 - - # Determine overall status - if results["failed"] == 0: - results["overall_status"] = "pass" if results["warnings"] == 0 else "warning" - else: - results["overall_status"] = "fail" - - return results - - def run_mai_specific_tests(self) -> Dict[str, Any]: - """ - Run Mai-specific validation tests. - - Returns: - Test results for Mai-specific functionality - """ - results = { - "category": "mai-specific", - "timestamp": datetime.now().isoformat(), - "checks": [], - "passed": 0, - "failed": 0, - "overall_status": "unknown", - } - - checks = [ - ("Model Interface", self._check_model_interface), - ("Resource Monitoring", self._check_resource_monitoring), - ("Git Workflows", self._check_git_workflows), - ("Context Compression", self._check_context_compression), - ("Core Components", self._check_core_components), - ] - - for check_name, check_func in checks: - self.logger.info(f"Running Mai-specific check: {check_name}") - - try: - check_result = check_func() - results["checks"].append( - { - "name": check_name, - "status": check_result["status"], - "message": check_result["message"], - "details": check_result.get("details", {}), - "suggestions": check_result.get("suggestions", []), - } - ) - - if check_result["status"] == "pass": - results["passed"] += 1 - else: - results["failed"] += 1 - - except Exception as e: - self.logger.error(f"Mai-specific check '{check_name}' failed: {e}") - results["checks"].append( - { - "name": check_name, - "status": "error", - "message": f"Check failed with error: {e}", - "details": {"traceback": traceback.format_exc()}, - "suggestions": ["Check Mai component configuration"], - } - ) - results["failed"] += 1 - - results["overall_status"] = "pass" if results["failed"] == 0 else "fail" - return results - - def run_performance_tests(self, duration: int = 30) -> Dict[str, Any]: - """ - Execute performance benchmarks. - - Args: - duration: Duration of performance test in seconds - - Returns: - Performance metrics with trend analysis - """ - results = { - "category": "performance", - "timestamp": datetime.now().isoformat(), - "duration": duration, - "metrics": {}, - "baseline_comparison": {}, - "trend_analysis": {}, - "overall_status": "unknown", - } - - self.logger.info(f"Running performance tests for {duration} seconds") - - try: - # Test different performance aspects - performance_checks = [ - ("Import Speed", self._test_import_speed), - ("Memory Usage", self._test_memory_usage), - ("Model Client", self._test_model_client_performance), - ("Git Operations", self._test_git_performance), - ] - - for check_name, check_func in performance_checks: - start_time = time.time() - - try: - metrics = check_func(duration) - end_time = time.time() - - results["metrics"][check_name] = { - "data": metrics, - "test_duration": end_time - start_time, - "status": "success", - } - - except Exception as e: - results["metrics"][check_name] = {"error": str(e), "status": "failed"} - - # Compare with baseline - results["baseline_comparison"] = self._compare_with_baseline(results["metrics"]) - - # Analyze trends - results["trend_analysis"] = self._analyze_performance_trends(results["metrics"]) - - # Determine overall status - failed_checks = sum( - 1 for m in results["metrics"].values() if m.get("status") == "failed" - ) - results["overall_status"] = "pass" if failed_checks == 0 else "fail" - - # Update baseline if tests passed - if results["overall_status"] == "pass": - self._update_performance_baseline(results["metrics"]) - - except Exception as e: - self.logger.error(f"Performance tests failed: {e}") - results["overall_status"] = "error" - results["error"] = str(e) - - return results - - def validate_improvement(self, branch_name: str, base_commit: str) -> Dict[str, Any]: - """ - Compare branch against baseline with full validation. - - Args: - branch_name: Name of improvement branch - base_commit: Base commit to compare against - - Returns: - Validation report with recommendations - """ - results = { - "branch_name": branch_name, - "base_commit": base_commit, - "timestamp": datetime.now().isoformat(), - "validation_results": {}, - "performance_comparison": {}, - "recommendations": [], - "can_merge": False, - "overall_status": "unknown", - } - - self.logger.info(f"Validating improvement branch {branch_name} against {base_commit[:8]}") - - try: - # Import git functionality for branch comparison - from .workflow import StagingWorkflow - - workflow = StagingWorkflow(str(self.project_path)) - - # Switch to improvement branch temporarily - original_branch = workflow.repo.active_branch.name - switch_result = workflow.switch_to_branch(branch_name) - - if not switch_result["success"]: - return { - **results, - "overall_status": "error", - "error": f"Cannot switch to branch {branch_name}: {switch_result['message']}", - } - - # Run tests on improvement branch - improvement_tests = self.run_all_tests("basic") - - # Switch back to base branch - workflow.switch_to_branch(base_commit) - - # Run tests on base branch - base_tests = self.run_all_tests("basic") - - # Compare results - comparison = self._compare_test_results(improvement_tests, base_tests) - results["validation_results"] = comparison - - # Run performance comparison - improvement_perf = self.run_performance_tests(duration=15) - workflow.switch_to_branch(branch_name) - branch_perf = improvement_perf - - workflow.switch_to_branch(base_commit) - base_perf = self.run_performance_tests(duration=15) - - results["performance_comparison"] = self._compare_performance(branch_perf, base_perf) - - # Generate recommendations - results["recommendations"] = self._generate_recommendations( - comparison, results["performance_comparison"] - ) - - # Determine if safe to merge - results["can_merge"] = self._can_merge_safely(results) - results["overall_status"] = "pass" if results["can_merge"] else "fail" - - # Switch back to original branch - workflow.switch_to_branch(original_branch) - - except Exception as e: - self.logger.error(f"Validation failed: {e}") - results["overall_status"] = "error" - results["error"] = str(e) - - return results - - def create_test_suite(self, test_type: str = "basic") -> Dict[str, Any]: - """ - Generate test suite for specific scenarios. - - Args: - test_type: Type of test suite to generate - - Returns: - Test suite configuration - """ - test_suites = { - "basic": { - "description": "Essential validation tests", - "tests": [ - "Python syntax validation", - "Import checking", - "Configuration validation", - "Basic functionality tests", - ], - "duration_estimate": "2-5 minutes", - "requirements": ["Python 3.10+", "Project dependencies"], - }, - "extended": { - "description": "Comprehensive validation including integration", - "tests": [ - "All basic tests", - "Integration tests", - "Error handling validation", - "Edge case testing", - ], - "duration_estimate": "5-15 minutes", - "requirements": ["All basic requirements", "Test environment setup"], - }, - "mai-specific": { - "description": "Mai-specific behavior and functionality", - "tests": [ - "Model interface testing", - "Resource monitoring validation", - "Git workflow testing", - "Context compression testing", - ], - "duration_estimate": "3-8 minutes", - "requirements": ["Ollama running (optional)", "Git repository"], - }, - "performance": { - "description": "Performance benchmarking and regression detection", - "tests": [ - "Import speed testing", - "Memory usage analysis", - "Model client performance", - "Git operation benchmarks", - ], - "duration_estimate": "1-5 minutes", - "requirements": ["Stable system load", "Consistent environment"], - }, - } - - if test_type not in test_suites: - return { - "error": f"Unknown test type: {test_type}", - "available_types": list(test_suites.keys()), - } - - suite = test_suites[test_type] - suite["test_type"] = test_type - suite["generated_at"] = datetime.now().isoformat() - - return suite - - def run_all_tests(self, category: str = "basic") -> Dict[str, Any]: - """ - Run all tests in a specific category. - - Args: - category: Test category to run - - Returns: - Aggregated test results - """ - if category not in self.categories: - return { - "error": f"Unknown test category: {category}", - "available_categories": list(self.categories.keys()), - } - - return self.categories[category]() - - # Private implementation methods - - def _basic_health_checks(self) -> Dict[str, Any]: - """Placeholder - implemented as run_basic_health_checks.""" - pass - - def _extended_health_checks(self) -> Dict[str, Any]: - """Extended health checks with integration testing.""" - # TODO: Implement extended tests - return {"status": "not_implemented", "message": "Extended checks not yet implemented"} - - def _mai_specific_tests(self) -> Dict[str, Any]: - """Placeholder - implemented as run_mai_specific_tests.""" - pass - - def _performance_tests(self) -> Dict[str, Any]: - """Placeholder - implemented as run_performance_tests.""" - pass - - def _check_python_syntax(self) -> Dict[str, Any]: - """Check Python syntax in all Python files.""" - python_files = list(self.project_path.rglob("*.py")) - syntax_errors = [] - - for file_path in python_files: - try: - with open(file_path, "r", encoding="utf-8") as f: - compile(f.read(), str(file_path), "exec") - except SyntaxError as e: - syntax_errors.append( - { - "file": str(file_path.relative_to(self.project_path)), - "line": e.lineno, - "error": str(e), - } - ) - - if syntax_errors: - return { - "status": "fail", - "message": f"Syntax errors found in {len(syntax_errors)} files", - "details": {"errors": syntax_errors}, - "suggestions": ["Fix syntax errors before proceeding"], - } - - return { - "status": "pass", - "message": f"All {len(python_files)} Python files have valid syntax", - } - - def _check_imports(self) -> Dict[str, Any]: - """Check that imports work correctly.""" - import_errors = [] - - # Try importing main modules - modules_to_test = ["src.mai.model", "src.mai.git", "src.mai.core"] - - for module_name in modules_to_test: - try: - importlib.import_module(module_name) - except ImportError as e: - import_errors.append({"module": module_name, "error": str(e)}) - - if import_errors: - return { - "status": "fail", - "message": f"Import errors in {len(import_errors)} modules", - "details": {"errors": import_errors}, - "suggestions": ["Check dependencies and module structure"], - } - - return {"status": "pass", "message": "All core modules import successfully"} - - def _check_configuration(self) -> Dict[str, Any]: - """Validate configuration files.""" - config_files = ["pyproject.toml", ".env", "README.md"] - issues = [] - - for config_file in config_files: - file_path = self.project_path / config_file - if file_path.exists(): - try: - if config_file.endswith(".toml"): - import toml - - with open(file_path, "r") as f: - toml.load(f) - except Exception as e: - issues.append({"file": config_file, "error": str(e)}) - - if issues: - return { - "status": "warning", - "message": f"Configuration issues in {len(issues)} files", - "details": {"issues": issues}, - "suggestions": ["Review and fix configuration errors"], - } - - return {"status": "pass", "message": "Configuration files are valid"} - - def _check_core_functionality(self) -> Dict[str, Any]: - """Check that core functionality works.""" - try: - # Test basic imports - from src.mai.core import MaiError, ConfigurationError - from src.mai.model.ollama_client import OllamaClient - from src.mai.git.workflow import StagingWorkflow - from src.mai.git.committer import AutoCommitter - - # Test basic functionality - client = OllamaClient() - workflow = StagingWorkflow(str(self.project_path)) - committer = AutoCommitter(str(self.project_path)) - - return { - "status": "pass", - "message": "Core functionality initializes correctly", - "details": { - "ollama_client": "ok", - "staging_workflow": "ok", - "auto_committer": "ok", - }, - } - - except Exception as e: - return { - "status": "fail", - "message": f"Core functionality test failed: {e}", - "suggestions": ["Check module imports and dependencies"], - } - - def _check_dependencies(self) -> Dict[str, Any]: - """Check that required dependencies are available.""" - required_packages = ["ollama", "psutil", "GitPython", "tiktoken"] - missing_packages = [] - - for package in required_packages: - try: - __import__(package.lower().replace("-", "_")) - except ImportError: - missing_packages.append(package) - - if missing_packages: - return { - "status": "fail", - "message": f"Missing dependencies: {', '.join(missing_packages)}", - "details": {"missing": missing_packages}, - "suggestions": [f"Install with: pip install {' '.join(missing_packages)}"], - } - - return {"status": "pass", "message": "All dependencies are available"} - - def _check_model_interface(self) -> Dict[str, Any]: - """Check model interface functionality.""" - try: - from src.mai.model.ollama_client import OllamaClient - - client = OllamaClient() - - # Test basic functionality - models = client.list_models() - - return { - "status": "pass", - "message": f"Model interface working, found {len(models)} models", - "details": {"model_count": len(models)}, - } - - except Exception as e: - return { - "status": "warning", - "message": f"Model interface test failed: {e}", - "suggestions": ["Ensure Ollama is running if model detection is needed"], - } - - def _check_resource_monitoring(self) -> Dict[str, Any]: - """Check resource monitoring functionality.""" - try: - import psutil - - # Test basic monitoring - cpu_percent = psutil.cpu_percent(interval=1) - memory = psutil.virtual_memory() - - return { - "status": "pass", - "message": "Resource monitoring working correctly", - "details": { - "cpu_usage": cpu_percent, - "memory_available": memory.available, - "memory_total": memory.total, - }, - } - - except Exception as e: - return { - "status": "fail", - "message": f"Resource monitoring test failed: {e}", - "suggestions": ["Check psutil installation"], - } - - def _check_git_workflows(self) -> Dict[str, Any]: - """Check git workflow functionality.""" - try: - from src.mai.git.workflow import StagingWorkflow - from src.mai.git.committer import AutoCommitter - - workflow = StagingWorkflow(str(self.project_path)) - committer = AutoCommitter(str(self.project_path)) - - # Test basic operations - branches = workflow.get_active_staging_branches() - history = committer.get_commit_history(limit=1) - - return { - "status": "pass", - "message": "Git workflows working correctly", - "details": {"staging_branches": len(branches), "commit_history": len(history)}, - } - - except Exception as e: - return { - "status": "fail", - "message": f"Git workflow test failed: {e}", - "suggestions": ["Check Git repository state"], - } - - def _check_context_compression(self) -> Dict[str, Any]: - """Check context compression functionality.""" - try: - from src.mai.model.compression import ContextCompressor - - compressor = ContextCompressor() - - # Test basic functionality - test_context = "This is a test context for compression." - compressed = compressor.compress_context(test_context) - - return { - "status": "pass", - "message": "Context compression working correctly", - "details": { - "original_length": len(test_context), - "compressed_length": len(compressed), - }, - } - - except Exception as e: - return { - "status": "fail", - "message": f"Context compression test failed: {e}", - "suggestions": ["Check compression module implementation"], - } - - def _check_core_components(self) -> Dict[str, Any]: - """Check core component availability.""" - core_components = [ - "src.mai.core.exceptions", - "src.mai.core.config", - "src.mai.model.ollama_client", - "src.mai.model.compression", - ] - - working_components = [] - failed_components = [] - - for component in core_components: - try: - importlib.import_module(component) - working_components.append(component) - except Exception: - failed_components.append(component) - - if failed_components: - return { - "status": "fail", - "message": f"Core components failed: {len(failed_components)}", - "details": {"working": working_components, "failed": failed_components}, - } - - return { - "status": "pass", - "message": f"All {len(working_components)} core components working", - } - - def _test_import_speed(self, duration: int) -> Dict[str, float]: - """Test module import speed.""" - start_time = time.time() - end_time = start_time + duration - import_count = 0 - - modules_to_test = ["src.mai.core", "src.mai.model", "src.mai.git"] - - while time.time() < end_time: - for module in modules_to_test: - try: - importlib.import_module(module) - import_count += 1 - except ImportError: - pass - time.sleep(0.1) # Small delay - - actual_duration = time.time() - start_time - imports_per_second = import_count / actual_duration - - return { - "imports_per_second": imports_per_second, - "total_imports": import_count, - "duration": actual_duration, - } - - def _test_memory_usage(self, duration: int) -> Dict[str, float]: - """Test memory usage patterns.""" - try: - import psutil - - memory_samples = [] - start_time = time.time() - - while time.time() - start_time < duration: - memory = psutil.virtual_memory() - memory_samples.append(memory.percent) - time.sleep(1) - - return { - "average_memory_percent": sum(memory_samples) / len(memory_samples), - "max_memory_percent": max(memory_samples), - "min_memory_percent": min(memory_samples), - "sample_count": len(memory_samples), - } - - except Exception as e: - return {"error": str(e)} - - def _test_model_client_performance(self, duration: int) -> Dict[str, Any]: - """Test model client performance.""" - try: - from src.mai.model.ollama_client import OllamaClient - - client = OllamaClient() - - start_time = time.time() - response_times = [] - - while time.time() - start_time < duration: - request_start = time.time() - models = client.list_models() - request_end = time.time() - - response_times.append(request_end - request_start) - time.sleep(2) # Delay between requests - - return { - "average_response_time": sum(response_times) / len(response_times), - "min_response_time": min(response_times), - "max_response_time": max(response_times), - "request_count": len(response_times), - } - - except Exception as e: - return {"error": str(e)} - - def _test_git_performance(self, duration: int) -> Dict[str, float]: - """Test git operation performance.""" - try: - from src.mai.git.workflow import StagingWorkflow - - workflow = StagingWorkflow(str(self.project_path)) - - start_time = time.time() - operation_times = [] - - while time.time() - start_time < duration: - op_start = time.time() - branches = workflow.get_active_staging_branches() - op_end = time.time() - - operation_times.append(op_end - op_start) - time.sleep(1) - - return { - "average_operation_time": sum(operation_times) / len(operation_times), - "min_operation_time": min(operation_times), - "max_operation_time": max(operation_times), - "operation_count": len(operation_times), - } - - except Exception as e: - return {"error": str(e)} - - def _load_performance_baseline(self) -> None: - """Load performance baseline from storage.""" - # TODO: Implement baseline persistence - self.performance_baseline = {} - - def _compare_with_baseline(self, current_metrics: Dict[str, Any]) -> Dict[str, Any]: - """Compare current metrics with baseline.""" - comparison = {} - - for metric_name, metric_data in current_metrics.items(): - if metric_data.get("status") == "success" and metric_name in self.performance_baseline: - baseline = self.performance_baseline[metric_name] - current = metric_data["data"] - - # Simple comparison logic - can be enhanced - if "imports_per_second" in current: - improvement = ( - (current["imports_per_second"] - baseline.get("imports_per_second", 0)) - / baseline.get("imports_per_second", 1) - * 100 - ) - comparison[metric_name] = { - "improvement_percent": improvement, - "baseline": baseline, - "current": current, - "status": "improved" if improvement > 0 else "degraded", - } - - return comparison - - def _analyze_performance_trends(self, metrics: Dict[str, Any]) -> Dict[str, Any]: - """Analyze performance trends from metrics.""" - trends = {} - - for metric_name, metric_data in metrics.items(): - if metric_data.get("status") == "success": - data = metric_data["data"] - - # Simple trend analysis - if "response_times" in str(data): - trends[metric_name] = {"trend": "stable", "confidence": "medium"} - else: - trends[metric_name] = {"trend": "unknown", "confidence": "low"} - - return trends - - def _update_performance_baseline(self, new_metrics: Dict[str, Any]) -> None: - """Update performance baseline with new metrics.""" - for metric_name, metric_data in new_metrics.items(): - if metric_data.get("status") == "success": - self.performance_baseline[metric_name] = metric_data["data"] - - # TODO: Persist baseline to storage - - def _compare_test_results( - self, improvement: Dict[str, Any], base: Dict[str, Any] - ) -> Dict[str, Any]: - """Compare test results between improvement and base.""" - comparison = { - "improvement_better": 0, - "base_better": 0, - "equal": 0, - "detail_comparison": {}, - } - - # Compare basic checks - improvement_checks = improvement.get("checks", []) - base_checks = base.get("checks", []) - - for imp_check in improvement_checks: - base_check = next((bc for bc in base_checks if bc["name"] == imp_check["name"]), None) - - if base_check: - imp_status = imp_check["status"] - base_status = base_check["status"] - - if imp_status == "pass" and base_status != "pass": - comparison["improvement_better"] += 1 - comparison_result = "improvement_better" - elif base_status == "pass" and imp_status != "pass": - comparison["base_better"] += 1 - comparison_result = "base_better" - else: - comparison["equal"] += 1 - comparison_result = "equal" - - comparison["detail_comparison"][imp_check["name"]] = { - "result": comparison_result, - "improvement": imp_status, - "base": base_status, - } - - return comparison - - def _compare_performance( - self, improvement_perf: Dict[str, Any], base_perf: Dict[str, Any] - ) -> Dict[str, Any]: - """Compare performance between improvement and base.""" - comparison = {"overall": "unknown", "metrics_comparison": {}} - - imp_metrics = improvement_perf.get("metrics", {}) - base_metrics = base_perf.get("metrics", {}) - - for metric_name in imp_metrics: - if metric_name in base_metrics: - imp_data = imp_metrics[metric_name].get("data", {}) - base_data = base_metrics[metric_name].get("data", {}) - - # Simple performance comparison - if "imports_per_second" in imp_data and "imports_per_second" in base_data: - if imp_data["imports_per_second"] > base_data["imports_per_second"]: - result = "improvement_better" - else: - result = "base_better" - else: - result = "cannot_compare" - - comparison["metrics_comparison"][metric_name] = { - "result": result, - "improvement": imp_data, - "base": base_data, - } - - # Determine overall comparison - better_count = sum( - 1 - for comp in comparison["metrics_comparison"].values() - if comp["result"] == "improvement_better" - ) - worse_count = sum( - 1 - for comp in comparison["metrics_comparison"].values() - if comp["result"] == "base_better" - ) - - if better_count > worse_count: - comparison["overall"] = "improvement_better" - elif worse_count > better_count: - comparison["overall"] = "base_better" - else: - comparison["overall"] = "equal" - - return comparison - - def _generate_recommendations( - self, validation: Dict[str, Any], performance: Dict[str, Any] - ) -> List[str]: - """Generate recommendations based on validation and performance.""" - recommendations = [] - - # Validation-based recommendations - failed_checks = [ - check - for check in validation.get("detail_comparison", {}).values() - if check["result"] == "base_better" - ] - if failed_checks: - recommendations.append("Fix failing tests before merging") - - # Performance-based recommendations - if performance.get("overall") == "base_better": - recommendations.append("Consider performance optimizations") - elif performance.get("overall") == "improvement_better": - recommendations.append("Performance improvement detected") - - # Default recommendations - if not recommendations: - recommendations.append("Improvement looks safe to merge") - - return recommendations - - def _can_merge_safely(self, results: Dict[str, Any]) -> bool: - """Determine if improvement can be merged safely.""" - # Check for critical failures - validation_results = results.get("validation_results", {}) - - # If any basic test failed, cannot merge - base_better_count = validation_results.get("base_better", 0) - if base_better_count > 0: - return False - - # If performance is severely degraded, warn but allow - performance_comparison = results.get("performance_comparison", {}) - if performance_comparison.get("overall") == "base_better": - # Could add more sophisticated logic here - pass - - return True diff --git a/src/mai/git/workflow.py b/src/mai/git/workflow.py deleted file mode 100644 index 8953f83..0000000 --- a/src/mai/git/workflow.py +++ /dev/null @@ -1,399 +0,0 @@ -""" -Staging workflow management for Mai's self-improvement system. - -Handles branch creation, management, and cleanup for testing improvements -before merging to main codebase. -""" - -import os -import time -import logging -from datetime import datetime, timedelta -from typing import List, Dict, Optional, Tuple, Any -from pathlib import Path - -try: - from git import Repo, InvalidGitRepositoryError, GitCommandError, Head - from git.exc import GitError -except ImportError: - raise ImportError("GitPython is required. Install with: pip install GitPython") - -from ..core import MaiError, ConfigurationError - - -class StagingWorkflowError(MaiError): - """Raised when staging workflow operations fail.""" - - pass - - -class StagingWorkflow: - """ - Manages staging branches for safe code improvements. - - Provides branch creation, validation, and cleanup capabilities - with proper error handling and recovery. - """ - - def __init__(self, project_path: str = ".", timeout: int = 30): - """ - Initialize staging workflow. - - Args: - project_path: Path to git repository - timeout: Timeout for git operations in seconds - - Raises: - ConfigurationError: If not a git repository - """ - self.project_path = Path(project_path).resolve() - self.timeout = timeout - self.logger = logging.getLogger(__name__) - - try: - self.repo = Repo(self.project_path) - except InvalidGitRepositoryError: - raise ConfigurationError(f"Not a git repository: {self.project_path}") - - # Configure retry logic for git operations - self.max_retries = 3 - self.retry_delay = 1 - - # Branch naming pattern - self.branch_prefix = "staging" - - # Initialize health check integration (will be connected later) - self.health_checker = None - - self.logger.info(f"Staging workflow initialized for {self.project_path}") - - def create_staging_branch(self, improvement_type: str, description: str) -> Dict[str, Any]: - """ - Create a staging branch for improvements. - - Args: - improvement_type: Type of improvement (e.g., 'optimization', 'feature', 'bugfix') - description: Description of improvement - - Returns: - Dictionary with branch information - - Raises: - StagingWorkflowError: If branch creation fails - """ - timestamp = datetime.now().strftime("%Y%m%d-%H%M%S") - # Sanitize description for branch name - description_safe = "".join(c for c in description[:20] if c.isalnum() or c in "-_").lower() - branch_name = f"{self.branch_prefix}/{improvement_type}-{timestamp}-{description_safe}" - - try: - # Ensure we're on main/develop branch - self._ensure_main_branch() - - # Check if branch already exists - if branch_name in [ref.name for ref in self.repo.refs]: - self.logger.warning(f"Branch {branch_name} already exists") - existing_branch = self.repo.refs[branch_name] - return { - "branch_name": branch_name, - "branch": existing_branch, - "created": False, - "message": f"Branch {branch_name} already exists", - } - - # Create new branch - current_branch = self.repo.active_branch - new_branch = self.repo.create_head(branch_name, current_branch.commit.hexsha) - - # Simple metadata handling - just log for now - self.logger.info(f"Branch metadata: type={improvement_type}, desc={description}") - - self.logger.info(f"Created staging branch: {branch_name}") - - return { - "branch_name": branch_name, - "branch": new_branch, - "created": True, - "timestamp": timestamp, - "improvement_type": improvement_type, - "description": description, - "message": f"Created staging branch {branch_name}", - } - - except (GitError, GitCommandError) as e: - raise StagingWorkflowError(f"Failed to create branch {branch_name}: {e}") - - def switch_to_branch(self, branch_name: str) -> Dict[str, Any]: - """ - Safely switch to specified branch. - - Args: - branch_name: Name of branch to switch to - - Returns: - Dictionary with switch result - - Raises: - StagingWorkflowError: If switch fails - """ - try: - # Check for uncommitted changes - if self.repo.is_dirty(untracked_files=True): - return { - "success": False, - "branch_name": branch_name, - "message": "Working directory has uncommitted changes. Commit or stash first.", - "uncommitted": True, - } - - # Verify branch exists - if branch_name not in [ref.name for ref in self.repo.refs]: - return { - "success": False, - "branch_name": branch_name, - "message": f"Branch {branch_name} does not exist", - "exists": False, - } - - # Switch to branch - branch = self.repo.refs[branch_name] - branch.checkout() - - self.logger.info(f"Switched to branch: {branch_name}") - - return { - "success": True, - "branch_name": branch_name, - "message": f"Switched to {branch_name}", - "current_commit": str(self.repo.active_branch.commit), - } - - except (GitError, GitCommandError) as e: - raise StagingWorkflowError(f"Failed to switch to branch {branch_name}: {e}") - - def get_active_staging_branches(self) -> List[Dict[str, Any]]: - """ - List all staging branches with metadata. - - Returns: - List of dictionaries with branch information - """ - staging_branches = [] - current_time = datetime.now() - - for ref in self.repo.refs: - if ref.name.startswith(self.branch_prefix + "/"): - try: - # Get branch age - commit_time = datetime.fromtimestamp(ref.commit.committed_date) - age = current_time - commit_time - - # Check if branch is stale (> 7 days) - is_stale = age > timedelta(days=7) - - # Simple metadata for now - metadata = { - "improvement_type": "unknown", - "description": "no description", - "created": "unknown", - } - - staging_branches.append( - { - "name": ref.name, - "commit": str(ref.commit), - "commit_message": ref.commit.message.strip(), - "created": commit_time.isoformat(), - "age_days": age.days, - "age_hours": age.total_seconds() / 3600, - "is_stale": is_stale, - "metadata": metadata, - "is_current": ref.name == self.repo.active_branch.name, - } - ) - - except Exception as e: - self.logger.warning(f"Error processing branch {ref.name}: {e}") - continue - - # Sort by creation time (newest first) - staging_branches.sort(key=lambda x: x["created"], reverse=True) - return staging_branches - - def validate_branch_state(self, branch_name: str) -> Dict[str, Any]: - """ - Validate branch state for safe merging. - - Args: - branch_name: Name of branch to validate - - Returns: - Dictionary with validation results - """ - try: - if branch_name not in [ref.name for ref in self.repo.refs]: - return { - "valid": False, - "branch_name": branch_name, - "issues": [f"Branch {branch_name} does not exist"], - "can_merge": False, - } - - # Switch to branch temporarily if not already there - original_branch = self.repo.active_branch.name - if original_branch != branch_name: - switch_result = self.switch_to_branch(branch_name) - if not switch_result["success"]: - return { - "valid": False, - "branch_name": branch_name, - "issues": [switch_result["message"]], - "can_merge": False, - } - - issues = [] - - # Check for uncommitted changes - if self.repo.is_dirty(untracked_files=True): - issues.append("Working directory has uncommitted changes") - - # Check for merge conflicts with main branch - try: - # Try to simulate merge without actually merging - main_branch = self._get_main_branch() - if main_branch and branch_name != main_branch: - merge_base = self.repo.merge_base(branch_name, main_branch) - if not merge_base: - issues.append("No common ancestor with main branch") - except Exception as e: - issues.append(f"Cannot determine merge compatibility: {e}") - - # Switch back to original branch - if original_branch != branch_name: - self.switch_to_branch(original_branch) - - return { - "valid": len(issues) == 0, - "branch_name": branch_name, - "issues": issues, - "can_merge": len(issues) == 0, - "metadata": {"improvement_type": "unknown", "description": "no description"}, - } - - except Exception as e: - return { - "valid": False, - "branch_name": branch_name, - "issues": [f"Validation failed: {e}"], - "can_merge": False, - } - - def cleanup_staging_branch( - self, branch_name: str, keep_if_failed: bool = False - ) -> Dict[str, Any]: - """ - Clean up staging branch after merge or when abandoned. - - Args: - branch_name: Name of branch to cleanup - keep_if_failed: Keep branch if validation failed - - Returns: - Dictionary with cleanup result - """ - try: - if branch_name not in [ref.name for ref in self.repo.refs]: - return { - "success": False, - "branch_name": branch_name, - "message": f"Branch {branch_name} does not exist", - } - - # Check validation result if keep_if_failed is True - if keep_if_failed: - validation = self.validate_branch_state(branch_name) - if not validation["can_merge"]: - return { - "success": False, - "branch_name": branch_name, - "message": "Keeping branch due to validation failures", - "validation": validation, - } - - # Don't delete current branch - if branch_name == self.repo.active_branch.name: - return { - "success": False, - "branch_name": branch_name, - "message": "Cannot delete currently active branch", - } - - # Delete branch - self.repo.delete_head(branch_name, force=True) - - self.logger.info(f"Cleaned up staging branch: {branch_name}") - - return { - "success": True, - "branch_name": branch_name, - "message": f"Deleted staging branch {branch_name}", - "deleted": True, - } - - except (GitError, GitCommandError) as e: - self.logger.error(f"Failed to cleanup branch {branch_name}: {e}") - return { - "success": False, - "branch_name": branch_name, - "message": f"Failed to delete branch: {e}", - "deleted": False, - } - - def cleanup_old_staging_branches(self, days_old: int = 7) -> Dict[str, Any]: - """ - Clean up old staging branches. - - Args: - days_old: Age threshold in days - - Returns: - Dictionary with cleanup results - """ - staging_branches = self.get_active_staging_branches() - old_branches = [b for b in staging_branches if b["age_days"] > days_old] - - cleanup_results = [] - for branch_info in old_branches: - result = self.cleanup_staging_branch(branch_info["name"]) - cleanup_results.append(result) - - successful = sum(1 for r in cleanup_results if r["success"]) - - return { - "total_old_branches": len(old_branches), - "cleaned_up": successful, - "failed": len(old_branches) - successful, - "results": cleanup_results, - } - - def _ensure_main_branch(self) -> None: - """Ensure we're on main or develop branch.""" - current = self.repo.active_branch.name - main_branch = self._get_main_branch() - - if main_branch and current != main_branch: - try: - self.repo.refs[main_branch].checkout() - except (GitError, GitCommandError) as e: - self.logger.warning(f"Cannot switch to {main_branch}: {e}") - - def _get_main_branch(self) -> Optional[str]: - """Get main/develop branch name.""" - for branch_name in ["main", "develop", "master"]: - if branch_name in [ref.name for ref in self.repo.refs]: - return branch_name - return None - - def set_health_checker(self, health_checker) -> None: - """Set health checker integration.""" - self.health_checker = health_checker diff --git a/src/mai/memory/__init__.py b/src/mai/memory/__init__.py deleted file mode 100644 index ca95482..0000000 --- a/src/mai/memory/__init__.py +++ /dev/null @@ -1,95 +0,0 @@ -""" -Mai Memory Module - -Provides persistent storage and retrieval of conversations -with semantic search capabilities. - -This module serves as the foundation for Mai's memory system, -enabling conversation retention and intelligent context retrieval. -""" - -# Version information -__version__ = "0.1.0" -__author__ = "Mai Team" - -# Core exports -from .storage import MemoryStorage - -# Optional exports (may not be available if dependencies missing) -try: - from .storage import ( - MemoryStorageError, - VectorSearchError, - DatabaseConnectionError, - ) - - __all__ = [ - "MemoryStorage", - "MemoryStorageError", - "VectorSearchError", - "DatabaseConnectionError", - ] -except ImportError: - __all__ = ["MemoryStorage"] - -# Module metadata -__module_info__ = { - "name": "Mai Memory Module", - "description": "Persistent memory storage with semantic search", - "version": __version__, - "features": { - "sqlite_storage": True, - "vector_search": "sqlite-vec" in globals(), - "embeddings": "sentence-transformers" in globals(), - "fallback_search": True, - }, - "dependencies": { - "required": ["sqlite3"], - "optional": { - "sqlite-vec": "Vector similarity search", - "sentence-transformers": "Text embeddings", - }, - }, -} - - -def get_module_info(): - """Get module information and capabilities.""" - return __module_info__ - - -def is_vector_search_available() -> bool: - """Check if vector search is available.""" - try: - import sqlite_vec - from sentence_transformers import SentenceTransformer - - return True - except ImportError: - return False - - -def is_embeddings_available() -> bool: - """Check if text embeddings are available.""" - try: - from sentence_transformers import SentenceTransformer - - return True - except ImportError: - return False - - -def get_memory_storage(*args, **kwargs): - """ - Factory function to create MemoryStorage instances. - - Args: - *args: Positional arguments to pass to MemoryStorage - **kwargs: Keyword arguments to pass to MemoryStorage - - Returns: - Configured MemoryStorage instance - """ - from .storage import MemoryStorage - - return MemoryStorage(*args, **kwargs) diff --git a/src/mai/memory/compression.py b/src/mai/memory/compression.py deleted file mode 100644 index 3b6d5fc..0000000 --- a/src/mai/memory/compression.py +++ /dev/null @@ -1,780 +0,0 @@ -""" -Memory Compression Implementation for Mai - -Intelligent conversation compression with AI-powered summarization -and pattern preservation for long-term memory efficiency. -""" - -import logging -import json -import hashlib -from typing import Dict, List, Any, Optional, Tuple -from datetime import datetime, timedelta -from dataclasses import dataclass, field -from pathlib import Path - -# Import Mai components -try: - from src.mai.core.exceptions import ( - MaiError, - ContextError, - create_error_context, - ) - from src.mai.core.config import get_config - from src.mai.model.ollama_client import OllamaClient - from src.mai.memory.storage import MemoryStorage -except ImportError: - # Define fallbacks if modules not available - class MaiError(Exception): - pass - - class ContextError(MaiError): - pass - - def create_error_context(component: str, operation: str, **data): - return {"component": component, "operation": operation, "data": data} - - def get_config(): - return None - - class MemoryStorage: - def __init__(self, *args, **kwargs): - pass - - def retrieve_conversation(self, conversation_id: str) -> Optional[Dict[str, Any]]: - return None - - def update_conversation(self, conversation_id: str, **kwargs) -> bool: - return True - - -logger = logging.getLogger(__name__) - - -class MemoryCompressionError(ContextError): - """Memory compression specific errors.""" - - def __init__(self, message: str, conversation_id: str = None, **kwargs): - context = create_error_context( - component="memory_compressor", - operation="compression", - conversation_id=conversation_id, - **kwargs, - ) - super().__init__(message, context=context) - self.conversation_id = conversation_id - - -@dataclass -class CompressionThresholds: - """Configuration for compression triggers.""" - - message_count: int = 50 - age_days: int = 30 - memory_limit_mb: int = 500 - - def should_compress(self, conversation: Dict[str, Any], current_memory_mb: float) -> bool: - """ - Check if conversation should be compressed. - - Args: - conversation: Conversation data - current_memory_mb: Current memory usage in MB - - Returns: - True if compression should be triggered - """ - # Check message count - message_count = len(conversation.get("messages", [])) - if message_count >= self.message_count: - return True - - # Check age - try: - created_at = datetime.fromisoformat(conversation.get("created_at", "")) - age_days = (datetime.now() - created_at).days - if age_days >= self.age_days: - return True - except (ValueError, TypeError): - pass - - # Check memory limit - if current_memory_mb >= self.memory_limit_mb: - return True - - return False - - -@dataclass -class CompressionResult: - """Result of compression operation.""" - - success: bool - original_messages: int - compressed_messages: int - compression_ratio: float - summary: str - patterns: List[Dict[str, Any]] = field(default_factory=list) - metadata: Dict[str, Any] = field(default_factory=dict) - error: Optional[str] = None - - -class MemoryCompressor: - """ - Intelligent conversation compression with AI summarization. - - Automatically compresses growing conversations while preserving - important information, user patterns, and conversation continuity. - """ - - def __init__( - self, - storage: Optional[MemoryStorage] = None, - ollama_client: Optional[OllamaClient] = None, - config: Optional[Dict[str, Any]] = None, - ): - """ - Initialize memory compressor. - - Args: - storage: Memory storage instance - ollama_client: Ollama client for AI summarization - config: Compression configuration - """ - self.storage = storage or MemoryStorage() - self.ollama_client = ollama_client or OllamaClient() - - # Load configuration - self.config = config or self._load_default_config() - self.thresholds = CompressionThresholds(**self.config.get("thresholds", {})) - - # Compression history tracking - self.compression_history: Dict[str, List[Dict[str, Any]]] = {} - - logger.info("MemoryCompressor initialized") - - def _load_default_config(self) -> Dict[str, Any]: - """Load default compression configuration.""" - return { - "thresholds": {"message_count": 50, "age_days": 30, "memory_limit_mb": 500}, - "summarization": { - "model": "llama2", - "preserve_elements": ["preferences", "decisions", "patterns", "key_facts"], - "min_quality_score": 0.7, - }, - "adaptive_weighting": { - "importance_decay_days": 90, - "pattern_weight": 1.5, - "technical_weight": 1.2, - }, - } - - def check_compression_needed(self, conversation_id: str) -> bool: - """ - Check if conversation needs compression. - - Args: - conversation_id: ID of conversation to check - - Returns: - True if compression is needed - """ - try: - # Get conversation data - conversation = self.storage.retrieve_conversation(conversation_id) - if not conversation: - logger.warning(f"Conversation {conversation_id} not found") - return False - - # Get current memory usage - storage_stats = self.storage.get_storage_stats() - current_memory_mb = storage_stats.get("database_size_mb", 0) - - # Check thresholds - return self.thresholds.should_compress(conversation, current_memory_mb) - - except Exception as e: - logger.error(f"Error checking compression need for {conversation_id}: {e}") - return False - - def compress_conversation(self, conversation_id: str) -> CompressionResult: - """ - Compress a conversation using AI summarization. - - Args: - conversation_id: ID of conversation to compress - - Returns: - CompressionResult with operation details - """ - try: - # Get conversation data - conversation = self.storage.retrieve_conversation(conversation_id) - if not conversation: - return CompressionResult( - success=False, - original_messages=0, - compressed_messages=0, - compression_ratio=0.0, - summary="", - error=f"Conversation {conversation_id} not found", - ) - - messages = conversation.get("messages", []) - original_count = len(messages) - - if original_count < self.thresholds.message_count: - return CompressionResult( - success=False, - original_messages=original_count, - compressed_messages=original_count, - compression_ratio=1.0, - summary="", - error="Conversation below compression threshold", - ) - - # Analyze conversation for compression strategy - compression_strategy = self._analyze_conversation(messages) - - # Generate AI summary - summary = self._generate_summary(messages, compression_strategy) - - # Extract patterns - patterns = self._extract_patterns(messages, compression_strategy) - - # Create compressed conversation structure - compressed_messages = self._create_compressed_structure( - messages, summary, patterns, compression_strategy - ) - - # Update conversation in storage - success = self._update_compressed_conversation( - conversation_id, compressed_messages, summary, patterns - ) - - if not success: - return CompressionResult( - success=False, - original_messages=original_count, - compressed_messages=original_count, - compression_ratio=1.0, - summary=summary, - error="Failed to update compressed conversation", - ) - - # Calculate compression ratio - compressed_count = len(compressed_messages) - compression_ratio = compressed_count / original_count if original_count > 0 else 1.0 - - # Track compression history - self._track_compression( - conversation_id, - { - "timestamp": datetime.now().isoformat(), - "original_messages": original_count, - "compressed_messages": compressed_count, - "compression_ratio": compression_ratio, - "strategy": compression_strategy, - }, - ) - - logger.info( - f"Compressed conversation {conversation_id}: {original_count} → {compressed_count} messages" - ) - - return CompressionResult( - success=True, - original_messages=original_count, - compressed_messages=compressed_count, - compression_ratio=compression_ratio, - summary=summary, - patterns=patterns, - metadata={ - "strategy": compression_strategy, - "timestamp": datetime.now().isoformat(), - }, - ) - - except Exception as e: - logger.error(f"Error compressing conversation {conversation_id}: {e}") - return CompressionResult( - success=False, - original_messages=0, - compressed_messages=0, - compression_ratio=0.0, - summary="", - error=str(e), - ) - - def _analyze_conversation(self, messages: List[Dict[str, Any]]) -> Dict[str, Any]: - """ - Analyze conversation to determine compression strategy. - - Args: - messages: List of conversation messages - - Returns: - Compression strategy dictionary - """ - strategy = { - "keep_recent_count": 10, # Keep most recent messages - "importance_weights": {}, - "conversation_type": "general", - "key_topics": [], - "user_preferences": [], - } - - # Analyze message patterns - user_messages = [m for m in messages if m.get("role") == "user"] - assistant_messages = [m for m in messages if m.get("role") == "assistant"] - - # Detect conversation type - if self._is_technical_conversation(messages): - strategy["conversation_type"] = "technical" - strategy["keep_recent_count"] = 15 # Keep more technical context - elif self._is_planning_conversation(messages): - strategy["conversation_type"] = "planning" - strategy["keep_recent_count"] = 12 - - # Identify key topics (simple keyword extraction) - all_content = " ".join([m.get("content", "") for m in messages]) - strategy["key_topics"] = self._extract_key_topics(all_content) - - # Calculate importance weights based on recency and content - for i, message in enumerate(messages): - # More recent messages get higher weight - recency_weight = (i + 1) / len(messages) - - # Content-based weighting - content_weight = 1.0 - content = message.get("content", "").lower() - - # Boost weight for messages containing key information - if any( - keyword in content - for keyword in ["prefer", "want", "should", "decide", "important"] - ): - content_weight *= 1.5 - - # Technical content gets boost in technical conversations - if strategy["conversation_type"] == "technical": - if any( - keyword in content - for keyword in ["code", "function", "implement", "fix", "error"] - ): - content_weight *= 1.2 - - strategy["importance_weights"][message.get("id", f"msg_{i}")] = ( - recency_weight * content_weight - ) - - return strategy - - def _is_technical_conversation(self, messages: List[Dict[str, Any]]) -> bool: - """Detect if conversation is technical in nature.""" - technical_keywords = [ - "code", - "function", - "implement", - "debug", - "error", - "fix", - "programming", - "development", - "api", - "database", - "algorithm", - ] - - tech_message_count = 0 - total_messages = len(messages) - - for message in messages: - content = message.get("content", "").lower() - if any(keyword in content for keyword in technical_keywords): - tech_message_count += 1 - - return (tech_message_count / total_messages) > 0.3 if total_messages > 0 else False - - def _is_planning_conversation(self, messages: List[Dict[str, Any]]) -> bool: - """Detect if conversation is about planning.""" - planning_keywords = [ - "plan", - "schedule", - "deadline", - "task", - "goal", - "objective", - "timeline", - "milestone", - "strategy", - "roadmap", - ] - - plan_message_count = 0 - total_messages = len(messages) - - for message in messages: - content = message.get("content", "").lower() - if any(keyword in content for keyword in planning_keywords): - plan_message_count += 1 - - return (plan_message_count / total_messages) > 0.25 if total_messages > 0 else False - - def _extract_key_topics(self, content: str) -> List[str]: - """Extract key topics from content (simple implementation).""" - # This is a simplified topic extraction - # In a real implementation, you might use NLP techniques - common_topics = [ - "development", - "design", - "testing", - "deployment", - "maintenance", - "security", - "performance", - "user interface", - "database", - "api", - ] - - topics = [] - content_lower = content.lower() - - for topic in common_topics: - if topic in content_lower: - topics.append(topic) - - return topics[:5] # Return top 5 topics - - def _generate_summary(self, messages: List[Dict[str, Any]], strategy: Dict[str, Any]) -> str: - """ - Generate AI summary of conversation. - - Args: - messages: Messages to summarize - strategy: Compression strategy information - - Returns: - Generated summary text - """ - try: - # Prepare summarization prompt - preserve_elements = self.config.get("summarization", {}).get("preserve_elements", []) - - prompt = f"""Please summarize this conversation while preserving important information: - -Conversation type: {strategy.get("conversation_type", "general")} -Key topics: {", ".join(strategy.get("key_topics", []))} - -Please preserve: -- {", ".join(preserve_elements)} - -Create a concise summary that maintains conversation continuity and captures the most important points. - -Conversation: -""" - - # Add conversation context (limit to avoid token limits) - for message in messages[-30:]: # Include last 30 messages for context - role = message.get("role", "unknown") - content = message.get("content", "")[:500] # Truncate long messages - prompt += f"\n{role}: {content}" - - prompt += "\n\nSummary:" - - # Generate summary using Ollama - model = self.config.get("summarization", {}).get("model", "llama2") - summary = self.ollama_client.generate_response(prompt, model) - - # Clean up summary - summary = summary.strip() - if len(summary) > 1000: - summary = summary[:1000] + "..." - - return summary - - except Exception as e: - logger.error(f"Error generating summary: {e}") - # Fallback to simple summary - return f"Conversation with {len(messages)} messages about {', '.join(strategy.get('key_topics', ['various topics']))}." - - def _extract_patterns( - self, messages: List[Dict[str, Any]], strategy: Dict[str, Any] - ) -> List[Dict[str, Any]]: - """ - Extract patterns from conversation for future learning. - - Args: - messages: Messages to analyze - strategy: Compression strategy - - Returns: - List of extracted patterns - """ - patterns = [] - - try: - # Extract user preferences - user_preferences = self._extract_user_preferences(messages) - patterns.extend(user_preferences) - - # Extract interaction patterns - interaction_patterns = self._extract_interaction_patterns(messages) - patterns.extend(interaction_patterns) - - # Extract topic preferences - topic_patterns = self._extract_topic_patterns(messages, strategy) - patterns.extend(topic_patterns) - - except Exception as e: - logger.error(f"Error extracting patterns: {e}") - - return patterns - - def _extract_user_preferences(self, messages: List[Dict[str, Any]]) -> List[Dict[str, Any]]: - """Extract user preferences from messages.""" - preferences = [] - - preference_keywords = { - "like": "positive_preference", - "prefer": "preference", - "want": "desire", - "don't like": "negative_preference", - "avoid": "avoidance", - "should": "expectation", - } - - for message in messages: - if message.get("role") != "user": - continue - - content = message.get("content", "").lower() - - for keyword, pref_type in preference_keywords.items(): - if keyword in content: - # Extract the preference context (simplified) - preferences.append( - { - "type": pref_type, - "keyword": keyword, - "context": content[:200], # Truncate for storage - "timestamp": message.get("timestamp"), - "confidence": 0.7, # Simplified confidence score - } - ) - - return preferences - - def _extract_interaction_patterns(self, messages: List[Dict[str, Any]]) -> List[Dict[str, Any]]: - """Extract interaction patterns from conversation.""" - patterns = [] - - # Analyze response patterns - user_messages = [m for m in messages if m.get("role") == "user"] - assistant_messages = [m for m in messages if m.get("role") == "assistant"] - - if len(user_messages) > 0 and len(assistant_messages) > 0: - # Calculate average message lengths - avg_user_length = sum(len(m.get("content", "")) for m in user_messages) / len( - user_messages - ) - avg_assistant_length = sum(len(m.get("content", "")) for m in assistant_messages) / len( - assistant_messages - ) - - patterns.append( - { - "type": "communication_style", - "avg_user_message_length": avg_user_length, - "avg_assistant_message_length": avg_assistant_length, - "message_count": len(messages), - "user_to_assistant_ratio": len(user_messages) / len(assistant_messages), - } - ) - - return patterns - - def _extract_topic_patterns( - self, messages: List[Dict[str, Any]], strategy: Dict[str, Any] - ) -> List[Dict[str, Any]]: - """Extract topic preferences from conversation.""" - patterns = [] - - key_topics = strategy.get("key_topics", []) - if key_topics: - patterns.append( - { - "type": "topic_preference", - "topics": key_topics, - "conversation_type": strategy.get("conversation_type", "general"), - "message_count": len(messages), - } - ) - - return patterns - - def _create_compressed_structure( - self, - messages: List[Dict[str, Any]], - summary: str, - patterns: List[Dict[str, Any]], - strategy: Dict[str, Any], - ) -> List[Dict[str, Any]]: - """ - Create compressed conversation structure. - - Args: - messages: Original messages - summary: Generated summary - patterns: Extracted patterns - strategy: Compression strategy - - Returns: - Compressed message list - """ - compressed = [] - - # Add compression marker as system message - compressed.append( - { - "id": "compression_marker", - "role": "system", - "content": f"[COMPRESSED] Original conversation had {len(messages)} messages", - "timestamp": datetime.now().isoformat(), - "token_count": 0, - } - ) - - # Add summary - compressed.append( - { - "id": "conversation_summary", - "role": "assistant", - "content": f"Summary: {summary}", - "timestamp": datetime.now().isoformat(), - "token_count": len(summary.split()), # Rough estimate - } - ) - - # Add extracted patterns if any - if patterns: - patterns_text = "Key patterns extracted:\n" - for pattern in patterns[:5]: # Limit to 5 patterns - patterns_text += f"- {pattern.get('type', 'unknown')}: {str(pattern.get('context', pattern))[:100]}\n" - - compressed.append( - { - "id": "extracted_patterns", - "role": "assistant", - "content": patterns_text, - "timestamp": datetime.now().isoformat(), - "token_count": len(patterns_text.split()), - } - ) - - # Keep most recent messages based on strategy - keep_count = strategy.get("keep_recent_count", 10) - recent_messages = messages[-keep_count:] if len(messages) > keep_count else messages - - for message in recent_messages: - compressed.append( - { - "id": message.get("id", f"compressed_{len(compressed)}"), - "role": message.get("role"), - "content": message.get("content"), - "timestamp": message.get("timestamp"), - "token_count": message.get("token_count", 0), - } - ) - - return compressed - - def _update_compressed_conversation( - self, - conversation_id: str, - compressed_messages: List[Dict[str, Any]], - summary: str, - patterns: List[Dict[str, Any]], - ) -> bool: - """ - Update conversation with compressed content. - - Args: - conversation_id: Conversation ID - compressed_messages: Compressed message list - summary: Generated summary - patterns: Extracted patterns - - Returns: - True if update successful - """ - try: - # This would use the storage interface to update the conversation - # For now, we'll simulate the update - - # In a real implementation, you would: - # 1. Update the messages in the database - # 2. Store compression metadata - # 3. Update conversation metadata - - logger.info(f"Updated conversation {conversation_id} with compressed content") - return True - - except Exception as e: - logger.error(f"Error updating compressed conversation: {e}") - return False - - def _track_compression(self, conversation_id: str, compression_data: Dict[str, Any]) -> None: - """ - Track compression history for analytics. - - Args: - conversation_id: Conversation ID - compression_data: Compression operation data - """ - if conversation_id not in self.compression_history: - self.compression_history[conversation_id] = [] - - self.compression_history[conversation_id].append(compression_data) - - # Limit history size - if len(self.compression_history[conversation_id]) > 10: - self.compression_history[conversation_id] = self.compression_history[conversation_id][ - -10: - ] - - def get_compression_stats(self) -> Dict[str, Any]: - """ - Get compression statistics. - - Returns: - Dictionary with compression statistics - """ - total_compressions = sum(len(history) for history in self.compression_history.values()) - - if total_compressions == 0: - return { - "total_compressions": 0, - "average_compression_ratio": 0.0, - "conversations_compressed": 0, - } - - # Calculate average compression ratio - total_ratio = 0.0 - ratio_count = 0 - - for conversation_id, history in self.compression_history.items(): - for compression in history: - ratio = compression.get("compression_ratio", 1.0) - total_ratio += ratio - ratio_count += 1 - - avg_ratio = total_ratio / ratio_count if ratio_count > 0 else 1.0 - - return { - "total_compressions": total_compressions, - "average_compression_ratio": avg_ratio, - "conversations_compressed": len(self.compression_history), - "compression_history": dict(self.compression_history), - } diff --git a/src/mai/memory/manager.py b/src/mai/memory/manager.py deleted file mode 100644 index 5cdf575..0000000 --- a/src/mai/memory/manager.py +++ /dev/null @@ -1,1056 +0,0 @@ -""" -Memory Manager Implementation for Mai - -Orchestrates all memory components and provides high-level API -for conversation management, compression triggers, and lifecycle management. -""" - -import logging -import uuid -import json -from typing import Dict, List, Any, Optional, Tuple -from datetime import datetime, timedelta -from dataclasses import dataclass, field - -# Import Mai components -try: - from src.mai.memory.storage import MemoryStorage, MemoryStorageError - from src.mai.memory.compression import MemoryCompressor, CompressionResult - from src.mai.memory.retrieval import ContextRetriever, SearchQuery, MemoryContext - from src.mai.core.exceptions import ( - MaiError, - ContextError, - create_error_context, - ) - from src.mai.core.config import get_config -except ImportError as e: - # Handle missing dependencies gracefully - logging.warning(f"Could not import Mai components: {e}") - - class MaiError(Exception): - pass - - class ContextError(MaiError): - pass - - def create_error_context(component: str, operation: str, **data): - return {"component": component, "operation": operation, "data": data} - - def get_config(): - return None - - # Define placeholder classes - MemoryStorage = None - MemoryCompressor = None - ContextRetriever = None - SearchQuery = None - MemoryContext = None - -logger = logging.getLogger(__name__) - - -class MemoryManagerError(ContextError): - """Memory manager specific errors.""" - - def __init__(self, message: str, operation: str = None, **kwargs): - context = create_error_context( - component="memory_manager", operation=operation or "manager_operation", **kwargs - ) - super().__init__(message, context=context) - self.operation = operation - - -@dataclass -class MemoryStats: - """Memory system statistics and health information.""" - - # Storage statistics - total_conversations: int = 0 - total_messages: int = 0 - database_size_mb: float = 0.0 - - # Compression statistics - total_compressions: int = 0 - average_compression_ratio: float = 1.0 - compressed_conversations: int = 0 - - # Retrieval statistics - recent_searches: int = 0 - average_search_time: float = 0.0 - - # Health indicators - last_error: Optional[str] = None - last_activity: Optional[str] = None - system_health: str = "healthy" - - # Component status - storage_enabled: bool = False - compression_enabled: bool = False - retrieval_enabled: bool = False - - def to_dict(self) -> Dict[str, Any]: - """Convert to dictionary for JSON serialization.""" - return { - "storage": { - "total_conversations": self.total_conversations, - "total_messages": self.total_messages, - "database_size_mb": self.database_size_mb, - "enabled": self.storage_enabled, - }, - "compression": { - "total_compressions": self.total_compressions, - "average_compression_ratio": self.average_compression_ratio, - "compressed_conversations": self.compressed_conversations, - "enabled": self.compression_enabled, - }, - "retrieval": { - "recent_searches": self.recent_searches, - "average_search_time": self.average_search_time, - "enabled": self.retrieval_enabled, - }, - "health": { - "overall_status": self.system_health, - "last_error": self.last_error, - "last_activity": self.last_activity, - }, - } - - -@dataclass -class ConversationMetadata: - """Metadata for conversation tracking.""" - - conversation_id: str - title: str - created_at: str - updated_at: str - message_count: int = 0 - compressed: bool = False - last_compressed: Optional[str] = None - conversation_type: str = "general" - tags: List[str] = field(default_factory=list) - - def to_dict(self) -> Dict[str, Any]: - """Convert to dictionary for storage.""" - return { - "conversation_id": self.conversation_id, - "title": self.title, - "created_at": self.created_at, - "updated_at": self.updated_at, - "message_count": self.message_count, - "compressed": self.compressed, - "last_compressed": self.last_compressed, - "conversation_type": self.conversation_type, - "tags": self.tags, - } - - -class MemoryManager: - """ - Orchestrates all memory components and provides high-level API. - - Manages conversation storage, automatic compression, context retrieval, - and memory lifecycle operations while providing comprehensive statistics - and health monitoring. - """ - - def __init__(self, config: Optional[Dict[str, Any]] = None): - """ - Initialize memory manager with all components. - - Args: - config: Configuration dictionary for memory system - """ - # Handle config as dict or extract from MemoryConfig object - if config: - self.config = config - else: - cfg = get_config() - if cfg and hasattr(cfg, "memory"): - # MemoryConfig object - convert to dict - self.config = { - "auto_compression": cfg.memory.auto_compression_enabled - if hasattr(cfg.memory, "auto_compression_enabled") - else True, - "compression_check_interval": cfg.memory.compression_check_interval - if hasattr(cfg.memory, "compression_check_interval") - else 3600, - "message_count": cfg.memory.message_count - if hasattr(cfg.memory, "message_count") - else 50, - "age_days": cfg.memory.age_days if hasattr(cfg.memory, "age_days") else 30, - } - else: - self.config = {} - - # Initialize core components - try: - self.storage = MemoryStorage() - self.compressor = MemoryCompressor(storage=self.storage) - self.retriever = ContextRetriever(storage=self.storage) - except Exception as e: - logger.error(f"Failed to initialize memory components: {e}") - self.storage = None - self.compressor = None - self.retriever = None - - # Conversation metadata tracking - self.conversation_metadata: Dict[str, ConversationMetadata] = {} - - # Performance and health tracking - self.search_times: List[float] = [] - self.compression_history: List[Dict[str, Any]] = [] - self.last_error: Optional[str] = None - self.last_activity = datetime.now().isoformat() - - # Compression trigger configuration - self.auto_compression_enabled = self.config.get("auto_compression", True) - self.compression_check_interval = self.config.get( - "compression_check_interval", 100 - ) # Check every 100 messages - - # Message counter for compression triggers - self.message_counter = 0 - - logger.info("MemoryManager initialized with all components") - - def store_conversation( - self, - messages: List[Dict[str, Any]], - title: Optional[str] = None, - metadata: Optional[Dict[str, Any]] = None, - ) -> str: - """ - Store a new conversation with automatic metadata generation. - - Args: - messages: List of conversation messages - title: Optional title for the conversation - metadata: Additional metadata to store - - Returns: - Conversation ID if stored successfully - - Raises: - MemoryManagerError: If storage operation fails - """ - if not self.storage: - raise MemoryManagerError("Storage not available", "store_conversation") - - try: - # Generate conversation ID if not provided - conversation_id = metadata.get("conversation_id") if metadata else None - if not conversation_id: - conversation_id = str(uuid.uuid4()) - - # Generate title if not provided - if not title: - title = self._generate_conversation_title(messages) - - # Create storage metadata - storage_metadata = { - "message_count": len(messages), - "created_at": datetime.now().isoformat(), - "updated_at": datetime.now().isoformat(), - "conversation_type": self._detect_conversation_type(messages), - **(metadata or {}), - } - - # Store conversation - success = self.storage.store_conversation( - conversation_id=conversation_id, - title=title, - messages=messages, - metadata=storage_metadata, - ) - - if not success: - raise MemoryManagerError("Failed to store conversation", "store_conversation") - - # Track metadata - conv_metadata = ConversationMetadata( - conversation_id=conversation_id, - title=title, - created_at=storage_metadata["created_at"], - updated_at=storage_metadata["updated_at"], - message_count=len(messages), - conversation_type=storage_metadata["conversation_type"], - tags=metadata.get("tags", []) if metadata else [], - ) - self.conversation_metadata[conversation_id] = conv_metadata - - # Update message counter and check compression - self.message_counter += len(messages) - self.last_activity = datetime.now().isoformat() - - # Trigger automatic compression if needed - if self.auto_compression_enabled: - self._check_compression_triggers(conversation_id) - - logger.info(f"Stored conversation '{conversation_id}' with {len(messages)} messages") - return conversation_id - - except Exception as e: - self.last_error = str(e) - logger.error(f"Failed to store conversation: {e}") - raise MemoryManagerError(f"Store conversation failed: {e}", "store_conversation") - - def get_context( - self, - query: str, - conversation_type: Optional[str] = None, - max_tokens: int = 2000, - max_results: int = 5, - ) -> Dict[str, Any]: - """ - Retrieve relevant context for a query. - - Args: - query: Search query text - conversation_type: Optional type hint for better search - max_tokens: Maximum context tokens to return - max_results: Maximum number of conversations to include - - Returns: - Dictionary with relevant context and metadata - - Raises: - MemoryManagerError: If retrieval operation fails - """ - if not self.retriever: - raise MemoryManagerError("Retrieval not available", "get_context") - - start_time = datetime.now() - - try: - # Create search query - search_query = SearchQuery( - text=query, - max_results=max_results, - max_tokens=max_tokens, - include_semantic=True, - include_keywords=True, - include_recency=True, - include_patterns=False, # Not implemented yet - conversation_type=conversation_type, - ) - - # Retrieve context - context = self.retriever.retrieve_context(search_query) - - # Update performance tracking - search_time = (datetime.now() - start_time).total_seconds() - self.search_times.append(search_time) - if len(self.search_times) > 100: # Keep only last 100 searches - self.search_times = self.search_times[-100:] - - self.last_activity = datetime.now().isoformat() - - # Convert to dictionary - result = { - "query": query, - "relevant_conversations": [ - { - "conversation_id": conv.conversation_id, - "title": conv.title, - "similarity_score": conv.similarity_score, - "excerpt": conv.excerpt, - "relevance_type": conv.relevance_type.value - if conv.relevance_type - else "unknown", - } - for conv in context.relevant_conversations - ], - "total_conversations": context.total_conversations, - "estimated_tokens": context.total_tokens, - "search_time": search_time, - "metadata": context.metadata, - } - - logger.info( - f"Retrieved context for query: '{query[:50]}...' ({len(context.relevant_conversations)} results)" - ) - return result - - except Exception as e: - self.last_error = str(e) - logger.error(f"Failed to get context: {e}") - raise MemoryManagerError(f"Context retrieval failed: {e}", "get_context") - - def retrieve_context_for_response( - self, - user_input: str, - conversation_history: Optional[List[Dict[str, Any]]] = None, - max_context_tokens: int = 1500, - ) -> Dict[str, Any]: - """ - Retrieve context specifically for Mai's response generation. - - This method integrates with Mai's conversation engine to provide - proactive context surfacing and memory references in responses. - - Args: - user_input: Current user message/input - conversation_history: Recent conversation context - max_context_tokens: Maximum tokens for context in response - - Returns: - Dictionary with context and integration data for response generation - """ - try: - # Analyze user input for proactive context detection - context_analysis = self._analyze_input_for_context(user_input, conversation_history) - - # Retrieve relevant context - context_result = self.get_context( - query=user_input, - conversation_type=context_analysis.get("detected_type"), - max_tokens=max_context_tokens, - max_results=8, # More results for better context selection - ) - - # Enhance context with proactive surfacing - enhanced_context = self._enhance_context_for_response( - context_result, context_analysis, user_input - ) - - # Generate memory references for injection - memory_references = self._generate_memory_references( - enhanced_context["context"], user_input - ) - - # Check if automatic compression should be triggered - compression_needed = self._check_compression_triggers_for_conversation() - - return { - "context": enhanced_context["context"], - "proactive_context": enhanced_context.get("proactive_context", []), - "memory_references": memory_references, - "context_analysis": context_analysis, - "compression_needed": compression_needed, - "integration_ready": True, - "metadata": { - "original_results": context_result.get("total_conversations", 0), - "proactive_items": len(enhanced_context.get("proactive_context", [])), - "memory_refs": len(memory_references), - "relevance_threshold": enhanced_context.get("relevance_threshold", 0.3), - }, - } - - except Exception as e: - logger.warning(f"Context retrieval for response failed: {e}") - return { - "context": None, - "proactive_context": [], - "memory_references": [], - "context_analysis": {}, - "compression_needed": False, - "integration_ready": False, - "error": str(e), - } - - def integrate_memory_in_response( - self, user_input: str, base_response: str, memory_context: Optional[Dict[str, Any]] = None - ) -> Dict[str, Any]: - """ - Integrate memory context into Mai's response. - - Injects memory references and context naturally into responses. - - Args: - user_input: Original user input - base_response: Mai's generated response without memory - memory_context: Context from retrieve_context_for_response - - Returns: - Dictionary with enhanced response and integration metadata - """ - try: - if not memory_context or not memory_context.get("integration_ready"): - return { - "response": base_response, - "memory_integrated": False, - "references_added": [], - "enhancements": [], - } - - # Extract memory references - memory_references = memory_context.get("memory_references", []) - proactive_context = memory_context.get("proactive_context", []) - - enhanced_response = base_response - references_added = [] - enhancements = [] - - # Add memory references to response - if memory_references: - # Select most relevant reference - best_reference = max(memory_references, key=lambda x: x.get("relevance", 0)) - - # Natural insertion point - if best_reference.get("relevance", 0) > 0.6: - reference_text = f" {best_reference['text']}." - - # Insert after first sentence or paragraph - if "." in enhanced_response[:200]: - first_period = enhanced_response.find(".", 200) - if first_period != -1: - enhanced_response = ( - enhanced_response[: first_period + 1] - + reference_text - + enhanced_response[first_period + 1 :] - ) - references_added.append(best_reference) - enhancements.append("Added memory reference") - - # Add proactive context mentions - if proactive_context and len(proactive_context) > 0: - top_proactive = proactive_context[0] # Most relevant proactive item - - if top_proactive.get("proactive_score", 0) > 0.5: - # Add contextual hint about related past discussions - context_hint = f"\n\n*(Note: I'm drawing on our previous discussions about {self._extract_result_topic(top_proactive['result'])} for context.)*" - enhanced_response += context_hint - enhancements.append("Added proactive context hint") - - return { - "response": enhanced_response, - "memory_integrated": True, - "references_added": references_added, - "enhancements": enhancements, - "proactive_items_used": len( - [pc for pc in proactive_context if pc.get("proactive_score", 0) > 0.5] - ), - "memory_quality_score": self._calculate_response_memory_quality(memory_context), - } - - except Exception as e: - logger.warning(f"Memory integration in response failed: {e}") - return { - "response": base_response, - "memory_integrated": False, - "references_added": [], - "enhancements": [], - "error": str(e), - } - - def search_conversations( - self, query: str, filters: Optional[Dict[str, Any]] = None, limit: int = 10 - ) -> List[Dict[str, Any]]: - """ - Search conversations with optional filters. - - Args: - query: Search query text - filters: Optional search filters - limit: Maximum results to return - - Returns: - List of matching conversations - """ - if not self.storage: - raise MemoryManagerError("Storage not available", "search_conversations") - - try: - # Use storage search with include_content for better results - results = self.storage.search_conversations( - query=query, limit=limit, include_content=True - ) - - # Apply filters if provided - if filters: - results = self._apply_search_filters(results, filters) - - # Enhance with metadata - enhanced_results = [] - for result in results: - conv_id = result["conversation_id"] - if conv_id in self.conversation_metadata: - result["metadata"] = self.conversation_metadata[conv_id].to_dict() - enhanced_results.append(result) - - self.last_activity = datetime.now().isoformat() - - logger.info( - f"Search found {len(enhanced_results)} conversations for query: '{query[:50]}...'" - ) - return enhanced_results - - except Exception as e: - self.last_error = str(e) - logger.error(f"Failed to search conversations: {e}") - raise MemoryManagerError(f"Search failed: {e}", "search_conversations") - - def check_compression_triggers(self) -> List[str]: - """ - Check all conversations for compression triggers. - - Returns: - List of conversation IDs that need compression - """ - triggered_conversations = [] - - if not self.compressor: - return triggered_conversations - - try: - # Get conversation list - conversations = self.storage.get_conversation_list(limit=100) - - for conv in conversations: - conv_id = conv["id"] - if self.compressor.check_compression_needed(conv_id): - triggered_conversations.append(conv_id) - - logger.info(f"Compression triggered for {len(triggered_conversations)} conversations") - return triggered_conversations - - except Exception as e: - self.last_error = str(e) - logger.error(f"Failed to check compression triggers: {e}") - return [] - - def cleanup_old_memories(self, days_old: int = 90) -> Dict[str, Any]: - """ - Clean up old conversations based on age. - - Args: - days_old: Delete conversations older than this many days - - Returns: - Dictionary with cleanup results - """ - if not self.storage: - raise MemoryManagerError("Storage not available", "cleanup_old_memories") - - try: - cutoff_date = datetime.now() - timedelta(days=days_old) - cutoff_iso = cutoff_date.isoformat() - - # Get conversations to clean up - conversations = self.storage.get_conversation_list(limit=1000) - to_delete = [] - - for conv in conversations: - try: - updated_at = datetime.fromisoformat(conv["updated_at"].replace("Z", "+00:00")) - if updated_at < cutoff_date: - to_delete.append(conv["id"]) - except (ValueError, KeyError): - continue - - # Delete old conversations - deleted_count = 0 - for conv_id in to_delete: - if self.storage.delete_conversation(conv_id): - deleted_count += 1 - # Remove from metadata tracking - if conv_id in self.conversation_metadata: - del self.conversation_metadata[conv_id] - - result = { - "total_checked": len(conversations), - "deleted_count": deleted_count, - "cutoff_date": cutoff_iso, - "days_old": days_old, - } - - self.last_activity = datetime.now().isoformat() - logger.info( - f"Cleanup completed: deleted {deleted_count} conversations older than {days_old} days" - ) - return result - - except Exception as e: - self.last_error = str(e) - logger.error(f"Failed to cleanup old memories: {e}") - raise MemoryManagerError(f"Cleanup failed: {e}", "cleanup_old_memories") - - def get_memory_stats(self) -> MemoryStats: - """ - Get comprehensive memory system statistics. - - Returns: - MemoryStats with current statistics - """ - try: - stats = MemoryStats() - - if self.storage: - # Get storage statistics - storage_stats = self.storage.get_storage_stats() - stats.total_conversations = storage_stats.get("conversation_count", 0) - stats.total_messages = storage_stats.get("message_count", 0) - stats.database_size_mb = storage_stats.get("database_size_mb", 0.0) - stats.storage_enabled = True - - if self.compressor: - # Get compression statistics - compression_stats = self.compressor.get_compression_stats() - stats.total_compressions = compression_stats.get("total_compressions", 0) - stats.average_compression_ratio = compression_stats.get( - "average_compression_ratio", 1.0 - ) - stats.compressed_conversations = compression_stats.get( - "conversations_compressed", 0 - ) - stats.compression_enabled = True - - if self.retriever: - # Calculate retrieval statistics - stats.recent_searches = len(self.search_times) - stats.average_search_time = ( - sum(self.search_times) / len(self.search_times) if self.search_times else 0.0 - ) - stats.retrieval_enabled = True - - # Health indicators - stats.last_error = self.last_error - stats.last_activity = self.last_activity - - # Determine overall health - error_count = 0 - if not stats.storage_enabled: - error_count += 1 - if not stats.compression_enabled: - error_count += 1 - if not stats.retrieval_enabled: - error_count += 1 - - if error_count == 0: - stats.system_health = "healthy" - elif error_count == 1: - stats.system_health = "degraded" - else: - stats.system_health = "unhealthy" - - return stats - - except Exception as e: - self.last_error = str(e) - logger.error(f"Failed to get memory stats: {e}") - return MemoryStats(system_health="error", last_error=str(e)) - - # Private helper methods - - def _generate_conversation_title(self, messages: List[Dict[str, Any]]) -> str: - """Generate a title for the conversation based on content.""" - if not messages: - return "Empty Conversation" - - # Get first user message - for message in messages: - if message.get("role") == "user": - content = message.get("content", "") - # Take first 50 characters - title = content[:50].strip() - if len(title) < len(content): - title += "..." - return title if title else "Untitled Conversation" - - # Fallback to first message - content = messages[0].get("content", "") - title = content[:50].strip() - if len(title) < len(content): - title += "..." - return title if title else "Untitled Conversation" - - def _detect_conversation_type(self, messages: List[Dict[str, Any]]) -> str: - """Detect conversation type from message content.""" - # Simple implementation - could be enhanced with NLP - technical_keywords = ["code", "function", "debug", "implement", "fix", "error"] - planning_keywords = ["plan", "schedule", "task", "deadline", "goal"] - question_keywords = ["?", "how", "what", "why", "when"] - - content_text = " ".join([m.get("content", "").lower() for m in messages]) - - # Count keyword occurrences - tech_count = sum(1 for kw in technical_keywords if kw in content_text) - plan_count = sum(1 for kw in planning_keywords if kw in content_text) - question_count = sum(1 for kw in question_keywords if kw in content_text) - - # Determine type based on highest count - if tech_count > plan_count and tech_count > question_count: - return "technical" - elif plan_count > question_count: - return "planning" - elif question_count > 0: - return "question" - else: - return "general" - - def _apply_search_filters( - self, results: List[Dict[str, Any]], filters: Dict[str, Any] - ) -> List[Dict[str, Any]]: - """Apply filters to search results.""" - filtered_results = [] - - for result in results: - # Date range filter - if "date_from" in filters or "date_to" in filters: - try: - result_date = result.get("matched_message", {}).get("timestamp", "") - if result_date: - if "date_from" in filters: - if result_date < filters["date_from"]: - continue - if "date_to" in filters: - if result_date > filters["date_to"]: - continue - except (ValueError, TypeError): - continue - - # Conversation type filter - if "conversation_type" in filters: - metadata = result.get("metadata", {}) - if metadata.get("conversation_type") != filters["conversation_type"]: - continue - - # Minimum similarity filter - if "min_similarity" in filters: - if result.get("similarity_score", 0) < filters["min_similarity"]: - continue - - filtered_results.append(result) - - return filtered_results - - def _check_compression_triggers_for_conversation(self) -> bool: - """Check if current conversation needs compression based on recent activity. - - Returns: - True if compression is needed for current context - """ - try: - # Check if any recent conversation needs compression - if not self.compressor or not self.auto_compression_enabled: - return False - - # Get recent conversations to check - recent_conversations = self.storage.get_conversation_list(limit=10) - - # Check if any conversation meets compression criteria - for conv in recent_conversations: - conv_id = conv["id"] - if self.compressor.check_compression_needed(conv_id): - return True - - return False - - except Exception as e: - logger.debug(f"Error checking compression triggers for conversation: {e}") - return False - - def _check_compression_triggers(self, conversation_id: str) -> None: - """Check if specific conversation needs compression and trigger it.""" - try: - if self.compressor.check_compression_needed(conversation_id): - result = self.compressor.compress_conversation(conversation_id) - - # Update metadata - if conversation_id in self.conversation_metadata: - metadata = self.conversation_metadata[conversation_id] - metadata.compressed = True - metadata.last_compressed = datetime.now().isoformat() - - # Track compression - self.compression_history.append( - { - "conversation_id": conversation_id, - "timestamp": datetime.now().isoformat(), - "original_messages": result.original_messages, - "compressed_messages": result.compressed_messages, - "compression_ratio": result.compression_ratio, - "success": result.success, - } - ) - - # Keep history manageable - if len(self.compression_history) > 100: - self.compression_history = self.compression_history[-100:] - - logger.info( - f"Auto-compressed conversation {conversation_id}: {result.compression_ratio:.2f} ratio" - ) - - except Exception as e: - logger.error(f"Failed to check compression triggers for {conversation_id}: {e}") - - def retrieve_context_for_response( - self, - user_input: str, - conversation_history: Optional[List[Dict[str, Any]]] = None, - max_context_tokens: int = 1500, - ) -> Dict[str, Any]: - """ - Retrieve context specifically for Mai's response generation. - - This method integrates with Mai's conversation engine to provide - proactive context surfacing and memory references in responses. - - Args: - user_input: Current user message/input - conversation_history: Recent conversation context - max_context_tokens: Maximum tokens for context in response - - Returns: - Dictionary with context and integration data for response generation - """ - try: - # Analyze user input for proactive context detection - context_analysis = self._analyze_input_for_context(user_input, conversation_history) - - # Retrieve relevant context - context_result = self.get_context( - query=user_input, - conversation_type=context_analysis.get("detected_type"), - max_tokens=max_context_tokens, - max_results=8, # More results for better context selection - ) - - # Enhance context with proactive surfacing - enhanced_context = self._enhance_context_for_response( - context_result, context_analysis, user_input - ) - - # Generate memory references for injection - memory_references = self._generate_memory_references( - enhanced_context["context"], user_input - ) - - # Check if automatic compression should be triggered - compression_needed = self._check_compression_triggers_for_conversation() - - return { - "context": enhanced_context["context"], - "proactive_context": enhanced_context.get("proactive_context", []), - "memory_references": memory_references, - "context_analysis": context_analysis, - "compression_needed": compression_needed, - "integration_ready": True, - "metadata": { - "original_results": context_result.get("total_conversations", 0), - "proactive_items": len(enhanced_context.get("proactive_context", [])), - "memory_refs": len(memory_references), - "relevance_threshold": enhanced_context.get("relevance_threshold", 0.3), - }, - } - - except Exception as e: - logger.warning(f"Context retrieval for response failed: {e}") - return { - "context": None, - "proactive_context": [], - "memory_references": [], - "context_analysis": {}, - "compression_needed": False, - "integration_ready": False, - "error": str(e), - } - - def integrate_memory_in_response( - self, user_input: str, base_response: str, memory_context: Optional[Dict[str, Any]] = None - ) -> Dict[str, Any]: - """ - Integrate memory context into Mai's response. - - Injects memory references and context naturally into responses. - - Args: - user_input: Original user input - base_response: Mai's generated response without memory - memory_context: Context from retrieve_context_for_response - - Returns: - Dictionary with enhanced response and integration metadata - """ - try: - if not memory_context or not memory_context.get("integration_ready"): - return { - "response": base_response, - "memory_integrated": False, - "references_added": [], - "enhancements": [], - } - - # Extract memory references - memory_references = memory_context.get("memory_references", []) - proactive_context = memory_context.get("proactive_context", []) - - enhanced_response = base_response - references_added = [] - enhancements = [] - - # Add memory references to response - if memory_references: - # Select most relevant reference - best_reference = max(memory_references, key=lambda x: x.get("relevance", 0)) - - # Natural insertion point - if best_reference.get("relevance", 0) > 0.6: - reference_text = f" {best_reference['text']}." - - # Insert after first sentence or paragraph - if "." in enhanced_response[:200]: - first_period = enhanced_response.find(".", 200) - if first_period != -1: - enhanced_response = ( - enhanced_response[: first_period + 1] - + reference_text - + enhanced_response[first_period + 1 :] - ) - references_added.append(best_reference) - enhancements.append("Added memory reference") - - # Add proactive context mentions - if proactive_context and len(proactive_context) > 0: - top_proactive = proactive_context[0] # Most relevant proactive item - - if top_proactive.get("proactive_score", 0) > 0.5: - # Add contextual hint about related past discussions - topic = self._extract_result_topic(top_proactive.get("result", {})) - context_hint = f"\n\n*(Note: I'm drawing on our previous discussions about {topic} for context.)*" - enhanced_response += context_hint - enhancements.append("Added proactive context hint") - - return { - "response": enhanced_response, - "memory_integrated": True, - "references_added": references_added, - "enhancements": enhancements, - "proactive_items_used": len( - [pc for pc in proactive_context if pc.get("proactive_score", 0) > 0.5] - ), - "memory_quality_score": self._calculate_response_memory_quality(memory_context), - } - - except Exception as e: - logger.warning(f"Memory integration in response failed: {e}") - return { - "response": base_response, - "memory_integrated": False, - "references_added": [], - "enhancements": [], - "error": str(e), - } - - def close(self) -> None: - """Close all memory components and cleanup resources.""" - try: - if self.storage: - self.storage.close() - if self.retriever: - self.retriever.close() - - logger.info("MemoryManager closed successfully") - - except Exception as e: - logger.error(f"Error closing MemoryManager: {e}") - - def __enter__(self): - """Context manager entry.""" - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - """Context manager exit.""" - self.close() diff --git a/src/mai/memory/retrieval.py b/src/mai/memory/retrieval.py deleted file mode 100644 index 779277a..0000000 --- a/src/mai/memory/retrieval.py +++ /dev/null @@ -1,1628 +0,0 @@ -""" -Context Retrieval Implementation for Mai Memory System - -Provides intelligent context retrieval with multi-faceted search, -adaptive weighting, and strategic context placement to prevent -"lost in the middle" problems. -""" - -import re -import json -import logging -from typing import Dict, List, Any, Optional, Tuple, Union -from datetime import datetime, timedelta -from dataclasses import dataclass - -# Import Mai components -try: - from src.mai.memory.storage import MemoryStorage, VectorSearchError, DatabaseConnectionError - from src.mai.models.conversation import Conversation - from src.mai.models.memory import ( - SearchQuery, - RetrievalResult, - MemoryContext, - ContextWeight, - ConversationType, - RelevanceType, - ConversationPattern, - ContextPlacement, - ) - from src.mai.core.config import get_config - from src.mai.core.exceptions import MaiError, ContextError, create_error_context -except ImportError as e: - # Handle missing dependencies gracefully - logging.warning(f"Could not import Mai components: {e}") - MemoryStorage = None - SearchQuery = None - RetrievalResult = None - MemoryContext = None - ContextWeight = None - ConversationType = None - RelevanceType = None - ConversationPattern = None - ContextPlacement = None - MaiError = Exception - ContextError = Exception - VectorSearchError = Exception - DatabaseConnectionError = Exception - - def create_error_context(component: str, operation: str, **data): - return {"component": component, "operation": operation, "data": data} - - def get_config(): - return {"memory": {"weights": {"pattern": 0.1}}} - - -logger = logging.getLogger(__name__) - - -class ContextRetrievalError(ContextError): - """Context retrieval specific errors.""" - - def __init__(self, message: str, query: str = None, **kwargs): - context = create_error_context( - component="context_retrieval", operation="retrieve_context", query=query, **kwargs - ) - super().__init__(message, context=context) - self.query = query - - -class ContextRetriever: - """ - Intelligent context retrieval system with multi-faceted search. - - Combines semantic similarity, keyword matching, recency weighting, - and user pattern analysis to provide comprehensive, relevant context - while preventing information overload and "lost in the middle" issues. - """ - - def __init__(self, storage: Optional[MemoryStorage] = None): - """ - Initialize context retriever with storage and configuration. - - Args: - storage: MemoryStorage instance (creates default if None) - """ - self.storage = storage or MemoryStorage() - self.config = get_config() - - # Load memory configuration - self.memory_config = self.config.memory - - # Initialize search weights for different conversation types - self._init_conversation_weights() - - # Pattern extraction cache - self._pattern_cache = {} - - logger.info("ContextRetriever initialized with multi-faceted search") - - def _init_conversation_weights(self) -> None: - """Initialize adaptive weights for different conversation types.""" - # Default weights from config - self.default_weights = ContextWeight( - semantic=self.memory_config.semantic_weight, - keyword=self.memory_config.keyword_weight, - recency=self.memory_config.recency_weight, - user_pattern=self.memory_config.user_pattern_weight, - ) - - # Conversation type-specific weight adjustments - self.type_weights = { - ConversationType.TECHNICAL: ContextWeight( - semantic=0.5, keyword=0.4, recency=0.05, user_pattern=0.05 - ), - ConversationType.PERSONAL: ContextWeight( - semantic=0.3, keyword=0.2, recency=0.3, user_pattern=0.2 - ), - ConversationType.PLANNING: ContextWeight( - semantic=0.4, keyword=0.2, recency=0.2, user_pattern=0.2 - ), - ConversationType.QUESTION: ContextWeight( - semantic=0.6, keyword=0.3, recency=0.05, user_pattern=0.05 - ), - ConversationType.CREATIVE: ContextWeight( - semantic=0.35, keyword=0.15, recency=0.2, user_pattern=0.3 - ), - ConversationType.ANALYSIS: ContextWeight( - semantic=0.45, keyword=0.35, recency=0.1, user_pattern=0.1 - ), - ConversationType.GENERAL: self.default_weights, - } - - def retrieve_context(self, query: SearchQuery) -> MemoryContext: - """ - Retrieve comprehensive context for a search query. - - Args: - query: SearchQuery with search parameters - - Returns: - MemoryContext with retrieved conversations and metadata - - Raises: - ContextRetrievalError: If retrieval fails - """ - try: - logger.info(f"Retrieving context for query: {query.text[:100]}...") - - # Detect conversation type if not provided - detected_type = query.conversation_type or self._detect_conversation_type(query.text) - query.conversation_type = detected_type - - # Get appropriate weights for this conversation type - weights = self._get_adaptive_weights(detected_type, query.weights) - - # Perform multi-faceted search - results = self._perform_multi_faceted_search(query, weights) - - # Rank and filter results - ranked_results = self._rank_results(results, weights, query) - - # Apply context placement strategy - final_results = self._apply_context_placement(ranked_results, query) - - # Create memory context - context = MemoryContext( - current_query=query, - relevant_conversations=final_results, - patterns=self._extract_patterns(final_results), - metadata={ - "weights_applied": weights.dict(), - "conversation_type": detected_type.value, - "search_facets": self._get_active_facets(query), - }, - ) - - # Set computed fields - context.total_conversations = len(final_results) - context.total_tokens = self._estimate_tokens(final_results) - context.applied_weights = weights.dict() - context.conversation_type_detected = detected_type - - logger.info( - f"Retrieved {context.total_conversations} conversations, ~{context.total_tokens} tokens" - ) - return context - - except Exception as e: - raise ContextRetrievalError( - message=f"Context retrieval failed: {e}", query=query.text, error_details=str(e) - ) from e - - def _detect_conversation_type(self, text: str) -> ConversationType: - """ - Detect conversation type from query text. - - Args: - text: Query text to analyze - - Returns: - Detected ConversationType - """ - text_lower = text.lower() - - # Technical indicators - technical_keywords = [ - "code", - "function", - "class", - "algorithm", - "debug", - "implement", - "api", - "database", - "server", - "python", - "javascript", - "react", - ] - if any(keyword in text_lower for keyword in technical_keywords): - return ConversationType.TECHNICAL - - # Question indicators - question_indicators = ["?", "how", "what", "why", "when", "where", "which"] - if text_lower.strip().endswith("?") or any( - indicator in text_lower.split()[:3] for indicator in question_indicators - ): - return ConversationType.QUESTION - - # Planning indicators - planning_keywords = [ - "plan", - "schedule", - "deadline", - "task", - "project", - "goal", - "organize", - "implement", - "roadmap", - ] - if any(keyword in text_lower for keyword in planning_keywords): - return ConversationType.PLANNING - - # Creative indicators - creative_keywords = [ - "create", - "design", - "write", - "imagine", - "brainstorm", - "idea", - "concept", - "story", - "novel", - "art", - "creative", - ] - if any(keyword in text_lower for keyword in creative_keywords): - return ConversationType.CREATIVE - - # Analysis indicators - analysis_keywords = [ - "analyze", - "compare", - "evaluate", - "review", - "assess", - "examine", - "pros", - "cons", - "advantages", - "disadvantages", - ] - if any(keyword in text_lower for keyword in analysis_keywords): - return ConversationType.ANALYSIS - - # Personal indicators (check last) - personal_keywords = [ - "i feel", - "i think", - "my opinion", - "personally", - "experience", - "remember", - "preference", - "favorite", - ] - if any(keyword in text_lower for keyword in personal_keywords): - return ConversationType.PERSONAL - - # Default to general - return ConversationType.GENERAL - - def _get_adaptive_weights( - self, conv_type: ConversationType, overrides: Dict[str, float] - ) -> ContextWeight: - """ - Get adaptive weights for conversation type with optional overrides. - - Args: - conv_type: Type of conversation - overrides: Weight overrides from query - - Returns: - ContextWeight with applied overrides - """ - # Start with type-specific weights - base_weights = self.type_weights.get(conv_type, self.default_weights) - - # Apply overrides - if overrides: - weight_dict = base_weights.dict() - weight_dict.update(overrides) - return ContextWeight(**weight_dict) - - return base_weights - - def _perform_multi_faceted_search( - self, query: SearchQuery, weights: ContextWeight - ) -> List[RetrievalResult]: - """ - Perform multi-faceted search combining different search methods. - - Args: - query: Search query with parameters - weights: Search weights to apply - - Returns: - List of retrieval results from different facets - """ - all_results = [] - - # Semantic similarity search - if query.include_semantic and weights.semantic > 0: - semantic_results = self._semantic_search(query) - all_results.extend(semantic_results) - logger.debug(f"Semantic search found {len(semantic_results)} results") - - # Keyword matching search - if query.include_keywords and weights.keyword > 0: - keyword_results = self._keyword_search(query) - all_results.extend(keyword_results) - logger.debug(f"Keyword search found {len(keyword_results)} results") - - # Recency-based search - if query.include_recency and weights.recency > 0: - recency_results = self._recency_search(query) - all_results.extend(recency_results) - logger.debug(f"Recency search found {len(recency_results)} results") - - # Pattern-based search - if query.include_patterns and weights.pattern > 0: - pattern_results = self._pattern_search(query) - all_results.extend(pattern_results) - logger.debug(f"Pattern search found {len(pattern_results)} results") - - return all_results - - def _semantic_search(self, query: SearchQuery) -> List[RetrievalResult]: - """Perform semantic similarity search using vector embeddings.""" - try: - # Use storage's search_conversations method - results = self.storage.search_conversations( - query=query.text, limit=query.max_results, include_content=True - ) - - # Convert to RetrievalResult objects - semantic_results = [] - for result in results: - retrieval_result = RetrievalResult( - conversation_id=result["conversation_id"], - title=result["title"], - similarity_score=result["similarity_score"], - relevance_type=RelevanceType.SEMANTIC, - excerpt=result["matched_message"]["content"][:500], - context_type=ConversationType.GENERAL, # Will be refined later - matched_message_id=result.get("message_id"), - semantic_score=result["similarity_score"], - ) - semantic_results.append(retrieval_result) - - return semantic_results - - except Exception as e: - logger.warning(f"Semantic search failed: {e}") - return [] - - def _keyword_search(self, query: SearchQuery) -> List[RetrievalResult]: - """Perform keyword matching search.""" - try: - # Extract keywords from query - keywords = self._extract_keywords(query.text) - if not keywords: - return [] - - # Get all conversations and search for keywords - conversations = self.storage.get_conversation_list(limit=50) - keyword_results = [] - - for conv in conversations: - # Get full conversation for content search - full_conv = self.storage.retrieve_conversation(conv["id"]) - if not full_conv: - continue - - # Check keyword matches - content_text = " ".join([msg["content"] for msg in full_conv["messages"]]).lower() - keyword_matches = sum(1 for kw in keywords if kw.lower() in content_text) - - if keyword_matches > 0: - # Calculate keyword score based on match density - keyword_score = min(keyword_matches / len(keywords), 1.0) - - retrieval_result = RetrievalResult( - conversation_id=conv["id"], - title=conv["title"], - similarity_score=keyword_score, - relevance_type=RelevanceType.KEYWORD, - excerpt=self._create_keyword_excerpt(content_text, keywords, 300), - keyword_score=keyword_score, - ) - keyword_results.append(retrieval_result) - - return sorted(keyword_results, key=lambda x: x.keyword_score, reverse=True)[ - : query.max_results - ] - - except Exception as e: - logger.warning(f"Keyword search failed: {e}") - return [] - - def _recency_search(self, query: SearchQuery) -> List[RetrievalResult]: - """Perform recency-based search for recent conversations.""" - try: - # Get recent conversations - conversations = self.storage.get_conversation_list(limit=query.max_results) - - recency_results = [] - now = datetime.now() - - for i, conv in enumerate(conversations): - # Calculate recency score (newer = higher score) - try: - updated_time = datetime.fromisoformat(conv["updated_at"].replace("Z", "+00:00")) - days_old = (now - updated_time).days - - # Exponential decay: recent conversations get much higher scores - recency_score = max(0, 1.0 - (days_old / 30.0)) # 30-day window - - retrieval_result = RetrievalResult( - conversation_id=conv["id"], - title=conv["title"], - similarity_score=recency_score, - relevance_type=RelevanceType.RECENCY, - excerpt=f"Recent conversation from {days_old} days ago", - recency_score=recency_score, - ) - recency_results.append(retrieval_result) - - except (ValueError, KeyError) as e: - logger.debug(f"Could not parse timestamp for conversation {conv['id']}: {e}") - continue - - return sorted(recency_results, key=lambda x: x.recency_score, reverse=True) - - except Exception as e: - logger.warning(f"Recency search failed: {e}") - return [] - - def _pattern_search(self, query: SearchQuery) -> List[RetrievalResult]: - """Perform pattern-based search using stored user patterns.""" - try: - if not self.storage: - logger.warning("Storage not available for pattern search") - return [] - - # Load user patterns from storage - user_patterns = self._load_user_patterns() - - if not user_patterns: - logger.debug("No user patterns found for pattern search") - return [] - - # Perform pattern matching against query - pattern_results = [] - - for pattern_name, pattern_data in user_patterns.items(): - pattern_score = self._calculate_pattern_match_score(query.query_text, pattern_data) - - if pattern_score > 0.3: # Threshold for pattern relevance - # Get associated conversations for this pattern - pattern_conversations = self._get_pattern_conversations( - pattern_name, pattern_data - ) - - for conversation in pattern_conversations: - result = RetrievalResult( - id=f"pattern_{pattern_name}_{conversation.id}", - conversation_id=conversation.id, - excerpt=conversation.summary or "", - relevance_score=pattern_score, - pattern_score=pattern_score, - timestamp=conversation.updated_at or conversation.created_at, - source="pattern_match", - content_type="pattern_match", - metadata={ - "pattern_name": pattern_name, - "pattern_type": pattern_data.get("type", "keyword"), - "match_score": pattern_score, - "pattern_frequency": pattern_data.get("frequency", 0), - }, - ) - pattern_results.append(result) - - # Sort by pattern score and limit results - pattern_results.sort(key=lambda x: x.pattern_score, reverse=True) - - logger.info( - f"Pattern search found {len(pattern_results)} results from {len(user_patterns)} patterns" - ) - return pattern_results[:50] # Limit to prevent overwhelming results - - except Exception as e: - logger.warning(f"Pattern search failed: {e}") - return [] - - def _rank_results( - self, results: List[RetrievalResult], weights: ContextWeight, query: SearchQuery - ) -> List[RetrievalResult]: - """ - Rank and combine results from different search facets. - - Args: - results: Raw results from all search facets - weights: Search weights to apply - query: Original search query - - Returns: - Ranked and deduplicated results - """ - # Group by conversation_id - conversation_groups = {} - for result in results: - conv_id = result.conversation_id - if conv_id not in conversation_groups: - conversation_groups[conv_id] = [] - conversation_groups[conv_id].append(result) - - # Combine scores for each conversation - combined_results = [] - for conv_id, group_results in conversation_groups.items(): - # Calculate weighted score - weighted_score = 0.0 - best_semantic = 0.0 - best_keyword = 0.0 - best_recency = 0.0 - best_pattern = 0.0 - best_excerpt = "" - - for result in group_results: - # Apply weights to facet scores - if result.semantic_score is not None: - weighted_score += result.semantic_score * weights.semantic - best_semantic = max(best_semantic, result.semantic_score) - if result.keyword_score is not None: - weighted_score += result.keyword_score * weights.keyword - best_keyword = max(best_keyword, result.keyword_score) - if result.recency_score is not None: - weighted_score += result.recency_score * weights.recency - best_recency = max(best_recency, result.recency_score) - if result.pattern_score is not None: - weighted_score += result.pattern_score * weights.pattern - best_pattern = max(best_pattern, result.pattern_score) - - # Keep the best excerpt - if len(result.excerpt) > len(best_excerpt): - best_excerpt = result.excerpt - - # Create combined result - combined_result = RetrievalResult( - conversation_id=conv_id, - title=group_results[0].title, - similarity_score=min(weighted_score, 1.0), # Cap at 1.0 - relevance_type=RelevanceType.HYBRID, - excerpt=best_excerpt, - semantic_score=best_semantic, - keyword_score=best_keyword, - recency_score=best_recency, - pattern_score=best_pattern, - ) - combined_results.append(combined_result) - - # Sort by combined score - return sorted(combined_results, key=lambda x: x.similarity_score, reverse=True) - - def _apply_context_placement( - self, results: List[RetrievalResult], query: SearchQuery - ) -> List[RetrievalResult]: - """ - Apply strategic context placement to prevent "lost in the middle". - - Uses a sophisticated algorithm to ensure important information remains - visible throughout the context window, preventing degradation of - information quality in the middle sections. - - Args: - results: Ranked search results - query: Search query for token limits - - Returns: - Results with strategic ordering to maximize information retention - """ - if not results: - return results - - # Estimate token usage with better accuracy - estimated_tokens = self._estimate_tokens(results) - if estimated_tokens <= query.max_tokens: - return self._optimize_ordering(results) # Still optimize ordering even if all fit - - # Strategic placement algorithm - return self._strategic_placement(results, query) - - def _strategic_placement( - self, results: List[RetrievalResult], query: SearchQuery - ) -> List[RetrievalResult]: - """ - Implement strategic placement to prevent information loss. - - Strategy: - 1. Prime positions (first 20%) - highest priority items - 2. Middle reinforcement (40%-60%) - key reinforcing items - 3. Distributed placement - spread important items throughout - 4. Token-aware selection - respect context limits - """ - if not results: - return results - - max_tokens = query.max_tokens - target_prime_tokens = int(max_tokens * 0.2) # 20% for prime position - target_middle_tokens = int(max_tokens * 0.2) # 20% for middle reinforcement - - # Categorize results by quality and importance - prime_results = [] # Top quality, high relevance - middle_results = [] # Reinforcing content - distributed_results = [] # Additional relevant content - - for result in results: - result_tokens = self._estimate_result_tokens(result) - result.importance_score = self._calculate_importance_score(result) - - # Categorize based on importance and relevance - if result.importance_score >= 0.8 or result.relevance_score >= 0.8: - prime_results.append(result) - elif result.importance_score >= 0.5 or result.relevance_score >= 0.5: - middle_results.append(result) - else: - distributed_results.append(result) - - # Build strategic context - strategic_results = [] - used_tokens = 0 - - # Phase 1: Fill prime positions with highest quality content - prime_results.sort(key=lambda x: (x.importance_score, x.relevance_score), reverse=True) - for result in prime_results: - result_tokens = self._estimate_result_tokens(result) - if used_tokens + result_tokens <= target_prime_tokens: - result.placement = "prime" - strategic_results.append(result) - used_tokens += result_tokens - - # Phase 2: Add middle reinforcement content - middle_results.sort(key=lambda x: (x.importance_score, x.relevance_score), reverse=True) - target_middle_start = int(max_tokens * 0.4) # Start at 40% mark - for result in middle_results: - result_tokens = self._estimate_result_tokens(result) - if used_tokens + result_tokens <= target_middle_tokens: - result.placement = "middle_reinforcement" - strategic_results.append(result) - used_tokens += result_tokens - - # Phase 3: Distribute remaining content strategically - remaining_tokens = max_tokens - used_tokens - distributed_slots = self._calculate_distribution_slots( - remaining_tokens, len(distributed_results) - ) - - for i, result in enumerate(distributed_results): - if i >= len(distributed_slots): - break - - result_tokens = self._estimate_result_tokens(result) - slot_tokens = distributed_slots[i] - - if result_tokens <= slot_tokens: - result.placement = "distributed" - strategic_results.append(result) - used_tokens += result_tokens - - # Optimize final ordering for flow and coherence - strategic_results = self._optimize_flow_ordering(strategic_results) - - logger.info( - f"Strategic placement: {len(strategic_results)}/{len(results)} results " - f"in {used_tokens}/{max_tokens} tokens " - f"(prime: {sum(1 for r in strategic_results if r.placement == 'prime')}, " - f"middle: {sum(1 for r in strategic_results if r.placement == 'middle_reinforcement')}, " - f"distributed: {sum(1 for r in strategic_results if r.placement == 'distributed')})" - ) - - return strategic_results - - def _calculate_importance_score(self, result: RetrievalResult) -> float: - """ - Calculate importance score based on multiple factors. - - Factors: - - Recency (more recent gets higher score) - - Relevance similarity - - User interaction patterns - - Content type importance - - Cross-reference frequency - """ - base_score = result.relevance_score - - # Recency factor (more recent = higher importance) - days_old = (datetime.now() - result.timestamp).days - recency_factor = max(0.1, 1.0 - (days_old / 365)) # Decay over a year - - # Content type importance - content_importance = self._get_content_importance(result.content_type or "text") - - # User pattern importance (if available) - pattern_importance = getattr(result, "pattern_score", 0.0) - - # Cross-reference importance (if this content is frequently referenced) - cross_ref_importance = getattr(result, "cross_reference_count", 0) / 10.0 - - # Combine factors with weights - importance_score = ( - base_score * 0.4 # Base relevance - + recency_factor * 0.2 # Recency - + content_importance * 0.15 # Content type - + pattern_importance * 0.15 # User patterns - + cross_ref_importance * 0.1 # Cross-references - ) - - return min(1.0, importance_score) - - def _get_content_importance(self, content_type: str) -> float: - """Get importance weight for content type.""" - importance_map = { - "code": 0.9, # Code snippets are highly valuable - "error": 0.95, # Error messages are critical - "decision": 0.85, # Decisions are important - "question": 0.7, # Questions show user intent - "summary": 0.8, # Summaries contain key info - "text": 0.5, # Default text content - } - return importance_map.get(content_type.lower(), 0.5) - - def _estimate_result_tokens(self, result: RetrievalResult) -> int: - """ - More accurate token estimation for a single result. - - Accounts for metadata and formatting overhead. - """ - # Base token count (4 chars per token on average) - base_tokens = len(result.excerpt) // 4 - - # Add overhead for metadata - metadata_overhead = 20 # Tokens for timestamps, sources, etc. - - # Add formatting overhead - formatting_overhead = 10 # Tokens for separators, labels - - return base_tokens + metadata_overhead + formatting_overhead - - def _calculate_distribution_slots(self, available_tokens: int, num_results: int) -> List[int]: - """ - Calculate token slots for distributed content placement. - - Ensures even distribution throughout remaining context space. - """ - if num_results == 0: - return [] - - # Reserve 10% buffer for safety - usable_tokens = int(available_tokens * 0.9) - - # Calculate base slot size - base_slot = usable_tokens // num_results - - # Distribute remaining tokens to early slots (for better UX) - remaining_tokens = usable_tokens % num_results - slots = [] - - for i in range(num_results): - slot_size = base_slot - if i < remaining_tokens: - slot_size += 1 - slots.append(slot_size) - - return slots - - def _optimize_flow_ordering(self, results: List[RetrievalResult]) -> List[RetrievalResult]: - """ - Optimize result ordering for better flow and coherence. - - Group related items together and maintain logical progression. - """ - if len(results) <= 2: - return results - - # Separate by placement - prime = [r for r in results if r.placement == "prime"] - middle = [r for r in results if r.placement == "middle_reinforcement"] - distributed = [r for r in results if r.placement == "distributed"] - - # Sort within each group - prime.sort(key=lambda x: (x.importance_score, x.relevance_score), reverse=True) - middle.sort(key=lambda x: (x.importance_score, x.relevance_score), reverse=True) - - # For distributed items, ensure variety - distributed.sort(key=lambda x: (x.timestamp, x.importance_score)) - - # Reassemble in flow order - return prime + middle + distributed - - def _optimize_ordering(self, results: List[RetrievalResult]) -> List[RetrievalResult]: - """ - Optimize ordering when all results fit in context. - - Even without token limits, we should optimize for information flow. - """ - if not results: - return results - - # Sort by importance score first, then by relevance - optimized = sorted( - results, - key=lambda x: (self._calculate_importance_score(x), x.relevance_score), - reverse=True, - ) - - # Apply flow optimization - return self._optimize_flow_ordering(optimized) - - def _detect_quality_degradation(self, context: List[RetrievalResult]) -> Dict[str, Any]: - """ - Detect potential quality degradation in context. - - Analyzes context for patterns that indicate information loss. - """ - if len(context) < 3: - return {"degradation_detected": False, "score": 1.0} - - # Calculate quality metrics - metrics = { - "relevance_variance": self._calculate_relevance_variance(context), - "importance_drop": self._calculate_importance_drop(context), - "content_distribution": self._calculate_content_distribution(context), - "temporal_gaps": self._calculate_temporal_gaps(context), - } - - # Overall quality score - quality_score = ( - (1.0 - metrics["relevance_variance"]) * 0.3 - + (1.0 - metrics["importance_drop"]) * 0.3 - + metrics["content_distribution"] * 0.2 - + (1.0 - metrics["temporal_gaps"]) * 0.2 - ) - - degradation_detected = quality_score < 0.7 - - return { - "degradation_detected": degradation_detected, - "score": quality_score, - "metrics": metrics, - "recommendations": self._generate_quality_recommendations(metrics), - } - - def _calculate_relevance_variance(self, context: List[RetrievalResult]) -> float: - """Calculate variance in relevance scores (lower is better).""" - if not context: - return 0.0 - - scores = [r.relevance_score for r in context] - mean_score = sum(scores) / len(scores) - variance = sum((s - mean_score) ** 2 for s in scores) / len(scores) - - # Normalize to 0-1 range - return min(1.0, variance / 0.25) # Max variance for scores 0-1 is 0.25 - - def _calculate_importance_drop(self, context: List[RetrievalResult]) -> float: - """Calculate drop in importance across context (lower is better).""" - if len(context) < 2: - return 0.0 - - importance_scores = [self._calculate_importance_score(r) for r in context] - - # Calculate drop from start to end - start_score = importance_scores[0] - end_score = importance_scores[-1] - - if start_score == 0: - return 1.0 - - drop = (start_score - end_score) / start_score - return max(0.0, min(1.0, drop)) - - def _calculate_content_distribution(self, context: List[RetrievalResult]) -> float: - """Calculate distribution quality of content types (higher is better).""" - if not context: - return 0.0 - - # Count content types - content_types = {} - for result in context: - content_type = result.content_type or "text" - content_types[content_type] = content_types.get(content_type, 0) + 1 - - # Good distribution has variety - num_types = len(content_types) - ideal_ratio = 1.0 / max(1, num_types) - - # Calculate how evenly distributed the types are - ratios = [count / len(context) for count in content_types.values()] - distribution_score = sum(1.0 - abs(ratio - ideal_ratio) for ratio in ratios) / len(ratios) - - # Bonus for having multiple content types - type_bonus = min(0.3, num_types * 0.1) - - return min(1.0, distribution_score + type_bonus) - - def _calculate_temporal_gaps(self, context: List[RetrievalResult]) -> float: - """Calculate temporal gaps in context (lower is better).""" - if len(context) < 2: - return 0.0 - - timestamps = [r.timestamp for r in context] - timestamps.sort() - - # Calculate gaps between consecutive items - gaps = [] - for i in range(1, len(timestamps)): - gap = (timestamps[i] - timestamps[i - 1]).days - gaps.append(gap) - - # Average gap in days, normalized to 0-1 (1 year = max gap) - avg_gap = sum(gaps) / len(gaps) if gaps else 0 - normalized_gap = min(1.0, avg_gap / 365) - - return normalized_gap - - def _generate_quality_recommendations(self, metrics: Dict[str, float]) -> List[str]: - """Generate recommendations to improve context quality.""" - recommendations = [] - - if metrics["relevance_variance"] > 0.3: - recommendations.append( - "High relevance variance - consider filtering low-relevance items" - ) - - if metrics["importance_drop"] > 0.4: - recommendations.append("Significant importance drop - redistribute important items") - - if metrics["content_distribution"] < 0.5: - recommendations.append("Poor content type distribution - include more variety") - - if metrics["temporal_gaps"] > 0.6: - recommendations.append("Large temporal gaps - consider temporal clustering") - - return recommendations - - def _load_user_patterns(self) -> Dict[str, Any]: - """Load user patterns from storage.""" - try: - if not self.storage: - return {} - - # In a full implementation, this would load from a patterns table - # For now, extract patterns from existing conversations - return self._extract_patterns_from_conversations() - - except Exception as e: - logger.warning(f"Failed to load user patterns: {e}") - return {} - - def _extract_patterns_from_conversations(self) -> Dict[str, Any]: - """Extract patterns from existing conversations.""" - try: - if not self.storage: - return {} - - # Get recent conversations for pattern extraction - recent_conversations = self.storage.get_recent_conversations(limit=50) - - if not recent_conversations: - return {} - - # Extract patterns from these conversations - all_results = [] - for conv in recent_conversations: - # Create a mock result for pattern extraction - mock_result = type( - "MockResult", - (), - { - "excerpt": conv.summary or "", - "relevance_score": 0.5, - "timestamp": conv.updated_at or conv.created_at, - "conversation_id": conv.id, - }, - )() - all_results.append(mock_result) - - # Use existing pattern extraction - patterns = self._extract_patterns(all_results) - - # Convert to user pattern format - user_patterns = {} - - # Convert keywords to user patterns - keywords = patterns.get("keywords", {}).get("importance", {}) - for keyword, importance in keywords.items(): - if importance > 0.5: - user_patterns[f"keyword_{keyword}"] = { - "type": "keyword", - "keyword": keyword, - "importance": importance, - "frequency": keywords.get(keyword, 0), - "contexts": [], - } - - # Convert topics to user patterns - topics = patterns.get("topics", {}).get("scores", {}) - for topic, score in topics.items(): - if score > 0.3: - user_patterns[f"topic_{topic}"] = { - "type": "topic", - "topic": topic, - "score": score, - "keywords": patterns.get("topics", {}).get("results", {}).get(topic, []), - } - - # Convert communication style to user patterns - styles = patterns.get("communication_style", {}).get("scores", {}) - for style, score in styles.items(): - if score > 0.3: - user_patterns[f"style_{style}"] = { - "type": "communication_style", - "style": style, - "score": score, - "examples": patterns.get("communication_style", {}) - .get("examples", {}) - .get(style, []), - } - - logger.info( - f"Extracted {len(user_patterns)} user patterns from {len(recent_conversations)} conversations" - ) - return user_patterns - - except Exception as e: - logger.warning(f"Failed to extract patterns from conversations: {e}") - return {} - - def _calculate_pattern_match_score( - self, query_text: str, pattern_data: Dict[str, Any] - ) -> float: - """Calculate how well a query matches a stored pattern.""" - try: - query_lower = query_text.lower() - pattern_type = pattern_data.get("type", "") - - if pattern_type == "keyword": - keyword = pattern_data.get("keyword", "") - if keyword in query_lower: - return pattern_data.get("importance", 0.5) - return 0.0 - - elif pattern_type == "topic": - topic_keywords = pattern_data.get("keywords", []) - matches = sum( - 1 - for kw_data in topic_keywords - if any(kw in query_lower for kw in kw_data.get("matches", [])) - ) - return min(1.0, matches / 3.0) * pattern_data.get("score", 0.5) - - elif pattern_type == "communication_style": - # Check if query matches communication style indicators - style_indicators = { - "questioning": ["?", "how", "what", "why", "can", "could"], - "declarative": ["is", "are", "will", "be"], - "imperative": ["do", "make", "create", "implement"], - "expressive": ["feel", "think", "opinion"], - } - - style = pattern_data.get("style", "") - indicators = style_indicators.get(style, []) - matches = sum(1 for indicator in indicators if indicator in query_lower) - return min(1.0, matches / len(indicators)) * pattern_data.get("score", 0.5) - - return 0.0 - - except Exception as e: - logger.warning(f"Pattern match score calculation failed: {e}") - return 0.0 - - def _get_pattern_conversations( - self, pattern_name: str, pattern_data: Dict[str, Any] - ) -> List[Any]: - """Get conversations associated with a specific pattern.""" - try: - if not self.storage: - return [] - - # For now, return recent conversations as associated - # In a full implementation, this would query a pattern_conversation table - recent_conversations = self.storage.get_recent_conversations(limit=10) - - # Filter based on pattern relevance - pattern_type = pattern_data.get("type", "") - - if pattern_type == "keyword": - keyword = pattern_data.get("keyword", "") - return [ - conv - for conv in recent_conversations - if conv.summary and keyword.lower() in conv.summary.lower() - ] - - elif pattern_type == "topic": - topic_keywords = pattern_data.get("keywords", []) - return [ - conv - for conv in recent_conversations - if conv.summary - and any( - kw in conv.summary.lower() - for kw_data in topic_keywords - for kw in ["code", "plan", "feel", "learn", "create", "analyze"][:3] - ) - ] - - # Default return recent conversations - return recent_conversations[:5] - - except Exception as e: - logger.warning(f"Failed to get pattern conversations: {e}") - return [] - - def _extract_keywords(self, text: str) -> List[str]: - """Extract meaningful keywords from text.""" - # Simple keyword extraction - in production, use more sophisticated NLP - words = re.findall(r"\b\w+\b", text.lower()) - - # Filter out common stop words - stop_words = { - "the", - "a", - "an", - "and", - "or", - "but", - "in", - "on", - "at", - "to", - "for", - "of", - "with", - "by", - "from", - "as", - "is", - "was", - "are", - "were", - "been", - "be", - "have", - "has", - "had", - "do", - "does", - "did", - "will", - "would", - "could", - "should", - "may", - "might", - "can", - "this", - "that", - "these", - "those", - } - - keywords = [word for word in words if len(word) > 2 and word not in stop_words] - - # Return unique keywords - return list(set(keywords))[:10] # Limit to 10 keywords - - def _create_keyword_excerpt(self, content: str, keywords: List[str], max_length: int) -> str: - """Create excerpt showing keyword matches.""" - # Find first keyword occurrence - content_lower = content.lower() - for keyword in keywords: - keyword_lower = keyword.lower() - pos = content_lower.find(keyword_lower) - if pos != -1: - # Create excerpt around keyword - start = max(0, pos - 50) - end = min(len(content), pos + len(keyword) + max_length - 100) - - excerpt = content[start:end] - if start > 0: - excerpt = "..." + excerpt - if end < len(content): - excerpt = excerpt + "..." - - return excerpt - - # Fallback to first characters - return content[:max_length] + ("..." if len(content) > max_length else "") - - def _estimate_tokens(self, results: List[RetrievalResult]) -> int: - """Estimate total tokens for results.""" - # Rough estimation: 1 token ≈ 4 characters - total_chars = sum(len(result.excerpt) for result in results) - return total_chars // 4 - - def _extract_patterns(self, results: List[RetrievalResult]) -> Dict[str, Any]: - """Extract patterns from search results.""" - try: - if not results: - return {} - - # Extract various types of patterns from the results - patterns = { - "keywords": self._extract_keyword_patterns(results), - "topics": self._extract_topic_patterns(results), - "communication_style": self._extract_communication_patterns(results), - "preferences": self._extract_preference_patterns(results), - "temporal": self._extract_temporal_patterns(results), - "emotional": self._extract_emotional_patterns(results), - } - - # Calculate pattern statistics - patterns["statistics"] = { - "total_results": len(results), - "pattern_density": self._calculate_pattern_density(patterns), - "confidence": self._calculate_pattern_confidence(patterns), - } - - logger.debug( - f"Extracted {sum(len(v) for v in patterns.values() if isinstance(v, dict))} patterns" - ) - return patterns - - except Exception as e: - logger.warning(f"Pattern extraction failed: {e}") - return {"error": str(e)} - - def _extract_keyword_patterns(self, results: List[RetrievalResult]) -> Dict[str, Any]: - """Extract keyword usage patterns from results.""" - keyword_freq = {} - keyword_context = {} - - for result in results: - # Extract keywords from the result text - keywords = self._extract_keywords(result.excerpt) - - for keyword in keywords: - # Track frequency - keyword_freq[keyword] = keyword_freq.get(keyword, 0) + 1 - - # Track context where keywords appear - if keyword not in keyword_context: - keyword_context[keyword] = [] - - keyword_context[keyword].append( - { - "conversation_id": result.conversation_id, - "timestamp": result.timestamp, - "relevance": result.relevance_score, - "context_snippet": result.excerpt[:100] + "..." - if len(result.excerpt) > 100 - else result.excerpt, - } - ) - - # Calculate keyword importance (frequency * relevance) - keyword_importance = {} - for keyword, freq in keyword_freq.items(): - contexts = keyword_context.get(keyword, []) - avg_relevance = sum(c["relevance"] for c in contexts) / len(contexts) if contexts else 0 - keyword_importance[keyword] = freq * avg_relevance - - return { - "frequency": keyword_freq, - "importance": keyword_importance, - "contexts": keyword_context, - } - - def _extract_topic_patterns(self, results: List[RetrievalResult]) -> Dict[str, Any]: - """Extract topic-based patterns from results.""" - topic_keywords = { - "technical": [ - "code", - "function", - "class", - "method", - "algorithm", - "debug", - "error", - "bug", - ], - "personal": ["feel", "think", "want", "need", "like", "dislike", "prefer"], - "planning": [ - "plan", - "schedule", - "deadline", - "goal", - "objective", - "strategy", - "roadmap", - ], - "learning": ["learn", "understand", "explain", "clarify", "example", "tutorial"], - "creative": ["create", "design", "imagine", "innovate", "invent", "artistic"], - "analytical": ["analyze", "compare", "evaluate", "assess", "measure", "metric"], - } - - topic_scores = {} - topic_results = {} - - for topic, keywords in topic_keywords.items(): - topic_score = 0 - matching_results = [] - - for result in results: - text_lower = result.excerpt.lower() - matches = sum(1 for keyword in keywords if keyword in text_lower) - - if matches > 0: - topic_score += matches * result.relevance_score - matching_results.append( - { - "result_id": result.id, - "matches": matches, - "relevance": result.relevance_score, - } - ) - - if topic_score > 0: - topic_scores[topic] = topic_score - topic_results[topic] = matching_results - - return { - "scores": topic_scores, - "results": topic_results, - "dominant_topic": max(topic_scores.items(), key=lambda x: x[1])[0] - if topic_scores - else None, - } - - def _extract_communication_patterns(self, results: List[RetrievalResult]) -> Dict[str, Any]: - """Extract communication style patterns from results.""" - communication_indicators = { - "questioning": ["?", "how", "what", "why", "when", "where", "can", "could", "would"], - "declarative": ["is", "are", "was", "were", "will", "be", "have", "has"], - "imperative": ["do", "make", "create", "implement", "fix", "solve", "try"], - "expressive": ["!", "feel", "think", "believe", "opinion", "view", "perspective"], - } - - style_scores = {} - style_examples = {} - - for style, indicators in communication_indicators.items(): - style_score = 0 - examples = [] - - for result in results: - text_lower = result.excerpt.lower() - matches = sum(1 for indicator in indicators if indicator in text_lower) - - if matches > 0: - style_score += matches * result.relevance_score - if len(examples) < 3: # Keep up to 3 examples - examples.append( - { - "text": result.excerpt[:200] + "..." - if len(result.excerpt) > 200 - else result.excerpt, - "relevance": result.relevance_score, - "matches": matches, - } - ) - - if style_score > 0: - style_scores[style] = style_score - style_examples[style] = examples - - return { - "scores": style_scores, - "examples": style_examples, - "dominant_style": max(style_scores.items(), key=lambda x: x[1])[0] - if style_scores - else None, - } - - def _extract_preference_patterns(self, results: List[RetrievalResult]) -> Dict[str, Any]: - """Extract user preference patterns from results.""" - preference_indicators = { - "prefers_detailed": ["explain", "detail", "elaborate", "more", "specific", "thorough"], - "prefers_concise": ["brief", "short", "concise", "summary", "quick", "simple"], - "prefers_examples": ["example", "illustrate", "demonstrate", "show", "instance"], - "prefers_technical": [ - "technical", - "implementation", - "code", - "algorithm", - "architecture", - ], - "prefers_conceptual": ["concept", "theory", "principle", "idea", "approach"], - } - - preference_scores = {} - - for preference, indicators in preference_indicators.items(): - pref_score = 0 - - for result in results: - text_lower = result.excerpt.lower() - matches = sum(1 for indicator in indicators if indicator in text_lower) - - if matches > 0: - pref_score += matches * result.relevance_score - - if pref_score > 0: - preference_scores[preference] = pref_score - - return { - "scores": preference_scores, - "strongest_preference": max(preference_scores.items(), key=lambda x: x[1])[0] - if preference_scores - else None, - } - - def _extract_temporal_patterns(self, results: List[RetrievalResult]) -> Dict[str, Any]: - """Extract temporal patterns from results.""" - if not results: - return {} - - # Sort results by timestamp - sorted_results = sorted(results, key=lambda x: x.timestamp) - - # Analyze temporal distribution - now = datetime.now() - time_buckets = { - "recent": 0, # Last 7 days - "moderate": 0, # 7-30 days - "older": 0, # 30-90 days - "historical": 0, # 90+ days - } - - for result in sorted_results: - days_old = (now - result.timestamp).days - - if days_old <= 7: - time_buckets["recent"] += 1 - elif days_old <= 30: - time_buckets["moderate"] += 1 - elif days_old <= 90: - time_buckets["older"] += 1 - else: - time_buckets["historical"] += 1 - - # Calculate activity patterns - activity_intensity = len(results) / max(1, (now - sorted_results[0].timestamp).days) - - return { - "time_distribution": time_buckets, - "activity_intensity": activity_intensity, - "time_span_days": (now - sorted_results[0].timestamp).days if sorted_results else 0, - "most_active_period": max(time_buckets.items(), key=lambda x: x[1])[0], - } - - def _extract_emotional_patterns(self, results: List[RetrievalResult]) -> Dict[str, Any]: - """Extract emotional tone patterns from results.""" - emotional_indicators = { - "positive": ["good", "great", "excellent", "love", "perfect", "amazing", "wonderful"], - "negative": ["bad", "terrible", "hate", "awful", "horrible", "frustrated", "annoyed"], - "neutral": ["okay", "fine", "normal", "standard", "regular", "typical"], - "curious": ["curious", "interested", "wonder", "question", "explore", "discover"], - "frustrated": ["stuck", "confused", "difficult", "hard", "challenging", "problem"], - } - - emotional_scores = {} - - for emotion, indicators in emotional_indicators.items(): - emotion_score = 0 - - for result in results: - text_lower = result.excerpt.lower() - matches = sum(1 for indicator in indicators if indicator in text_lower) - - if matches > 0: - emotion_score += matches * result.relevance_score - - if emotion_score > 0: - emotional_scores[emotion] = emotion_score - - return { - "scores": emotional_scores, - "dominant_emotion": max(emotional_scores.items(), key=lambda x: x[1])[0] - if emotional_scores - else None, - "emotional_diversity": len(emotional_scores), - } - - def _calculate_pattern_density(self, patterns: Dict[str, Any]) -> float: - """Calculate the density of patterns found.""" - total_patterns = 0 - max_possible_patterns = 0 - - for key, value in patterns.items(): - if isinstance(value, dict) and key != "statistics": - if key in ["keywords", "topics", "communication_style", "preferences"]: - total_patterns += len([v for v in value.values() if v]) - max_possible_patterns += len(value) - elif key in ["temporal", "emotional"]: - total_patterns += 1 if value else 0 - max_possible_patterns += 1 - - return total_patterns / max(max_possible_patterns, 1) - - def _calculate_pattern_confidence(self, patterns: Dict[str, Any]) -> float: - """Calculate confidence level in extracted patterns.""" - confidence_factors = [] - - # Keyword diversity - keywords = patterns.get("keywords", {}).get("frequency", {}) - if len(keywords) > 5: - confidence_factors.append(0.8) - elif len(keywords) > 2: - confidence_factors.append(0.6) - else: - confidence_factors.append(0.3) - - # Topic clarity - topics = patterns.get("topics", {}).get("scores", {}) - if topics: - max_score = max(topics.values()) - total_score = sum(topics.values()) - if max_score / total_score > 0.5: - confidence_factors.append(0.7) - else: - confidence_factors.append(0.5) - - # Communication style consistency - styles = patterns.get("communication_style", {}).get("scores", {}) - if styles: - confidence_factors.append(0.6) - - # Overall pattern density - density = self._calculate_pattern_density(patterns) - confidence_factors.append(density) - - return sum(confidence_factors) / len(confidence_factors) if confidence_factors else 0.0 - - def _get_active_facets(self, query: SearchQuery) -> List[str]: - """Get list of active search facets.""" - facets = [] - if query.include_semantic: - facets.append("semantic") - if query.include_keywords: - facets.append("keywords") - if query.include_recency: - facets.append("recency") - if query.include_patterns: - facets.append("patterns") - return facets - - def get_context_for_query(self, query_text: str, **kwargs) -> MemoryContext: - """ - Convenience method to get context for a simple text query. - - Args: - query_text: Text to search for - **kwargs: Additional search parameters - - Returns: - MemoryContext with search results - """ - # Create SearchQuery from text - query = SearchQuery( - text=query_text, - max_results=kwargs.get("max_results", self.memory_config.max_results), - max_tokens=kwargs.get("max_tokens", 2000), - include_semantic=kwargs.get("include_semantic", True), - include_keywords=kwargs.get("include_keywords", True), - include_recency=kwargs.get("include_recency", True), - include_patterns=kwargs.get("include_patterns", True), - ) - - return self.retrieve_context(query) - - def close(self) -> None: - """Close context retriever and cleanup resources.""" - if self.storage: - self.storage.close() - self.storage = None - logger.info("ContextRetriever closed") - - def __enter__(self): - """Context manager entry.""" - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - """Context manager exit.""" - self.close() diff --git a/src/mai/memory/storage.py b/src/mai/memory/storage.py deleted file mode 100644 index 316cd5f..0000000 --- a/src/mai/memory/storage.py +++ /dev/null @@ -1,822 +0,0 @@ -""" -Memory Storage Implementation for Mai - -Provides SQLite-based persistent storage with vector similarity search -for conversation retention and semantic retrieval. -""" - -import os -import sqlite3 -import json -import logging -from typing import Dict, List, Any, Optional, Tuple -from datetime import datetime -from pathlib import Path - -# Import dependencies -try: - import sqlite_vec # type: ignore -except ImportError: - # Fallback if sqlite-vec not installed - sqlite_vec = None - -try: - from sentence_transformers import SentenceTransformer -except ImportError: - # Fallback if sentence-transformers not installed - SentenceTransformer = None - -# Import Mai components -try: - from src.mai.core.exceptions import ( - MaiError, - ContextError, - create_error_context, - ) - from src.mai.core.config import get_config -except ImportError: - # Define fallbacks if modules not available - class MaiError(Exception): - pass - - class ContextError(MaiError): - pass - - def create_error_context(component: str, operation: str, **data): - return {"component": component, "operation": operation, "data": data} - - def get_config(): - return None - - -logger = logging.getLogger(__name__) - - -class MemoryStorageError(ContextError): - """Memory storage specific errors.""" - - def __init__(self, message: str, operation: str = None, **kwargs): - context = create_error_context( - component="memory_storage", operation=operation or "storage_operation", **kwargs - ) - super().__init__(message, context=context) - self.operation = operation - - -class VectorSearchError(MemoryStorageError): - """Vector similarity search errors.""" - - def __init__(self, query: str, error_details: str = None): - message = f"Vector search failed for query: '{query}'" - if error_details: - message += f": {error_details}" - - super().__init__( - message=message, operation="vector_search", query=query, error_details=error_details - ) - - -class DatabaseConnectionError(MemoryStorageError): - """Database connection and operation errors.""" - - def __init__(self, db_path: str, error_details: str = None): - message = f"Database connection error: {db_path}" - if error_details: - message += f": {error_details}" - - super().__init__( - message=message, - operation="database_connection", - db_path=db_path, - error_details=error_details, - ) - - -class MemoryStorage: - """ - SQLite-based memory storage with vector similarity search. - - Handles persistent storage of conversations, messages, and embeddings - with semantic search capabilities using sqlite-vec extension. - """ - - def __init__(self, db_path: Optional[str] = None, embedding_model: str = "all-MiniLM-L6-v2"): - """ - Initialize memory storage with database and embedding model. - - Args: - db_path: Path to SQLite database file (default: ./data/mai_memory.db) - embedding_model: Name of sentence-transformers model to use - """ - # Set database path - if db_path is None: - # Default to ./data/mai_memory.db - db_path = os.path.join(os.getcwd(), "data", "mai_memory.db") - - self.db_path = Path(db_path) - self.embedding_model_name = embedding_model - - # Ensure database directory exists - self.db_path.parent.mkdir(parents=True, exist_ok=True) - - # Initialize components - self._db: Optional[sqlite3.Connection] = None - self._embedding_model: Optional[SentenceTransformer] = None - self._embedding_dim: Optional[int] = None - self._config = get_config() - - # Initialize embedding model first (needed for database schema) - self._initialize_embedding_model() - # Then initialize database - self._initialize_database() - - logger.info(f"MemoryStorage initialized with database: {self.db_path}") - - def _initialize_database(self) -> None: - """Initialize SQLite database with schema and vector extension.""" - try: - # Connect to database - self._db = sqlite3.connect(str(self.db_path)) - self._db.row_factory = sqlite3.Row # Enable dict-like row access - - # Enable foreign keys - self._db.execute("PRAGMA foreign_keys = ON") - - # Load sqlite-vec extension if available - if sqlite_vec is not None: - try: - self._db.enable_load_extension(True) - # Try to load the full path to vec0.so - vec_path = sqlite_vec.__file__.replace("__init__.py", "vec0.so") - self._db.load_extension(vec_path) - logger.info("sqlite-vec extension loaded successfully") - self._vector_enabled = True - except Exception as e: - logger.warning(f"Failed to load sqlite-vec extension: {e}") - # Try fallback with just extension name - try: - self._db.load_extension("vec0") - logger.info("sqlite-vec extension loaded successfully (fallback)") - self._vector_enabled = True - except Exception as e2: - logger.warning(f"Failed to load sqlite-vec extension (fallback): {e2}") - self._vector_enabled = False - else: - logger.warning("sqlite-vec not available - vector features disabled") - self._vector_enabled = False - - # Create tables - self._create_tables() - - # Verify schema - self._verify_schema() - - except Exception as e: - raise DatabaseConnectionError(db_path=str(self.db_path), error_details=str(e)) - - def _initialize_embedding_model(self) -> None: - """Initialize sentence-transformers embedding model.""" - try: - if SentenceTransformer is not None: - # Load embedding model (download if needed) - logger.info(f"Loading embedding model: {self.embedding_model_name}") - self._embedding_model = SentenceTransformer(self.embedding_model_name) - - # Test embedding generation - test_embedding = self._embedding_model.encode("test") - self._embedding_dim = len(test_embedding) - logger.info( - f"Embedding model loaded: {self.embedding_model_name} (dim: {self._embedding_dim})" - ) - else: - logger.warning("sentence-transformers not available - embeddings disabled") - self._embedding_model = None - self._embedding_dim = None - - except Exception as e: - logger.error(f"Failed to initialize embedding model: {e}") - self._embedding_model = None - self._embedding_dim = None - - def _create_tables(self) -> None: - """Create database schema for conversations, messages, and embeddings.""" - cursor = self._db.cursor() - - try: - # Conversations table - cursor.execute(""" - CREATE TABLE IF NOT EXISTS conversations ( - id TEXT PRIMARY KEY, - title TEXT NOT NULL, - created_at TEXT NOT NULL, - updated_at TEXT NOT NULL, - metadata TEXT DEFAULT '{}' - ) - """) - - # Messages table - cursor.execute(""" - CREATE TABLE IF NOT EXISTS messages ( - id TEXT PRIMARY KEY, - conversation_id TEXT NOT NULL, - role TEXT NOT NULL CHECK (role IN ('user', 'assistant', 'system')), - content TEXT NOT NULL, - timestamp TEXT NOT NULL, - token_count INTEGER DEFAULT 0, - FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE - ) - """) - - # Vector embeddings table (if sqlite-vec available) - if self._vector_enabled and self._embedding_dim: - cursor.execute(f""" - CREATE VIRTUAL TABLE IF NOT EXISTS message_embeddings - USING vec0( - embedding float[{self._embedding_dim}] - ) - """) - - # Regular table for embedding metadata - cursor.execute(""" - CREATE TABLE IF NOT EXISTS embedding_metadata ( - rowid INTEGER PRIMARY KEY, - message_id TEXT NOT NULL, - conversation_id TEXT NOT NULL, - created_at TEXT NOT NULL, - FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE, - FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE - ) - """) - - # Create indexes for performance - cursor.execute( - "CREATE INDEX IF NOT EXISTS idx_messages_conversation ON messages(conversation_id)" - ) - cursor.execute( - "CREATE INDEX IF NOT EXISTS idx_messages_timestamp ON messages(timestamp)" - ) - cursor.execute( - "CREATE INDEX IF NOT EXISTS idx_conversations_updated ON conversations(updated_at)" - ) - - # Commit schema changes - self._db.commit() - logger.info("Database schema created successfully") - - except Exception as e: - self._db.rollback() - raise MemoryStorageError( - message=f"Failed to create database schema: {e}", operation="create_schema" - ) - finally: - cursor.close() - - def _verify_schema(self) -> None: - """Verify that database schema is correct and up-to-date.""" - cursor = self._db.cursor() - - try: - # Check if required tables exist - cursor.execute(""" - SELECT name FROM sqlite_master - WHERE type='table' AND name IN ('conversations', 'messages') - """) - required_tables = [row[0] for row in cursor.fetchall()] - - if len(required_tables) != 2: - raise MemoryStorageError( - message="Required tables missing from database", operation="verify_schema" - ) - - # Check vector table if vector search is enabled - if self._vector_enabled: - cursor.execute(""" - SELECT name FROM sqlite_master - WHERE type='table' AND name='message_embeddings' - """) - vector_tables = [row[0] for row in cursor.fetchall()] - - if not vector_tables: - logger.warning("Vector table not found - vector search disabled") - self._vector_enabled = False - - logger.info("Database schema verification passed") - - except Exception as e: - raise MemoryStorageError( - message=f"Schema verification failed: {e}", operation="verify_schema" - ) - finally: - cursor.close() - - def store_conversation( - self, - conversation_id: str, - title: str, - messages: List[Dict[str, Any]], - metadata: Optional[Dict[str, Any]] = None, - ) -> bool: - """ - Store a complete conversation with all messages. - - Args: - conversation_id: Unique identifier for the conversation - title: Human-readable title for the conversation - messages: List of messages with 'role', 'content', and optional 'timestamp' - metadata: Additional metadata to store with conversation - - Returns: - True if stored successfully - - Raises: - MemoryStorageError: If storage operation fails - """ - if self._db is None: - raise DatabaseConnectionError(db_path=str(self.db_path)) - - cursor = self._db.cursor() - now = datetime.now().isoformat() - - try: - # Insert conversation - cursor.execute( - """ - INSERT OR REPLACE INTO conversations - (id, title, created_at, updated_at, metadata) - VALUES (?, ?, ?, ?, ?) - """, - [conversation_id, title, now, now, json.dumps(metadata or {})], - ) - - # Insert messages - for i, message in enumerate(messages): - message_id = f"{conversation_id}_{i}" - role = message.get("role", "user") - content = message.get("content", "") - timestamp = message.get("timestamp", now) - - # Basic validation - if role not in ["user", "assistant", "system"]: - role = "user" - - cursor.execute( - """ - INSERT OR REPLACE INTO messages - (id, conversation_id, role, content, timestamp) - VALUES (?, ?, ?, ?, ?) - """, - [message_id, conversation_id, role, content, timestamp], - ) - - # Generate and store embedding if available - if self._embedding_model and self._vector_enabled: - try: - embedding = self._embedding_model.encode(content) - - # Store embedding in vector table - cursor.execute( - """ - INSERT INTO message_embeddings (rowid, embedding) - VALUES (?, ?) - """, - [len(content), embedding.tolist()], - ) - - # Store embedding metadata - vector_rowid = cursor.lastrowid - cursor.execute( - """ - INSERT INTO embedding_metadata - (rowid, message_id, conversation_id, created_at) - VALUES (?, ?, ?, ?) - """, - [vector_rowid, message_id, conversation_id, now], - ) - - except Exception as e: - logger.warning( - f"Failed to generate embedding for message {message_id}: {e}" - ) - # Continue without embedding - don't fail the whole operation - - self._db.commit() - logger.info(f"Stored conversation '{conversation_id}' with {len(messages)} messages") - return True - - except Exception as e: - self._db.rollback() - raise MemoryStorageError( - message=f"Failed to store conversation: {e}", - operation="store_conversation", - conversation_id=conversation_id, - ) - finally: - cursor.close() - - def retrieve_conversation(self, conversation_id: str) -> Optional[Dict[str, Any]]: - """ - Retrieve a complete conversation by ID. - - Args: - conversation_id: ID of conversation to retrieve - - Returns: - Dictionary with conversation data or None if not found - - Raises: - MemoryStorageError: If retrieval operation fails - """ - if self._db is None: - raise DatabaseConnectionError(db_path=str(self.db_path)) - - cursor = self._db.cursor() - - try: - # Get conversation info - cursor.execute( - """ - SELECT id, title, created_at, updated_at, metadata - FROM conversations - WHERE id = ? - """, - [conversation_id], - ) - - conversation_row = cursor.fetchone() - if not conversation_row: - return None - - # Get messages - cursor.execute( - """ - SELECT id, role, content, timestamp, token_count - FROM messages - WHERE conversation_id = ? - ORDER BY timestamp - """, - [conversation_id], - ) - - message_rows = cursor.fetchall() - - # Build result - conversation = { - "id": conversation_row["id"], - "title": conversation_row["title"], - "created_at": conversation_row["created_at"], - "updated_at": conversation_row["updated_at"], - "metadata": json.loads(conversation_row["metadata"]), - "messages": [ - { - "id": msg["id"], - "role": msg["role"], - "content": msg["content"], - "timestamp": msg["timestamp"], - "token_count": msg["token_count"], - } - for msg in message_rows - ], - } - - logger.debug( - f"Retrieved conversation '{conversation_id}' with {len(message_rows)} messages" - ) - return conversation - - except Exception as e: - raise MemoryStorageError( - message=f"Failed to retrieve conversation: {e}", - operation="retrieve_conversation", - conversation_id=conversation_id, - ) - finally: - cursor.close() - - def search_conversations( - self, query: str, limit: int = 5, include_content: bool = False - ) -> List[Dict[str, Any]]: - """ - Search conversations using semantic similarity. - - Args: - query: Search query text - limit: Maximum number of results to return - include_content: Whether to include full message content in results - - Returns: - List of matching conversations with similarity scores - - Raises: - VectorSearchError: If search operation fails - """ - if not self._vector_enabled or self._embedding_model is None: - logger.warning("Vector search not available - falling back to text search") - return self._text_search_fallback(query, limit, include_content) - - if self._db is None: - raise DatabaseConnectionError(db_path=str(self.db_path)) - - cursor = self._db.cursor() - - try: - # For now, use text search as vector search needs sqlite-vec syntax fixes - logger.info("Using text search fallback temporarily") - return self._text_search_fallback(query, limit, include_content) - - # TODO: Fix sqlite-vec query syntax for proper vector search - # Generate query embedding - # query_embedding = self._embedding_model.encode(query) - # - # # Perform vector similarity search using sqlite-vec syntax - # cursor.execute( - # """ - # SELECT - # em.conversation_id, - # em.message_id, - # em.created_at, - # m.role, - # m.content, - # c.title, - # vec_distance_l2(e.embedding, ?) as distance - # FROM message_embeddings e - # JOIN embedding_metadata em ON e.rowid = em.rowid - # JOIN messages m ON em.message_id = m.id - # JOIN conversations c ON em.conversation_id = c.id - # WHERE e.embedding MATCH ? - # ORDER BY distance - # LIMIT ? - # """, - # [query_embedding.tolist(), query_embedding.tolist(), limit], - # ) - - results = [] - seen_conversations = set() - - for row in cursor.fetchall(): - conv_id = row["conversation_id"] - if conv_id not in seen_conversations: - conversation = { - "conversation_id": conv_id, - "title": row["title"], - "similarity_score": 1.0 - row["distance"], # Convert distance to similarity - "matched_message": { - "role": row["role"], - "content": row["content"] - if include_content - else row["content"][:200] + "..." - if len(row["content"]) > 200 - else row["content"], - "timestamp": row["created_at"], - }, - } - results.append(conversation) - seen_conversations.add(conv_id) - - logger.debug(f"Vector search found {len(results)} conversations for query: '{query}'") - return results - - except Exception as e: - raise VectorSearchError(query=query, error_details=str(e)) - finally: - cursor.close() - - def _text_search_fallback( - self, query: str, limit: int, include_content: bool = False - ) -> List[Dict[str, Any]]: - """ - Fallback text search when vector search is unavailable. - - Args: - query: Search query text - limit: Maximum number of results - include_content: Whether to include full message content - - Returns: - List of matching conversations - """ - cursor = self._db.cursor() - - try: - # Simple text search in message content - cursor.execute( - """ - SELECT DISTINCT - c.id as conversation_id, - c.title, - m.role, - m.content, - m.timestamp - FROM conversations c - JOIN messages m ON c.id = m.conversation_id - WHERE m.content LIKE ? - ORDER BY m.timestamp DESC - LIMIT ? - """, - [f"%{query}%", limit], - ) - - results = [] - seen_conversations = set() - - for row in cursor.fetchall(): - conv_id = row["conversation_id"] - if conv_id not in seen_conversations: - conversation = { - "conversation_id": conv_id, - "title": row["title"], - "similarity_score": 0.5, # Default score for text search - "matched_message": { - "role": row["role"], - "content": row["content"] - if include_content - else row["content"][:200] + "..." - if len(row["content"]) > 200 - else row["content"], - "timestamp": row["timestamp"], - }, - } - results.append(conversation) - seen_conversations.add(conv_id) - - logger.debug( - f"Text search fallback found {len(results)} conversations for query: '{query}'" - ) - return results - - except Exception as e: - logger.error(f"Text search fallback failed: {e}") - return [] - finally: - cursor.close() - - def get_conversation_list(self, limit: int = 50, offset: int = 0) -> List[Dict[str, Any]]: - """ - Get a list of all conversations with basic info. - - Args: - limit: Maximum number of conversations to return - offset: Number of conversations to skip - - Returns: - List of conversation summaries - - Raises: - MemoryStorageError: If operation fails - """ - if self._db is None: - raise DatabaseConnectionError(db_path=str(self.db_path)) - - cursor = self._db.cursor() - - try: - cursor.execute( - """ - SELECT - c.id, - c.title, - c.created_at, - c.updated_at, - c.metadata, - COUNT(m.id) as message_count - FROM conversations c - LEFT JOIN messages m ON c.id = m.conversation_id - GROUP BY c.id - ORDER BY c.updated_at DESC - LIMIT ? OFFSET ? - """, - [limit, offset], - ) - - conversations = [] - for row in cursor.fetchall(): - conversation = { - "id": row["id"], - "title": row["title"], - "created_at": row["created_at"], - "updated_at": row["updated_at"], - "metadata": json.loads(row["metadata"]), - "message_count": row["message_count"], - } - conversations.append(conversation) - - return conversations - - except Exception as e: - raise MemoryStorageError( - message=f"Failed to get conversation list: {e}", operation="get_conversation_list" - ) - finally: - cursor.close() - - def delete_conversation(self, conversation_id: str) -> bool: - """ - Delete a conversation and all its messages. - - Args: - conversation_id: ID of conversation to delete - - Returns: - True if deleted successfully - - Raises: - MemoryStorageError: If deletion fails - """ - if self._db is None: - raise DatabaseConnectionError(db_path=str(self.db_path)) - - cursor = self._db.cursor() - - try: - # Delete conversation (cascade will delete messages and embeddings) - cursor.execute( - """ - DELETE FROM conversations WHERE id = ? - """, - [conversation_id], - ) - - self._db.commit() - deleted_count = cursor.rowcount - - if deleted_count > 0: - logger.info(f"Deleted conversation '{conversation_id}'") - return True - else: - logger.warning(f"Conversation '{conversation_id}' not found for deletion") - return False - - except Exception as e: - self._db.rollback() - raise MemoryStorageError( - message=f"Failed to delete conversation: {e}", - operation="delete_conversation", - conversation_id=conversation_id, - ) - finally: - cursor.close() - - def get_storage_stats(self) -> Dict[str, Any]: - """ - Get storage statistics and health information. - - Returns: - Dictionary with storage statistics - - Raises: - MemoryStorageError: If operation fails - """ - if self._db is None: - raise DatabaseConnectionError(db_path=str(self.db_path)) - - cursor = self._db.cursor() - - try: - stats = {} - - # Count conversations - cursor.execute("SELECT COUNT(*) as count FROM conversations") - stats["conversation_count"] = cursor.fetchone()["count"] - - # Count messages - cursor.execute("SELECT COUNT(*) as count FROM messages") - stats["message_count"] = cursor.fetchone()["count"] - - # Database file size - if self.db_path.exists(): - stats["database_size_bytes"] = self.db_path.stat().st_size - stats["database_size_mb"] = stats["database_size_bytes"] / (1024 * 1024) - else: - stats["database_size_bytes"] = 0 - stats["database_size_mb"] = 0 - - # Vector search capability - stats["vector_search_enabled"] = self._vector_enabled - stats["embedding_model"] = self.embedding_model_name - stats["embedding_dim"] = self._embedding_dim - - # Database path - stats["database_path"] = str(self.db_path) - - return stats - - except Exception as e: - raise MemoryStorageError( - message=f"Failed to get storage stats: {e}", operation="get_storage_stats" - ) - finally: - cursor.close() - - def close(self) -> None: - """Close database connection and cleanup resources.""" - if self._db: - self._db.close() - self._db = None - logger.info("MemoryStorage database connection closed") - - def __enter__(self): - """Context manager entry.""" - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - """Context manager exit.""" - self.close() diff --git a/src/mai/model/__init__.py b/src/mai/model/__init__.py deleted file mode 100644 index d80bd71..0000000 --- a/src/mai/model/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -""" -Mai Model Interface Module - -This module provides the core interface for interacting with various AI models, -with a focus on local Ollama models. It handles model discovery, capability -detection, and provides a unified interface for model switching and inference. - -The model interface is designed to be extensible, allowing future support -for additional model providers while maintaining a consistent API. -""" - -from .ollama_client import OllamaClient - -__all__ = ["OllamaClient"] diff --git a/src/mai/model/compression.py b/src/mai/model/compression.py deleted file mode 100644 index 7f58420..0000000 --- a/src/mai/model/compression.py +++ /dev/null @@ -1,522 +0,0 @@ -""" -Context compression and token management for Mai. - -Handles conversation context within model token limits while preserving -important information and conversation quality. -""" - -import re -from typing import Dict, List, Tuple, Any, Optional -from dataclasses import dataclass -from collections import deque -import hashlib -import json -import time - - -@dataclass -class TokenInfo: - """Token counting information.""" - - count: int - model_name: str - accuracy: float = 0.95 # Confidence in token count accuracy - - -@dataclass -class CompressionResult: - """Result of context compression.""" - - compressed_conversation: List[Dict[str, Any]] - original_tokens: int - compressed_tokens: int - compression_ratio: float - quality_score: float - preserved_elements: List[str] - - -@dataclass -class BudgetEnforcement: - """Token budget enforcement result.""" - - action: str # 'proceed', 'compress', 'reject' - token_count: int - budget_limit: int - urgency: float # 0.0 to 1.0 - message: str - - -class ContextCompressor: - """ - Handles context compression and token management for conversations. - - Features: - - Token counting with model-specific accuracy - - Intelligent compression preserving key information - - Budget enforcement to prevent exceeding context windows - - Quality metrics and validation - """ - - def __init__(self): - """Initialize the context compressor.""" - self.tiktoken_available = self._check_tiktoken() - if self.tiktoken_available: - import tiktoken - - self.encoders = { - "gpt-3.5-turbo": tiktoken.encoding_for_model("gpt-3.5-turbo"), - "gpt-4": tiktoken.encoding_for_model("gpt-4"), - "gpt-4-turbo": tiktoken.encoding_for_model("gpt-4-turbo"), - "text-davinci-003": tiktoken.encoding_for_model("text-davinci-003"), - } - else: - self.encoders = {} - print("Warning: tiktoken not available, using approximate token counting") - - # Compression thresholds - self.warning_threshold = 0.75 # Warn at 75% of context window - self.critical_threshold = 0.90 # Critical at 90% of context window - self.budget_ratio = 0.9 # Budget at 90% of context window - - # Compression cache - self.compression_cache = {} - self.cache_ttl = 3600 # 1 hour - self.performance_cache = deque(maxlen=100) - - # Quality metrics - self.min_quality_score = 0.7 - self.preservation_patterns = [ - r"\b(install|configure|set up|create|build|implement)\b", - r"\b(error|bug|issue|problem|fix)\b", - r"\b(decision|choice|prefer|selected)\b", - r"\b(important|critical|essential|must)\b", - r"\b(key|main|primary|core)\b", - ] - - def _check_tiktoken(self) -> bool: - """Check if tiktoken is available.""" - try: - import tiktoken - - return True - except ImportError: - return False - - def count_tokens(self, text: str, model_name: str = "gpt-3.5-turbo") -> TokenInfo: - """ - Count tokens in text with model-specific accuracy. - - Args: - text: Text to count tokens for - model_name: Model name for tokenization - - Returns: - TokenInfo with count and accuracy - """ - if not text: - return TokenInfo(0, model_name, 1.0) - - if self.tiktoken_available and model_name in self.encoders: - encoder = self.encoders[model_name] - try: - tokens = encoder.encode(text) - return TokenInfo(len(tokens), model_name, 0.99) - except Exception as e: - print(f"Tiktoken error: {e}, falling back to approximation") - - # Fallback: approximate token counting - # Rough approximation: ~4 characters per token for English - # Slightly better approach using word and punctuation patterns - words = re.findall(r"\w+|[^\w\s]", text) - # Adjust for model families - model_multipliers = { - "gpt-3.5": 1.0, - "gpt-4": 0.9, # More efficient tokenization - "claude": 1.1, # Less efficient - "llama": 1.2, # Even less efficient - } - - # Determine model family - model_family = "gpt-3.5" - for family in model_multipliers: - if family in model_name.lower(): - model_family = family - break - - multiplier = model_multipliers.get(model_family, 1.0) - token_count = int(len(words) * 1.3 * multiplier) # 1.3 is base conversion - - return TokenInfo(token_count, model_name, 0.85) # Lower accuracy for approximation - - def should_compress( - self, conversation: List[Dict[str, Any]], model_context_window: int - ) -> Tuple[bool, float, str]: - """ - Determine if conversation should be compressed. - - Args: - conversation: List of message dictionaries - model_context_window: Model's context window size - - Returns: - Tuple of (should_compress, urgency, message) - """ - total_tokens = sum(self.count_tokens(msg.get("content", "")).count for msg in conversation) - - usage_ratio = total_tokens / model_context_window - - if usage_ratio >= self.critical_threshold: - return True, 1.0, f"Critical: {usage_ratio:.1%} of context window used" - elif usage_ratio >= self.warning_threshold: - return True, 0.7, f"Warning: {usage_ratio:.1%} of context window used" - elif len(conversation) > 50: # Conversation length consideration - return True, 0.5, "Long conversation: consider compression for performance" - else: - return False, 0.0, "Context within acceptable limits" - - def preserve_key_elements(self, conversation: List[Dict[str, Any]]) -> List[str]: - """ - Extract and preserve critical information from conversation. - - Args: - conversation: List of message dictionaries - - Returns: - List of critical elements to preserve - """ - key_elements = [] - - for msg in conversation: - content = msg.get("content", "") - role = msg.get("role", "") - - # Look for important patterns - for pattern in self.preservation_patterns: - matches = re.findall(pattern, content, re.IGNORECASE) - if matches: - # Extract surrounding context - for match in matches: - # Find the sentence containing the match - sentences = re.split(r"[.!?]+", content) - for sentence in sentences: - if match.lower() in sentence.lower(): - key_elements.append(f"{role}: {sentence.strip()}") - break - - # Also preserve system messages and instructions - for msg in conversation: - if msg.get("role") in ["system", "instruction"]: - key_elements.append(f"system: {msg.get('content', '')}") - - return key_elements - - def compress_conversation( - self, conversation: List[Dict[str, Any]], target_token_ratio: float = 0.5 - ) -> CompressionResult: - """ - Compress conversation while preserving key information. - - Args: - conversation: List of message dictionaries - target_token_ratio: Target ratio of original tokens to keep - - Returns: - CompressionResult with compressed conversation and metrics - """ - if not conversation: - return CompressionResult([], 0, 0, 1.0, 1.0, []) - - # Calculate current token usage - original_tokens = sum( - self.count_tokens(msg.get("content", "")).count for msg in conversation - ) - - target_tokens = int(original_tokens * target_token_ratio) - - # Check cache - cache_key = self._get_cache_key(conversation, target_token_ratio) - if cache_key in self.compression_cache: - cached_result = self.compression_cache[cache_key] - if time.time() - cached_result["timestamp"] < self.cache_ttl: - return CompressionResult(**cached_result["result"]) - - # Preserve key elements - key_elements = self.preserve_key_elements(conversation) - - # Split conversation: keep recent messages, compress older ones - split_point = max(0, len(conversation) // 2) # Keep second half - recent_messages = conversation[split_point:] - older_messages = conversation[:split_point] - - compressed_messages = [] - - # Summarize older messages - if older_messages: - summary = self._create_summary(older_messages, target_tokens // 2) - compressed_messages.append( - { - "role": "system", - "content": f"[Compressed context: {summary}]", - "metadata": { - "compressed": True, - "original_count": len(older_messages), - "summary_token_count": self.count_tokens(summary).count, - }, - } - ) - - # Add recent messages - compressed_messages.extend(recent_messages) - - # Add key elements if they might be lost - if key_elements: - key_content = "\n\nKey information to remember:\n" + "\n".join(key_elements[:5]) - compressed_messages.append( - { - "role": "system", - "content": key_content, - "metadata": {"type": "key_elements", "preserved_count": len(key_elements)}, - } - ) - - # Calculate metrics - compressed_tokens = sum( - self.count_tokens(msg.get("content", "")).count for msg in compressed_messages - ) - - compression_ratio = compressed_tokens / original_tokens if original_tokens > 0 else 1.0 - quality_score = self._calculate_quality_score( - conversation, compressed_messages, key_elements - ) - - result = CompressionResult( - compressed_conversation=compressed_messages, - original_tokens=original_tokens, - compressed_tokens=compressed_tokens, - compression_ratio=compression_ratio, - quality_score=quality_score, - preserved_elements=key_elements, - ) - - # Cache result - self.compression_cache[cache_key] = {"result": result.__dict__, "timestamp": time.time()} - - return result - - def _create_summary(self, messages: List[Dict[str, Any]], target_tokens: int) -> str: - """ - Create a summary of older messages. - - Args: - messages: List of message dictionaries - target_tokens: Target token count for summary - - Returns: - Summary string - """ - # Extract key points from messages - key_points = [] - - for msg in messages: - content = msg.get("content", "") - role = msg.get("role", "") - - # Extract first sentence or important parts - sentences = re.split(r"[.!?]+", content) - if sentences: - first_sentence = sentences[0].strip() - if len(first_sentence) > 10: # Skip very short fragments - key_points.append(f"{role}: {first_sentence}") - - # Join and truncate to target length - summary = " | ".join(key_points) - - # Truncate if too long - while len(summary) > target_tokens * 4 and key_points: # Rough character estimate - key_points.pop() - summary = " | ".join(key_points) - - return summary if summary else "Previous conversation context" - - def _calculate_quality_score( - self, - original: List[Dict[str, Any]], - compressed: List[Dict[str, Any]], - preserved_elements: List[str], - ) -> float: - """ - Calculate quality score for compression. - - Args: - original: Original conversation - compressed: Compressed conversation - preserved_elements: Elements preserved - - Returns: - Quality score between 0.0 and 1.0 - """ - # Base score from token preservation - original_tokens = sum(self.count_tokens(msg.get("content", "")).count for msg in original) - compressed_tokens = sum( - self.count_tokens(msg.get("content", "")).count for msg in compressed - ) - - preservation_score = min(1.0, compressed_tokens / original_tokens) - - # Bonus for preserved elements - element_bonus = min(0.2, len(preserved_elements) * 0.02) - - # Penalty for too aggressive compression - if compressed_tokens < original_tokens * 0.3: - preservation_score *= 0.8 - - quality_score = min(1.0, preservation_score + element_bonus) - - return quality_score - - def enforce_token_budget( - self, - conversation: List[Dict[str, Any]], - model_context_window: int, - budget_ratio: Optional[float] = None, - ) -> BudgetEnforcement: - """ - Enforce token budget before model call. - - Args: - conversation: List of message dictionaries - model_context_window: Model's context window size - budget_ratio: Budget ratio (default from config) - - Returns: - BudgetEnforcement with action and details - """ - if budget_ratio is None: - budget_ratio = self.budget_ratio - - budget_limit = int(model_context_window * budget_ratio) - current_tokens = sum( - self.count_tokens(msg.get("content", "")).count for msg in conversation - ) - - usage_ratio = current_tokens / model_context_window - - if current_tokens > budget_limit: - if usage_ratio >= 0.95: - return BudgetEnforcement( - action="reject", - token_count=current_tokens, - budget_limit=budget_limit, - urgency=1.0, - message=f"Conversation too long: {current_tokens} tokens exceeds budget of {budget_limit}", - ) - else: - return BudgetEnforcement( - action="compress", - token_count=current_tokens, - budget_limit=budget_limit, - urgency=min(1.0, usage_ratio), - message=f"Compression needed: {current_tokens} tokens exceeds budget of {budget_limit}", - ) - else: - urgency = max(0.0, usage_ratio - 0.7) / 0.2 # Normalize between 0.7-0.9 - return BudgetEnforcement( - action="proceed", - token_count=current_tokens, - budget_limit=budget_limit, - urgency=urgency, - message=f"Within budget: {current_tokens} tokens of {budget_limit}", - ) - - def validate_compression( - self, original: List[Dict[str, Any]], compressed: List[Dict[str, Any]] - ) -> Dict[str, Any]: - """ - Validate compression quality and information preservation. - - Args: - original: Original conversation - compressed: Compressed conversation - - Returns: - Dictionary with validation metrics - """ - # Token-based metrics - original_tokens = sum(self.count_tokens(msg.get("content", "")).count for msg in original) - compressed_tokens = sum( - self.count_tokens(msg.get("content", "")).count for msg in compressed - ) - - # Semantic similarity (simplified) - original_text = " ".join(msg.get("content", "") for msg in original).lower() - compressed_text = " ".join(msg.get("content", "") for msg in compressed).lower() - - # Word overlap as simple similarity metric - original_words = set(re.findall(r"\w+", original_text)) - compressed_words = set(re.findall(r"\w+", compressed_text)) - - if original_words: - similarity = len(original_words & compressed_words) / len(original_words) - else: - similarity = 1.0 - - # Key information preservation - original_key = self.preserve_key_elements(original) - compressed_key = self.preserve_key_elements(compressed) - - key_preservation = len(compressed_key) / max(1, len(original_key)) - - return { - "token_preservation": compressed_tokens / max(1, original_tokens), - "semantic_similarity": similarity, - "key_information_preservation": key_preservation, - "overall_quality": (similarity + key_preservation) / 2, - "recommendations": self._get_validation_recommendations( - similarity, key_preservation, compressed_tokens / max(1, original_tokens) - ), - } - - def _get_validation_recommendations( - self, similarity: float, key_preservation: float, token_ratio: float - ) -> List[str]: - """Get recommendations based on validation metrics.""" - recommendations = [] - - if similarity < 0.7: - recommendations.append("Low semantic similarity - consider preserving more context") - - if key_preservation < 0.8: - recommendations.append( - "Key information not well preserved - adjust preservation patterns" - ) - - if token_ratio > 0.8: - recommendations.append("Compression too conservative - can reduce more") - elif token_ratio < 0.3: - recommendations.append("Compression too aggressive - losing too much content") - - if not recommendations: - recommendations.append("Compression quality is acceptable") - - return recommendations - - def _get_cache_key(self, conversation: List[Dict[str, Any]], target_ratio: float) -> str: - """Generate cache key for compression result.""" - # Create hash of conversation and target ratio - content = json.dumps([msg.get("content", "") for msg in conversation], sort_keys=True) - content_hash = hashlib.md5(content.encode()).hexdigest() - return f"{content_hash}_{target_ratio}" - - def get_performance_stats(self) -> Dict[str, Any]: - """Get performance statistics for the compressor.""" - return { - "cache_size": len(self.compression_cache), - "cache_hit_ratio": len(self.performance_cache) / max(1, len(self.compression_cache)), - "tiktoken_available": self.tiktoken_available, - "supported_models": list(self.encoders.keys()) if self.tiktoken_available else [], - "compression_thresholds": { - "warning": self.warning_threshold, - "critical": self.critical_threshold, - "budget": self.budget_ratio, - }, - } diff --git a/src/mai/model/ollama_client.py b/src/mai/model/ollama_client.py deleted file mode 100644 index 085ddb8..0000000 --- a/src/mai/model/ollama_client.py +++ /dev/null @@ -1,316 +0,0 @@ -""" -Ollama Client Wrapper - -Provides a robust wrapper around the Ollama Python client with model discovery, -capability detection, caching, and error handling. -""" - -import logging -import time -from typing import Dict, List, Optional, Any -from datetime import datetime, timedelta - -import ollama -from src.mai.core import ModelError, ConfigurationError - - -logger = logging.getLogger(__name__) - - -class OllamaClient: - """ - Robust wrapper for Ollama API with model discovery and caching. - - This client handles connection management, model discovery, capability - detection, and graceful error handling for Ollama operations. - """ - - def __init__(self, host: str = "http://localhost:11434", timeout: int = 30): - """ - Initialize Ollama client with connection settings. - - Args: - host: Ollama server URL - timeout: Connection timeout in seconds - """ - self.host = host - self.timeout = timeout - self._client = None - self._model_cache: Dict[str, Dict[str, Any]] = {} - self._cache_timestamp: Optional[datetime] = None - self._cache_duration = timedelta(minutes=30) - - # Initialize client (may fail if Ollama not running) - self._initialize_client() - - def _initialize_client(self) -> None: - """Initialize Ollama client with error handling.""" - try: - self._client = ollama.Client(host=self.host, timeout=self.timeout) - logger.info(f"Ollama client initialized for {self.host}") - except Exception as e: - logger.warning(f"Failed to initialize Ollama client: {e}") - self._client = None - - def _check_client(self) -> None: - """Check if client is initialized, attempt reconnection if needed.""" - if self._client is None: - logger.info("Attempting to reconnect to Ollama...") - self._initialize_client() - if self._client is None: - raise ModelError("Cannot connect to Ollama. Is it running?") - - def list_models(self) -> List[Dict[str, Any]]: - """ - List all available models with basic metadata. - - Returns: - List of models with name and basic info - """ - try: - self._check_client() - if self._client is None: - logger.warning("Ollama client not available") - return [] - - # Get raw model list from Ollama - response = self._client.list() - models = response.get("models", []) - - # Extract relevant information - model_list = [] - for model in models: - # Handle both dict and object responses from ollama - if isinstance(model, dict): - model_name = model.get("name", "") - model_size = model.get("size", 0) - model_digest = model.get("digest", "") - model_modified = model.get("modified_at", "") - else: - # Ollama returns model objects with 'model' attribute - model_name = getattr(model, "model", "") - model_size = getattr(model, "size", 0) - model_digest = getattr(model, "digest", "") - model_modified = getattr(model, "modified_at", "") - - model_info = { - "name": model_name, - "size": model_size, - "digest": model_digest, - "modified_at": model_modified, - } - model_list.append(model_info) - - logger.info(f"Found {len(model_list)} models") - return model_list - - except ConnectionError as e: - logger.error(f"Connection error listing models: {e}") - return [] - except Exception as e: - logger.error(f"Error listing models: {e}") - return [] - - def get_model_info(self, model_name: str) -> Dict[str, Any]: - """ - Get detailed information about a specific model. - - Args: - model_name: Name of the model - - Returns: - Dictionary with model details - """ - # Check cache first - if model_name in self._model_cache: - cache_entry = self._model_cache[model_name] - if ( - self._cache_timestamp - and datetime.now() - self._cache_timestamp < self._cache_duration - ): - logger.debug(f"Returning cached info for {model_name}") - return cache_entry - - try: - self._check_client() - if self._client is None: - raise ModelError("Cannot connect to Ollama") - - # Get model details from Ollama - response = self._client.show(model_name) - - # Extract key information - model_info = { - "name": model_name, - "parameter_size": response.get("details", {}).get("parameter_size", ""), - "context_window": response.get("details", {}).get("context_length", 0), - "model_family": response.get("details", {}).get("families", []), - "model_format": response.get("details", {}).get("format", ""), - "quantization": response.get("details", {}).get("quantization_level", ""), - "size": response.get("details", {}).get("size", 0), - "modelfile": response.get("modelfile", ""), - "template": response.get("template", ""), - "parameters": response.get("parameters", {}), - } - - # Cache the result - self._model_cache[model_name] = model_info - self._cache_timestamp = datetime.now() - - logger.debug(f"Retrieved info for {model_name}: {model_info['parameter_size']} params") - return model_info - - except Exception as e: - error_msg = f"Error getting model info for {model_name}: {e}" - logger.error(error_msg) - raise ModelError(error_msg) - - def is_model_available(self, model_name: str) -> bool: - """ - Check if a model is available and can be queried. - - Args: - model_name: Name of the model to check - - Returns: - True if model exists and is accessible - """ - try: - # First check if model exists in list - models = self.list_models() - model_names = [m["name"] for m in models] - - if model_name not in model_names: - logger.debug(f"Model {model_name} not found in available models") - return False - - # Try to get model info to verify accessibility - self.get_model_info(model_name) - return True - - except (ModelError, Exception) as e: - logger.debug(f"Model {model_name} not accessible: {e}") - return False - - def refresh_models(self) -> None: - """ - Force refresh of model list and clear cache. - - This method clears all cached information and forces a fresh - query to Ollama for all operations. - """ - logger.info("Refreshing model information...") - - # Clear cache - self._model_cache.clear() - self._cache_timestamp = None - - # Reinitialize client if needed - if self._client is None: - self._initialize_client() - - logger.info("Model cache cleared") - - def get_connection_status(self) -> Dict[str, Any]: - """ - Get current connection status and diagnostics. - - Returns: - Dictionary with connection status information - """ - status = { - "connected": False, - "host": self.host, - "timeout": self.timeout, - "models_count": 0, - "cache_size": len(self._model_cache), - "cache_valid": False, - "error": None, - } - - try: - if self._client is None: - status["error"] = "Client not initialized" - return status - - # Try to list models to verify connection - models = self.list_models() - status["connected"] = True - status["models_count"] = len(models) - - # Check cache validity - if self._cache_timestamp: - age = datetime.now() - self._cache_timestamp - status["cache_valid"] = age < self._cache_duration - status["cache_age_minutes"] = age.total_seconds() / 60 - - except Exception as e: - status["error"] = str(e) - logger.debug(f"Connection status check failed: {e}") - - return status - - def generate_response( - self, prompt: str, model: str, context: Optional[List[Dict[str, Any]]] = None - ) -> str: - """ - Generate a response from the specified model. - - Args: - prompt: User prompt/message - model: Model name to use - context: Optional conversation context - - Returns: - Generated response text - - Raises: - ModelError: If generation fails - """ - try: - self._check_client() - if self._client is None: - raise ModelError("Cannot connect to Ollama") - - if not model: - raise ModelError("No model specified") - - # Build the full prompt with context if provided - if context: - messages = context + [{"role": "user", "content": prompt}] - else: - messages = [{"role": "user", "content": prompt}] - - # Generate response using Ollama - response = self._client.chat(model=model, messages=messages, stream=False) - - # Extract the response text - result = response.get("message", {}).get("content", "") - if not result: - logger.warning(f"Empty response from {model}") - return "I apologize, but I couldn't generate a response." - - logger.debug(f"Generated response from {model}") - return result - - except ModelError: - raise - except Exception as e: - error_msg = f"Error generating response from {model}: {e}" - logger.error(error_msg) - raise ModelError(error_msg) - - -# Convenience function for creating a client -def create_client(host: Optional[str] = None, timeout: int = 30) -> OllamaClient: - """ - Create an OllamaClient with optional configuration. - - Args: - host: Optional Ollama server URL - timeout: Connection timeout in seconds - - Returns: - Configured OllamaClient instance - """ - return OllamaClient(host=host or "http://localhost:11434", timeout=timeout) diff --git a/src/mai/model/resource_detector.py b/src/mai/model/resource_detector.py deleted file mode 100644 index 1864681..0000000 --- a/src/mai/model/resource_detector.py +++ /dev/null @@ -1,497 +0,0 @@ -""" -Resource monitoring for Mai. - -Monitors system resources (CPU, RAM, GPU) and provides -resource-aware model selection capabilities. -""" - -import time -import platform -from dataclasses import dataclass -from typing import Optional, Dict, List, Tuple, Any -from collections import deque - - -@dataclass -class ResourceInfo: - """Current system resource state""" - - cpu_percent: float - memory_total_gb: float - memory_available_gb: float - memory_percent: float - gpu_available: bool - gpu_memory_gb: Optional[float] = None - gpu_usage_percent: Optional[float] = None - timestamp: float = 0.0 - - -@dataclass -class MemoryTrend: - """Memory usage trend analysis""" - - current: float - trend: str # 'stable', 'increasing', 'decreasing' - rate: float # GB per minute - confidence: float # 0.0 to 1.0 - - -class ResourceDetector: - """System resource monitoring with trend analysis""" - - def __init__(self): - """Initialize resource monitoring""" - self.memory_threshold_warning = 80.0 # 80% for warning - self.memory_threshold_critical = 90.0 # 90% for critical - self.history_window = 60 # seconds - self.history_size = 60 # data points - - # Resource history tracking - self.memory_history: deque = deque(maxlen=self.history_size) - self.cpu_history: deque = deque(maxlen=self.history_size) - self.timestamps: deque = deque(maxlen=self.history_size) - - # GPU detection - self.gpu_available = self._detect_gpu() - self.gpu_info = self._get_gpu_info() - - # Initialize psutil if available - self._init_psutil() - - def _init_psutil(self): - """Initialize psutil with fallback""" - try: - import psutil - - self.psutil = psutil - self.has_psutil = True - except ImportError: - print("Warning: psutil not available. Resource monitoring will be limited.") - self.psutil = None - self.has_psutil = False - - def _detect_gpu(self) -> bool: - """Detect GPU availability""" - try: - # Try NVIDIA GPU detection - result = subprocess.run( - ["nvidia-smi", "--query-gpu=name", "--format=csv,noheader,nounits"], - capture_output=True, - text=True, - timeout=5, - ) - if result.returncode == 0 and result.stdout.strip(): - return True - except (subprocess.TimeoutExpired, FileNotFoundError): - pass - - try: - # Try AMD GPU detection - result = subprocess.run( - ["rocm-smi", "--showproductname"], capture_output=True, text=True, timeout=5 - ) - if result.returncode == 0: - return True - except (subprocess.TimeoutExpired, FileNotFoundError): - pass - - # Apple Silicon detection - if platform.system() == "Darwin" and platform.machine() in ["arm64", "arm"]: - return True - - return False - - def _get_gpu_info(self) -> Dict[str, Any]: - """Get GPU information""" - info: Dict[str, Any] = {"type": None, "memory_gb": None, "name": None} - - try: - # NVIDIA GPU - result = subprocess.run( - ["nvidia-smi", "--query-gpu=name,memory.total", "--format=csv,noheader,nounits"], - capture_output=True, - text=True, - timeout=5, - ) - if result.returncode == 0: - lines = result.stdout.strip().split("\n") - if lines and lines[0]: - parts = lines[0].split(", ") - if len(parts) >= 2: - info["type"] = "nvidia" - info["name"] = parts[0].strip() - info["memory_gb"] = float(parts[1].strip()) / 1024 # Convert MB to GB - except (subprocess.TimeoutExpired, FileNotFoundError, ValueError): - pass - - # Apple Silicon - if ( - not info["type"] - and platform.system() == "Darwin" - and platform.machine() in ["arm64", "arm"] - ): - info["type"] = "apple_silicon" - # Unified memory, estimate based on system memory - if self.has_psutil and self.psutil is not None: - memory = self.psutil.virtual_memory() - info["memory_gb"] = memory.total / (1024**3) - - return info - - def detect_resources(self) -> ResourceInfo: - """Get current system resource state (alias for get_current_resources)""" - return self.get_current_resources() - - def get_current_resources(self) -> ResourceInfo: - """Get current system resource state""" - if not self.has_psutil: - # Fallback to basic monitoring - return self._get_fallback_resources() - - # CPU usage - cpu_percent = self.psutil.cpu_percent(interval=1) if self.psutil else 0.0 - - # Memory information - if self.psutil: - memory = self.psutil.virtual_memory() - memory_total_gb = memory.total / (1024**3) - memory_available_gb = memory.available / (1024**3) - memory_percent = memory.percent - else: - # Use fallback values - memory_total_gb = 8.0 # Default assumption - memory_available_gb = 4.0 - memory_percent = 50.0 - - # GPU information - gpu_usage_percent = None - gpu_memory_gb = None - - if self.gpu_info["type"] == "nvidia": - try: - result = subprocess.run( - [ - "nvidia-smi", - "--query-gpu=utilization.gpu,memory.used", - "--format=csv,noheader,nounits", - ], - capture_output=True, - text=True, - timeout=5, - ) - if result.returncode == 0: - lines = result.stdout.strip().split("\n") - if lines and lines[0]: - parts = lines[0].split(", ") - if len(parts) >= 2: - gpu_usage_percent = float(parts[0].strip()) - gpu_memory_gb = float(parts[1].strip()) / 1024 - except (subprocess.TimeoutExpired, ValueError): - pass - - current_time = time.time() - resource_info = ResourceInfo( - cpu_percent=cpu_percent, - memory_total_gb=memory_total_gb, - memory_available_gb=memory_available_gb, - memory_percent=memory_percent, - gpu_available=self.gpu_available, - gpu_memory_gb=gpu_memory_gb, - gpu_usage_percent=gpu_usage_percent, - timestamp=current_time, - ) - - # Update history - self._update_history(resource_info) - - return resource_info - - def _get_fallback_resources(self) -> ResourceInfo: - """Fallback resource detection without psutil""" - # Basic resource detection using /proc filesystem on Linux - cpu_percent = 0.0 - memory_total_gb = 0.0 - memory_available_gb = 0.0 - memory_percent = 0.0 - - try: - # Read memory info from /proc/meminfo - with open("/proc/meminfo", "r") as f: - meminfo = {} - for line in f: - if ":" in line: - key, value = line.split(":", 1) - meminfo[key.strip()] = int(value.split()[0]) - - if "MemTotal" in meminfo: - memory_total_gb = meminfo["MemTotal"] / (1024**2) - if "MemAvailable" in meminfo: - memory_available_gb = meminfo["MemAvailable"] / (1024**2) - - if memory_total_gb > 0: - memory_percent = ( - (memory_total_gb - memory_available_gb) / memory_total_gb - ) * 100 - except (IOError, KeyError, ValueError): - pass - - current_time = time.time() - return ResourceInfo( - cpu_percent=cpu_percent, - memory_total_gb=memory_total_gb, - memory_available_gb=memory_available_gb, - memory_percent=memory_percent, - gpu_available=self.gpu_available, - gpu_memory_gb=self.gpu_info.get("memory_gb"), - gpu_usage_percent=None, - timestamp=current_time, - ) - - def _update_history(self, resource_info: ResourceInfo): - """Update resource history for trend analysis""" - current_time = time.time() - - self.memory_history.append(resource_info.memory_percent) - self.cpu_history.append(resource_info.cpu_percent) - self.timestamps.append(current_time) - - def is_memory_constrained(self) -> Tuple[bool, str]: - """Check if memory is constrained""" - if not self.memory_history: - resources = self.get_current_resources() - current_memory = resources.memory_percent - else: - current_memory = self.memory_history[-1] - - # Check current memory usage - if current_memory >= self.memory_threshold_critical: - return True, "critical" - elif current_memory >= self.memory_threshold_warning: - return True, "warning" - - # Check trend - trend = self.get_memory_trend() - if trend.trend == "increasing" and trend.rate > 5.0: # 5GB/min increase - return True, "trend_warning" - - return False, "normal" - - def get_memory_trend(self) -> MemoryTrend: - """Analyze memory usage trend over last minute""" - if len(self.memory_history) < 10: - return MemoryTrend( - current=self.memory_history[-1] if self.memory_history else 0.0, - trend="stable", - rate=0.0, - confidence=0.0, - ) - - # Get recent data points (last 10 measurements) - recent_memory = list(self.memory_history)[-10:] - recent_times = list(self.timestamps)[-10:] - - # Calculate trend - if len(recent_memory) >= 2 and len(recent_times) >= 2: - time_span = recent_times[-1] - recent_times[0] - memory_change = recent_memory[-1] - recent_memory[0] - - # Convert to GB per minute if we have memory info - rate = 0.0 - if self.has_psutil and time_span > 0 and self.psutil is not None: - # Use psutil to get total memory for conversion - total_memory = self.psutil.virtual_memory().total / (1024**3) - rate = (memory_change / 100.0) * total_memory * (60.0 / time_span) - - # Determine trend - if abs(memory_change) < 2.0: # Less than 2% change - trend = "stable" - elif memory_change > 0: - trend = "increasing" - else: - trend = "decreasing" - - # Confidence based on data consistency - confidence = min(1.0, len(recent_memory) / 10.0) - - return MemoryTrend( - current=recent_memory[-1], trend=trend, rate=rate, confidence=confidence - ) - - return MemoryTrend( - current=recent_memory[-1] if recent_memory else 0.0, - trend="stable", - rate=0.0, - confidence=0.0, - ) - - def get_performance_degradation(self) -> Dict: - """Analyze performance degradation metrics""" - if len(self.memory_history) < 20 or len(self.cpu_history) < 20: - return { - "status": "insufficient_data", - "memory_trend": "unknown", - "cpu_trend": "unknown", - "overall": "stable", - } - - # Memory trend - memory_trend = self.get_memory_trend() - - # CPU trend - recent_cpu = list(self.cpu_history)[-10:] - older_cpu = list(self.cpu_history)[-20:-10] - - avg_recent_cpu = sum(recent_cpu) / len(recent_cpu) - avg_older_cpu = sum(older_cpu) / len(older_cpu) - - cpu_increase = avg_recent_cpu - avg_older_cpu - - # Overall assessment - if memory_trend.trend == "increasing" and memory_trend.rate > 5.0: - memory_status = "worsening" - elif memory_trend.trend == "increasing": - memory_status = "concerning" - else: - memory_status = "stable" - - if cpu_increase > 20: - cpu_status = "worsening" - elif cpu_increase > 10: - cpu_status = "concerning" - else: - cpu_status = "stable" - - # Overall status - if memory_status == "worsening" or cpu_status == "worsening": - overall = "critical" - elif memory_status == "concerning" or cpu_status == "concerning": - overall = "degrading" - else: - overall = "stable" - - return { - "status": "analyzed", - "memory_trend": memory_status, - "cpu_trend": cpu_status, - "cpu_increase": cpu_increase, - "memory_rate": memory_trend.rate, - "overall": overall, - } - - def estimate_model_requirements(self, model_size: str) -> Dict: - """Estimate memory requirements for model size""" - # Conservative estimates based on model parameter count - requirements = { - "1b": {"memory_gb": 2.0, "memory_warning_gb": 2.5, "memory_critical_gb": 3.0}, - "3b": {"memory_gb": 4.0, "memory_warning_gb": 5.0, "memory_critical_gb": 6.0}, - "7b": {"memory_gb": 8.0, "memory_warning_gb": 10.0, "memory_critical_gb": 12.0}, - "13b": {"memory_gb": 16.0, "memory_warning_gb": 20.0, "memory_critical_gb": 24.0}, - "70b": {"memory_gb": 80.0, "memory_warning_gb": 100.0, "memory_critical_gb": 120.0}, - } - - size_key = model_size.lower() - if size_key not in requirements: - # Default to 7B requirements for unknown models - size_key = "7b" - - base_req = requirements[size_key] - - # Add buffer for context and processing overhead (50%) - context_overhead = base_req["memory_gb"] * 0.5 - - return { - "size_category": size_key, - "base_memory_gb": base_req["memory_gb"], - "context_overhead_gb": context_overhead, - "total_required_gb": base_req["memory_gb"] + context_overhead, - "warning_threshold_gb": base_req["memory_warning_gb"], - "critical_threshold_gb": base_req["memory_critical_gb"], - } - - def can_fit_model(self, model_info: Dict) -> Dict: - """Check if model fits in current resources""" - # Extract model size info - model_size = model_info.get("size", "7b") - if isinstance(model_size, str): - # Extract numeric size from strings like "7B", "13B", etc. - import re - - match = re.search(r"(\d+\.?\d*)[Bb]", model_size) - if match: - size_num = float(match.group(1)) - if size_num <= 2: - size_key = "1b" - elif size_num <= 4: - size_key = "3b" - elif size_num <= 10: - size_key = "7b" - elif size_num <= 20: - size_key = "13b" - else: - size_key = "70b" - else: - size_key = "7b" - else: - size_key = str(model_size).lower() - - # Get requirements - requirements = self.estimate_model_requirements(size_key) - - # Get current resources - current_resources = self.get_current_resources() - - # Check memory fit - available_memory = current_resources.memory_available_gb - required_memory = requirements["total_required_gb"] - - memory_fit_score = min(1.0, available_memory / required_memory) - - # Check performance trends - degradation = self.get_performance_degradation() - - # Adjust confidence based on trends - trend_adjustment = 1.0 - if degradation["overall"] == "critical": - trend_adjustment = 0.5 - elif degradation["overall"] == "degrading": - trend_adjustment = 0.8 - - confidence = memory_fit_score * trend_adjustment - - # GPU consideration - gpu_factor = 1.0 - if self.gpu_available and self.gpu_info.get("memory_gb"): - gpu_memory = self.gpu_info["memory_gb"] - if gpu_memory < required_memory: - gpu_factor = 0.5 # GPU might not have enough memory - - final_confidence = confidence * gpu_factor - - return { - "can_fit": final_confidence >= 0.8, - "confidence": final_confidence, - "memory_fit_score": memory_fit_score, - "trend_adjustment": trend_adjustment, - "gpu_factor": gpu_factor, - "available_memory_gb": available_memory, - "required_memory_gb": required_memory, - "memory_deficit_gb": max(0, required_memory - available_memory), - "recommendation": self._get_fitting_recommendation(final_confidence, requirements), - } - - def _get_fitting_recommendation(self, confidence: float, requirements: Dict) -> str: - """Get recommendation based on fitting assessment""" - if confidence >= 0.9: - return "Excellent fit - model should run smoothly" - elif confidence >= 0.8: - return "Good fit - model should work well" - elif confidence >= 0.6: - return "Possible fit - may experience performance issues" - elif confidence >= 0.4: - return "Tight fit - expect significant slowdowns" - else: - return f"Insufficient resources - need at least {requirements['total_required_gb']:.1f}GB available" - - -# Required import for subprocess -import subprocess diff --git a/src/mai/model/switcher.py b/src/mai/model/switcher.py deleted file mode 100644 index 4c973c4..0000000 --- a/src/mai/model/switcher.py +++ /dev/null @@ -1,594 +0,0 @@ -""" -Model selection and switching logic for Mai. - -Intelligently selects and switches between models based on -available resources and conversation requirements. -""" - -import time -import asyncio -from typing import Dict, List, Optional, Tuple, Any -from dataclasses import dataclass, asdict -from enum import Enum - - -class ModelSize(Enum): - """Model size categories""" - - TINY = "1b" - SMALL = "3b" - MEDIUM = "7b" - LARGE = "13b" - HUGE = "70b" - - -class SwitchReason(Enum): - """Reasons for model switching""" - - RESOURCE_CONSTRAINT = "resource_constraint" - PERFORMANCE_DEGRADATION = "performance_degradation" - TASK_COMPLEXITY = "task_complexity" - USER_REQUEST = "user_request" - ERROR_RECOVERY = "error_recovery" - PROACTIVE_OPTIMIZATION = "proactive_optimization" - - -@dataclass -class ModelInfo: - """Information about an available model""" - - name: str - size: str # '7b', '13b', etc. - parameters: int # parameter count - context_window: int # context window size - quantization: str # 'q4_0', 'q8_0', etc. - modified_at: Optional[str] = None - digest: Optional[str] = None - - def __post_init__(self): - """Post-processing for model info""" - # Extract parameter count from size string - if isinstance(self.size, str): - import re - - match = re.search(r"(\d+\.?\d*)", self.size.lower()) - if match: - self.parameters = int(float(match.group(1)) * 1e9) - - # Determine size category - if self.parameters <= 2e9: - self.size_category = ModelSize.TINY - elif self.parameters <= 4e9: - self.size_category = ModelSize.SMALL - elif self.parameters <= 10e9: - self.size_category = ModelSize.MEDIUM - elif self.parameters <= 20e9: - self.size_category = ModelSize.LARGE - else: - self.size_category = ModelSize.HUGE - self.size_category = ModelSize.MEDIUM # Default override for now - - -@dataclass -class SwitchMetrics: - """Metrics for model switching performance""" - - switch_time: float - context_transfer_time: float - context_compression_ratio: float - success: bool - error_message: Optional[str] = None - - -@dataclass -class SwitchRecommendation: - """Recommendation for model switching""" - - should_switch: bool - target_model: Optional[str] - reason: SwitchReason - confidence: float - expected_benefit: str - estimated_cost: Dict[str, float] - - -class ModelSwitcher: - """Intelligent model selection and switching""" - - def __init__(self, ollama_client, resource_detector): - """Initialize model switcher with dependencies""" - self.client = ollama_client - self.resource_detector = resource_detector - - # Current state - self.current_model: Optional[str] = None - self.current_model_info: Optional[ModelInfo] = None - self.conversation_context: List[Dict] = [] - - # Switching history and performance - self.switch_history: List[Dict] = [] - self.performance_metrics: Dict[str, Any] = { - "switch_count": 0, - "successful_switches": 0, - "average_switch_time": 0.0, - "last_switch_time": None, - } - - # Model capability mappings - self.model_requirements = { - ModelSize.TINY: {"memory_gb": 2, "cpu_cores": 2, "context_preference": 0.3}, - ModelSize.SMALL: {"memory_gb": 4, "cpu_cores": 4, "context_preference": 0.5}, - ModelSize.MEDIUM: {"memory_gb": 8, "cpu_cores": 6, "context_preference": 0.7}, - ModelSize.LARGE: {"memory_gb": 16, "cpu_cores": 8, "context_preference": 0.8}, - ModelSize.HUGE: {"memory_gb": 80, "cpu_cores": 16, "context_preference": 1.0}, - } - - # Initialize available models - self.available_models: Dict[str, ModelInfo] = {} - # Models will be refreshed when needed - # Note: _refresh_model_list is async and should be called from async context - - async def _refresh_model_list(self): - """Refresh the list of available models""" - try: - # This would use the actual ollama client - # For now, create mock models - self.available_models = { - "llama3.2:1b": ModelInfo( - name="llama3.2:1b", - size="1b", - parameters=1_000_000_000, - context_window=2048, - quantization="q4_0", - ), - "llama3.2:3b": ModelInfo( - name="llama3.2:3b", - size="3b", - parameters=3_000_000_000, - context_window=4096, - quantization="q4_0", - ), - "llama3.2:7b": ModelInfo( - name="llama3.2:7b", - size="7b", - parameters=7_000_000_000, - context_window=8192, - quantization="q4_0", - ), - "llama3.2:13b": ModelInfo( - name="llama3.2:13b", - size="13b", - parameters=13_000_000_000, - context_window=8192, - quantization="q4_0", - ), - } - except Exception as e: - print(f"Error refreshing model list: {e}") - - async def select_best_model( - self, task_complexity: str = "medium", conversation_length: int = 0 - ) -> Tuple[str, float]: - """Select the best model based on current conditions""" - if not self.available_models: - # Refresh if no models available - await self._refresh_model_list() - - if not self.available_models: - raise ValueError("No models available for selection") - - # Get current resources - resources = self.resource_detector.get_current_resources() - - # Get performance degradation - degradation = self.resource_detector.get_performance_degradation() - - # Filter models that can fit - suitable_models = [] - for model_name, model_info in self.available_models.items(): - # Check if model fits in resources - can_fit_result = self.resource_detector.can_fit_model( - {"size": model_info.size, "parameters": model_info.parameters} - ) - - if can_fit_result["can_fit"]: - # Calculate score based on capability and efficiency - score = self._calculate_model_score( - model_info, resources, degradation, task_complexity, conversation_length - ) - suitable_models.append((model_name, model_info, score)) - - # Sort by score (descending) - suitable_models.sort(key=lambda x: x[2], reverse=True) - - if not suitable_models: - # No suitable models, return the smallest available as fallback - smallest_model = min(self.available_models.items(), key=lambda x: x[1].parameters) - return smallest_model[0], 0.5 - - best_model_name, best_model_info, best_score = suitable_models[0] - return best_model_name, best_score - - def _calculate_model_score( - self, - model_info: ModelInfo, - resources: Any, - degradation: Dict, - task_complexity: str, - conversation_length: int, - ) -> float: - """Calculate score for model selection""" - score = 0.0 - - # Base score from model capability (size) - capability_scores = { - ModelSize.TINY: 0.3, - ModelSize.SMALL: 0.5, - ModelSize.MEDIUM: 0.7, - ModelSize.LARGE: 0.85, - ModelSize.HUGE: 1.0, - } - score += capability_scores.get(model_info.size_category, 0.7) - - # Resource fit bonus - if hasattr(model_info, "size_category"): - resource_fit = self.resource_detector.can_fit_model( - {"size": model_info.size_category.value, "parameters": model_info.parameters} - ) - score += resource_fit["confidence"] * 0.3 - - # Performance degradation penalty - if degradation["overall"] == "critical": - score -= 0.3 - elif degradation["overall"] == "degrading": - score -= 0.15 - - # Task complexity adjustment - complexity_multipliers = { - "simple": {"tiny": 1.2, "small": 1.1, "medium": 0.9, "large": 0.7, "huge": 0.5}, - "medium": {"tiny": 0.8, "small": 0.9, "medium": 1.0, "large": 1.1, "huge": 0.9}, - "complex": {"tiny": 0.5, "small": 0.7, "medium": 0.9, "large": 1.2, "huge": 1.3}, - } - - size_key = ( - model_info.size_category.value if hasattr(model_info, "size_category") else "medium" - ) - mult = complexity_multipliers.get(task_complexity, {}).get(size_key, 1.0) - score *= mult - - # Conversation length adjustment (larger context for longer conversations) - if conversation_length > 50: - if model_info.context_window >= 8192: - score += 0.1 - elif model_info.context_window < 4096: - score -= 0.2 - elif conversation_length > 20: - if model_info.context_window >= 4096: - score += 0.05 - - return max(0.0, min(1.0, score)) - - def should_switch_model(self, current_performance_metrics: Dict) -> SwitchRecommendation: - """Determine if model should be switched""" - if not self.current_model: - # No current model, select best available - return SwitchRecommendation( - should_switch=True, - target_model=None, # Will be selected - reason=SwitchReason.PROACTIVE_OPTIMIZATION, - confidence=1.0, - expected_benefit="Initialize with optimal model", - estimated_cost={"time": 0.0, "memory": 0.0}, - ) - - # Check resource constraints - memory_constrained, constraint_level = self.resource_detector.is_memory_constrained() - if memory_constrained and constraint_level in ["warning", "critical"]: - # Need to switch to smaller model - smaller_model = self._find_smaller_model() - if smaller_model: - benefit = f"Reduce memory usage during {constraint_level} constraint" - return SwitchRecommendation( - should_switch=True, - target_model=smaller_model, - reason=SwitchReason.RESOURCE_CONSTRAINT, - confidence=0.9, - expected_benefit=benefit, - estimated_cost={"time": 2.0, "memory": -4.0}, - ) - - # Check performance degradation - degradation = self.resource_detector.get_performance_degradation() - if degradation["overall"] in ["critical", "degrading"]: - # Consider switching to smaller model - smaller_model = self._find_smaller_model() - if smaller_model and self.current_model_info: - benefit = "Improve responsiveness during performance degradation" - return SwitchRecommendation( - should_switch=True, - target_model=smaller_model, - reason=SwitchReason.PERFORMANCE_DEGRADATION, - confidence=0.8, - expected_benefit=benefit, - estimated_cost={"time": 2.0, "memory": -4.0}, - ) - - # Check if resources are available for larger model - if not memory_constrained and degradation["overall"] == "stable": - # Can we switch to a larger model? - larger_model = self._find_larger_model() - if larger_model: - benefit = "Increase capability with available resources" - return SwitchRecommendation( - should_switch=True, - target_model=larger_model, - reason=SwitchReason.PROACTIVE_OPTIMIZATION, - confidence=0.7, - expected_benefit=benefit, - estimated_cost={"time": 3.0, "memory": 4.0}, - ) - - return SwitchRecommendation( - should_switch=False, - target_model=None, - reason=SwitchReason.PROACTIVE_OPTIMIZATION, - confidence=1.0, - expected_benefit="Current model is optimal", - estimated_cost={"time": 0.0, "memory": 0.0}, - ) - - def _find_smaller_model(self) -> Optional[str]: - """Find a smaller model than current""" - if not self.current_model_info or not self.available_models: - return None - - current_size = getattr(self.current_model_info, "size_category", ModelSize.MEDIUM) - smaller_sizes = [ - ModelSize.TINY, - ModelSize.SMALL, - ModelSize.MEDIUM, - ModelSize.LARGE, - ModelSize.HUGE, - ] - current_index = smaller_sizes.index(current_size) - - # Look for models in smaller categories - for size in smaller_sizes[:current_index]: - for model_name, model_info in self.available_models.items(): - if hasattr(model_info, "size_category") and model_info.size_category == size: - # Check if it fits - can_fit = self.resource_detector.can_fit_model( - {"size": size.value, "parameters": model_info.parameters} - ) - if can_fit["can_fit"]: - return model_name - - return None - - def _find_larger_model(self) -> Optional[str]: - """Find a larger model than current""" - if not self.current_model_info or not self.available_models: - return None - - current_size = getattr(self.current_model_info, "size_category", ModelSize.MEDIUM) - larger_sizes = [ - ModelSize.TINY, - ModelSize.SMALL, - ModelSize.MEDIUM, - ModelSize.LARGE, - ModelSize.HUGE, - ] - current_index = larger_sizes.index(current_size) - - # Look for models in larger categories - for size in larger_sizes[current_index + 1 :]: - for model_name, model_info in self.available_models.items(): - if hasattr(model_info, "size_category") and model_info.size_category == size: - # Check if it fits - can_fit = self.resource_detector.can_fit_model( - {"size": size.value, "parameters": model_info.parameters} - ) - if can_fit["can_fit"]: - return model_name - - return None - - async def switch_model( - self, new_model_name: str, conversation_context: Optional[List[Dict]] = None - ) -> SwitchMetrics: - """Switch to a new model with context preservation""" - start_time = time.time() - - try: - # Validate new model is available - if new_model_name not in self.available_models: - raise ValueError(f"Model {new_model_name} not available") - - # Compress conversation context if provided - context_transfer_time = 0.0 - compression_ratio = 1.0 - compressed_context = conversation_context - - if conversation_context: - compress_start = time.time() - compressed_context = self._compress_context(conversation_context) - context_transfer_time = time.time() - compress_start - compression_ratio = len(conversation_context) / max(1, len(compressed_context)) - - # Perform the switch (mock implementation) - # In real implementation, this would use the ollama client - old_model = self.current_model - self.current_model = new_model_name - self.current_model_info = self.available_models[new_model_name] - - if conversation_context and compressed_context is not None: - self.conversation_context = compressed_context - - switch_time = time.time() - start_time - - # Update performance metrics - self._update_switch_metrics(True, switch_time) - - # Record switch in history - self.switch_history.append( - { - "timestamp": time.time(), - "from_model": old_model, - "to_model": new_model_name, - "switch_time": switch_time, - "context_transfer_time": context_transfer_time, - "compression_ratio": compression_ratio, - "success": True, - } - ) - - return SwitchMetrics( - switch_time=switch_time, - context_transfer_time=context_transfer_time, - context_compression_ratio=compression_ratio, - success=True, - ) - - except Exception as e: - switch_time = time.time() - start_time - self._update_switch_metrics(False, switch_time) - - return SwitchMetrics( - switch_time=switch_time, - context_transfer_time=0.0, - context_compression_ratio=1.0, - success=False, - error_message=str(e), - ) - - def _compress_context(self, context: List[Dict]) -> List[Dict]: - """Compress conversation context for transfer""" - # Simple compression strategy - keep recent messages and summaries - if len(context) <= 10: - return context - - # Keep first 2 and last 8 messages - compressed = context[:2] + context[-8:] - - # Add a summary if we removed significant content - if len(context) > len(compressed): - summary_msg = { - "role": "system", - "content": f"[{len(context) - len(compressed)} earlier messages summarized for context compression]", - } - compressed.insert(2, summary_msg) - - return compressed - - def _update_switch_metrics(self, success: bool, switch_time: float): - """Update performance metrics for switching""" - self.performance_metrics["switch_count"] += 1 - - if success: - self.performance_metrics["successful_switches"] += 1 - - # Update average switch time - if self.performance_metrics["switch_count"] == 1: - self.performance_metrics["average_switch_time"] = switch_time - else: - current_avg = self.performance_metrics["average_switch_time"] - n = self.performance_metrics["switch_count"] - new_avg = ((n - 1) * current_avg + switch_time) / n - self.performance_metrics["average_switch_time"] = new_avg - - self.performance_metrics["last_switch_time"] = time.time() - - def get_model_recommendations(self) -> List[Dict]: - """Get model recommendations based on current state""" - recommendations = [] - - # Get current resources - resources = self.resource_detector.get_current_resources() - - # Get performance degradation - degradation = self.resource_detector.get_performance_degradation() - - for model_name, model_info in self.available_models.items(): - # Check if model fits - can_fit_result = self.resource_detector.can_fit_model( - {"size": model_info.size, "parameters": model_info.parameters} - ) - - if can_fit_result["can_fit"]: - # Calculate recommendation score - score = self._calculate_model_score(model_info, resources, degradation, "medium", 0) - - recommendation = { - "model": model_name, - "model_info": asdict(model_info), - "can_fit": True, - "fit_confidence": can_fit_result["confidence"], - "performance_score": score, - "memory_deficit_gb": can_fit_result.get("memory_deficit_gb", 0), - "recommendation": can_fit_result.get("recommendation", ""), - "reason": self._get_recommendation_reason(score, resources, model_info), - } - recommendations.append(recommendation) - else: - # Model doesn't fit, but include with explanation - recommendation = { - "model": model_name, - "model_info": asdict(model_info), - "can_fit": False, - "fit_confidence": can_fit_result["confidence"], - "performance_score": 0.0, - "memory_deficit_gb": can_fit_result.get("memory_deficit_gb", 0), - "recommendation": can_fit_result.get("recommendation", ""), - "reason": f"Insufficient memory - need {can_fit_result.get('memory_deficit_gb', 0):.1f}GB more", - } - recommendations.append(recommendation) - - # Sort by performance score - recommendations.sort(key=lambda x: x["performance_score"], reverse=True) - - return recommendations - - def _get_recommendation_reason( - self, score: float, resources: Any, model_info: ModelInfo - ) -> str: - """Get reason for recommendation""" - if score >= 0.8: - return "Excellent fit for current conditions" - elif score >= 0.6: - return "Good choice, should work well" - elif score >= 0.4: - return "Possible fit, may have performance issues" - else: - return "Not recommended for current conditions" - - def estimate_switching_cost( - self, from_model: str, to_model: str, context_size: int - ) -> Dict[str, float]: - """Estimate the cost of switching between models""" - # Base time cost - base_time = 1.0 # 1 second base switching time - - # Context transfer cost - context_time = context_size * 0.01 # 10ms per message - - # Model loading cost (based on size difference) - from_info = self.available_models.get(from_model) - to_info = self.available_models.get(to_model) - - if from_info and to_info: - size_diff = abs(to_info.parameters - from_info.parameters) / 1e9 - loading_cost = size_diff * 0.5 # 0.5s per billion parameters difference - else: - loading_cost = 2.0 # Default 2 seconds - - total_time = base_time + context_time + loading_cost - - # Memory cost (temporary increase during switch) - memory_cost = 2.0 if context_size > 20 else 1.0 # GB - - return { - "time_seconds": total_time, - "memory_gb": memory_cost, - "context_transfer_time": context_time, - "model_loading_time": loading_cost, - } diff --git a/src/mai/models/__init__.py b/src/mai/models/__init__.py deleted file mode 100644 index d7f2c62..0000000 --- a/src/mai/models/__init__.py +++ /dev/null @@ -1,40 +0,0 @@ -""" -Mai data models package. - -Exports all Pydantic models for conversations, memory, and related data structures. -""" - -from .conversation import ( - Message, - Conversation, - ConversationSummary, - ConversationFilter, -) - -from .memory import ( - ConversationType, - RelevanceType, - SearchQuery, - RetrievalResult, - MemoryContext, - ContextWeight, - ConversationPattern, - ContextPlacement, -) - -__all__ = [ - # Conversation models - "Message", - "Conversation", - "ConversationSummary", - "ConversationFilter", - # Memory models - "ConversationType", - "RelevanceType", - "SearchQuery", - "RetrievalResult", - "MemoryContext", - "ContextWeight", - "ConversationPattern", - "ContextPlacement", -] diff --git a/src/mai/models/conversation.py b/src/mai/models/conversation.py deleted file mode 100644 index edee5f6..0000000 --- a/src/mai/models/conversation.py +++ /dev/null @@ -1,172 +0,0 @@ -""" -Conversation data models for Mai memory system. - -Provides Pydantic models for conversations, messages, and related -data structures with proper validation and serialization. -""" - -from typing import List, Dict, Any, Optional -from datetime import datetime -from pydantic import BaseModel, Field, validator -import json - - -class Message(BaseModel): - """Individual message within a conversation.""" - - id: str = Field(..., description="Unique message identifier") - role: str = Field(..., description="Message role: 'user', 'assistant', or 'system'") - content: str = Field(..., description="Message content text") - timestamp: str = Field(..., description="ISO timestamp of message") - token_count: Optional[int] = Field(0, description="Token count for message") - metadata: Optional[Dict[str, Any]] = Field( - default_factory=dict, description="Additional message metadata" - ) - - @validator("role") - def validate_role(cls, v): - """Validate that role is one of the allowed values.""" - allowed_roles = ["user", "assistant", "system"] - if v not in allowed_roles: - raise ValueError(f"Role must be one of: {allowed_roles}") - return v - - @validator("timestamp") - def validate_timestamp(cls, v): - """Validate timestamp format and ensure it's ISO format.""" - try: - # Try to parse the timestamp to ensure it's valid - dt = datetime.fromisoformat(v.replace("Z", "+00:00")) - # Return in standard ISO format - return dt.isoformat() - except (ValueError, AttributeError) as e: - raise ValueError(f"Invalid timestamp format: {v}. Must be ISO format.") from e - - class Config: - """Pydantic configuration for Message model.""" - - json_encoders = {datetime: lambda v: v.isoformat()} - - -class Conversation(BaseModel): - """Complete conversation with messages and metadata.""" - - id: str = Field(..., description="Unique conversation identifier") - title: str = Field(..., description="Human-readable conversation title") - created_at: str = Field(..., description="ISO timestamp when conversation was created") - updated_at: str = Field(..., description="ISO timestamp when conversation was last updated") - messages: List[Message] = Field( - default_factory=list, description="List of messages in chronological order" - ) - metadata: Optional[Dict[str, Any]] = Field( - default_factory=dict, description="Additional conversation metadata" - ) - message_count: Optional[int] = Field(0, description="Total number of messages") - - @validator("messages") - def validate_message_order(cls, v): - """Ensure messages are in chronological order.""" - if not v: - return v - - # Sort by timestamp to ensure chronological order - try: - sorted_messages = sorted( - v, key=lambda m: datetime.fromisoformat(m.timestamp.replace("Z", "+00:00")) - ) - return sorted_messages - except (ValueError, AttributeError) as e: - raise ValueError("Messages have invalid timestamps") from e - - @validator("updated_at") - def validate_updated_timestamp(cls, v, values): - """Ensure updated_at is not earlier than created_at.""" - if "created_at" in values: - try: - created = datetime.fromisoformat(values["created_at"].replace("Z", "+00:00")) - updated = datetime.fromisoformat(v.replace("Z", "+00:00")) - - if updated < created: - raise ValueError("updated_at cannot be earlier than created_at") - except (ValueError, AttributeError) as e: - raise ValueError(f"Invalid timestamp comparison: {e}") from e - - return v - - def add_message(self, message: Message) -> None: - """ - Add a message to the conversation and update timestamps. - - Args: - message: Message to add - """ - self.messages.append(message) - self.message_count = len(self.messages) - - # Update the updated_at timestamp - self.updated_at = datetime.now().isoformat() - - def get_message_count(self) -> int: - """Get the actual message count.""" - return len(self.messages) - - def get_latest_message(self) -> Optional[Message]: - """Get the most recent message in the conversation.""" - if not self.messages: - return None - - # Return the message with the latest timestamp - return max( - self.messages, key=lambda m: datetime.fromisoformat(m.timestamp.replace("Z", "+00:00")) - ) - - class Config: - """Pydantic configuration for Conversation model.""" - - json_encoders = {datetime: lambda v: v.isoformat()} - - -class ConversationSummary(BaseModel): - """Summary of a conversation for search results.""" - - id: str = Field(..., description="Conversation identifier") - title: str = Field(..., description="Conversation title") - created_at: str = Field(..., description="Creation timestamp") - updated_at: str = Field(..., description="Last update timestamp") - message_count: int = Field(..., description="Total messages in conversation") - preview: Optional[str] = Field(None, description="Short preview of conversation content") - tags: Optional[List[str]] = Field( - default_factory=list, description="Tags or keywords for conversation" - ) - - class Config: - """Pydantic configuration for ConversationSummary model.""" - - pass - - -class ConversationFilter(BaseModel): - """Filter criteria for searching conversations.""" - - role: Optional[str] = Field(None, description="Filter by message role") - start_date: Optional[str] = Field( - None, description="Filter messages after this date (ISO format)" - ) - end_date: Optional[str] = Field( - None, description="Filter messages before this date (ISO format)" - ) - keywords: Optional[List[str]] = Field(None, description="Filter by keywords in message content") - min_message_count: Optional[int] = Field(None, description="Minimum message count") - max_message_count: Optional[int] = Field(None, description="Maximum message count") - - @validator("start_date", "end_date") - def validate_date_filters(cls, v): - """Validate date filter format.""" - if v is None: - return v - - try: - datetime.fromisoformat(v.replace("Z", "+00:00")) - return v - except (ValueError, AttributeError) as e: - raise ValueError(f"Invalid date format: {v}. Must be ISO format.") from e diff --git a/src/mai/models/memory.py b/src/mai/models/memory.py deleted file mode 100644 index be59c22..0000000 --- a/src/mai/models/memory.py +++ /dev/null @@ -1,256 +0,0 @@ -""" -Memory system data models for Mai context retrieval. - -Provides Pydantic models for memory context, search queries, -retrieval results, and related data structures. -""" - -from typing import List, Dict, Any, Optional, Union -from datetime import datetime -from pydantic import BaseModel, Field, validator -from enum import Enum - -from .conversation import Conversation, Message - - -class ConversationType(str, Enum): - """Enumeration of conversation types for adaptive weighting.""" - - TECHNICAL = "technical" - PERSONAL = "personal" - PLANNING = "planning" - GENERAL = "general" - QUESTION = "question" - CREATIVE = "creative" - ANALYSIS = "analysis" - - -class RelevanceType(str, Enum): - """Enumeration of relevance types for search results.""" - - SEMANTIC = "semantic" - KEYWORD = "keyword" - RECENCY = "recency" - PATTERN = "pattern" - HYBRID = "hybrid" - - -class SearchQuery(BaseModel): - """Query model for context search operations.""" - - text: str = Field(..., description="Search query text") - conversation_type: Optional[ConversationType] = Field( - None, description="Detected conversation type" - ) - filters: Optional[Dict[str, Any]] = Field(default_factory=dict, description="Search filters") - weights: Optional[Dict[str, float]] = Field( - default_factory=dict, description="Search weight overrides" - ) - limits: Optional[Dict[str, int]] = Field(default_factory=dict, description="Search limits") - - # Default limits - max_results: int = Field(5, description="Maximum number of results to return") - max_tokens: int = Field(2000, description="Maximum tokens in returned context") - - # Search facet controls - include_semantic: bool = Field(True, description="Include semantic similarity search") - include_keywords: bool = Field(True, description="Include keyword matching") - include_recency: bool = Field(True, description="Include recency weighting") - include_patterns: bool = Field(True, description="Include pattern matching") - - @validator("text") - def validate_text(cls, v): - """Validate search text is not empty.""" - if not v or not v.strip(): - raise ValueError("Search text cannot be empty") - return v.strip() - - @validator("max_results") - def validate_max_results(cls, v): - """Validate max results is reasonable.""" - if v < 1: - raise ValueError("max_results must be at least 1") - if v > 20: - raise ValueError("max_results cannot exceed 20") - return v - - -class RetrievalResult(BaseModel): - """Single result from context retrieval operation.""" - - conversation_id: str = Field(..., description="ID of the conversation") - title: str = Field(..., description="Title of the conversation") - similarity_score: float = Field(..., description="Similarity score (0.0 to 1.0)") - relevance_type: RelevanceType = Field(..., description="Type of relevance") - excerpt: str = Field(..., description="Relevant excerpt from conversation") - context_type: Optional[ConversationType] = Field(None, description="Type of conversation") - matched_message_id: Optional[str] = Field(None, description="ID of the best matching message") - metadata: Optional[Dict[str, Any]] = Field( - default_factory=dict, description="Additional result metadata" - ) - - # Component scores for hybrid results - semantic_score: Optional[float] = Field(None, description="Semantic similarity score") - keyword_score: Optional[float] = Field(None, description="Keyword matching score") - recency_score: Optional[float] = Field(None, description="Recency-based score") - pattern_score: Optional[float] = Field(None, description="Pattern matching score") - - @validator("similarity_score") - def validate_similarity_score(cls, v): - """Validate similarity score is in valid range.""" - if not 0.0 <= v <= 1.0: - raise ValueError("similarity_score must be between 0.0 and 1.0") - return v - - @validator("excerpt") - def validate_excerpt(cls, v): - """Validate excerpt is not empty.""" - if not v or not v.strip(): - raise ValueError("excerpt cannot be empty") - return v.strip() - - -class MemoryContext(BaseModel): - """Complete memory context for current query.""" - - current_query: SearchQuery = Field(..., description="The search query") - relevant_conversations: List[RetrievalResult] = Field( - default_factory=list, description="Retrieved conversations" - ) - patterns: Optional[Dict[str, Any]] = Field( - default_factory=dict, description="Extracted patterns" - ) - metadata: Optional[Dict[str, Any]] = Field( - default_factory=dict, description="Additional context metadata" - ) - - # Context statistics - total_conversations: int = Field(0, description="Total conversations found") - total_tokens: int = Field(0, description="Total tokens in retrieved context") - context_quality_score: Optional[float] = Field( - None, description="Quality assessment of context" - ) - - # Weighting information - applied_weights: Optional[Dict[str, float]] = Field( - default_factory=dict, description="Weights applied to search" - ) - conversation_type_detected: Optional[ConversationType] = Field( - None, description="Detected conversation type" - ) - - def add_result(self, result: RetrievalResult) -> None: - """Add a retrieval result to the context.""" - self.relevant_conversations.append(result) - self.total_conversations = len(self.relevant_conversations) - # Estimate tokens (rough approximation: 1 token ≈ 4 characters) - self.total_tokens += len(result.excerpt) // 4 - - def is_within_token_limit(self, max_tokens: Optional[int] = None) -> bool: - """Check if context is within token limits.""" - limit = max_tokens or self.current_query.max_tokens - return self.total_tokens <= limit - - def get_summary_text(self, max_chars: int = 500) -> str: - """Get a summary of the retrieved context.""" - if not self.relevant_conversations: - return "No relevant conversations found." - - summaries = [] - total_chars = 0 - - for result in self.relevant_conversations[:3]: # Top 3 results - summary = f"{result.title}: {result.excerpt[:200]}..." - if total_chars + len(summary) > max_chars: - break - summaries.append(summary) - total_chars += len(summary) - - return " | ".join(summaries) - - class Config: - """Pydantic configuration for MemoryContext model.""" - - pass - - -class ContextWeight(BaseModel): - """Weight configuration for different search facets.""" - - semantic: float = Field(0.4, description="Weight for semantic similarity") - keyword: float = Field(0.3, description="Weight for keyword matching") - recency: float = Field(0.2, description="Weight for recency") - pattern: float = Field(0.1, description="Weight for pattern matching") - - @validator("semantic", "keyword", "recency", "pattern") - def validate_weights(cls, v): - """Validate individual weights are non-negative.""" - if v < 0: - raise ValueError("Weights cannot be negative") - return v - - @validator("semantic", "keyword", "recency", "pattern") - def validate_weight_range(cls, v): - """Validate weights are reasonable.""" - if v > 2.0: - raise ValueError("Individual weights cannot exceed 2.0") - return v - - def normalize(self) -> "ContextWeight": - """Normalize weights so they sum to 1.0.""" - total = self.semantic + self.keyword + self.recency + self.pattern - if total == 0: - return ContextWeight() - - return ContextWeight( - semantic=self.semantic / total, - keyword=self.keyword / total, - recency=self.recency / total, - pattern=self.pattern / total, - ) - - -class ConversationPattern(BaseModel): - """Extracted pattern from conversations.""" - - pattern_type: str = Field(..., description="Type of pattern (preference, topic, style, etc.)") - pattern_value: str = Field(..., description="Pattern value or description") - confidence: float = Field(..., description="Confidence score for pattern") - frequency: int = Field(1, description="How often this pattern appears") - conversation_ids: List[str] = Field( - default_factory=list, description="Conversations where pattern appears" - ) - last_seen: str = Field(..., description="ISO timestamp when pattern was last observed") - - @validator("confidence") - def validate_confidence(cls, v): - """Validate confidence score.""" - if not 0.0 <= v <= 1.0: - raise ValueError("confidence must be between 0.0 and 1.0") - return v - - class Config: - """Pydantic configuration for ConversationPattern model.""" - - pass - - -class ContextPlacement(BaseModel): - """Strategy for placing context to prevent 'lost in middle'.""" - - strategy: str = Field(..., description="Placement strategy name") - reasoning: str = Field(..., description="Why this strategy was chosen") - high_priority_items: List[int] = Field( - default_factory=list, description="Indices of high priority conversations" - ) - distributed_items: List[int] = Field( - default_factory=list, description="Indices of distributed conversations" - ) - token_allocation: Dict[str, int] = Field( - default_factory=dict, description="Token allocation per conversation" - ) - - class Config: - """Pydantic configuration for ContextPlacement model.""" - - pass diff --git a/src/mai/sandbox/__init__.py b/src/mai/sandbox/__init__.py deleted file mode 100644 index a2569a1..0000000 --- a/src/mai/sandbox/__init__.py +++ /dev/null @@ -1,29 +0,0 @@ -""" -Mai Sandbox System - Safe Code Execution - -This module provides the foundational safety infrastructure for Mai's code execution, -including risk analysis, resource enforcement, and audit logging. -""" - -from .audit_logger import AuditLogger -from .approval_system import ApprovalSystem -from .docker_executor import ContainerConfig, ContainerResult, DockerExecutor -from .manager import ExecutionRequest, ExecutionResult, SandboxManager -from .resource_enforcer import ResourceEnforcer, ResourceLimits, ResourceUsage -from .risk_analyzer import RiskAnalyzer, RiskAssessment - -__all__ = [ - "SandboxManager", - "ExecutionRequest", - "ExecutionResult", - "RiskAnalyzer", - "RiskAssessment", - "ResourceEnforcer", - "ResourceLimits", - "ResourceUsage", - "AuditLogger", - "ApprovalSystem", - "DockerExecutor", - "ContainerConfig", - "ContainerResult", -] diff --git a/src/mai/sandbox/approval_system.py b/src/mai/sandbox/approval_system.py deleted file mode 100644 index 3cd8a71..0000000 --- a/src/mai/sandbox/approval_system.py +++ /dev/null @@ -1,431 +0,0 @@ -""" -Risk-based User Approval System - -This module provides a sophisticated approval system that evaluates code execution -requests based on risk analysis and provides appropriate user interaction workflows. -""" - -import logging -import json -import hashlib -from typing import Dict, List, Optional, Tuple, Any -from enum import Enum -from dataclasses import dataclass, asdict -from datetime import datetime -import sys -import re - -from ..core.config import get_config - - -class RiskLevel(Enum): - """Risk levels for code execution.""" - - LOW = "low" - MEDIUM = "medium" - HIGH = "high" - BLOCKED = "blocked" - - -class ApprovalResult(Enum): - """Approval decision results.""" - - ALLOWED = "allowed" - DENIED = "denied" - BLOCKED = "blocked" - APPROVED = "approved" - - -@dataclass -class RiskAnalysis: - """Risk analysis result.""" - - risk_level: RiskLevel - confidence: float - reasons: List[str] - affected_resources: List[str] - severity_score: float - - -@dataclass -class ApprovalRequest: - """Approval request data.""" - - code: str - risk_analysis: RiskAnalysis - context: Dict[str, Any] - timestamp: datetime - request_id: str - user_preference: Optional[str] = None - - -@dataclass -class ApprovalDecision: - """Approval decision record.""" - - request: ApprovalRequest - result: ApprovalResult - user_input: str - timestamp: datetime - trust_updated: bool = False - - -class ApprovalSystem: - """Risk-based approval system for code execution.""" - - def __init__(self): - self.config = get_config() - self.logger = logging.getLogger(__name__) - self.approval_history: List[ApprovalDecision] = [] - self.user_preferences: Dict[str, str] = {} - self.trust_patterns: Dict[str, int] = {} - - # Risk thresholds - use defaults since sandbox config not yet in main Config - self.risk_thresholds = { - "low_threshold": 0.3, - "medium_threshold": 0.6, - "high_threshold": 0.8, - } - - # Load saved preferences - self._load_preferences() - - def _load_preferences(self): - """Load user preferences from configuration.""" - try: - # For now, preferences are stored locally only - # TODO: Integrate with Config class when sandbox config added - self.user_preferences = {} - except Exception as e: - self.logger.warning(f"Could not load user preferences: {e}") - - def _save_preferences(self): - """Save user preferences to configuration.""" - try: - # Note: This would integrate with config hot-reload system - pass - except Exception as e: - self.logger.warning(f"Could not save user preferences: {e}") - - def _generate_request_id(self, code: str) -> str: - """Generate unique request ID for code.""" - content = f"{code}_{datetime.now().isoformat()}" - return hashlib.md5(content.encode()).hexdigest()[:12] - - def _analyze_code_risk(self, code: str, context: Dict[str, Any]) -> RiskAnalysis: - """Analyze code for potential risks.""" - risk_patterns = { - "HIGH": [ - r"os\.system\s*\(", - r"subprocess\.call\s*\(", - r"exec\s*\(", - r"eval\s*\(", - r"__import__\s*\(", - r'open\s*\([\'"]\/', - r"shutil\.rmtree", - r"pickle\.loads?", - ], - "MEDIUM": [ - r"import\s+os", - r"import\s+subprocess", - r"import\s+sys", - r"open\s*\(", - r"file\s*\(", - r"\.write\s*\(", - r"\.read\s*\(", - ], - } - - risk_score = 0.0 - reasons = [] - affected_resources = [] - - # Check for high-risk patterns - for pattern in risk_patterns["HIGH"]: - if re.search(pattern, code, re.IGNORECASE): - risk_score += 0.4 - reasons.append(f"High-risk pattern detected: {pattern}") - affected_resources.append("system_operations") - - # Check for medium-risk patterns - for pattern in risk_patterns["MEDIUM"]: - if re.search(pattern, code, re.IGNORECASE): - risk_score += 0.2 - reasons.append(f"Medium-risk pattern detected: {pattern}") - affected_resources.append("file_system") - - # Analyze context - if context.get("user_level") == "new": - risk_score += 0.1 - reasons.append("New user profile") - - # Determine risk level - if risk_score >= self.risk_thresholds["high_threshold"]: - risk_level = RiskLevel.HIGH - elif risk_score >= self.risk_thresholds["medium_threshold"]: - risk_level = RiskLevel.MEDIUM - elif risk_score >= self.risk_thresholds["low_threshold"]: - risk_level = RiskLevel.LOW - else: - risk_level = RiskLevel.LOW # Default to low for very safe code - - # Check for blocked operations - blocked_patterns = [ - r"rm\s+-rf\s+\/", - r"dd\s+if=", - r"format\s+", - r"fdisk", - ] - - for pattern in blocked_patterns: - if re.search(pattern, code, re.IGNORECASE): - risk_level = RiskLevel.BLOCKED - reasons.append(f"Blocked operation detected: {pattern}") - break - - confidence = min(0.95, 0.5 + len(reasons) * 0.1) - - return RiskAnalysis( - risk_level=risk_level, - confidence=confidence, - reasons=reasons, - affected_resources=affected_resources, - severity_score=risk_score, - ) - - def _present_approval_request(self, request: ApprovalRequest) -> str: - """Present approval request to user based on risk level.""" - risk_level = request.risk_analysis.risk_level - - if risk_level == RiskLevel.LOW: - return self._present_low_risk_request(request) - elif risk_level == RiskLevel.MEDIUM: - return self._present_medium_risk_request(request) - elif risk_level == RiskLevel.HIGH: - return self._present_high_risk_request(request) - else: # BLOCKED - return self._present_blocked_request(request) - - def _present_low_risk_request(self, request: ApprovalRequest) -> str: - """Present low-risk approval request.""" - print(f"\n🟢 [LOW RISK] Execute {self._get_operation_type(request.code)}?") - print(f"Code: {request.code[:100]}{'...' if len(request.code) > 100 else ''}") - - response = input("Allow? [Y/n/a(llow always)]: ").strip().lower() - - if response in ["", "y", "yes"]: - return "allowed" - elif response == "a": - self.user_preferences[self._get_operation_type(request.code)] = "auto_allow" - return "allowed_always" - else: - return "denied" - - def _present_medium_risk_request(self, request: ApprovalRequest) -> str: - """Present medium-risk approval request with details.""" - print(f"\n🟡 [MEDIUM RISK] Potentially dangerous operation detected") - print(f"Operation Type: {self._get_operation_type(request.code)}") - print(f"Affected Resources: {', '.join(request.risk_analysis.affected_resources)}") - print(f"Risk Factors: {len(request.risk_analysis.reasons)}") - print(f"\nCode Preview:") - print(request.code[:200] + ("..." if len(request.code) > 200 else "")) - - if request.risk_analysis.reasons: - print(f"\nRisk Reasons:") - for reason in request.risk_analysis.reasons[:3]: - print(f" • {reason}") - - response = input("\nAllow this operation? [y/N/d(etails)/a(llow always)]: ").strip().lower() - - if response == "y": - return "allowed" - elif response == "d": - return self._present_detailed_view(request) - elif response == "a": - self.user_preferences[self._get_operation_type(request.code)] = "auto_allow" - return "allowed_always" - else: - return "denied" - - def _present_high_risk_request(self, request: ApprovalRequest) -> str: - """Present high-risk approval request with full details.""" - print(f"\n🔴 [HIGH RISK] Dangerous operation detected!") - print(f"Severity Score: {request.risk_analysis.severity_score:.2f}") - print(f"Confidence: {request.risk_analysis.confidence:.2f}") - - print(f"\nAffected Resources: {', '.join(request.risk_analysis.affected_resources)}") - print(f"\nAll Risk Factors:") - for reason in request.risk_analysis.reasons: - print(f" • {reason}") - - print(f"\nFull Code:") - print("=" * 50) - print(request.code) - print("=" * 50) - - print(f"\n⚠️ This operation could potentially harm your system or data.") - - response = ( - input("\nType 'confirm' to allow, 'cancel' to deny, 'details' for more info: ") - .strip() - .lower() - ) - - if response == "confirm": - return "allowed" - elif response == "details": - return self._present_detailed_analysis(request) - else: - return "denied" - - def _present_blocked_request(self, request: ApprovalRequest) -> str: - """Present blocked operation notification.""" - print(f"\n🚫 [BLOCKED] Operation not permitted") - print(f"This operation is blocked for security reasons:") - for reason in request.risk_analysis.reasons: - print(f" • {reason}") - print("\nThis operation cannot be executed.") - return "blocked" - - def _present_detailed_view(self, request: ApprovalRequest) -> str: - """Present detailed view of the request.""" - print(f"\n📋 Detailed Analysis") - print(f"Request ID: {request.request_id}") - print(f"Timestamp: {request.timestamp}") - print(f"Risk Level: {request.risk_analysis.risk_level.value.upper()}") - print(f"Severity Score: {request.risk_analysis.severity_score:.2f}") - - print(f"\nContext Information:") - for key, value in request.context.items(): - print(f" {key}: {value}") - - print(f"\nFull Code:") - print("=" * 50) - print(request.code) - print("=" * 50) - - response = input("\nProceed with execution? [y/N]: ").strip().lower() - return "allowed" if response == "y" else "denied" - - def _present_detailed_analysis(self, request: ApprovalRequest) -> str: - """Present extremely detailed analysis for high-risk operations.""" - print(f"\n🔬 Security Analysis Report") - print(f"Generated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") - print(f"Request ID: {request.request_id}") - - print(f"\nRisk Assessment:") - print(f" Level: {request.risk_analysis.risk_level.value.upper()}") - print(f" Score: {request.risk_analysis.severity_score:.2f}/1.0") - print(f" Confidence: {request.risk_analysis.confidence:.2f}") - - print(f"\nThreat Analysis:") - for reason in request.risk_analysis.reasons: - print(f" ⚠️ {reason}") - - print(f"\nResource Impact:") - for resource in request.risk_analysis.affected_resources: - print(f" 📁 {resource}") - - print( - f"\nRecommendation: {'DENY' if request.risk_analysis.severity_score > 0.8 else 'REVIEW CAREFULLY'}" - ) - - response = input("\nFinal decision? [confirm/cancel]: ").strip().lower() - return "allowed" if response == "confirm" else "denied" - - def _get_operation_type(self, code: str) -> str: - """Extract operation type from code.""" - if "import" in code: - return "module_import" - elif "os.system" in code or "subprocess" in code: - return "system_command" - elif "open(" in code: - return "file_operation" - elif "print(" in code: - return "output_operation" - else: - return "code_execution" - - def request_approval( - self, code: str, context: Optional[Dict[str, Any]] = None - ) -> Tuple[ApprovalResult, Optional[ApprovalDecision]]: - """Request user approval for code execution.""" - if context is None: - context = {} - - # Analyze risk - risk_analysis = self._analyze_code_risk(code, context) - - # Create request - request = ApprovalRequest( - code=code, - risk_analysis=risk_analysis, - context=context, - timestamp=datetime.now(), - request_id=self._generate_request_id(code), - ) - - # Check user preferences - operation_type = self._get_operation_type(code) - if ( - self.user_preferences.get(operation_type) == "auto_allow" - and risk_analysis.risk_level == RiskLevel.LOW - ): - decision = ApprovalDecision( - request=request, - result=ApprovalResult.ALLOWED, - user_input="auto_allowed", - timestamp=datetime.now(), - ) - self.approval_history.append(decision) - return ApprovalResult.ALLOWED, decision - - # Present request based on risk level - user_response = self._present_approval_request(request) - - # Convert user response to approval result - if user_response == "blocked": - result = ApprovalResult.BLOCKED - elif user_response in ["allowed", "allowed_always"]: - result = ApprovalResult.APPROVED - else: - result = ApprovalResult.DENIED - - # Create decision record - decision = ApprovalDecision( - request=request, - result=result, - user_input=user_response, - timestamp=datetime.now(), - trust_updated=("allowed_always" in user_response), - ) - - # Save decision - self.approval_history.append(decision) - if decision.trust_updated: - self._save_preferences() - - return result, decision - - def get_approval_history(self, limit: int = 10) -> List[ApprovalDecision]: - """Get recent approval history.""" - return self.approval_history[-limit:] - - def get_trust_patterns(self) -> Dict[str, int]: - """Get learned trust patterns.""" - patterns = {} - for decision in self.approval_history: - op_type = self._get_operation_type(decision.request.code) - if decision.result == ApprovalResult.APPROVED: - patterns[op_type] = patterns.get(op_type, 0) + 1 - return patterns - - def reset_preferences(self): - """Reset all user preferences.""" - self.user_preferences.clear() - self._save_preferences() - - def is_code_safe(self, code: str) -> bool: - """Quick check if code is considered safe (no approval needed).""" - risk_analysis = self._analyze_code_risk(code, {}) - return risk_analysis.risk_level == RiskLevel.LOW and len(risk_analysis.reasons) == 0 diff --git a/src/mai/sandbox/audit_logger.py b/src/mai/sandbox/audit_logger.py deleted file mode 100644 index 9eb9b62..0000000 --- a/src/mai/sandbox/audit_logger.py +++ /dev/null @@ -1,442 +0,0 @@ -""" -Audit Logging for Mai Sandbox System - -Provides immutable, append-only logging with sensitive data masking -and tamper detection for sandbox execution audit trails. -""" - -import gzip -import hashlib -import json -import os -import re -import time -from dataclasses import asdict, dataclass -from datetime import datetime -from pathlib import Path -from typing import Any - - -@dataclass -class AuditEntry: - """Single audit log entry""" - - timestamp: str - execution_id: str - code_hash: str - risk_score: int - patterns_detected: list[str] - execution_result: dict[str, Any] - resource_usage: dict[str, Any] | None = None - masked_data: dict[str, str] | None = None - integrity_hash: str | None = None - - -@dataclass -class LogIntegrity: - """Log integrity verification result""" - - is_valid: bool - tampered_entries: list[int] - hash_chain_valid: bool - last_verified: str - - -class AuditLogger: - """ - Provides immutable audit logging with sensitive data masking - and tamper detection for sandbox execution tracking. - """ - - # Patterns for sensitive data masking - SENSITIVE_PATTERNS = [ - (r"\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b", "[EMAIL_REDACTED]"), - (r"\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b", "[IP_REDACTED]"), - (r"password[\\s]*[:=][\\s]*[^\\s]+", "password=[PASSWORD_REDACTED]"), - (r"api[_-]?key[\\s]*[:=][\\s]*[^\\s]+", "api_key=[API_KEY_REDACTED]"), - (r"token[\\s]*[:=][\\s]*[^\\s]+", "token=[TOKEN_REDACTED]"), - (r"secret[\\s]*[:=][\\s]*[^\\s]+", "secret=[SECRET_REDACTED]"), - (r"bearers?\\s+[^\\s]+", "Bearer [TOKEN_REDACTED]"), - (r"\\b(?:\\d{4}[-\\s]?){3}\\d{4}\\b", "[CREDIT_CARD_REDACTED]"), # Basic CC pattern - (r"\\b\\d{3}-?\\d{2}-?\\d{4}\\b", "[SSN_REDACTED]"), - ] - - def __init__(self, log_dir: str | None = None, max_file_size_mb: int = 100): - """ - Initialize audit logger - - Args: - log_dir: Directory for log files (default: .mai/logs) - max_file_size_mb: Maximum file size before rotation - """ - self.log_dir = Path(log_dir or ".mai/logs") - self.max_file_size = max_file_size_mb * 1024 * 1024 # Convert to bytes - self.current_log_file = None - self.previous_hash = None - - # Ensure log directory exists with secure permissions - self.log_dir.mkdir(parents=True, exist_ok=True) - os.chmod(self.log_dir, 0o700) # Only owner can access - - # Initialize log file - self._initialize_log_file() - - def _initialize_log_file(self): - """Initialize or find current log file""" - timestamp = datetime.now().strftime("%Y%m%d") - self.current_log_file = self.log_dir / f"sandbox_audit_{timestamp}.jsonl" - - # Create file if doesn't exist - if not self.current_log_file.exists(): - self.current_log_file.touch() - os.chmod(self.current_log_file, 0o600) # Read/write for owner only - - # Load previous hash for integrity chain - self.previous_hash = self._get_last_hash() - - def log_execution( - self, - code: str, - execution_result: dict[str, Any], - risk_assessment: dict[str, Any] | None = None, - resource_usage: dict[str, Any] | None = None, - ) -> str: - """ - Log code execution with full audit trail - - Args: - code: Executed code string - execution_result: Result of execution - risk_assessment: Risk analysis results - resource_usage: Resource usage during execution - - Returns: - Execution ID for this log entry - """ - # Generate execution ID and timestamp - execution_id = hashlib.sha256(f"{time.time()}{code[:100]}".encode()).hexdigest()[:16] - timestamp = datetime.now().isoformat() - - # Calculate code hash - code_hash = hashlib.sha256(code.encode()).hexdigest() - - # Extract risk information - risk_score = 0 - patterns_detected = [] - if risk_assessment: - risk_score = risk_assessment.get("score", 0) - patterns_detected = [p.get("pattern", "") for p in risk_assessment.get("patterns", [])] - - # Mask sensitive data in code - masked_code, masked_info = self.mask_sensitive_data(code) - - # Create audit entry - entry = AuditEntry( - timestamp=timestamp, - execution_id=execution_id, - code_hash=code_hash, - risk_score=risk_score, - patterns_detected=patterns_detected, - execution_result=execution_result, - resource_usage=resource_usage, - masked_data=masked_info, - integrity_hash=None, # Will be calculated - ) - - # Calculate integrity hash with previous hash - entry.integrity_hash = self._calculate_chain_hash(entry) - - # Write to log file - self._write_entry(entry) - - # Check if rotation needed - if self.current_log_file.stat().st_size > self.max_file_size: - self._rotate_logs() - - return execution_id - - def mask_sensitive_data(self, text: str) -> tuple[str, dict[str, str]]: - """ - Mask sensitive data patterns in text - - Args: - text: Text to mask - - Returns: - Tuple of (masked_text, masking_info) - """ - masked_text = text - masking_info = {} - - for pattern, replacement in self.SENSITIVE_PATTERNS: - matches = re.findall(pattern, masked_text, re.IGNORECASE) - if matches: - masking_info[pattern] = f"Replaced {len(matches)} instances" - masked_text = re.sub(pattern, replacement, masked_text, flags=re.IGNORECASE) - - return masked_text, masking_info - - def rotate_logs(self): - """Rotate current log file with compression""" - if not self.current_log_file.exists(): - return - - # Compress old log - timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") - compressed_file = self.log_dir / f"sandbox_audit_{timestamp}.jsonl.gz" - - with open(self.current_log_file, "rb") as f_in: - with gzip.open(compressed_file, "wb") as f_out: - f_out.writelines(f_in) - - # Remove original - self.current_log_file.unlink() - - # Set secure permissions on compressed file - os.chmod(compressed_file, 0o600) - - # Reinitialize new log file - self._initialize_log_file() - - def verify_integrity(self) -> LogIntegrity: - """ - Verify log file integrity using hash chain - - Returns: - LogIntegrity verification result - """ - if not self.current_log_file.exists(): - return LogIntegrity( - is_valid=False, - tampered_entries=[], - hash_chain_valid=False, - last_verified=datetime.now().isoformat(), - ) - - try: - with open(self.current_log_file) as f: - lines = f.readlines() - - tampered_entries = [] - previous_hash = None - - for i, line in enumerate(lines): - try: - entry_data = json.loads(line.strip()) - expected_hash = entry_data.get("integrity_hash") - - # Recalculate hash without integrity field - entry_data["integrity_hash"] = None - actual_hash = hashlib.sha256( - json.dumps(entry_data, sort_keys=True).encode() - ).hexdigest() - - if previous_hash: - # Include previous hash in calculation - combined = f"{previous_hash}{actual_hash}" - actual_hash = hashlib.sha256(combined.encode()).hexdigest() - - if expected_hash != actual_hash: - tampered_entries.append(i) - - previous_hash = expected_hash - - except (json.JSONDecodeError, KeyError): - tampered_entries.append(i) - - return LogIntegrity( - is_valid=len(tampered_entries) == 0, - tampered_entries=tampered_entries, - hash_chain_valid=len(tampered_entries) == 0, - last_verified=datetime.now().isoformat(), - ) - - except Exception: - return LogIntegrity( - is_valid=False, - tampered_entries=[], - hash_chain_valid=False, - last_verified=datetime.now().isoformat(), - ) - - def query_logs( - self, limit: int = 100, risk_min: int = 0, after: str | None = None - ) -> list[dict[str, Any]]: - """ - Query audit logs with filters - - Args: - limit: Maximum number of entries to return - risk_min: Minimum risk score to include - after: ISO timestamp to filter after - - Returns: - List of matching log entries - """ - if not self.current_log_file.exists(): - return [] - - entries = [] - - try: - with open(self.current_log_file) as f: - for line in f: - if not line.strip(): - continue - - try: - entry = json.loads(line.strip()) - - # Apply filters - if entry.get("risk_score", 0) < risk_min: - continue - - if after and entry.get("timestamp", "") <= after: - continue - - entries.append(entry) - - if len(entries) >= limit: - break - - except json.JSONDecodeError: - continue - - except Exception: - return [] - - # Return in reverse chronological order - return list(reversed(entries[-limit:])) - - def get_execution_by_id(self, execution_id: str) -> dict[str, Any] | None: - """ - Retrieve specific execution by ID - - Args: - execution_id: Unique execution identifier - - Returns: - Log entry or None if not found - """ - entries = self.query_logs(limit=1000) # Get more for search - - for entry in entries: - if entry.get("execution_id") == execution_id: - return entry - - return None - - def _write_entry(self, entry: AuditEntry): - """Write entry to log file""" - try: - with open(self.current_log_file, "a") as f: - # Convert to dict and remove None values - entry_dict = {k: v for k, v in asdict(entry).items() if v is not None} - f.write(json.dumps(entry_dict) + "\\n") - f.flush() # Ensure immediate write - - # Update previous hash - self.previous_hash = entry.integrity_hash - - except Exception as e: - raise RuntimeError(f"Failed to write audit entry: {e}") from e - - def _calculate_chain_hash(self, entry: AuditEntry) -> str: - """Calculate integrity hash for entry with previous hash""" - entry_dict = asdict(entry) - entry_dict["integrity_hash"] = None # Exclude from calculation - - # Create hash of entry data - entry_hash = hashlib.sha256(json.dumps(entry_dict, sort_keys=True).encode()).hexdigest() - - # Chain with previous hash if exists - if self.previous_hash: - combined = f"{self.previous_hash}{entry_hash}" - return hashlib.sha256(combined.encode()).hexdigest() - - return entry_hash - - def _get_last_hash(self) -> str | None: - """Get hash from last entry in log file""" - if not self.current_log_file.exists(): - return None - - try: - with open(self.current_log_file) as f: - lines = f.readlines() - - if not lines: - return None - - last_line = lines[-1].strip() - if not last_line: - return None - - entry = json.loads(last_line) - return entry.get("integrity_hash") - - except (json.JSONDecodeError, FileNotFoundError): - return None - - def _rotate_logs(self): - """Perform log rotation""" - try: - self.rotate_logs() - except Exception as e: - print(f"Log rotation failed: {e}") - - def get_log_stats(self) -> dict[str, Any]: - """ - Get statistics about audit logs - - Returns: - Dictionary with log statistics - """ - if not self.current_log_file.exists(): - return { - "total_entries": 0, - "file_size_bytes": 0, - "high_risk_executions": 0, - "last_execution": None, - } - - try: - with open(self.current_log_file) as f: - lines = f.readlines() - - entries = [] - high_risk_count = 0 - - for line in lines: - if not line.strip(): - continue - - try: - entry = json.loads(line.strip()) - entries.append(entry) - - if entry.get("risk_score", 0) >= 70: - high_risk_count += 1 - - except json.JSONDecodeError: - continue - - file_size = self.current_log_file.stat().st_size - last_execution = entries[-1].get("timestamp") if entries else None - - return { - "total_entries": len(entries), - "file_size_bytes": file_size, - "file_size_mb": file_size / (1024 * 1024), - "high_risk_executions": high_risk_count, - "last_execution": last_execution, - "log_file": str(self.current_log_file), - } - - except Exception: - return { - "total_entries": 0, - "file_size_bytes": 0, - "high_risk_executions": 0, - "last_execution": None, - } diff --git a/src/mai/sandbox/docker_executor.py b/src/mai/sandbox/docker_executor.py deleted file mode 100644 index e754c84..0000000 --- a/src/mai/sandbox/docker_executor.py +++ /dev/null @@ -1,432 +0,0 @@ -""" -Docker Executor for Mai Safe Code Execution - -Provides isolated container execution using Docker with comprehensive -resource limits, security restrictions, and audit logging integration. -""" - -import logging -import tempfile -import time -import uuid -from dataclasses import dataclass -from pathlib import Path -from typing import Any - -try: - import docker - from docker.errors import APIError, ContainerError, DockerException, ImageNotFound - from docker.models.containers import Container - - DOCKER_AVAILABLE = True -except ImportError: - docker = None - Container = None - DockerException = Exception - APIError = Exception - ContainerError = Exception - ImageNotFound = Exception - DOCKER_AVAILABLE = False - -from .audit_logger import AuditLogger - - -@dataclass -class ContainerConfig: - """Configuration for Docker container execution""" - - image: str = "python:3.10-slim" - timeout_seconds: int = 30 - memory_limit: str = "128m" # Docker memory limit format - cpu_limit: str = "0.5" # CPU quota (0.5 = 50% of one CPU) - network_disabled: bool = True - read_only_filesystem: bool = True - tmpfs_size: str = "64m" # Temporary filesystem size - working_dir: str = "/app" - user: str = "nobody" # Non-root user - - -@dataclass -class ContainerResult: - """Result of container execution""" - - success: bool - container_id: str - exit_code: int - stdout: str | None = None - stderr: str | None = None - execution_time: float = 0.0 - error: str | None = None - resource_usage: dict[str, Any] | None = None - - -class DockerExecutor: - """ - Docker-based container executor for isolated code execution. - - Provides secure sandboxing using Docker containers with resource limits, - network restrictions, and comprehensive audit logging. - """ - - def __init__(self, audit_logger: AuditLogger | None = None): - """ - Initialize Docker executor - - Args: - audit_logger: Optional audit logger for execution logging - """ - self.audit_logger = audit_logger - self.client = None - self.available = False - - # Try to initialize Docker client - self._initialize_docker() - - # Setup logging - self.logger = logging.getLogger(__name__) - - def _initialize_docker(self) -> None: - """Initialize Docker client and verify availability""" - if not DOCKER_AVAILABLE: - self.available = False - return - - try: - if docker is not None: - self.client = docker.from_env() - # Test Docker connection - self.client.ping() - self.available = True - else: - self.available = False - self.client = None - except Exception as e: - self.logger.warning(f"Docker not available: {e}") - self.available = False - self.client = None - - def is_available(self) -> bool: - """Check if Docker executor is available""" - return self.available and self.client is not None - - def execute_code( - self, - code: str, - config: ContainerConfig | None = None, - environment: dict[str, str] | None = None, - files: dict[str, str] | None = None, - ) -> ContainerResult: - """ - Execute code in isolated Docker container - - Args: - code: Python code to execute - config: Container configuration - environment: Environment variables - files: Additional files to mount in container - - Returns: - ContainerResult with execution details - """ - if not self.is_available() or self.client is None: - return ContainerResult( - success=False, container_id="", exit_code=-1, error="Docker executor not available" - ) - - config = config or ContainerConfig() - container_id = str(uuid.uuid4())[:8] - start_time = time.time() - - try: - # Create temporary directory for files - with tempfile.TemporaryDirectory() as temp_dir: - temp_path = Path(temp_dir) - - # Write code to file - code_file = temp_path / "execute.py" - code_file.write_text(code) - - # Prepare volume mounts - volumes = { - str(code_file): { - "bind": f"{config.working_dir}/execute.py", - "mode": "ro", # read-only - } - } - - # Add additional files if provided - if files: - for filename, content in files.items(): - file_path = temp_path / filename - file_path.write_text(content) - volumes[str(file_path)] = { - "bind": f"{config.working_dir}/{filename}", - "mode": "ro", - } - - # Prepare container configuration - container_config = self._build_container_config(config, environment) - - # Create and start container - container = self.client.containers.run( - image=config.image, - command=["python", "execute.py"], - volumes=volumes, - **container_config, - detach=True, - ) - - # Get container ID safely - container_id = getattr(container, "id", container_id) - - try: - # Wait for completion with timeout - result = container.wait(timeout=config.timeout_seconds) - exit_code = result["StatusCode"] - - # Get logs - stdout = container.logs(stdout=True, stderr=False).decode("utf-8") - stderr = container.logs(stdout=False, stderr=True).decode("utf-8") - - # Get resource usage stats - stats = self._get_container_stats(container) - - # Determine success - success = exit_code == 0 and not stderr - - execution_result = ContainerResult( - success=success, - container_id=container_id, - exit_code=exit_code, - stdout=stdout, - stderr=stderr, - execution_time=time.time() - start_time, - resource_usage=stats, - ) - - # Log execution if audit logger available - if self.audit_logger: - self._log_container_execution(code, execution_result, config) - - return execution_result - - finally: - # Always cleanup container - try: - container.remove(force=True) - except Exception: - pass # Best effort cleanup - - except ContainerError as e: - return ContainerResult( - success=False, - container_id=container_id or "unknown", - exit_code=getattr(e, "exit_code", -1), - stderr=str(e), - execution_time=time.time() - start_time, - error=f"Container execution error: {e}", - ) - - except ImageNotFound as e: - return ContainerResult( - success=False, - container_id=container_id, - exit_code=-1, - error=f"Docker image not found: {e}", - ) - - except APIError as e: - return ContainerResult( - success=False, - container_id=container_id, - exit_code=-1, - error=f"Docker API error: {e}", - ) - - except Exception as e: - return ContainerResult( - success=False, - container_id=container_id, - exit_code=-1, - execution_time=time.time() - start_time, - error=f"Unexpected error: {e}", - ) - - def _build_container_config( - self, config: ContainerConfig, environment: dict[str, str] | None = None - ) -> dict[str, Any]: - """Build Docker container configuration""" - container_config = { - "mem_limit": config.memory_limit, - "cpu_quota": int(float(config.cpu_limit) * 100000), # Convert to microseconds - "cpu_period": 100000, # 100ms period - "network_disabled": config.network_disabled, - "read_only": config.read_only_filesystem, - "tmpfs": {"/tmp": f"size={config.tmpfs_size},noexec,nosuid,nodev"}, - "user": config.user, - "working_dir": config.working_dir, - "remove": True, # Auto-remove container - } - - # Add environment variables - if environment: - container_config["environment"] = { - **environment, - "PYTHONPATH": config.working_dir, - "PYTHONDONTWRITEBYTECODE": "1", - } - else: - container_config["environment"] = { - "PYTHONPATH": config.working_dir, - "PYTHONDONTWRITEBYTECODE": "1", - } - - # Security options - container_config["security_opt"] = [ - "no-new-privileges:true", - "seccomp:unconfined", # Python needs some syscalls - ] - - # Capabilities (drop all capabilities) - container_config["cap_drop"] = ["ALL"] - container_config["cap_add"] = ["CHOWN", "DAC_OVERRIDE"] # Minimal capabilities for Python - - return container_config - - def _get_container_stats(self, container) -> dict[str, Any]: - """Get resource usage statistics from container""" - try: - stats = container.stats(stream=False) - - # Calculate CPU usage - cpu_stats = stats.get("cpu_stats", {}) - precpu_stats = stats.get("precpu_stats", {}) - - cpu_usage = cpu_stats.get("cpu_usage", {}).get("total_usage", 0) - precpu_usage = precpu_stats.get("cpu_usage", {}).get("total_usage", 0) - - system_usage = cpu_stats.get("system_cpu_usage", 0) - presystem_usage = precpu_stats.get("system_cpu_usage", 0) - - cpu_count = cpu_stats.get("online_cpus", 1) - - cpu_percent = 0.0 - if system_usage > presystem_usage: - cpu_delta = cpu_usage - precpu_usage - system_delta = system_usage - presystem_usage - cpu_percent = (cpu_delta / system_delta) * cpu_count * 100.0 - - # Calculate memory usage - memory_stats = stats.get("memory_stats", {}) - memory_usage = memory_stats.get("usage", 0) - memory_limit = memory_stats.get("limit", 1) - memory_percent = (memory_usage / memory_limit) * 100.0 - - return { - "cpu_percent": round(cpu_percent, 2), - "memory_usage_bytes": memory_usage, - "memory_limit_bytes": memory_limit, - "memory_percent": round(memory_percent, 2), - "memory_usage_mb": round(memory_usage / (1024 * 1024), 2), - } - - except Exception: - return { - "cpu_percent": 0.0, - "memory_usage_bytes": 0, - "memory_limit_bytes": 0, - "memory_percent": 0.0, - "memory_usage_mb": 0.0, - } - - def _log_container_execution( - self, code: str, result: ContainerResult, config: ContainerConfig - ) -> None: - """Log container execution to audit logger""" - if not self.audit_logger: - return - - execution_data = { - "type": "docker_container", - "container_id": result.container_id, - "exit_code": result.exit_code, - "stdout": result.stdout, - "stderr": result.stderr, - "execution_time": result.execution_time, - "config": { - "image": config.image, - "timeout": config.timeout_seconds, - "memory_limit": config.memory_limit, - "cpu_limit": config.cpu_limit, - "network_disabled": config.network_disabled, - "read_only_filesystem": config.read_only_filesystem, - }, - "resource_usage": result.resource_usage, - } - - # Note: execution_type parameter not available in current AuditLogger - self.audit_logger.log_execution(code=code, execution_result=execution_data) - - def get_available_images(self) -> list[str]: - """Get list of available Docker images""" - if not self.is_available() or self.client is None: - return [] - - try: - images = self.client.images.list() - return [img.tags[0] for img in images if img.tags] - except Exception: - return [] - - def pull_image(self, image_name: str) -> bool: - """Pull Docker image""" - if not self.is_available() or self.client is None: - return False - - try: - self.client.images.pull(image_name) - return True - except Exception: - return False - - def cleanup_containers(self) -> int: - """Clean up any dangling containers""" - if not self.is_available() or self.client is None: - return 0 - - try: - containers = self.client.containers.list(all=True, filters={"status": "exited"}) - count = 0 - for container in containers: - try: - container.remove(force=True) - count += 1 - except Exception: - pass - return count - except Exception: - return 0 - - def get_system_info(self) -> dict[str, Any]: - """Get Docker system information""" - if not self.is_available() or self.client is None: - return {"available": False} - - try: - info = self.client.info() - version = self.client.version() - - return { - "available": True, - "version": version.get("Version", "unknown"), - "api_version": version.get("ApiVersion", "unknown"), - "containers": info.get("Containers", 0), - "containers_running": info.get("ContainersRunning", 0), - "containers_paused": info.get("ContainersPaused", 0), - "containers_stopped": info.get("ContainersStopped", 0), - "images": info.get("Images", 0), - "memory_total": info.get("MemTotal", 0), - "ncpu": info.get("NCPU", 0), - } - except Exception: - return {"available": False, "error": "Failed to get system info"} diff --git a/src/mai/sandbox/manager.py b/src/mai/sandbox/manager.py deleted file mode 100644 index 1b9cbbc..0000000 --- a/src/mai/sandbox/manager.py +++ /dev/null @@ -1,439 +0,0 @@ -""" -Sandbox Manager for Mai Safe Code Execution - -Central orchestrator for sandbox execution, integrating risk analysis, -resource enforcement, and audit logging for safe code execution. -""" - -import time -import uuid -from dataclasses import dataclass -from typing import Any - -from .audit_logger import AuditLogger -from .docker_executor import ContainerConfig, ContainerResult, DockerExecutor -from .resource_enforcer import ResourceEnforcer, ResourceLimits, ResourceUsage -from .risk_analyzer import RiskAnalyzer, RiskAssessment - - -@dataclass -class ExecutionRequest: - """Request for sandbox code execution""" - - code: str - environment: dict[str, str] | None = None - timeout_seconds: int = 30 - cpu_limit_percent: float = 70.0 - memory_limit_percent: float = 70.0 - network_allowed: bool = False - filesystem_restricted: bool = True - use_docker: bool = True - docker_image: str = "python:3.10-slim" - additional_files: dict[str, str] | None = None - - -@dataclass -class ExecutionResult: - """Result of sandbox execution""" - - success: bool - execution_id: str - output: str | None = None - error: str | None = None - risk_assessment: RiskAssessment | None = None - resource_usage: ResourceUsage | None = None - execution_time: float = 0.0 - audit_entry_id: str | None = None - execution_method: str = "local" # "local", "docker", "fallback" - container_result: ContainerResult | None = None - - -class SandboxManager: - """ - Central sandbox orchestrator that coordinates risk analysis, - resource enforcement, and audit logging for safe code execution. - """ - - def __init__(self, log_dir: str | None = None): - """ - Initialize sandbox manager - - Args: - log_dir: Directory for audit logs - """ - self.risk_analyzer = RiskAnalyzer() - self.resource_enforcer = ResourceEnforcer() - self.audit_logger = AuditLogger(log_dir=log_dir) - self.docker_executor = DockerExecutor(audit_logger=self.audit_logger) - - # Execution state - self.active_executions: dict[str, dict[str, Any]] = {} - - def execute_code(self, request: ExecutionRequest) -> ExecutionResult: - """ - Execute code in sandbox with full safety checks - - Args: - request: ExecutionRequest with code and constraints - - Returns: - ExecutionResult with execution details - """ - execution_id = str(uuid.uuid4())[:8] - start_time = time.time() - - try: - # Step 1: Risk analysis - risk_assessment = self.risk_analyzer.analyze_ast(request.code) - - # Step 2: Check if execution is allowed - if not self._is_execution_allowed(risk_assessment): - result = ExecutionResult( - success=False, - execution_id=execution_id, - error=( - f"Code execution blocked: Risk score {risk_assessment.score} " - "exceeds safe threshold" - ), - risk_assessment=risk_assessment, - execution_time=time.time() - start_time, - ) - - # Log blocked execution - self._log_execution(request, result, risk_assessment) - return result - - # Step 3: Set resource limits - resource_limits = ResourceLimits( - cpu_percent=request.cpu_limit_percent, - memory_percent=request.memory_limit_percent, - timeout_seconds=request.timeout_seconds, - ) - - self.resource_enforcer.set_limits(resource_limits) - self.resource_enforcer.start_monitoring() - - # Step 4: Choose execution method and execute code - execution_method = ( - "docker" if request.use_docker and self.docker_executor.is_available() else "local" - ) - - if execution_method == "docker": - execution_result = self._execute_in_docker(request, execution_id) - else: - execution_result = self._execute_in_sandbox(request, execution_id) - execution_method = "local" - - # Step 5: Get resource usage (for local execution) - if execution_method == "local": - resource_usage = self.resource_enforcer.stop_monitoring() - else: - resource_usage = None # Docker provides its own resource usage - - # Step 6: Create result - result = ExecutionResult( - success=execution_result.get("success", False), - execution_id=execution_id, - output=execution_result.get("output"), - error=execution_result.get("error"), - risk_assessment=risk_assessment, - resource_usage=resource_usage, - execution_time=time.time() - start_time, - execution_method=execution_method, - container_result=execution_result.get("container_result"), - ) - - # Step 7: Log execution - audit_id = self._log_execution(request, result, risk_assessment, resource_usage) - result.audit_entry_id = audit_id - - return result - - except Exception as e: - # Handle unexpected errors - result = ExecutionResult( - success=False, - execution_id=execution_id, - error=f"Sandbox execution error: {str(e)}", - execution_time=time.time() - start_time, - ) - - # Log error - self._log_execution(request, result) - return result - - finally: - # Cleanup - self.resource_enforcer.stop_monitoring() - - def check_risk(self, code: str) -> RiskAssessment: - """ - Perform risk analysis on code - - Args: - code: Code to analyze - - Returns: - RiskAssessment with detailed analysis - """ - return self.risk_analyzer.analyze_ast(code) - - def enforce_limits(self, limits: ResourceLimits) -> bool: - """ - Set resource limits for execution - - Args: - limits: Resource limits to enforce - - Returns: - True if limits were set successfully - """ - return self.resource_enforcer.set_limits(limits) - - def log_execution( - self, - code: str, - execution_result: dict[str, Any], - risk_assessment: dict[str, Any] | None = None, - resource_usage: dict[str, Any] | None = None, - ) -> str: - """ - Log execution details to audit trail - - Args: - code: Executed code - execution_result: Result of execution - risk_assessment: Risk analysis results - resource_usage: Resource usage statistics - - Returns: - Audit entry ID - """ - return self.audit_logger.log_execution( - code=code, - execution_result=execution_result, - risk_assessment=risk_assessment, - resource_usage=resource_usage, - ) - - def get_execution_history( - self, limit: int = 50, min_risk_score: int = 0 - ) -> list[dict[str, Any]]: - """ - Get execution history from audit logs - - Args: - limit: Maximum entries to return - min_risk_score: Minimum risk score filter - - Returns: - List of execution entries - """ - return self.audit_logger.query_logs(limit=limit, risk_min=min_risk_score) - - def verify_log_integrity(self) -> bool: - """ - Verify audit log integrity - - Returns: - True if logs are intact - """ - integrity = self.audit_logger.verify_integrity() - return integrity.is_valid - - def get_system_status(self) -> dict[str, Any]: - """ - Get current sandbox system status - - Returns: - Dictionary with system status - """ - return { - "active_executions": len(self.active_executions), - "resource_monitoring": self.resource_enforcer.monitoring_active, - "current_usage": self.resource_enforcer.monitor_usage(), - "log_stats": self.audit_logger.get_log_stats(), - "log_integrity": self.verify_log_integrity(), - "docker_available": self.docker_executor.is_available(), - "docker_info": self.docker_executor.get_system_info(), - } - - def get_docker_status(self) -> dict[str, Any]: - """ - Get Docker executor status and available images - - Returns: - Dictionary with Docker status - """ - return { - "available": self.docker_executor.is_available(), - "images": self.docker_executor.get_available_images(), - "system_info": self.docker_executor.get_system_info(), - } - - def pull_docker_image(self, image_name: str) -> bool: - """ - Pull a Docker image for execution - - Args: - image_name: Name of the Docker image to pull - - Returns: - True if image was pulled successfully - """ - return self.docker_executor.pull_image(image_name) - - def cleanup_docker_containers(self) -> int: - """ - Clean up any dangling Docker containers - - Returns: - Number of containers cleaned up - """ - return self.docker_executor.cleanup_containers() - - def _is_execution_allowed(self, risk_assessment: RiskAssessment) -> bool: - """ - Determine if execution is allowed based on risk assessment - - Args: - risk_assessment: Risk analysis result - - Returns: - True if execution is allowed - """ - # Block if any BLOCKED patterns detected - blocked_patterns = [p for p in risk_assessment.patterns if p.severity == "BLOCKED"] - if blocked_patterns: - return False - - # Require approval for HIGH risk - if risk_assessment.score >= 70: - return False # Would require user approval in full implementation - - return True - - def _execute_in_docker(self, request: ExecutionRequest, execution_id: str) -> dict[str, Any]: - """ - Execute code in Docker container - - Args: - request: Execution request - execution_id: Unique execution identifier - - Returns: - Dictionary with execution result - """ - # Create container configuration based on request - config = ContainerConfig( - image=request.docker_image, - timeout_seconds=request.timeout_seconds, - memory_limit=f"{int(request.memory_limit_percent * 128 / 100)}m", # Scale to container - cpu_limit=str(request.cpu_limit_percent / 100), - network_disabled=not request.network_allowed, - read_only_filesystem=request.filesystem_restricted, - ) - - # Execute in Docker container - container_result = self.docker_executor.execute_code( - code=request.code, - config=config, - environment=request.environment, - files=request.additional_files, - ) - - return { - "success": container_result.success, - "output": container_result.stdout, - "error": container_result.stderr or container_result.error, - "container_result": container_result, - } - - def _execute_in_sandbox(self, request: ExecutionRequest, execution_id: str) -> dict[str, Any]: - """ - Execute code in local sandbox environment (fallback) - - Args: - request: Execution request - execution_id: Unique execution identifier - - Returns: - Dictionary with execution result - """ - try: - # For now, just simulate execution with eval (NOT PRODUCTION SAFE) - # This would be replaced with proper sandbox execution - if request.code.strip().startswith("print"): - # Simple print statement - result = eval(request.code) - return {"success": True, "output": str(result)} - else: - # For safety, don't execute arbitrary code in this demo - return {"success": False, "error": "Code execution not implemented in demo mode"} - - except Exception as e: - return {"success": False, "error": f"Execution error: {str(e)}"} - - def _log_execution( - self, - request: ExecutionRequest, - result: ExecutionResult, - risk_assessment: RiskAssessment | None = None, - resource_usage: ResourceUsage | None = None, - ) -> str: - """ - Internal method to log execution - - Args: - request: Execution request - result: Execution result - risk_assessment: Risk analysis - resource_usage: Resource usage - - Returns: - Audit entry ID - """ - # Prepare execution result for logging - execution_result = { - "success": result.success, - "output": result.output, - "error": result.error, - "execution_time": result.execution_time, - } - - # Prepare risk assessment for logging - risk_data = None - if risk_assessment: - risk_data = { - "score": risk_assessment.score, - "patterns": [ - { - "pattern": p.pattern, - "severity": p.severity, - "score": p.score, - "line_number": p.line_number, - "description": p.description, - } - for p in risk_assessment.patterns - ], - "safe_to_execute": risk_assessment.safe_to_execute, - "approval_required": risk_assessment.approval_required, - } - - # Prepare resource usage for logging - usage_data = None - if resource_usage: - usage_data = { - "cpu_percent": resource_usage.cpu_percent, - "memory_percent": resource_usage.memory_percent, - "memory_used_gb": resource_usage.memory_used_gb, - "elapsed_seconds": resource_usage.elapsed_seconds, - "approaching_limits": resource_usage.approaching_limits, - } - - return self.audit_logger.log_execution( - code=request.code, - execution_result=execution_result, - risk_assessment=risk_data, - resource_usage=usage_data, - ) diff --git a/src/mai/sandbox/resource_enforcer.py b/src/mai/sandbox/resource_enforcer.py deleted file mode 100644 index f007ac0..0000000 --- a/src/mai/sandbox/resource_enforcer.py +++ /dev/null @@ -1,337 +0,0 @@ -""" -Resource Enforcement for Mai Sandbox System - -Provides percentage-based resource limit enforcement -building on existing Phase 1 monitoring infrastructure. -""" - -import sys -import threading -import time -from dataclasses import dataclass -from pathlib import Path -from typing import Any - - -@dataclass -class ResourceLimits: - """Resource limit configuration""" - - cpu_percent: float - memory_percent: float - timeout_seconds: int - network_bandwidth_mbps: float | None = None - - -@dataclass -class ResourceUsage: - """Current resource usage statistics""" - - cpu_percent: float - memory_percent: float - memory_used_gb: float - elapsed_seconds: float - approaching_limits: dict[str, bool] - - -class ResourceEnforcer: - """ - Enforces resource limits for sandbox execution. - Builds on Phase 1 ResourceDetector for percentage-based limits. - """ - - def __init__(self): - """Initialize resource enforcer""" - # Try to import existing resource monitoring from Phase 1 - try: - sys.path.append(str(Path(__file__).parent.parent / "model")) - from resource_detector import ResourceDetector - - self.resource_detector = ResourceDetector() - except ImportError: - # Fallback implementation - self.resource_detector = None - - self.current_limits: ResourceLimits | None = None - self.start_time: float | None = None - self.timeout_timer: threading.Timer | None = None - self.monitoring_active: bool = False - - def set_cpu_limit(self, percent: float) -> float: - """ - Calculate CPU limit as percentage of available resources - - Args: - percent: Desired CPU limit (0-100) - - Returns: - Actual CPU limit percentage - """ - if not 0 <= percent <= 100: - raise ValueError("CPU percent must be between 0 and 100") - - # Calculate effective limit - cpu_limit = min(percent, 100.0) - - return cpu_limit - - def set_memory_limit(self, percent: float) -> float: - """ - Calculate memory limit as percentage of available resources - - Args: - percent: Desired memory limit (0-100) - - Returns: - Actual memory limit percentage - """ - if not 0 <= percent <= 100: - raise ValueError("Memory percent must be between 0 and 100") - - # Calculate effective limit - if self.resource_detector: - try: - resource_info = self.resource_detector.get_current_usage() - memory_limit = min( - percent, - resource_info.memory_percent - + (resource_info.memory_available_gb / resource_info.memory_total_gb * 100), - ) - return memory_limit - except Exception: - pass - - # Fallback - memory_limit = min(percent, 100.0) - return memory_limit - - def set_limits(self, limits: ResourceLimits) -> bool: - """ - Set comprehensive resource limits - - Args: - limits: ResourceLimits configuration - - Returns: - True if limits were successfully set - """ - try: - self.current_limits = limits - return True - except Exception as e: - print(f"Failed to set limits: {e}") - return False - - def enforce_timeout(self, seconds: int) -> bool: - """ - Enforce execution timeout using signal alarm - - Args: - seconds: Timeout in seconds - - Returns: - True if timeout was set successfully - """ - try: - if self.timeout_timer: - self.timeout_timer.cancel() - - # Create timeout handler - def timeout_handler(): - raise TimeoutError(f"Execution exceeded {seconds} second timeout") - - # Set timer (cross-platform alternative to signal.alarm) - self.timeout_timer = threading.Timer(seconds, timeout_handler) - self.timeout_timer.daemon = True - self.timeout_timer.start() - - return True - except Exception as e: - print(f"Failed to set timeout: {e}") - return False - - def start_monitoring(self) -> bool: - """ - Start resource monitoring for an execution session - - Returns: - True if monitoring started successfully - """ - try: - self.start_time = time.time() - self.monitoring_active = True - return True - except Exception as e: - print(f"Failed to start monitoring: {e}") - return False - - def stop_monitoring(self) -> ResourceUsage: - """ - Stop monitoring and return usage statistics - - Returns: - ResourceUsage with execution statistics - """ - if not self.monitoring_active: - raise RuntimeError("Monitoring not active") - - # Stop timeout timer - if self.timeout_timer: - self.timeout_timer.cancel() - self.timeout_timer = None - - # Calculate usage - end_time = time.time() - elapsed = end_time - (self.start_time or 0) - - # Get current resource info - cpu_percent = 0.0 - memory_percent = 0.0 - memory_used_gb = 0.0 - memory_total_gb = 0.0 - - if self.resource_detector: - try: - current_info = self.resource_detector.get_current_usage() - cpu_percent = current_info.cpu_percent - memory_percent = current_info.memory_percent - memory_used_gb = current_info.memory_total_gb - current_info.memory_available_gb - except Exception: - pass # Use fallback values - - # Check approaching limits - approaching = {} - if self.current_limits: - approaching["cpu"] = cpu_percent > self.current_limits.cpu_percent * 0.8 - approaching["memory"] = memory_percent > self.current_limits.memory_percent * 0.8 - approaching["timeout"] = elapsed > self.current_limits.timeout_seconds * 0.8 - - usage = ResourceUsage( - cpu_percent=cpu_percent, - memory_percent=memory_percent, - memory_used_gb=memory_used_gb, - elapsed_seconds=elapsed, - approaching_limits=approaching, - ) - - self.monitoring_active = False - return usage - - def monitor_usage(self) -> dict[str, Any]: - """ - Get current resource usage statistics - - Returns: - Dictionary with current usage metrics - """ - # Get current resource info - cpu_percent = 0.0 - memory_percent = 0.0 - memory_used_gb = 0.0 - memory_available_gb = 0.0 - memory_total_gb = 0.0 - gpu_available = False - gpu_memory_gb = None - gpu_usage_percent = None - - if self.resource_detector: - try: - current_info = self.resource_detector.get_current_usage() - cpu_percent = current_info.cpu_percent - memory_percent = current_info.memory_percent - memory_used_gb = current_info.memory_total_gb - current_info.memory_available_gb - memory_available_gb = current_info.memory_available_gb - memory_total_gb = current_info.memory_total_gb - gpu_available = current_info.gpu_available - gpu_memory_gb = current_info.gpu_memory_gb - gpu_usage_percent = current_info.gpu_usage_percent - except Exception: - pass - - usage = { - "cpu_percent": cpu_percent, - "memory_percent": memory_percent, - "memory_used_gb": memory_used_gb, - "memory_available_gb": memory_available_gb, - "memory_total_gb": memory_total_gb, - "gpu_available": gpu_available, - "gpu_memory_gb": gpu_memory_gb, - "gpu_usage_percent": gpu_usage_percent, - "monitoring_active": self.monitoring_active, - } - - if self.monitoring_active and self.start_time: - usage["elapsed_seconds"] = time.time() - self.start_time - - return usage - - def check_limits(self) -> dict[str, bool]: - """ - Check if current usage exceeds or approaches limits - - Returns: - Dictionary of limit check results - """ - if not self.current_limits: - return {"limits_set": False} - - # Get current resource info - cpu_percent = 0.0 - memory_percent = 0.0 - - if self.resource_detector: - try: - current_info = self.resource_detector.get_current_usage() - cpu_percent = current_info.cpu_percent - memory_percent = current_info.memory_percent - except Exception: - pass - - checks = { - "limits_set": True, - "cpu_exceeded": cpu_percent > self.current_limits.cpu_percent, - "memory_exceeded": memory_percent > self.current_limits.memory_percent, - "cpu_approaching": cpu_percent > self.current_limits.cpu_percent * 0.8, - "memory_approaching": memory_percent > self.current_limits.memory_percent * 0.8, - } - - if self.monitoring_active and self.start_time: - elapsed = time.time() - self.start_time - checks["timeout_exceeded"] = elapsed > self.current_limits.timeout_seconds - checks["timeout_approaching"] = elapsed > self.current_limits.timeout_seconds * 0.8 - - return checks - - def graceful_degradation_warning(self) -> str | None: - """ - Generate warning if approaching resource limits - - Returns: - Warning message or None if safe - """ - checks = self.check_limits() - - if not checks["limits_set"]: - return None - - warnings = [] - - if checks["cpu_approaching"]: - warnings.append(f"CPU usage approaching limit ({self.current_limits.cpu_percent}%)") - - if checks["memory_approaching"]: - warnings.append( - f"Memory usage approaching limit ({self.current_limits.memory_percent}%)" - ) - - if self.monitoring_active and self.start_time: - elapsed = time.time() - self.start_time - if elapsed > self.current_limits.timeout_seconds * 0.8: - warnings.append( - f"Execution approaching timeout ({self.current_limits.timeout_seconds}s)" - ) - - if warnings: - return "Warning: " + "; ".join(warnings) + ". Consider reducing execution scope." - - return None diff --git a/src/mai/sandbox/risk_analyzer.py b/src/mai/sandbox/risk_analyzer.py deleted file mode 100644 index 55bcf2d..0000000 --- a/src/mai/sandbox/risk_analyzer.py +++ /dev/null @@ -1,260 +0,0 @@ -""" -Risk Analysis for Mai Sandbox System - -Provides AST-based code analysis to detect dangerous patterns -and calculate risk scores for code execution decisions. -""" - -import ast -import re -from dataclasses import dataclass - - -@dataclass -class RiskPattern: - """Represents a detected risky code pattern""" - - pattern: str - severity: str # 'BLOCKED', 'HIGH', 'MEDIUM', 'LOW' - score: int - line_number: int - description: str - - -@dataclass -class RiskAssessment: - """Result of risk analysis""" - - score: int - patterns: list[RiskPattern] - safe_to_execute: bool - approval_required: bool - - -class RiskAnalyzer: - """ - Analyzes code for dangerous patterns using AST parsing - and static analysis techniques. - """ - - # Severity scores and risk thresholds - SEVERITY_SCORES = {"BLOCKED": 100, "HIGH": 80, "MEDIUM": 50, "LOW": 20} - - # Known dangerous patterns - DANGEROUS_IMPORTS = { - "os.system": ("BLOCKED", "Direct system command execution"), - "os.popen": ("BLOCKED", "Direct system command execution"), - "subprocess.run": ("HIGH", "Subprocess execution"), - "subprocess.call": ("HIGH", "Subprocess execution"), - "subprocess.Popen": ("HIGH", "Subprocess execution"), - "eval": ("HIGH", "Dynamic code execution"), - "exec": ("HIGH", "Dynamic code execution"), - "compile": ("MEDIUM", "Code compilation"), - "__import__": ("MEDIUM", "Dynamic import"), - "open": ("LOW", "File access"), - "shutil.rmtree": ("HIGH", "Directory deletion"), - "os.remove": ("HIGH", "File deletion"), - "os.unlink": ("HIGH", "File deletion"), - "os.mkdir": ("LOW", "Directory creation"), - "os.chdir": ("MEDIUM", "Directory change"), - } - - # Regex patterns for additional checks - REGEX_PATTERNS = [ - (r"/dev/[^\\s]+", "BLOCKED", "Device file access"), - (r"rm\\s+-rf\\s+/", "BLOCKED", "Recursive root deletion"), - (r"shell=True", "HIGH", "Shell execution in subprocess"), - (r"password", "MEDIUM", "Potential password handling"), - (r"api[_-]?key", "MEDIUM", "Potential API key handling"), - (r"chmod\\s+777", "HIGH", "Permissive file permissions"), - (r"sudo\\s+", "HIGH", "Privilege escalation"), - ] - - def __init__(self): - """Initialize risk analyzer""" - self.reset_analysis() - - def reset_analysis(self): - """Reset analysis state""" - self.detected_patterns: list[RiskPattern] = [] - - def analyze_ast(self, code: str) -> RiskAssessment: - """ - Analyze Python code using AST parsing - - Args: - code: Python source code to analyze - - Returns: - RiskAssessment with score, patterns, and execution decision - """ - self.reset_analysis() - - try: - tree = ast.parse(code) - self._walk_ast(tree) - except SyntaxError as e: - # Syntax errors are automatically high risk - pattern = RiskPattern( - pattern="syntax_error", - severity="HIGH", - score=90, - line_number=getattr(e, "lineno", 0), - description=f"Syntax error: {e}", - ) - self.detected_patterns.append(pattern) - - # Additional regex-based checks - self._regex_checks(code) - - # Calculate overall assessment - total_score = max([p.score for p in self.detected_patterns] + [0]) - - assessment = RiskAssessment( - score=total_score, - patterns=self.detected_patterns.copy(), - safe_to_execute=total_score < 50, - approval_required=total_score >= 30, - ) - - return assessment - - def detect_dangerous_patterns(self, code: str) -> list[RiskPattern]: - """ - Detect dangerous patterns using both AST and regex analysis - - Args: - code: Python source code - - Returns: - List of detected RiskPattern objects - """ - assessment = self.analyze_ast(code) - return assessment.patterns - - def calculate_risk_score(self, patterns: list[RiskPattern]) -> int: - """ - Calculate overall risk score from detected patterns - - Args: - patterns: List of detected risk patterns - - Returns: - Overall risk score (0-100) - """ - if not patterns: - return 0 - - return max([p.score for p in patterns]) - - def _walk_ast(self, tree: ast.AST): - """Walk AST tree and detect dangerous patterns""" - for node in ast.walk(tree): - self._check_imports(node) - self._check_function_calls(node) - self._check_file_operations(node) - - def _check_imports(self, node: ast.AST): - """Check for dangerous imports""" - if isinstance(node, ast.Import): - for alias in node.names: - name = alias.name - if name in self.DANGEROUS_IMPORTS: - severity, desc = self.DANGEROUS_IMPORTS[name] - pattern = RiskPattern( - pattern=f"import_{name}", - severity=severity, - score=self.SEVERITY_SCORES[severity], - line_number=getattr(node, "lineno", 0), - description=f"Import of {desc}", - ) - self.detected_patterns.append(pattern) - - elif isinstance(node, ast.ImportFrom): - if node.module and node.module in self.DANGEROUS_IMPORTS: - name = node.module - severity, desc = self.DANGEROUS_IMPORTS[name] - pattern = RiskPattern( - pattern=f"from_{name}", - severity=severity, - score=self.SEVERITY_SCORES[severity], - line_number=getattr(node, "lineno", 0), - description=f"Import from {desc}", - ) - self.detected_patterns.append(pattern) - - def _check_function_calls(self, node: ast.AST): - """Check for dangerous function calls""" - if isinstance(node, ast.Call): - # Get function name - func_name = self._get_function_name(node.func) - if func_name in self.DANGEROUS_IMPORTS: - severity, desc = self.DANGEROUS_IMPORTS[func_name] - pattern = RiskPattern( - pattern=f"call_{func_name}", - severity=severity, - score=self.SEVERITY_SCORES[severity], - line_number=getattr(node, "lineno", 0), - description=f"Call to {desc}", - ) - self.detected_patterns.append(pattern) - - # Check for shell=True in subprocess calls - if func_name in ["subprocess.run", "subprocess.call", "subprocess.Popen"]: - for keyword in node.keywords: - if keyword.arg == "shell" and isinstance(keyword.value, ast.Constant): - if keyword.value.value is True: - pattern = RiskPattern( - pattern="shell_true", - severity="HIGH", - score=self.SEVERITY_SCORES["HIGH"], - line_number=getattr(node, "lineno", 0), - description="Shell execution in subprocess", - ) - self.detected_patterns.append(pattern) - - def _check_file_operations(self, node: ast.AST): - """Check for dangerous file operations""" - if isinstance(node, ast.Call): - func_name = self._get_function_name(node.func) - dangerous_file_ops = ["shutil.rmtree", "os.remove", "os.unlink", "os.chmod", "os.chown"] - if func_name in dangerous_file_ops: - severity = "HIGH" if "rmtree" in func_name else "MEDIUM" - pattern = RiskPattern( - pattern=f"file_{func_name}", - severity=severity, - score=self.SEVERITY_SCORES[severity], - line_number=getattr(node, "lineno", 0), - description=f"Dangerous file operation: {func_name}", - ) - self.detected_patterns.append(pattern) - - def _get_function_name(self, node: ast.AST) -> str: - """Extract function name from AST node""" - if isinstance(node, ast.Name): - return node.id - elif isinstance(node, ast.Attribute): - attr = [] - while isinstance(node, ast.Attribute): - attr.append(node.attr) - node = node.value - if isinstance(node, ast.Name): - attr.append(node.id) - return ".".join(reversed(attr)) - return "" - - def _regex_checks(self, code: str): - """Perform regex-based pattern detection""" - lines = code.split("\\n") - - for pattern_str, severity, description in self.REGEX_PATTERNS: - for line_num, line in enumerate(lines, 1): - if re.search(pattern_str, line, re.IGNORECASE): - pattern = RiskPattern( - pattern=pattern_str, - severity=severity, - score=self.SEVERITY_SCORES[severity], - line_number=line_num, - description=f"Regex detected: {description}", - ) - self.detected_patterns.append(pattern) diff --git a/tests/test_docker_executor.py b/tests/test_docker_executor.py deleted file mode 100644 index 4b0b45e..0000000 --- a/tests/test_docker_executor.py +++ /dev/null @@ -1,378 +0,0 @@ -""" -Tests for Docker Executor component - -Test suite for Docker-based container execution with isolation, -resource limits, and audit logging integration. -""" - -import pytest -import tempfile -from unittest.mock import Mock, patch, MagicMock -from pathlib import Path - -# Import components under test -from src.mai.sandbox.docker_executor import DockerExecutor, ContainerConfig, ContainerResult -from src.mai.sandbox.audit_logger import AuditLogger - - -class TestContainerConfig: - """Test ContainerConfig dataclass""" - - def test_default_config(self): - """Test default configuration values""" - config = ContainerConfig() - assert config.image == "python:3.10-slim" - assert config.timeout_seconds == 30 - assert config.memory_limit == "128m" - assert config.cpu_limit == "0.5" - assert config.network_disabled is True - assert config.read_only_filesystem is True - assert config.tmpfs_size == "64m" - assert config.working_dir == "/app" - assert config.user == "nobody" - - def test_custom_config(self): - """Test custom configuration values""" - config = ContainerConfig( - image="python:3.9-alpine", - timeout_seconds=60, - memory_limit="256m", - cpu_limit="0.8", - network_disabled=False, - ) - assert config.image == "python:3.9-alpine" - assert config.timeout_seconds == 60 - assert config.memory_limit == "256m" - assert config.cpu_limit == "0.8" - assert config.network_disabled is False - - -class TestDockerExecutor: - """Test DockerExecutor class""" - - @pytest.fixture - def mock_audit_logger(self): - """Create mock audit logger""" - return Mock(spec=AuditLogger) - - @pytest.fixture - def docker_executor(self, mock_audit_logger): - """Create DockerExecutor instance for testing""" - return DockerExecutor(audit_logger=mock_audit_logger) - - def test_init_without_docker(self, mock_audit_logger): - """Test initialization when Docker is not available""" - with patch("src.mai.sandbox.docker_executor.DOCKER_AVAILABLE", False): - executor = DockerExecutor(audit_logger=mock_audit_logger) - assert executor.is_available() is False - assert executor.client is None - - def test_init_with_docker_error(self, mock_audit_logger): - """Test initialization when Docker fails to connect""" - with patch("src.mai.sandbox.docker_executor.DOCKER_AVAILABLE", True): - with patch("docker.from_env") as mock_from_env: - mock_from_env.side_effect = Exception("Docker daemon not running") - - executor = DockerExecutor(audit_logger=mock_audit_logger) - assert executor.is_available() is False - assert executor.client is None - - def test_is_available(self, docker_executor): - """Test is_available method""" - # When client is None, should not be available - docker_executor.client = None - docker_executor.available = False - assert docker_executor.is_available() is False - - # When client is available, should reflect available status - docker_executor.client = Mock() - docker_executor.available = True - assert docker_executor.is_available() is True - - docker_executor.client = Mock() - docker_executor.available = False - assert docker_executor.is_available() is False - - def test_execute_code_unavailable(self, docker_executor): - """Test execute_code when Docker is not available""" - with patch.object(docker_executor, "is_available", return_value=False): - result = docker_executor.execute_code("print('test')") - - assert result.success is False - assert result.container_id == "" - assert result.exit_code == -1 - assert "Docker executor not available" in result.error - - @patch("src.mai.sandbox.docker_executor.Path") - @patch("src.mai.sandbox.docker_executor.tempfile.TemporaryDirectory") - def test_execute_code_success(self, mock_temp_dir, mock_path, docker_executor): - """Test successful code execution in container""" - # Mock temporary directory and file creation - mock_temp_file = Mock() - mock_temp_file.write_text = Mock() - - mock_temp_path = Mock() - mock_temp_path.__truediv__ = Mock(return_value=mock_temp_file) - mock_temp_path.__str__ = Mock(return_value="/tmp/test") - - mock_temp_dir.return_value.__enter__.return_value = mock_temp_path - - # Mock Docker client and container - mock_container = Mock() - mock_container.id = "test-container-id" - mock_container.wait.return_value = {"StatusCode": 0} - mock_container.logs.return_value = b"test output" - mock_container.stats.return_value = { - "cpu_stats": {"cpu_usage": {"total_usage": 1000000}, "system_cpu_usage": 2000000}, - "precpu_stats": {"cpu_usage": {"total_usage": 500000}, "system_cpu_usage": 1000000}, - "memory_stats": {"usage": 50000000, "limit": 100000000}, - } - - mock_client = Mock() - mock_client.containers.run.return_value = mock_container - - docker_executor.client = mock_client - docker_executor.available = True - - # Execute code - result = docker_executor.execute_code("print('test')") - - assert result.success is True - assert result.container_id == "test-container-id" - assert result.exit_code == 0 - assert result.stdout == "test output" - assert result.execution_time > 0 - assert result.resource_usage is not None - - @patch("src.mai.sandbox.docker_executor.Path") - @patch("src.mai.sandbox.docker_executor.tempfile.TemporaryDirectory") - def test_execute_code_with_files(self, mock_temp_dir, mock_path, docker_executor): - """Test code execution with additional files""" - # Mock temporary directory and file creation - mock_temp_file = Mock() - mock_temp_file.write_text = Mock() - - mock_temp_path = Mock() - mock_temp_path.__truediv__ = Mock(return_value=mock_temp_file) - mock_temp_path.__str__ = Mock(return_value="/tmp/test") - - mock_temp_dir.return_value.__enter__.return_value = mock_temp_path - - # Mock Docker client and container - mock_container = Mock() - mock_container.id = "test-container-id" - mock_container.wait.return_value = {"StatusCode": 0} - mock_container.logs.return_value = b"test output" - mock_container.stats.return_value = {} - - mock_client = Mock() - mock_client.containers.run.return_value = mock_container - - docker_executor.client = mock_client - docker_executor.available = True - - # Execute code with files - files = {"data.txt": "test data"} - result = docker_executor.execute_code("print('test')", files=files) - - # Verify additional files were handled - assert mock_temp_file.write_text.call_count >= 2 # code + data file - assert result.success is True - - def test_build_container_config(self, docker_executor): - """Test building Docker container configuration""" - config = ContainerConfig(memory_limit="256m", cpu_limit="0.8", network_disabled=False) - environment = {"TEST_VAR": "test_value"} - - container_config = docker_executor._build_container_config(config, environment) - - assert container_config["mem_limit"] == "256m" - assert container_config["cpu_quota"] == 80000 # 0.8 * 100000 - assert container_config["cpu_period"] == 100000 - assert container_config["network_disabled"] is False - assert container_config["read_only"] is True - assert container_config["user"] == "nobody" - assert container_config["working_dir"] == "/app" - assert "TEST_VAR" in container_config["environment"] - assert "security_opt" in container_config - assert "cap_drop" in container_config - assert "cap_add" in container_config - - def test_get_container_stats(self, docker_executor): - """Test extracting container resource statistics""" - mock_container = Mock() - mock_container.stats.return_value = { - "cpu_stats": { - "cpu_usage": {"total_usage": 2000000}, - "system_cpu_usage": 4000000, - "online_cpus": 2, - }, - "precpu_stats": {"cpu_usage": {"total_usage": 1000000}, "system_cpu_usage": 2000000}, - "memory_stats": { - "usage": 67108864, # 64MB - "limit": 134217728, # 128MB - }, - } - - stats = docker_executor._get_container_stats(mock_container) - - assert stats["cpu_percent"] == 100.0 # (2000000-1000000)/(4000000-2000000) * 2 * 100 - assert stats["memory_usage_bytes"] == 67108864 - assert stats["memory_limit_bytes"] == 134217728 - assert stats["memory_percent"] == 50.0 - assert stats["memory_usage_mb"] == 64.0 - - def test_get_container_stats_error(self, docker_executor): - """Test get_container_stats with error""" - mock_container = Mock() - mock_container.stats.side_effect = Exception("Stats error") - - stats = docker_executor._get_container_stats(mock_container) - - assert stats["cpu_percent"] == 0.0 - assert stats["memory_usage_bytes"] == 0 - assert stats["memory_percent"] == 0.0 - assert stats["memory_usage_mb"] == 0.0 - - def test_log_container_execution(self, docker_executor, mock_audit_logger): - """Test logging container execution""" - config = ContainerConfig(image="python:3.10-slim") - result = ContainerResult( - success=True, - container_id="test-id", - exit_code=0, - stdout="test output", - stderr="", - execution_time=1.5, - resource_usage={"cpu_percent": 50.0}, - ) - - docker_executor._log_container_execution("print('test')", result, config) - - # Verify audit logger was called - mock_audit_logger.log_execution.assert_called_once() - call_args = mock_audit_logger.log_execution.call_args - assert call_args.kwargs["code"] == "print('test')" - assert call_args.kwargs["execution_type"] == "docker" - assert "docker_container" in call_args.kwargs["execution_result"]["type"] - - def test_get_available_images(self, docker_executor): - """Test getting available Docker images""" - mock_image = Mock() - mock_image.tags = ["python:3.10-slim", "python:3.9-alpine"] - - mock_client = Mock() - mock_client.images.list.return_value = [mock_image] - - docker_executor.client = mock_client - docker_executor.available = True - - images = docker_executor.get_available_images() - - assert "python:3.10-slim" in images - assert "python:3.9-alpine" in images - - def test_pull_image(self, docker_executor): - """Test pulling Docker image""" - mock_client = Mock() - mock_client.images.pull.return_value = None - - docker_executor.client = mock_client - docker_executor.available = True - - result = docker_executor.pull_image("python:3.10-slim") - - assert result is True - mock_client.images.pull.assert_called_once_with("python:3.10-slim") - - def test_cleanup_containers(self, docker_executor): - """Test cleaning up containers""" - mock_container = Mock() - - mock_client = Mock() - mock_client.containers.list.return_value = [mock_container, mock_container] - - docker_executor.client = mock_client - docker_executor.available = True - - count = docker_executor.cleanup_containers() - - assert count == 2 - assert mock_container.remove.call_count == 2 - - def test_get_system_info(self, docker_executor): - """Test getting Docker system information""" - mock_client = Mock() - mock_client.info.return_value = { - "Containers": 5, - "ContainersRunning": 2, - "Images": 10, - "MemTotal": 8589934592, - "NCPU": 4, - } - mock_client.version.return_value = {"Version": "20.10.7", "ApiVersion": "1.41"} - - docker_executor.client = mock_client - docker_executor.available = True - - info = docker_executor.get_system_info() - - assert info["available"] is True - assert info["version"] == "20.10.7" - assert info["api_version"] == "1.41" - assert info["containers"] == 5 - assert info["images"] == 10 - - -class TestDockerExecutorIntegration: - """Integration tests for Docker executor with other sandbox components""" - - @pytest.fixture - def mock_audit_logger(self): - """Create mock audit logger""" - return Mock(spec=AuditLogger) - - def test_docker_executor_integration(self, mock_audit_logger): - """Test Docker executor integration with audit logger""" - executor = DockerExecutor(audit_logger=mock_audit_logger) - - # Test that audit logger is properly integrated - assert executor.audit_logger is mock_audit_logger - - # Mock Docker availability for integration test - with patch.object(executor, "is_available", return_value=False): - result = executor.execute_code("print('test')") - - # Should fail gracefully and still attempt logging - assert result.success is False - - def test_container_result_serialization(self): - """Test ContainerResult can be properly serialized""" - result = ContainerResult( - success=True, - container_id="test-id", - exit_code=0, - stdout="test output", - stderr="", - execution_time=1.5, - resource_usage={"cpu_percent": 50.0}, - ) - - # Test that result can be converted to dict for JSON serialization - result_dict = { - "success": result.success, - "container_id": result.container_id, - "exit_code": result.exit_code, - "stdout": result.stdout, - "stderr": result.stderr, - "execution_time": result.execution_time, - "error": result.error, - "resource_usage": result.resource_usage, - } - - assert result_dict["success"] is True - assert result_dict["container_id"] == "test-id" - - -if __name__ == "__main__": - pytest.main([__file__]) diff --git a/tests/test_docker_integration.py b/tests/test_docker_integration.py deleted file mode 100644 index 3588460..0000000 --- a/tests/test_docker_integration.py +++ /dev/null @@ -1,341 +0,0 @@ -""" -Integration test for complete Docker sandbox execution - -Tests the full integration of Docker executor with sandbox manager, -risk analysis, resource enforcement, and audit logging. -""" - -import pytest -import tempfile -import json -from pathlib import Path -from unittest.mock import patch, Mock - -from src.mai.sandbox.manager import SandboxManager, ExecutionRequest -from src.mai.sandbox.audit_logger import AuditLogger - - -@pytest.mark.integration -class TestDockerSandboxIntegration: - """Integration tests for Docker sandbox execution""" - - @pytest.fixture - def temp_log_dir(self): - """Create temporary directory for audit logs""" - with tempfile.TemporaryDirectory() as temp_dir: - yield temp_dir - - @pytest.fixture - def sandbox_manager(self, temp_log_dir): - """Create SandboxManager with temp log directory""" - return SandboxManager(log_dir=temp_log_dir) - - def test_full_docker_execution_workflow(self, sandbox_manager): - """Test complete Docker execution workflow""" - with patch.object(sandbox_manager.docker_executor, "is_available", return_value=True): - with patch.object(sandbox_manager.docker_executor, "execute_code") as mock_docker: - # Mock Docker container execution - from src.mai.sandbox.docker_executor import ContainerResult - - mock_docker.return_value = { - "success": True, - "output": "42\n", - "container_result": ContainerResult( - success=True, - container_id="integration-test-container", - exit_code=0, - stdout="42\n", - stderr="", - execution_time=2.3, - resource_usage={ - "cpu_percent": 15.2, - "memory_usage_mb": 28.5, - "memory_percent": 5.5, - }, - ), - } - - # Create execution request - request = ExecutionRequest( - code="result = 6 * 7\nprint(result)", - use_docker=True, - docker_image="python:3.10-slim", - timeout_seconds=30, - cpu_limit_percent=50.0, - memory_limit_percent=40.0, - network_allowed=False, - filesystem_restricted=True, - ) - - # Execute code - result = sandbox_manager.execute_code(request) - - # Verify execution results - assert result.success is True - assert result.execution_method == "docker" - assert result.output == "42\n" - assert result.container_result is not None - assert result.container_result.container_id == "integration-test-container" - assert result.container_result.exit_code == 0 - assert result.container_result.execution_time == 2.3 - assert result.container_result.resource_usage["cpu_percent"] == 15.2 - assert result.container_result.resource_usage["memory_usage_mb"] == 28.5 - - # Verify Docker executor was called with correct parameters - mock_docker.assert_called_once() - call_args = mock_docker.call_args - - # Check code was passed correctly - assert call_args.args[0] == "result = 6 * 7\nprint(result)" - - # Check container config - config = call_args.kwargs["config"] - assert config.image == "python:3.10-slim" - assert config.timeout_seconds == 30 - assert config.memory_limit == "51m" # Scaled from 40% of 128m - assert config.cpu_limit == "0.5" # 50% CPU - assert config.network_disabled is True - assert config.read_only_filesystem is True - - # Verify audit logging occurred - assert result.audit_entry_id is not None - - # Check audit log contents - logs = sandbox_manager.get_execution_history(limit=1) - assert len(logs) == 1 - - log_entry = logs[0] - assert log_entry["code"] == "result = 6 * 7\nprint(result)" - assert log_entry["execution_result"]["success"] is True - assert "docker_container" in log_entry["execution_result"] - - def test_docker_execution_with_additional_files(self, sandbox_manager): - """Test Docker execution with additional files""" - with patch.object(sandbox_manager.docker_executor, "is_available", return_value=True): - with patch.object(sandbox_manager.docker_executor, "execute_code") as mock_docker: - # Mock Docker execution - from src.mai.sandbox.docker_executor import ContainerResult - - mock_docker.return_value = { - "success": True, - "output": "Hello, Alice!\n", - "container_result": ContainerResult( - success=True, - container_id="files-test-container", - exit_code=0, - stdout="Hello, Alice!\n", - ), - } - - # Create execution request with additional files - request = ExecutionRequest( - code="with open('template.txt', 'r') as f: template = f.read()\nprint(template.replace('{name}', 'Alice'))", - use_docker=True, - additional_files={"template.txt": "Hello, {name}!"}, - ) - - # Execute code - result = sandbox_manager.execute_code(request) - - # Verify execution - assert result.success is True - assert result.execution_method == "docker" - - # Verify Docker executor was called with files - call_args = mock_docker.call_args - assert "files" in call_args.kwargs - assert call_args.kwargs["files"] == {"template.txt": "Hello, {name}!"} - - def test_docker_execution_blocked_by_risk_analysis(self, sandbox_manager): - """Test that high-risk code is blocked before Docker execution""" - with patch.object(sandbox_manager.docker_executor, "is_available", return_value=True): - with patch.object(sandbox_manager.docker_executor, "execute_code") as mock_docker: - # Risk analysis will automatically detect the dangerous pattern - request = ExecutionRequest( - code="import subprocess; subprocess.run(['rm', '-rf', '/'], shell=True)", - use_docker=True, - ) - - # Execute code - result = sandbox_manager.execute_code(request) - - # Verify execution was blocked - assert result.success is False - assert "blocked" in result.error.lower() - assert result.risk_assessment.score >= 70 - assert result.execution_method == "local" # Set before Docker check - - # Docker executor should not be called - mock_docker.assert_not_called() - - # Should still be logged - assert result.audit_entry_id is not None - - def test_docker_execution_fallback_to_local(self, sandbox_manager): - """Test fallback to local execution when Docker unavailable""" - with patch.object(sandbox_manager.docker_executor, "is_available", return_value=False): - with patch.object(sandbox_manager, "_execute_in_sandbox") as mock_local: - with patch.object( - sandbox_manager.resource_enforcer, "stop_monitoring" - ) as mock_monitoring: - # Mock local execution - mock_local.return_value = {"success": True, "output": "Local fallback result"} - - # Mock resource usage - from src.mai.sandbox.resource_enforcer import ResourceUsage - - mock_monitoring.return_value = ResourceUsage( - cpu_percent=35.0, - memory_percent=25.0, - memory_used_gb=0.4, - elapsed_seconds=1.8, - approaching_limits=False, - ) - - # Create request preferring Docker - request = ExecutionRequest( - code="print('fallback test')", - use_docker=True, # But Docker is unavailable - ) - - # Execute code - result = sandbox_manager.execute_code(request) - - # Verify fallback to local execution - assert result.success is True - assert result.execution_method == "local" - assert result.output == "Local fallback result" - assert result.container_result is None - assert result.resource_usage is not None - assert result.resource_usage.cpu_percent == 35.0 - - # Verify local execution was used - mock_local.assert_called_once() - - def test_audit_logging_docker_execution_details(self, sandbox_manager): - """Test comprehensive audit logging for Docker execution""" - with patch.object(sandbox_manager.docker_executor, "is_available", return_value=True): - with patch.object(sandbox_manager.docker_executor, "execute_code") as mock_docker: - # Mock Docker execution with detailed stats - from src.mai.sandbox.docker_executor import ContainerResult - - mock_docker.return_value = { - "success": True, - "output": "Calculation complete: 144\n", - "container_result": ContainerResult( - success=True, - container_id="audit-test-container", - exit_code=0, - stdout="Calculation complete: 144\n", - stderr="", - execution_time=3.7, - resource_usage={ - "cpu_percent": 22.8, - "memory_usage_mb": 45.2, - "memory_percent": 8.9, - "memory_usage_bytes": 47395648, - "memory_limit_bytes": 536870912, - }, - ), - } - - # Execute request - request = ExecutionRequest( - code="result = 12 * 12\nprint(f'Calculation complete: {result}')", - use_docker=True, - docker_image="python:3.9-alpine", - timeout_seconds=45, - ) - - result = sandbox_manager.execute_code(request) - - # Verify audit log contains Docker execution details - logs = sandbox_manager.get_execution_history(limit=1) - assert len(logs) == 1 - - log_entry = logs[0] - execution_result = log_entry["execution_result"] - - # Check Docker-specific fields - assert execution_result["type"] == "docker_container" - assert execution_result["container_id"] == "audit-test-container" - assert execution_result["exit_code"] == 0 - assert execution_result["stdout"] == "Calculation complete: 144\n" - - # Check configuration details - config = execution_result["config"] - assert config["image"] == "python:3.9-alpine" - assert config["timeout"] == 45 - assert config["network_disabled"] is True - assert config["read_only_filesystem"] is True - - # Check resource usage - resource_usage = execution_result["resource_usage"] - assert resource_usage["cpu_percent"] == 22.8 - assert resource_usage["memory_usage_mb"] == 45.2 - assert resource_usage["memory_percent"] == 8.9 - - def test_system_status_includes_docker_info(self, sandbox_manager): - """Test system status includes Docker information""" - with patch.object(sandbox_manager.docker_executor, "is_available", return_value=True): - with patch.object( - sandbox_manager.docker_executor, "get_system_info" - ) as mock_docker_info: - # Mock Docker system info - mock_docker_info.return_value = { - "available": True, - "version": "20.10.12", - "api_version": "1.41", - "containers": 5, - "containers_running": 2, - "images": 8, - "ncpu": 4, - "memory_total": 8589934592, - } - - # Get system status - status = sandbox_manager.get_system_status() - - # Verify Docker information is included - assert "docker_available" in status - assert "docker_info" in status - assert status["docker_available"] is True - assert status["docker_info"]["available"] is True - assert status["docker_info"]["version"] == "20.10.12" - assert status["docker_info"]["containers"] == 5 - assert status["docker_info"]["images"] == 8 - - def test_docker_status_management(self, sandbox_manager): - """Test Docker status management functions""" - with patch.object(sandbox_manager.docker_executor, "is_available", return_value=True): - with patch.object( - sandbox_manager.docker_executor, "get_available_images" - ) as mock_images: - with patch.object(sandbox_manager.docker_executor, "pull_image") as mock_pull: - with patch.object( - sandbox_manager.docker_executor, "cleanup_containers" - ) as mock_cleanup: - # Mock responses - mock_images.return_value = ["python:3.10-slim", "python:3.9-alpine"] - mock_pull.return_value = True - mock_cleanup.return_value = 3 - - # Test get Docker status - status = sandbox_manager.get_docker_status() - assert status["available"] is True - assert "python:3.10-slim" in status["images"] - assert "python:3.9-alpine" in status["images"] - - # Test pull image - pull_result = sandbox_manager.pull_docker_image("node:16-alpine") - assert pull_result is True - mock_pull.assert_called_once_with("node:16-alpine") - - # Test cleanup containers - cleanup_count = sandbox_manager.cleanup_docker_containers() - assert cleanup_count == 3 - mock_cleanup.assert_called_once() - - -if __name__ == "__main__": - pytest.main([__file__, "-v"]) diff --git a/tests/test_integration.py b/tests/test_integration.py deleted file mode 100644 index 2637b41..0000000 --- a/tests/test_integration.py +++ /dev/null @@ -1,632 +0,0 @@ -#!/usr/bin/env python3 -""" -Comprehensive integration tests for Phase 1 requirements. - -This module validates all Phase 1 components work together correctly. -Tests cover model discovery, resource monitoring, model selection, -context compression, git workflow, and end-to-end conversations. -""" - -import unittest -import os -import sys -import time -import tempfile -import shutil -from unittest.mock import Mock, patch, MagicMock -from pathlib import Path - -# Add src to path for imports -sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "src")) - -# Mock missing dependencies first -sys.modules["ollama"] = Mock() -sys.modules["psutil"] = Mock() -sys.modules["tiktoken"] = Mock() - - -# Test availability of core components -def check_imports(): - """Check if all required imports are available.""" - test_results = {} - - # Test each import - imports_to_test = [ - ("mai.core.interface", "MaiInterface"), - ("mai.model.resource_detector", "ResourceDetector"), - ("mai.model.compression", "ContextCompressor"), - ("mai.core.config", "Config"), - ("mai.core.exceptions", "MaiError"), - ("mai.git.workflow", "StagingWorkflow"), - ("mai.git.committer", "AutoCommitter"), - ("mai.git.health_check", "HealthChecker"), - ] - - for module_name, class_name in imports_to_test: - try: - module = __import__(module_name, fromlist=[class_name]) - cls = getattr(module, class_name) - test_results[f"{module_name}.{class_name}"] = "OK" - except ImportError as e: - test_results[f"{module_name}.{class_name}"] = f"IMPORT_ERROR: {e}" - except AttributeError as e: - test_results[f"{module_name}.{class_name}"] = f"CLASS_NOT_FOUND: {e}" - - return test_results - - -class TestComponentImports(unittest.TestCase): - """Test that all Phase 1 components can be imported.""" - - def test_all_components_import(self): - """Test that all required components can be imported.""" - results = check_imports() - - # Print results for debugging - print("\n=== Import Test Results ===") - for component, status in results.items(): - print(f"{component}: {status}") - - # Check that at least some imports work - successful_imports = sum(1 for status in results.values() if status == "OK") - self.assertGreater( - successful_imports, 0, "At least one component should import successfully" - ) - - -class TestResourceDetectionBasic(unittest.TestCase): - """Test basic resource detection functionality.""" - - def test_resource_info_structure(self): - """Test that ResourceInfo has required structure.""" - try: - from mai.model.resource_detector import ResourceInfo - - # Create a test ResourceInfo with correct attributes - resources = ResourceInfo( - cpu_percent=50.0, - memory_total_gb=16.0, - memory_available_gb=8.0, - memory_percent=50.0, - gpu_available=False, - ) - - self.assertEqual(resources.cpu_percent, 50.0) - self.assertEqual(resources.memory_total_gb, 16.0) - self.assertEqual(resources.memory_available_gb, 8.0) - self.assertEqual(resources.memory_percent, 50.0) - self.assertEqual(resources.gpu_available, False) - except ImportError: - self.skipTest("ResourceDetector not available") - - def test_resource_detector_basic(self): - """Test ResourceDetector can be instantiated.""" - try: - from mai.model.resource_detector import ResourceDetector - - detector = ResourceDetector() - self.assertIsNotNone(detector) - except ImportError: - self.skipTest("ResourceDetector not available") - - -class TestContextCompressionBasic(unittest.TestCase): - """Test basic context compression functionality.""" - - def test_context_compressor_instantiation(self): - """Test ContextCompressor can be instantiated.""" - try: - from mai.model.compression import ContextCompressor - - compressor = ContextCompressor() - self.assertIsNotNone(compressor) - except ImportError: - self.skipTest("ContextCompressor not available") - - def test_token_counting_basic(self): - """Test basic token counting functionality.""" - try: - from mai.model.compression import ContextCompressor, TokenInfo - - compressor = ContextCompressor() - tokens = compressor.count_tokens("Hello, world!") - - self.assertIsInstance(tokens, TokenInfo) - self.assertGreater(tokens.count, 0) - self.assertIsInstance(tokens.model_name, str) - self.assertGreater(len(tokens.model_name), 0) - self.assertIsInstance(tokens.accuracy, float) - self.assertGreaterEqual(tokens.accuracy, 0.0) - self.assertLessEqual(tokens.accuracy, 1.0) - except (ImportError, AttributeError): - self.skipTest("ContextCompressor not fully available") - - def test_token_info_structure(self): - """Test TokenInfo object structure and attributes.""" - try: - from mai.model.compression import ContextCompressor, TokenInfo - - compressor = ContextCompressor() - tokens = compressor.count_tokens("Test string for structure validation") - - # Test TokenInfo structure - self.assertIsInstance(tokens, TokenInfo) - self.assertTrue(hasattr(tokens, "count")) - self.assertTrue(hasattr(tokens, "model_name")) - self.assertTrue(hasattr(tokens, "accuracy")) - - # Test attribute types - self.assertIsInstance(tokens.count, int) - self.assertIsInstance(tokens.model_name, str) - self.assertIsInstance(tokens.accuracy, float) - - # Test attribute values - self.assertGreaterEqual(tokens.count, 0) - self.assertGreater(len(tokens.model_name), 0) - self.assertGreaterEqual(tokens.accuracy, 0.0) - self.assertLessEqual(tokens.accuracy, 1.0) - except (ImportError, AttributeError): - self.skipTest("ContextCompressor not fully available") - - def test_token_counting_accuracy(self): - """Test token counting accuracy for various text lengths.""" - try: - from mai.model.compression import ContextCompressor - - compressor = ContextCompressor() - - # Test with different text lengths - test_cases = [ - ("", 0, 5), # Empty string - ("Hello", 1, 10), # Short text - ("Hello, world! This is a test.", 5, 15), # Medium text - ( - "This is a longer text to test token counting accuracy across multiple sentences and paragraphs. " - * 3, - 50, - 200, - ), # Long text - ] - - for text, min_expected, max_expected in test_cases: - with self.subTest(text_length=len(text)): - tokens = compressor.count_tokens(text) - self.assertGreaterEqual( - tokens.count, - min_expected, - f"Token count {tokens.count} below minimum {min_expected} for text: {text[:50]}...", - ) - self.assertLessEqual( - tokens.count, - max_expected, - f"Token count {tokens.count} above maximum {max_expected} for text: {text[:50]}...", - ) - - # Test accuracy is reasonable - self.assertGreaterEqual(tokens.accuracy, 0.7, "Accuracy should be at least 70%") - self.assertLessEqual(tokens.accuracy, 1.0, "Accuracy should not exceed 100%") - - except (ImportError, AttributeError): - self.skipTest("ContextCompressor not fully available") - - def test_token_fallback_behavior(self): - """Test token counting fallback behavior when tiktoken unavailable.""" - try: - from mai.model.compression import ContextCompressor - from unittest.mock import patch - - compressor = ContextCompressor() - test_text = "Testing fallback behavior with a reasonable text length" - - # Test normal behavior first - tokens_normal = compressor.count_tokens(test_text) - self.assertIsInstance(tokens_normal, type(tokens_normal)) - self.assertGreater(tokens_normal.count, 0) - - # Test with mocked tiktoken error to trigger fallback - with patch("tiktoken.encoding_for_model") as mock_encoding: - mock_encoding.side_effect = Exception("tiktoken not available") - - tokens_fallback = compressor.count_tokens(test_text) - - # Both should return TokenInfo objects - self.assertEqual(type(tokens_normal), type(tokens_fallback)) - self.assertIsInstance(tokens_fallback, type(tokens_fallback)) - self.assertGreater(tokens_fallback.count, 0) - - # Fallback might be less accurate but should still be reasonable - self.assertGreaterEqual(tokens_fallback.accuracy, 0.7) - self.assertLessEqual(tokens_fallback.accuracy, 1.0) - - except (ImportError, AttributeError): - self.skipTest("ContextCompressor not fully available") - - def test_token_edge_cases(self): - """Test token counting with edge cases.""" - try: - from mai.model.compression import ContextCompressor - - compressor = ContextCompressor() - - # Edge cases to test - edge_cases = [ - ("", "Empty string"), - (" ", "Single space"), - ("\n", "Single newline"), - ("\t", "Single tab"), - (" ", "Multiple spaces"), - ("Hello\nworld", "Text with newline"), - ("Special chars: !@#$%^&*()", "Special characters"), - ("Unicode: ñáéíóú 🤖", "Unicode characters"), - ("Numbers: 1234567890", "Numbers"), - ("Mixed: Hello123!@#world", "Mixed content"), - ] - - for text, description in edge_cases: - with self.subTest(case=description): - tokens = compressor.count_tokens(text) - - # All should return TokenInfo - self.assertIsInstance(tokens, type(tokens)) - self.assertGreaterEqual( - tokens.count, 0, f"Token count should be >= 0 for {description}" - ) - - # Model name and accuracy should be set - self.assertGreater( - len(tokens.model_name), - 0, - f"Model name should not be empty for {description}", - ) - self.assertGreaterEqual( - tokens.accuracy, 0.7, f"Accuracy should be reasonable for {description}" - ) - self.assertLessEqual( - tokens.accuracy, 1.0, f"Accuracy should not exceed 100% for {description}" - ) - - except (ImportError, AttributeError): - self.skipTest("ContextCompressor not fully available") - - -class TestConfigSystem(unittest.TestCase): - """Test configuration system functionality.""" - - def test_config_instantiation(self): - """Test Config can be instantiated.""" - try: - from mai.core.config import Config - - config = Config() - self.assertIsNotNone(config) - except ImportError: - self.skipTest("Config not available") - - def test_config_validation(self): - """Test configuration validation.""" - try: - from mai.core.config import Config - - config = Config() - # Test basic validation - self.assertIsNotNone(config) - except ImportError: - self.skipTest("Config not available") - - -class TestGitWorkflowBasic(unittest.TestCase): - """Test basic git workflow functionality.""" - - def test_staging_workflow_instantiation(self): - """Test StagingWorkflow can be instantiated.""" - try: - from mai.git.workflow import StagingWorkflow - - workflow = StagingWorkflow() - self.assertIsNotNone(workflow) - except ImportError: - self.skipTest("StagingWorkflow not available") - - def test_auto_committer_instantiation(self): - """Test AutoCommitter can be instantiated.""" - try: - from mai.git.committer import AutoCommitter - - committer = AutoCommitter() - self.assertIsNotNone(committer) - except ImportError: - self.skipTest("AutoCommitter not available") - - def test_health_checker_instantiation(self): - """Test HealthChecker can be instantiated.""" - try: - from mai.git.health_check import HealthChecker - - checker = HealthChecker() - self.assertIsNotNone(checker) - except ImportError: - self.skipTest("HealthChecker not available") - - -class TestExceptionHandling(unittest.TestCase): - """Test exception handling system.""" - - def test_exception_hierarchy(self): - """Test exception hierarchy exists.""" - try: - from mai.core.exceptions import ( - MaiError, - ModelError, - ConfigurationError, - ModelConnectionError, - ) - - # Test exception inheritance - self.assertTrue(issubclass(ModelError, MaiError)) - self.assertTrue(issubclass(ConfigurationError, MaiError)) - self.assertTrue(issubclass(ModelConnectionError, ModelError)) - - # Test instantiation - error = MaiError("Test error") - self.assertEqual(str(error), "Test error") - except ImportError: - self.skipTest("Exception hierarchy not available") - - -class TestFileStructure(unittest.TestCase): - """Test that all required files exist with proper structure.""" - - def test_core_files_exist(self): - """Test that all core files exist.""" - required_files = [ - "src/mai/core/interface.py", - "src/mai/model/ollama_client.py", - "src/mai/model/resource_detector.py", - "src/mai/model/compression.py", - "src/mai/core/config.py", - "src/mai/core/exceptions.py", - "src/mai/git/workflow.py", - "src/mai/git/committer.py", - "src/mai/git/health_check.py", - ] - - project_root = os.path.dirname(os.path.dirname(__file__)) - - for file_path in required_files: - full_path = os.path.join(project_root, file_path) - self.assertTrue(os.path.exists(full_path), f"Required file {file_path} does not exist") - - def test_minimum_file_sizes(self): - """Test that files meet minimum size requirements.""" - min_lines = 40 # From plan requirements - - test_file = os.path.join(os.path.dirname(__file__), "test_integration.py") - with open(test_file, "r") as f: - lines = f.readlines() - - self.assertGreaterEqual( - len(lines), min_lines, f"Integration test file must have at least {min_lines} lines" - ) - - -class TestPhase1Requirements(unittest.TestCase): - """Test that Phase 1 requirements are satisfied.""" - - def test_requirement_1_model_discovery(self): - """Requirement 1: Model discovery and capability detection.""" - try: - from mai.core.interface import MaiInterface - - # Test interface has list_models method - interface = MaiInterface() - self.assertTrue(hasattr(interface, "list_models")) - except ImportError: - self.skipTest("MaiInterface not available") - - def test_requirement_2_resource_monitoring(self): - """Requirement 2: Resource monitoring and constraint detection.""" - try: - from mai.model.resource_detector import ResourceDetector - - detector = ResourceDetector() - self.assertTrue(hasattr(detector, "detect_resources")) - except ImportError: - self.skipTest("ResourceDetector not available") - - def test_requirement_3_model_selection(self): - """Requirement 3: Intelligent model selection.""" - try: - from mai.core.interface import MaiInterface - - interface = MaiInterface() - # Should have model selection capability - self.assertIsNotNone(interface) - except ImportError: - self.skipTest("MaiInterface not available") - - def test_requirement_4_context_compression(self): - """Requirement 4: Context compression for model switching.""" - try: - from mai.model.compression import ContextCompressor - - compressor = ContextCompressor() - self.assertTrue(hasattr(compressor, "count_tokens")) - except ImportError: - self.skipTest("ContextCompressor not available") - - def test_requirement_5_git_integration(self): - """Requirement 5: Git workflow automation.""" - # Check if GitPython is available - try: - import git - except ImportError: - self.skipTest("GitPython not available - git integration tests skipped") - - git_components = [ - ("mai.git.workflow", "StagingWorkflow"), - ("mai.git.committer", "AutoCommitter"), - ("mai.git.health_check", "HealthChecker"), - ] - - available_count = 0 - for module_name, class_name in git_components: - try: - module = __import__(module_name, fromlist=[class_name]) - cls = getattr(module, class_name) - available_count += 1 - except ImportError: - pass - - # At least one git component should be available if GitPython is installed - # If GitPython is installed but no components are available, that's a problem - if available_count == 0: - # Check if the source files actually exist - import os - from pathlib import Path - - src_path = Path(__file__).parent.parent / "src" / "mai" / "git" - if src_path.exists(): - git_files = list(src_path.glob("*.py")) - if git_files: - self.fail( - f"Git files exist but no git components importable. Files: {[f.name for f in git_files]}" - ) - return - - # If we get here, either components are available or they don't exist yet - # Both are acceptable states for Phase 1 validation - self.assertTrue(True, "Git integration validation completed") - - -class TestErrorHandlingGracefulDegradation(unittest.TestCase): - """Test error handling and graceful degradation.""" - - def test_missing_dependency_handling(self): - """Test handling of missing dependencies.""" - # Mock missing ollama dependency - with patch.dict("sys.modules", {"ollama": None}): - try: - from mai.model.ollama_client import OllamaClient - - # If import succeeds, test that it handles missing dependency - client = OllamaClient() - self.assertIsNotNone(client) - except ImportError: - # Expected behavior - import should fail gracefully - pass - - def test_resource_exhaustion_simulation(self): - """Test behavior with simulated resource exhaustion.""" - try: - from mai.model.resource_detector import ResourceInfo - - # Create exhausted resource scenario with correct attributes - exhausted = ResourceInfo( - cpu_percent=95.0, - memory_total_gb=16.0, - memory_available_gb=0.1, # Very low (100MB) - memory_percent=99.4, # Almost all memory used - gpu_available=False, - ) - - # ResourceInfo should handle extreme values - self.assertEqual(exhausted.cpu_percent, 95.0) - self.assertEqual(exhausted.memory_available_gb, 0.1) - self.assertEqual(exhausted.memory_percent, 99.4) - except ImportError: - self.skipTest("ResourceInfo not available") - - -class TestPerformanceRegression(unittest.TestCase): - """Test performance regression detection.""" - - def test_import_time_performance(self): - """Test that import time is reasonable.""" - import_time_start = time.time() - - # Try to import main components - try: - from mai.core.config import Config - from mai.core.exceptions import MaiError - - config = Config() - except ImportError: - pass - - import_time = time.time() - import_time_start - - # Imports should complete within reasonable time (< 5 seconds) - self.assertLess(import_time, 5.0, "Import time should be reasonable") - - def test_instantiation_performance(self): - """Test that component instantiation is performant.""" - times = [] - - # Test multiple instantiations - for _ in range(5): - start_time = time.time() - try: - from mai.core.config import Config - - config = Config() - except ImportError: - pass - times.append(time.time() - start_time) - - avg_time = sum(times) / len(times) - - # Average instantiation should be fast (< 1 second) - self.assertLess(avg_time, 1.0, "Component instantiation should be fast") - - -def run_phase1_validation(): - """Run comprehensive Phase 1 validation.""" - print("\n" + "=" * 60) - print("PHASE 1 INTEGRATION TEST VALIDATION") - print("=" * 60) - - # Run import checks - import_results = check_imports() - print("\n1. COMPONENT IMPORT VALIDATION:") - for component, status in import_results.items(): - status_symbol = "✓" if status == "OK" else "✗" - print(f" {status_symbol} {component}: {status}") - - # Count successful imports - successful = sum(1 for s in import_results.values() if s == "OK") - total = len(import_results) - print(f"\n Import Success Rate: {successful}/{total} ({successful / total * 100:.1f}%)") - - # Run unit tests - print("\n2. FUNCTIONAL TESTS:") - loader = unittest.TestLoader() - suite = loader.loadTestsFromModule(sys.modules[__name__]) - runner = unittest.TextTestRunner(verbosity=1) - result = runner.run(suite) - - # Summary - print("\n" + "=" * 60) - print("PHASE 1 VALIDATION SUMMARY") - print("=" * 60) - print(f"Tests run: {result.testsRun}") - print(f"Failures: {len(result.failures)}") - print(f"Errors: {len(result.errors)}") - print(f"Skipped: {len(result.skipped)}") - - success_rate = ( - (result.testsRun - len(result.failures) - len(result.errors)) / result.testsRun * 100 - ) - print(f"Success Rate: {success_rate:.1f}%") - - if success_rate >= 80: - print("✓ PHASE 1 VALIDATION: PASSED") - else: - print("✗ PHASE 1 VALIDATION: FAILED") - - return result.wasSuccessful() - - -if __name__ == "__main__": - # Run Phase 1 validation - success = run_phase1_validation() - sys.exit(0 if success else 1) diff --git a/tests/test_memory_system.py b/tests/test_memory_system.py deleted file mode 100644 index d2d0ace..0000000 --- a/tests/test_memory_system.py +++ /dev/null @@ -1,351 +0,0 @@ -""" -Comprehensive test suite for Mai Memory System - -Tests all memory components including storage, compression, retrieval, and CLI integration. -""" - -import pytest -import tempfile -import shutil -import os -import sys -import time -from pathlib import Path -from unittest.mock import Mock, patch, MagicMock -from datetime import datetime, timedelta - -# Add src to path -sys.path.insert(0, str(Path(__file__).parent.parent / "src")) - -# Import CLI interface - this should work -from mai.core.interface import show_memory_status, search_memory, manage_memory - -# Try to import memory components - they might not work due to dependencies -try: - from mai.memory.storage import MemoryStorage, MemoryStorageError - from mai.memory.compression import MemoryCompressor, CompressionResult - from mai.memory.retrieval import ContextRetriever, SearchQuery, MemoryContext - from mai.memory.manager import MemoryManager, MemoryStats - from mai.models.conversation import Conversation, Message - from mai.models.memory import MemoryContext as ModelMemoryContext - - MEMORY_COMPONENTS_AVAILABLE = True -except ImportError as e: - print(f"Memory components not available: {e}") - MEMORY_COMPONENTS_AVAILABLE = False - - -class TestCLIInterface: - """Test CLI interface functions - these should always work.""" - - def test_show_memory_status(self): - """Test show_memory_status CLI function.""" - result = show_memory_status() - - assert result is not None - assert isinstance(result, dict) - - # Should contain memory status information - if "memory_enabled" in result: - assert isinstance(result["memory_enabled"], bool) - - if "error" in result: - # Memory system might not be initialized, that's okay for test - assert isinstance(result["error"], str) - - def test_search_memory(self): - """Test search_memory CLI function.""" - result = search_memory("test query") - - assert result is not None - assert isinstance(result, dict) - - if "success" in result: - assert isinstance(result["success"], bool) - - if "results" in result: - assert isinstance(result["results"], list) - - if "error" in result: - # Memory system might not be initialized, that's okay for test - assert isinstance(result["error"], str) - - def test_manage_memory(self): - """Test manage_memory CLI function.""" - # Test stats action (should work even without memory system) - result = manage_memory("stats") - - assert result is not None - assert isinstance(result, dict) - assert result.get("action") == "stats" - - if "success" in result: - assert isinstance(result["success"], bool) - - if "error" in result: - # Memory system might not be initialized, that's okay for test - assert isinstance(result["error"], str) - - -def test_manage_memory_unknown_action(self): - """Test manage_memory with unknown action.""" - result = manage_memory("unknown_action") - - assert result is not None - assert isinstance(result, dict) - assert result.get("success") is False - # Check if error mentions unknown action or memory system not available - error_msg = result.get("error", "").lower() - assert "unknown" in error_msg or "memory system not available" in error_msg - - -@pytest.mark.skipif(not MEMORY_COMPONENTS_AVAILABLE, reason="Memory components not available") -class TestMemoryStorage: - """Test memory storage functionality.""" - - @pytest.fixture - def temp_db(self): - """Create temporary database for testing.""" - temp_dir = tempfile.mkdtemp() - db_path = os.path.join(temp_dir, "test_memory.db") - yield db_path - shutil.rmtree(temp_dir, ignore_errors=True) - - def test_storage_initialization(self, temp_db): - """Test that storage initializes correctly.""" - try: - storage = MemoryStorage(database_path=temp_db) - assert storage is not None - except Exception as e: - # Storage might fail due to missing dependencies - pytest.skip(f"Storage initialization failed: {e}") - - def test_conversation_storage(self, temp_db): - """Test storing and retrieving conversations.""" - try: - storage = MemoryStorage(database_path=temp_db) - - # Create test conversation with minimal required fields - conversation = Conversation( - title="Test Conversation", - messages=[ - Message(role="user", content="Hello", timestamp=datetime.now()), - Message(role="assistant", content="Hi there!", timestamp=datetime.now()), - ], - created_at=datetime.now(), - updated_at=datetime.now(), - ) - - # Store conversation - conv_id = storage.store_conversation(conversation) - assert conv_id is not None - - except Exception as e: - pytest.skip(f"Conversation storage test failed: {e}") - - def test_conversation_search(self, temp_db): - """Test searching conversations.""" - try: - storage = MemoryStorage(database_path=temp_db) - - # Store test conversations - conv1 = Conversation( - title="Python Programming", - messages=[ - Message(role="user", content="How to use Python?", timestamp=datetime.now()) - ], - created_at=datetime.now(), - updated_at=datetime.now(), - ) - conv2 = Conversation( - title="Machine Learning", - messages=[Message(role="user", content="What is ML?", timestamp=datetime.now())], - created_at=datetime.now(), - updated_at=datetime.now(), - ) - - storage.store_conversation(conv1) - storage.store_conversation(conv2) - - # Search for Python - results = storage.search_conversations("Python", limit=10) - assert isinstance(results, list) - - except Exception as e: - pytest.skip(f"Conversation search test failed: {e}") - - -@pytest.mark.skipif(not MEMORY_COMPONENTS_AVAILABLE, reason="Memory components not available") -class TestMemoryCompression: - """Test memory compression functionality.""" - - @pytest.fixture - def compressor(self): - """Create compressor instance.""" - try: - return MemoryCompressor() - except Exception as e: - pytest.skip(f"Compressor initialization failed: {e}") - - def test_conversation_compression(self, compressor): - """Test conversation compression.""" - try: - # Create test conversation - conversation = Conversation( - title="Long Conversation", - messages=[ - Message(role="user", content=f"Message {i}", timestamp=datetime.now()) - for i in range(10) # Smaller for testing - ], - created_at=datetime.now(), - updated_at=datetime.now(), - ) - - # Compress - result = compressor.compress_conversation(conversation) - - assert result is not None - - except Exception as e: - pytest.skip(f"Conversation compression test failed: {e}") - - -@pytest.mark.skipif(not MEMORY_COMPONENTS_AVAILABLE, reason="Memory components not available") -class TestMemoryManager: - """Test memory manager orchestration.""" - - @pytest.fixture - def temp_manager(self): - """Create memory manager with temporary storage.""" - temp_dir = tempfile.mkdtemp() - db_path = os.path.join(temp_dir, "test_manager.db") - - try: - # Mock the storage path - with patch("mai.memory.manager.MemoryStorage") as mock_storage: - mock_storage.return_value = MemoryStorage(database_path=db_path) - manager = MemoryManager() - yield manager - except Exception as e: - # If manager fails, create a mock - mock_manager = Mock(spec=MemoryManager) - mock_manager.get_memory_stats.return_value = MemoryStats() - mock_manager.store_conversation.return_value = "test-conv-id" - mock_manager.get_context.return_value = ModelMemoryContext( - relevant_conversations=[], total_conversations=0, estimated_tokens=0, metadata={} - ) - mock_manager.search_conversations.return_value = [] - yield mock_manager - - shutil.rmtree(temp_dir, ignore_errors=True) - - def test_conversation_storage(self, temp_manager): - """Test conversation storage through manager.""" - try: - messages = [ - {"role": "user", "content": "Hello"}, - {"role": "assistant", "content": "Hi there!"}, - ] - - conv_id = temp_manager.store_conversation(messages=messages, metadata={"test": True}) - - assert conv_id is not None - assert isinstance(conv_id, str) - - except Exception as e: - pytest.skip(f"Manager conversation storage test failed: {e}") - - def test_memory_stats(self, temp_manager): - """Test memory statistics through manager.""" - try: - stats = temp_manager.get_memory_stats() - assert stats is not None - assert isinstance(stats, MemoryStats) - - except Exception as e: - pytest.skip(f"Manager memory stats test failed: {e}") - - -@pytest.mark.skipif(not MEMORY_COMPONENTS_AVAILABLE, reason="Memory components not available") -class TestContextRetrieval: - """Test context retrieval functionality.""" - - @pytest.fixture - def retriever(self): - """Create retriever instance.""" - try: - return ContextRetriever() - except Exception as e: - pytest.skip(f"Retriever initialization failed: {e}") - - def test_context_retrieval(self, retriever): - """Test context retrieval for query.""" - try: - query = SearchQuery(text="Python programming", max_results=5) - - context = retriever.get_context(query) - - assert context is not None - assert isinstance(context, ModelMemoryContext) - - except Exception as e: - pytest.skip(f"Context retrieval test failed: {e}") - - -class TestIntegration: - """Integration tests for memory system.""" - - def test_end_to_end_workflow(self): - """Test complete workflow: store -> search -> compress.""" - # This is a smoke test to verify the basic workflow doesn't crash - # Individual components are tested in their respective test classes - - # Test CLI functions don't crash - status = show_memory_status() - assert isinstance(status, dict) - - search_result = search_memory("test") - assert isinstance(search_result, dict) - - manage_result = manage_memory("stats") - assert isinstance(manage_result, dict) - - -# Performance and stress tests -class TestPerformance: - """Performance tests for memory system.""" - - def test_search_performance(self): - """Test search performance with larger datasets.""" - try: - # This would require setting up a larger test dataset - # For now, just verify the function exists and returns reasonable timing - start_time = time.time() - result = search_memory("performance test") - end_time = time.time() - - search_time = end_time - start_time - assert search_time < 5.0 # Should complete within 5 seconds - assert isinstance(result, dict) - - except ImportError: - pytest.skip("Memory system dependencies not available") - - def test_memory_stats_performance(self): - """Test memory stats calculation performance.""" - try: - start_time = time.time() - result = show_memory_status() - end_time = time.time() - - stats_time = end_time - start_time - assert stats_time < 2.0 # Should complete within 2 seconds - assert isinstance(result, dict) - - except ImportError: - pytest.skip("Memory system dependencies not available") - - -if __name__ == "__main__": - # Run tests if script is executed directly - pytest.main([__file__, "-v"]) diff --git a/tests/test_sandbox_approval.py b/tests/test_sandbox_approval.py deleted file mode 100644 index 1e54621..0000000 --- a/tests/test_sandbox_approval.py +++ /dev/null @@ -1,409 +0,0 @@ -""" -Test suite for ApprovalSystem - -This module provides comprehensive testing for the risk-based approval system -including user interaction, trust management, and edge cases. -""" - -import pytest -import time -from unittest.mock import Mock, patch, MagicMock -from datetime import datetime -from typing import Dict, Any - -import sys -import os - -sys.path.append(os.path.join(os.path.dirname(__file__), "..", "src")) - -from mai.sandbox.approval_system import ( - ApprovalSystem, - RiskLevel, - ApprovalResult, - RiskAnalysis, - ApprovalRequest, - ApprovalDecision, -) - - -class TestApprovalSystem: - """Test cases for ApprovalSystem.""" - - @pytest.fixture - def approval_system(self): - """Create fresh ApprovalSystem for each test.""" - with patch("mai.sandbox.approval_system.get_config") as mock_config: - mock_config.return_value = Mock() - mock_config.return_value.get.return_value = { - "low_threshold": 0.3, - "medium_threshold": 0.6, - "high_threshold": 0.8, - } - return ApprovalSystem() - - @pytest.fixture - def mock_low_risk_code(self): - """Sample low-risk code.""" - return 'print("hello world")' - - @pytest.fixture - def mock_medium_risk_code(self): - """Sample medium-risk code.""" - return "import os\nprint(os.getcwd())" - - @pytest.fixture - def mock_high_risk_code(self): - """Sample high-risk code.""" - return 'import subprocess\nsubprocess.call(["ls", "-la"])' - - @pytest.fixture - def mock_blocked_code(self): - """Sample blocked code.""" - return 'os.system("rm -rf /")' - - def test_initialization(self, approval_system): - """Test ApprovalSystem initialization.""" - assert approval_system.approval_history == [] - assert approval_system.user_preferences == {} - assert approval_system.trust_patterns == {} - assert approval_system.risk_thresholds["low_threshold"] == 0.3 - - def test_risk_analysis_low_risk(self, approval_system, mock_low_risk_code): - """Test risk analysis for low-risk code.""" - context = {} - risk_analysis = approval_system._analyze_code_risk(mock_low_risk_code, context) - - assert risk_analysis.risk_level == RiskLevel.LOW - assert risk_analysis.severity_score < 0.3 - assert len(risk_analysis.reasons) == 0 - assert risk_analysis.confidence > 0.5 - - def test_risk_analysis_medium_risk(self, approval_system, mock_medium_risk_code): - """Test risk analysis for medium-risk code.""" - context = {} - risk_analysis = approval_system._analyze_code_risk(mock_medium_risk_code, context) - - assert risk_analysis.risk_level == RiskLevel.MEDIUM - assert risk_analysis.severity_score >= 0.3 - assert len(risk_analysis.reasons) > 0 - assert "file_system" in risk_analysis.affected_resources - - def test_risk_analysis_high_risk(self, approval_system, mock_high_risk_code): - """Test risk analysis for high-risk code.""" - context = {} - risk_analysis = approval_system._analyze_code_risk(mock_high_risk_code, context) - - assert risk_analysis.risk_level == RiskLevel.HIGH - assert risk_analysis.severity_score >= 0.6 - assert len(risk_analysis.reasons) > 0 - assert "system_operations" in risk_analysis.affected_resources - - def test_risk_analysis_blocked(self, approval_system, mock_blocked_code): - """Test risk analysis for blocked code.""" - context = {} - risk_analysis = approval_system._analyze_code_risk(mock_blocked_code, context) - - assert risk_analysis.risk_level == RiskLevel.BLOCKED - assert any("blocked operation" in reason.lower() for reason in risk_analysis.reasons) - - def test_operation_type_detection(self, approval_system): - """Test operation type detection.""" - assert approval_system._get_operation_type('print("hello")') == "output_operation" - assert approval_system._get_operation_type("import os") == "module_import" - assert approval_system._get_operation_type('os.system("ls")') == "system_command" - assert approval_system._get_operation_type('open("file.txt")') == "file_operation" - assert approval_system._get_operation_type("x = 5") == "code_execution" - - def test_request_id_generation(self, approval_system): - """Test unique request ID generation.""" - code1 = 'print("test")' - code2 = 'print("test")' - - id1 = approval_system._generate_request_id(code1) - time.sleep(0.01) # Small delay to ensure different timestamps - id2 = approval_system._generate_request_id(code2) - - assert id1 != id2 # Should be different due to timestamp - assert len(id1) == 12 # MD5 hash truncated to 12 chars - assert len(id2) == 12 - - @patch("builtins.input") - def test_low_risk_approval_allow(self, mock_input, approval_system, mock_low_risk_code): - """Test low-risk approval with user allowing.""" - mock_input.return_value = "y" - - result, decision = approval_system.request_approval(mock_low_risk_code) - - assert result == ApprovalResult.APPROVED - assert decision.user_input == "allowed" - assert decision.request.risk_analysis.risk_level == RiskLevel.LOW - - @patch("builtins.input") - def test_low_risk_approval_deny(self, mock_input, approval_system, mock_low_risk_code): - """Test low-risk approval with user denying.""" - mock_input.return_value = "n" - - result, decision = approval_system.request_approval(mock_low_risk_code) - - assert result == ApprovalResult.DENIED - assert decision.user_input == "denied" - - @patch("builtins.input") - def test_low_risk_approval_always(self, mock_input, approval_system, mock_low_risk_code): - """Test low-risk approval with 'always allow' preference.""" - mock_input.return_value = "a" - - result, decision = approval_system.request_approval(mock_low_risk_code) - - assert result == ApprovalResult.APPROVED - assert decision.user_input == "allowed_always" - assert decision.trust_updated == True - assert "output_operation" in approval_system.user_preferences - - @patch("builtins.input") - def test_medium_risk_approval_details(self, mock_input, approval_system, mock_medium_risk_code): - """Test medium-risk approval requesting details.""" - mock_input.return_value = "d" # Request details first - - with patch.object(approval_system, "_present_detailed_view") as mock_detailed: - mock_detailed.return_value = "allowed" - - result, decision = approval_system.request_approval(mock_medium_risk_code) - - assert result == ApprovalResult.APPROVED - mock_detailed.assert_called_once() - - @patch("builtins.input") - def test_high_risk_approval_confirm(self, mock_input, approval_system, mock_high_risk_code): - """Test high-risk approval with confirmation.""" - mock_input.return_value = "confirm" - - result, decision = approval_system.request_approval(mock_high_risk_code) - - assert result == ApprovalResult.APPROVED - assert decision.request.risk_analysis.risk_level == RiskLevel.HIGH - - @patch("builtins.input") - def test_high_risk_approval_cancel(self, mock_input, approval_system, mock_high_risk_code): - """Test high-risk approval with cancellation.""" - mock_input.return_value = "cancel" - - result, decision = approval_system.request_approval(mock_high_risk_code) - - assert result == ApprovalResult.DENIED - - @patch("builtins.print") - def test_blocked_operation(self, mock_print, approval_system, mock_blocked_code): - """Test blocked operation handling.""" - result, decision = approval_system.request_approval(mock_blocked_code) - - assert result == ApprovalResult.BLOCKED - assert decision.request.risk_analysis.risk_level == RiskLevel.BLOCKED - - def test_auto_approval_for_trusted_operation(self, approval_system, mock_low_risk_code): - """Test auto-approval for trusted operations.""" - # Set up user preference - approval_system.user_preferences["output_operation"] = "auto_allow" - - result, decision = approval_system.request_approval(mock_low_risk_code) - - assert result == ApprovalResult.ALLOWED - assert decision.user_input == "auto_allowed" - - def test_approval_history(self, approval_system, mock_low_risk_code): - """Test approval history tracking.""" - # Add some decisions - with patch("builtins.input", return_value="y"): - approval_system.request_approval(mock_low_risk_code) - approval_system.request_approval(mock_low_risk_code) - - history = approval_system.get_approval_history(5) - assert len(history) == 2 - assert all(isinstance(decision, ApprovalDecision) for decision in history) - - def test_trust_patterns_learning(self, approval_system, mock_low_risk_code): - """Test trust pattern learning.""" - # Add approved decisions - with patch("builtins.input", return_value="y"): - for _ in range(3): - approval_system.request_approval(mock_low_risk_code) - - patterns = approval_system.get_trust_patterns() - assert "output_operation" in patterns - assert patterns["output_operation"] == 3 - - def test_preferences_reset(self, approval_system): - """Test preferences reset.""" - # Add some preferences - approval_system.user_preferences = {"test": "value"} - approval_system.reset_preferences() - - assert approval_system.user_preferences == {} - - def test_is_code_safe(self, approval_system, mock_low_risk_code, mock_high_risk_code): - """Test quick safety check.""" - assert approval_system.is_code_safe(mock_low_risk_code) == True - assert approval_system.is_code_safe(mock_high_risk_code) == False - - def test_context_awareness(self, approval_system, mock_low_risk_code): - """Test context-aware risk analysis.""" - # New user context should increase risk - context_new_user = {"user_level": "new"} - risk_new = approval_system._analyze_code_risk(mock_low_risk_code, context_new_user) - - context_known_user = {"user_level": "known"} - risk_known = approval_system._analyze_code_risk(mock_low_risk_code, context_known_user) - - assert risk_new.severity_score > risk_known.severity_score - assert "New user profile" in risk_new.reasons - - def test_request_id_uniqueness(self, approval_system): - """Test that request IDs are unique even for same code.""" - code = 'print("test")' - ids = [] - - for _ in range(10): - rid = approval_system._generate_request_id(code) - assert rid not in ids, f"Duplicate ID: {rid}" - ids.append(rid) - - def test_risk_score_accumulation(self, approval_system): - """Test that multiple risk factors accumulate.""" - # Code with multiple risk factors - risky_code = """ -import os -import subprocess -os.system("ls") -subprocess.call(["pwd"]) - """ - risk_analysis = approval_system._analyze_code_risk(risky_code, {}) - - assert risk_analysis.severity_score > 0.5 - assert len(risk_analysis.reasons) >= 2 - assert "system_operations" in risk_analysis.affected_resources - - @patch("builtins.input") - def test_detailed_view_presentation(self, mock_input, approval_system, mock_medium_risk_code): - """Test detailed view presentation.""" - mock_input.return_value = "y" - - # Create a request - risk_analysis = approval_system._analyze_code_risk(mock_medium_risk_code, {}) - request = ApprovalRequest( - code=mock_medium_risk_code, - risk_analysis=risk_analysis, - context={"test": "value"}, - timestamp=datetime.now(), - request_id="test123", - ) - - result = approval_system._present_detailed_view(request) - assert result == "allowed" - - @patch("builtins.input") - def test_detailed_analysis_presentation(self, mock_input, approval_system, mock_high_risk_code): - """Test detailed analysis presentation.""" - mock_input.return_value = "confirm" - - # Create a request - risk_analysis = approval_system._analyze_code_risk(mock_high_risk_code, {}) - request = ApprovalRequest( - code=mock_high_risk_code, - risk_analysis=risk_analysis, - context={}, - timestamp=datetime.now(), - request_id="test456", - ) - - result = approval_system._present_detailed_analysis(request) - assert result == "allowed" - - def test_error_handling_in_risk_analysis(self, approval_system): - """Test error handling in risk analysis.""" - # Test with None code (should not crash) - try: - risk_analysis = approval_system._analyze_code_risk(None, {}) - # Should still return a valid RiskAnalysis object - assert isinstance(risk_analysis, RiskAnalysis) - except Exception: - # If it raises an exception, that's also acceptable behavior - pass - - def test_preferences_persistence(self, approval_system): - """Test preferences persistence simulation.""" - # Simulate loading preferences with error - with patch.object(approval_system, "_load_preferences") as mock_load: - mock_load.side_effect = Exception("Load error") - - # Should not crash during initialization - try: - approval_system._load_preferences() - except Exception: - pass # Expected - - # Simulate saving preferences with error - with patch.object(approval_system, "_save_preferences") as mock_save: - mock_save.side_effect = Exception("Save error") - - # Should not crash when saving - try: - approval_system._save_preferences() - except Exception: - pass # Expected - - @pytest.mark.parametrize( - "code_pattern,expected_risk", - [ - ('print("hello")', RiskLevel.LOW), - ("import os", RiskLevel.MEDIUM), - ('os.system("ls")', RiskLevel.HIGH), - ("rm -rf /", RiskLevel.BLOCKED), - ('eval("x + 1")', RiskLevel.HIGH), - ('exec("print(1)")', RiskLevel.HIGH), - ('__import__("os")', RiskLevel.HIGH), - ], - ) - def test_risk_patterns(self, approval_system, code_pattern, expected_risk): - """Test various code patterns for risk classification.""" - risk_analysis = approval_system._analyze_code_risk(code_pattern, {}) - - # Allow some flexibility in risk assessment - if expected_risk == RiskLevel.HIGH: - assert risk_analysis.risk_level in [RiskLevel.HIGH, RiskLevel.BLOCKED] - else: - assert risk_analysis.risk_level == expected_risk - - def test_approval_decision_dataclass(self): - """Test ApprovalDecision dataclass.""" - now = datetime.now() - request = ApprovalRequest( - code='print("test")', - risk_analysis=RiskAnalysis( - risk_level=RiskLevel.LOW, - confidence=0.8, - reasons=[], - affected_resources=[], - severity_score=0.1, - ), - context={}, - timestamp=now, - request_id="test123", - ) - - decision = ApprovalDecision( - request=request, - result=ApprovalResult.APPROVED, - user_input="y", - timestamp=now, - trust_updated=False, - ) - - assert decision.request == request - assert decision.result == ApprovalResult.APPROVED - assert decision.user_input == "y" - assert decision.timestamp == now - assert decision.trust_updated == False - - -if __name__ == "__main__": - pytest.main([__file__, "-v"]) diff --git a/tests/test_sandbox_docker_integration.py b/tests/test_sandbox_docker_integration.py deleted file mode 100644 index 4ce5cdd..0000000 --- a/tests/test_sandbox_docker_integration.py +++ /dev/null @@ -1,403 +0,0 @@ -""" -Tests for SandboxManager with Docker integration - -Test suite for enhanced SandboxManager that includes Docker-based -container execution with fallback to local execution. -""" - -import pytest -from unittest.mock import Mock, patch, call - -from src.mai.sandbox.manager import SandboxManager, ExecutionRequest, ExecutionResult -from src.mai.sandbox.risk_analyzer import RiskAssessment, RiskPattern -from src.mai.sandbox.resource_enforcer import ResourceUsage, ResourceLimits -from src.mai.sandbox.docker_executor import ContainerResult, ContainerConfig - - -class TestSandboxManagerDockerIntegration: - """Test SandboxManager Docker integration features""" - - @pytest.fixture - def sandbox_manager(self): - """Create SandboxManager instance for testing""" - return SandboxManager() - - @pytest.fixture - def mock_docker_executor(self): - """Create mock Docker executor""" - mock_executor = Mock() - mock_executor.is_available.return_value = True - mock_executor.execute_code.return_value = ContainerResult( - success=True, - container_id="test-container-id", - exit_code=0, - stdout="Hello from Docker!", - stderr="", - execution_time=1.2, - resource_usage={"cpu_percent": 45.0, "memory_usage_mb": 32.0}, - ) - mock_executor.get_system_info.return_value = { - "available": True, - "version": "20.10.7", - "containers": 3, - } - return mock_executor - - def test_execution_request_with_docker_options(self): - """Test ExecutionRequest with Docker-specific options""" - request = ExecutionRequest( - code="print('test')", - use_docker=True, - docker_image="python:3.9-alpine", - timeout_seconds=45, - network_allowed=True, - additional_files={"data.txt": "test content"}, - ) - - assert request.use_docker is True - assert request.docker_image == "python:3.9-alpine" - assert request.timeout_seconds == 45 - assert request.network_allowed is True - assert request.additional_files == {"data.txt": "test content"} - - def test_execution_result_with_docker_info(self): - """Test ExecutionResult includes Docker execution info""" - container_result = ContainerResult( - success=True, - container_id="test-id", - exit_code=0, - stdout="Docker output", - execution_time=1.5, - ) - - result = ExecutionResult( - success=True, - execution_id="test-exec", - output="Docker output", - execution_method="docker", - container_result=container_result, - ) - - assert result.execution_method == "docker" - assert result.container_result == container_result - assert result.container_result.container_id == "test-id" - - def test_execute_code_with_docker_available(self, sandbox_manager): - """Test code execution when Docker is available""" - with patch.object(sandbox_manager.docker_executor, "is_available", return_value=True): - with patch.object(sandbox_manager.risk_analyzer, "analyze_ast") as mock_risk: - with patch.object(sandbox_manager.docker_executor, "execute_code") as mock_docker: - with patch.object(sandbox_manager.audit_logger, "log_execution") as mock_log: - # Mock risk analysis (allow execution) - mock_risk.return_value = RiskAssessment( - score=20, patterns=[], safe_to_execute=True, approval_required=False - ) - - # Mock Docker execution - mock_docker.return_value = { - "success": True, - "output": "Hello from Docker!", - "container_result": ContainerResult( - success=True, - container_id="test-container", - exit_code=0, - stdout="Hello from Docker!", - ), - } - - # Execute request with Docker - request = ExecutionRequest( - code="print('Hello from Docker!')", use_docker=True - ) - - result = sandbox_manager.execute_code(request) - - # Verify Docker was used - assert result.execution_method == "docker" - assert result.success is True - assert result.output == "Hello from Docker!" - assert result.container_result is not None - - # Verify Docker executor was called - mock_docker.assert_called_once() - - def test_execute_code_fallback_to_local(self, sandbox_manager): - """Test fallback to local execution when Docker unavailable""" - with patch.object(sandbox_manager.docker_executor, "is_available", return_value=False): - with patch.object(sandbox_manager.risk_analyzer, "analyze_ast") as mock_risk: - with patch.object(sandbox_manager, "_execute_in_sandbox") as mock_local: - with patch.object( - sandbox_manager.resource_enforcer, "stop_monitoring" - ) as mock_monitoring: - # Mock risk analysis (allow execution) - mock_risk.return_value = RiskAssessment( - score=20, patterns=[], safe_to_execute=True, approval_required=False - ) - - # Mock local execution - mock_local.return_value = {"success": True, "output": "Hello from local!"} - - # Mock resource monitoring - mock_monitoring.return_value = ResourceUsage( - cpu_percent=25.0, - memory_percent=30.0, - memory_used_gb=0.5, - elapsed_seconds=1.0, - approaching_limits=False, - ) - - # Execute request preferring Docker - request = ExecutionRequest( - code="print('Hello')", - use_docker=True, # But Docker is unavailable - ) - - result = sandbox_manager.execute_code(request) - - # Verify fallback to local execution - assert result.execution_method == "local" - assert result.success is True - assert result.output == "Hello from local!" - assert result.container_result is None - - # Verify local execution was used - mock_local.assert_called_once() - - def test_execute_code_local_preference(self, sandbox_manager): - """Test explicit preference for local execution""" - with patch.object(sandbox_manager.risk_analyzer, "analyze_ast") as mock_risk: - with patch.object(sandbox_manager, "_execute_in_sandbox") as mock_local: - # Mock risk analysis (allow execution) - mock_risk.return_value = RiskAssessment( - score=20, patterns=[], safe_to_execute=True, approval_required=False - ) - - # Mock local execution - mock_local.return_value = {"success": True, "output": "Local execution"} - - # Execute request explicitly preferring local - request = ExecutionRequest( - code="print('Local')", - use_docker=False, # Explicitly prefer local - ) - - result = sandbox_manager.execute_code(request) - - # Verify local execution was used - assert result.execution_method == "local" - assert result.success is True - - # Docker executor should not be called - sandbox_manager.docker_executor.execute_code.assert_not_called() - - def test_build_docker_config_from_request(self, sandbox_manager): - """Test building Docker config from execution request""" - from src.mai.sandbox.docker_executor import ContainerConfig - - # Use the actual method from DockerExecutor - config = sandbox_manager.docker_executor._build_container_config( - ContainerConfig( - memory_limit="256m", cpu_limit="0.8", network_disabled=False, timeout_seconds=60 - ), - {"TEST_VAR": "value"}, - ) - - assert config["mem_limit"] == "256m" - assert config["cpu_quota"] == 80000 - assert config["network_disabled"] is False - assert config["security_opt"] is not None - assert "TEST_VAR" in config["environment"] - - def test_get_docker_status(self, sandbox_manager, mock_docker_executor): - """Test getting Docker status information""" - sandbox_manager.docker_executor = mock_docker_executor - - status = sandbox_manager.get_docker_status() - - assert "available" in status - assert "images" in status - assert "system_info" in status - assert status["available"] is True - assert status["system_info"]["available"] is True - - def test_pull_docker_image(self, sandbox_manager, mock_docker_executor): - """Test pulling Docker image""" - sandbox_manager.docker_executor = mock_docker_executor - mock_docker_executor.pull_image.return_value = True - - result = sandbox_manager.pull_docker_image("python:3.9-slim") - - assert result is True - mock_docker_executor.pull_image.assert_called_once_with("python:3.9-slim") - - def test_cleanup_docker_containers(self, sandbox_manager, mock_docker_executor): - """Test cleaning up Docker containers""" - sandbox_manager.docker_executor = mock_docker_executor - mock_docker_executor.cleanup_containers.return_value = 3 - - result = sandbox_manager.cleanup_docker_containers() - - assert result == 3 - mock_docker_executor.cleanup_containers.assert_called_once() - - def test_get_system_status_includes_docker(self, sandbox_manager, mock_docker_executor): - """Test system status includes Docker information""" - sandbox_manager.docker_executor = mock_docker_executor - - with patch.object(sandbox_manager, "verify_log_integrity", return_value=True): - status = sandbox_manager.get_system_status() - - assert "docker_available" in status - assert "docker_info" in status - assert status["docker_available"] is True - assert status["docker_info"]["available"] is True - - def test_execute_code_with_additional_files(self, sandbox_manager): - """Test code execution with additional files in Docker""" - with patch.object(sandbox_manager.docker_executor, "is_available", return_value=True): - with patch.object(sandbox_manager.risk_analyzer, "analyze_ast") as mock_risk: - with patch.object(sandbox_manager.docker_executor, "execute_code") as mock_docker: - # Mock risk analysis (allow execution) - mock_risk.return_value = RiskAssessment( - score=20, patterns=[], safe_to_execute=True, approval_required=False - ) - - # Mock Docker execution - mock_docker.return_value = { - "success": True, - "output": "Processed files", - "container_result": ContainerResult( - success=True, - container_id="test-container", - exit_code=0, - stdout="Processed files", - ), - } - - # Execute request with additional files - request = ExecutionRequest( - code="with open('data.txt', 'r') as f: print(f.read())", - use_docker=True, - additional_files={"data.txt": "test data content"}, - ) - - result = sandbox_manager.execute_code(request) - - # Verify Docker executor was called with files - mock_docker.assert_called_once() - call_args = mock_docker.call_args - assert "files" in call_args.kwargs - assert call_args.kwargs["files"] == {"data.txt": "test data content"} - - assert result.success is True - assert result.execution_method == "docker" - - def test_risk_analysis_blocks_docker_execution(self, sandbox_manager): - """Test that high-risk code is blocked even with Docker""" - with patch.object(sandbox_manager.risk_analyzer, "analyze_ast") as mock_risk: - # Mock high-risk analysis (block execution) - mock_risk.return_value = RiskAssessment( - score=85, - patterns=[ - RiskPattern( - pattern="os.system", - severity="BLOCKED", - score=50, - line_number=1, - description="System command execution", - ) - ], - safe_to_execute=False, - approval_required=True, - ) - - # Execute risky code with Docker preference - request = ExecutionRequest(code="os.system('rm -rf /')", use_docker=True) - - result = sandbox_manager.execute_code(request) - - # Verify execution was blocked - assert result.success is False - assert "blocked" in result.error.lower() - assert result.risk_assessment.score == 85 - assert result.execution_method == "local" # Default before Docker check - - # Docker should not be called for blocked code - sandbox_manager.docker_executor.execute_code.assert_not_called() - - -class TestSandboxManagerDockerEdgeCases: - """Test edge cases and error handling in Docker integration""" - - @pytest.fixture - def sandbox_manager(self): - """Create SandboxManager instance for testing""" - return SandboxManager() - - def test_docker_executor_error_handling(self, sandbox_manager): - """Test handling of Docker executor errors""" - with patch.object(sandbox_manager.docker_executor, "is_available", return_value=True): - with patch.object(sandbox_manager.risk_analyzer, "analyze_ast") as mock_risk: - with patch.object(sandbox_manager.docker_executor, "execute_code") as mock_docker: - # Mock risk analysis (allow execution) - mock_risk.return_value = RiskAssessment( - score=20, patterns=[], safe_to_execute=True, approval_required=False - ) - - # Mock Docker executor error - mock_docker.return_value = { - "success": False, - "error": "Docker daemon not available", - "container_result": None, - } - - request = ExecutionRequest(code="print('test')", use_docker=True) - - result = sandbox_manager.execute_code(request) - - # Verify error handling - assert result.success is False - assert result.execution_method == "docker" - assert "Docker daemon not available" in result.error - - def test_container_resource_usage_integration(self, sandbox_manager): - """Test integration of container resource usage""" - with patch.object(sandbox_manager.docker_executor, "is_available", return_value=True): - with patch.object(sandbox_manager.risk_analyzer, "analyze_ast") as mock_risk: - with patch.object(sandbox_manager.docker_executor, "execute_code") as mock_docker: - # Mock risk analysis (allow execution) - mock_risk.return_value = RiskAssessment( - score=20, patterns=[], safe_to_execute=True, approval_required=False - ) - - # Mock Docker execution with resource usage - container_result = ContainerResult( - success=True, - container_id="test-container", - exit_code=0, - stdout="test output", - resource_usage={ - "cpu_percent": 35.5, - "memory_usage_mb": 64.2, - "memory_percent": 12.5, - }, - ) - - mock_docker.return_value = { - "success": True, - "output": "test output", - "container_result": container_result, - } - - request = ExecutionRequest(code="print('test')", use_docker=True) - - result = sandbox_manager.execute_code(request) - - # Verify resource usage is preserved - assert result.container_result.resource_usage["cpu_percent"] == 35.5 - assert result.container_result.resource_usage["memory_usage_mb"] == 64.2 - assert result.container_result.resource_usage["memory_percent"] == 12.5 - - -if __name__ == "__main__": - pytest.main([__file__]) diff --git a/tests/test_smoke.py b/tests/test_smoke.py deleted file mode 100644 index 4bbc146..0000000 --- a/tests/test_smoke.py +++ /dev/null @@ -1,2 +0,0 @@ -def test_smoke() -> None: - assert True