{"id":34694096,"url":"https://github.com/tantaneity/cat-brain-service","last_synced_at":"2026-04-13T19:33:14.006Z","repository":{"id":329997896,"uuid":"1121259005","full_name":"tantaneity/cat-brain-service","owner":"tantaneity","description":"ML service for cats that actually learn stuff. PPO brains, personality drift, mood system. ","archived":false,"fork":false,"pushed_at":"2026-03-15T02:30:29.000Z","size":1837,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-15T13:19:00.965Z","etag":null,"topics":["artificial-intelligence","docker","fastapi","game-ai","gymnasium","indie-game","machine-learning","ml-inference","pet-project","ppo","prometheus","python","pytorch","redis","reinforcement-learning","reinforcement-learning-algorithms","stable-baselines3"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tantaneity.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-22T17:32:46.000Z","updated_at":"2026-03-15T02:30:32.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/tantaneity/cat-brain-service","commit_stats":null,"previous_names":["tantaneity/cat-brain-service"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/tantaneity/cat-brain-service","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tantaneity%2Fcat-brain-service","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tantaneity%2Fcat-brain-service/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tantaneity%2Fcat-brain-service/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tantaneity%2Fcat-brain-service/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tantaneity","download_url":"https://codeload.github.com/tantaneity/cat-brain-service/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tantaneity%2Fcat-brain-service/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31768638,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T15:25:13.801Z","status":"ssl_error","status_checked_at":"2026-04-13T15:25:09.162Z","response_time":93,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["artificial-intelligence","docker","fastapi","game-ai","gymnasium","indie-game","machine-learning","ml-inference","pet-project","ppo","prometheus","python","pytorch","redis","reinforcement-learning","reinforcement-learning-algorithms","stable-baselines3"],"created_at":"2025-12-24T22:26:05.292Z","updated_at":"2026-04-13T19:33:13.996Z","avatar_url":"https://github.com/tantaneity.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Cat Brain Service\n\nliving cat ai with emotions, reactions, and realistic behavior\n\n## System Architecture\n\n```mermaid\ngraph TB\n    subgraph Client[\"Unity Client\"]\n        UNITY[\"Game Engine\u003cbr/\u003eCatState + Stimuli\"]\n    end\n\n    subgraph API[\"FastAPI Service\"]\n        PREDICT[\"Predict API\"]\n        CATS[\"Cat Management API\"]\n        MODELS[\"Model Management API\"]\n        LEARN[\"Experience API\"]\n        JUMP[\"Jump Learning API\"]\n        MONITOR[\"Health + Metrics\"]\n        MIDDLEWARE[\"Middleware\u003cbr/\u003eLogging + Metrics + RequestId\"]\n        DEPS[\"Dependencies\u003cbr/\u003eDI Container\"]\n\n        PREDICT \u0026 CATS \u0026 MODELS \u0026 LEARN \u0026 JUMP \u0026 MONITOR --\u003e MIDDLEWARE\n        MIDDLEWARE --\u003e DEPS\n    end\n\n    subgraph Core[\"Behavioral Core\"]\n        CONTEXTUAL[\"ContextualBehaviorEngine\u003cbr/\u003eMain Orchestrator\"]\n        EMOTIONS[\"Emotion Engine\u003cbr/\u003e13 emotions, 3 axes\"]\n        REACTIONS[\"Reaction System\u003cbr/\u003e9 stimuli, 182 rules\"]\n        BEHAVIOR[\"Stochastic Behavior\u003cbr/\u003eQuirks + Patterns\"]\n        MEMORY[\"Cat Memory\u003cbr/\u003eLast 50 actions\"]\n        LASER[\"Laser Learning\u003cbr/\u003eInterest + Skill\"]\n        VOICE[\"Voice Learning\u003cbr/\u003eCall + Nickname\"]\n\n        CONTEXTUAL --\u003e EMOTIONS\n        CONTEXTUAL --\u003e REACTIONS\n        CONTEXTUAL --\u003e BEHAVIOR\n        CONTEXTUAL --\u003e MEMORY\n        CONTEXTUAL --\u003e LASER\n        CONTEXTUAL --\u003e VOICE\n    end\n\n    subgraph Inference[\"ML Inference\"]\n        PREDICTOR[\"Batch Predictor\u003cbr/\u003ePPO + Personality\"]\n        PROFILE[\"CatProfileStore\u003cbr/\u003ePer-cat Modifiers\"]\n        LOADER[\"Model Loader\u003cbr/\u003eDefault + Individual\"]\n        MODELS_STORE[(\"models\")]\n\n        PREDICTOR --\u003e PROFILE\n        PREDICTOR --\u003e LOADER\n        LOADER --\u003e MODELS_STORE\n    end\n\n    subgraph Services[\"Services\"]\n        CAT_SERVICE[\"CatService\u003cbr/\u003eCat Management\"]\n        HISTORY[\"ActionHistory\u003cbr/\u003eJSONL per-cat\"]\n        JUMP_SERVICE[\"JumpLearningService\u003cbr/\u003eForce Calibration\"]\n    end\n\n    subgraph Training[\"Training Pipeline\"]\n        ENV[\"CatEnvironment\u003cbr/\u003eGymnasium\"]\n        PPO[\"PPO Algorithm\u003cbr/\u003eStable-Baselines3\"]\n        ENV --\u003e PPO --\u003e MODELS_STORE\n    end\n\n    UNITY --\u003e PREDICT\n    DEPS --\u003e PREDICTOR\n    DEPS --\u003e CONTEXTUAL\n    DEPS --\u003e CAT_SERVICE\n    DEPS --\u003e JUMP_SERVICE\n    PREDICTOR --\u003e CONTEXTUAL\n    CAT_SERVICE --\u003e HISTORY\n    CAT_SERVICE --\u003e LOADER\n\n    style Client fill:#fef3c7\n    style API fill:#fff7ed\n    style Core fill:#fce7f3\n    style Inference fill:#ede9fe\n    style Services fill:#ecfdf5\n    style Training fill:#e0f2fe\n```\n\n## Request Flow\n\n```mermaid\nsequenceDiagram\n    participant U as Unity\n    participant R as Routes\n    participant P as Predictor\n    participant C as ContextualEngine\n    participant E as Emotions\n    participant X as Reactions\n    participant B as Behavior\n    participant M as Memory\n\n    U-\u003e\u003eR: POST predict (CatState + stimuli)\n\n    R-\u003e\u003eP: predict_single(obs, cat_id, personality)\n    Note over P: Apply personality modifiers\u003cbr/\u003e(hunger x1.4 for foodie, etc)\u003cbr/\u003eApply per-cat profile modifiers\n    P-\u003e\u003eP: model.predict(modified_obs)\n    P--\u003e\u003eR: base_action\n\n    R-\u003e\u003eC: process_action(base_action, state)\n    C-\u003e\u003eM: get_memory(cat_id)\n    M--\u003e\u003eC: recent_actions, activity_level\n\n    C-\u003e\u003eE: calculate 3 emotion axes\n    Note over E: BASE: mood + hunger + energy\u003cbr/\u003eMOOD: valence + arousal\u003cbr/\u003eREACTION: stimulus-driven (expires)\n    E--\u003e\u003eC: emotion_axes + visual_layers\n\n    C-\u003e\u003eC: extract_stimuli(state)\n    Note over C: pet? call? noise? toy?\u003cbr/\u003efood? movement? laser?\n\n    C-\u003e\u003eX: match(stimulus, emotion)\n\n    alt reaction matched\n        X--\u003e\u003eC: action override + mood_delta + animation + sound\n    else no match\n        C-\u003e\u003eB: add_noise(base_action, 20 pct)\n        B--\u003e\u003eC: noisy_action + quirks\n    end\n\n    C-\u003e\u003eC: laser_behavior + voice_behavior\n    C-\u003e\u003eM: check repetition\n    opt too repetitive\n        C-\u003e\u003eB: introduce_distraction()\n    end\n\n    C-\u003e\u003eM: record(action, mood)\n    C--\u003e\u003eR: CatAction\n\n    R--\u003e\u003eU: action + emotion + animation + sound + mood_change + visual_layers\n```\n\n## Emotion System\n\n```mermaid\ngraph TD\n    subgraph Inputs\n        MOOD[\"mood 0-100\"]\n        HUNGER[\"hunger 0-100\"]\n        ENERGY[\"energy 0-100\"]\n        NOISE[\"noise 0-1\"]\n        STIMULUS[\"active stimulus\"]\n    end\n\n    subgraph Calculation\n        AROUSAL[\"Arousal\u003cbr/\u003ehunger deficit + energy + noise\"]\n        VALENCE[\"Valence\u003cbr/\u003emood normalized to -1..1\"]\n        INTENSITY[\"Intensity\u003cbr/\u003eextremes + arousal + mood deviation\"]\n    end\n\n    subgraph ThreeAxes[\"3 Emotion Axes\"]\n        BASE[\"BASE axis\u003cbr/\u003efrom mood + needs\u003cbr/\u003eslow, stable, 3 votes to change\"]\n        MOOD_AX[\"MOOD axis\u003cbr/\u003efrom valence + arousal\u003cbr/\u003emedium, 2 votes to change\"]\n        REACT[\"REACTION axis\u003cbr/\u003efrom stimulus\u003cbr/\u003efast, expires in 3-5s\"]\n    end\n\n    subgraph Compose[\"Visual Composition\"]\n        LAYERS[\"Visual Layers\u003cbr/\u003epriority + weight per axis\"]\n        PRIMARY[\"visual_primary\u003cbr/\u003ehighest priority active layer\"]\n    end\n\n    MOOD \u0026 HUNGER \u0026 ENERGY --\u003e AROUSAL\n    MOOD --\u003e VALENCE\n    AROUSAL \u0026 VALENCE --\u003e BASE \u0026 MOOD_AX\n    STIMULUS --\u003e REACT\n\n    BASE \u0026 MOOD_AX \u0026 REACT --\u003e LAYERS --\u003e PRIMARY\n\n    style Inputs fill:#dbeafe\n    style Calculation fill:#fef9c3\n    style ThreeAxes fill:#fce7f3\n    style Compose fill:#d1fae5\n```\n\n### 13 emotions\n\n| positive | negative | neutral |\n|----------|----------|---------|\n| happy | scared | curious |\n| excited | anxious | sleepy |\n| playful | grumpy | hungry |\n| affectionate | annoyed | demanding |\n| content | | |\n| relaxed | | |\n\n### 4 intensity levels\n`subtle` \u003c `moderate` \u003c `strong` \u003c `intense`\n\n## Decision Pipeline\n\n```mermaid\nflowchart TD\n    STATE([\"CatState from Unity\"]) --\u003e PERSONALITY\n\n    PERSONALITY[\"Apply Personality\u003cbr/\u003ebalanced, lazy, foodie, playful\"] --\u003e MODEL\n    MODEL[\"PPO Model\u003cbr/\u003e11 features, 8 actions\"] --\u003e BASE\n\n    BASE[\"base_action\"] --\u003e STIMULUS{\"stimulus\u003cbr/\u003edetected?\"}\n\n    STIMULUS --\u003e|yes| RULES[\"182 reaction rules\u003cbr/\u003estimulus x emotion\"]\n    STIMULUS --\u003e|no| NOISE[\"Stochastic Layer\u003cbr/\u003e20 pct randomness + quirks\"]\n\n    RULES --\u003e OVERRIDE{\"reaction\u003cbr/\u003efires?\"}\n    OVERRIDE --\u003e|yes| REACTION_ACTION[\"Override Action\u003cbr/\u003emood_delta + animation + sound\"]\n    OVERRIDE --\u003e|no| NOISE\n\n    NOISE --\u003e QUIRK{\"random\u003cbr/\u003equirk?\"}\n    QUIRK --\u003e|yes| QUIRK_ACTION[\"Groom, Explore, or Meow\"]\n    QUIRK --\u003e|no| PATTERN{\"behavior\u003cbr/\u003epattern?\"}\n\n    PATTERN --\u003e|zoomies| ZOOMIES[\"Play + Explore burst\"]\n    PATTERN --\u003e|lazy_sunday| LAZY[\"Idle + Sleep + Groom\"]\n    PATTERN --\u003e|midnight_madness| MIDNIGHT[\"Explore + Meow chain\"]\n    PATTERN --\u003e|none| PASS[\"Keep base action\"]\n\n    REACTION_ACTION \u0026 QUIRK_ACTION \u0026 ZOOMIES \u0026 LAZY \u0026 MIDNIGHT \u0026 PASS --\u003e LASER{\"laser\u003cbr/\u003evisible?\"}\n\n    LASER --\u003e|yes| LASER_LEARN[\"Laser Behavior\u003cbr/\u003einterest + skill\"]\n    LASER --\u003e|no| VOICE{\"player\u003cbr/\u003ecalling?\"}\n\n    LASER_LEARN --\u003e VOICE\n\n    VOICE --\u003e|yes| VOICE_LEARN[\"Voice Behavior\u003cbr/\u003esignal strength\"]\n    VOICE --\u003e|no| REPETITION\n\n    VOICE_LEARN --\u003e REPETITION\n\n    REPETITION{\"repeating\u003cbr/\u003etoo much?\"} --\u003e|yes| DISTRACT[\"Force Distraction\"]\n    REPETITION --\u003e|no| FINAL\n\n    DISTRACT --\u003e FINAL([\"Final Action + Emotion + Hints\"])\n\n    style STATE fill:#fef3c7\n    style MODEL fill:#ddd6fe\n    style RULES fill:#fecaca\n    style NOISE fill:#d1fae5\n    style FINAL fill:#bfdbfe\n```\n\n## Personality System\n\n```mermaid\ngraph TD\n    subgraph InputObs[\"Observation - 11 features\"]\n        OBS[\"hunger, energy, dist_food, dist_toy,\u003cbr/\u003edist_bed, mood, lazy, foodie, playful,\u003cbr/\u003ebowl_empty, bowl_tipped\"]\n    end\n\n    subgraph Types[\"4 Personality Types\"]\n        BAL[\"balanced\u003cbr/\u003eall x 1.0\"]\n        LAZ[\"lazy\u003cbr/\u003eenergy x 1.5, hunger x 0.8\u003cbr/\u003edist_toy x 0.7\"]\n        FOO[\"foodie\u003cbr/\u003ehunger x 1.4, energy x 0.7\u003cbr/\u003edist_food x 0.7, dist_toy x 1.3\"]\n        PLA[\"playful\u003cbr/\u003ehunger x 0.7, energy x 0.9\u003cbr/\u003edist_food x 1.2, dist_toy x 0.6\"]\n    end\n\n    subgraph PerCat[\"Per-Cat Profile\"]\n        SEED[\"Deterministic seed\u003cbr/\u003efrom cat_id hash\"]\n        MODS[\"9 unique modifiers\u003cbr/\u003ehunger, energy, distances,\u003cbr/\u003emood, lazy, foodie, playful\u003cbr/\u003erange 0.55 to 1.45\"]\n    end\n\n    subgraph Drift[\"Runtime Drift\"]\n        SLEEP_IDLE[\"sleep + idle\u003cbr/\u003elazy +0.05, playful -0.025\"]\n        EAT[\"move_to_food\u003cbr/\u003efoodie +0.05\"]\n        PLAY_TOY[\"play + move_to_toy\u003cbr/\u003eplayful +0.05, lazy -0.035\"]\n    end\n\n    OBS --\u003e Types --\u003e|multiply| MODIFIED[\"Modified Observation\"]\n    OBS --\u003e PerCat --\u003e|multiply| MODIFIED\n    MODIFIED --\u003e MODEL[\"PPO Model\"]\n\n    style InputObs fill:#f0fdf4\n    style Types fill:#eff6ff\n    style PerCat fill:#fef3c7\n    style Drift fill:#fdf2f8\n```\n\n## Actions\n\n| # | action | description |\n|---|--------|-------------|\n| 0 | idle | stand around, do nothing |\n| 1 | move_to_food | walk to food bowl |\n| 2 | move_to_toy | approach nearest toy |\n| 3 | sleep | find spot and nap |\n| 4 | groom | self-grooming |\n| 5 | play | play with toy or laser |\n| 6 | explore | wander around |\n| 7 | meow_at_bowl | sit at bowl, meow for food |\n\n## 9 Stimulus Types\n\n| stimulus | trigger condition |\n|----------|-------------------|\n| player_approach | player_nearby \u0026\u0026 distance \u003c threshold |\n| player_pet | is_being_petted |\n| player_call | is_player_calling |\n| loud_noise | loud_noise_level \u003e 0.3 |\n| new_toy | new_toy_appeared |\n| food_refill | food_bowl_refilled |\n| door_open | sudden_movement (approximation) |\n| sudden_movement | sudden_movement flag |\n| unknown_person | (reserved) |\n\n## Model Selection\n\n```mermaid\nflowchart LR\n    REQ([\"predict request\"]) --\u003e HAS_ID{\"cat_id?\"}\n\n    HAS_ID --\u003e|yes| CHECK{\"individual\u003cbr/\u003emodel exists?\"}\n    HAS_ID --\u003e|no| DEFAULT\n\n    CHECK --\u003e|yes| INDIVIDUAL[\"Individual Model\"]\n    CHECK --\u003e|no| DEFAULT[\"Default Model\"]\n\n    INDIVIDUAL --\u003e PREDICT[\"PPO predict\"]\n    DEFAULT --\u003e PREDICT\n\n    style DEFAULT fill:#93c5fd\n    style INDIVIDUAL fill:#c4b5fd\n    style PREDICT fill:#86efac\n```\n\n## Endpoints\n\n| method | path | description |\n|--------|------|-------------|\n| POST | `/predict` | predict single action |\n| POST | `/predict_batch` | predict for multiple cats |\n| POST | `/cats` | create cat with personality |\n| GET | `/cats/{id}` | get cat info |\n| GET | `/cats/{id}/profile` | get personality profile + modifiers |\n| GET | `/models` | list model versions |\n| GET | `/models/{version}` | model metadata |\n| POST | `/experience` | submit single experience |\n| POST | `/experience/batch` | submit batch experiences |\n| POST | `/jump/predict` | predict jump force |\n| POST | `/jump/result` | record jump outcome |\n| GET | `/jump/memory/{id}` | get jump memories |\n| DELETE | `/jump/memory/{id}/{target}` | reset jump target memory |\n| GET | `/health` `/ready` `/live` | health probes |\n| GET | `/metrics` | prometheus metrics |\n\n## How to Run\n\n### dev\n\n```bash\npython -m venv venv\nsource venv/bin/activate\npip install -r requirements.txt\n\nuvicorn src.api.main:app --reload --host 0.0.0.0 --port 8000\n\npython -m src.training.trainer\n```\n\n### docker\n\n```bash\ncd docker\ndocker-compose up --build\n```\n\napi: `localhost:8000`\ndocs: `localhost:8000/docs`\n\n## Response Format\n\n```json\n{\n  \"action\": 5,\n  \"action_name\": \"play\",\n  \"emotion\": \"playful\",\n  \"emotion_intensity\": \"strong\",\n  \"mood_change\": 12.0,\n  \"arousal_level\": 0.65,\n  \"animation_hint\": \"playful_approach\",\n  \"sound_hint\": \"chirp\",\n  \"reaction_triggered\": true,\n  \"behavior_pattern\": \"zoomies\",\n  \"emotion_axes\": {\n    \"base\":     { \"emotion\": \"content\",  \"intensity\": 0.4, \"source\": \"base\" },\n    \"mood\":     { \"emotion\": \"happy\",    \"intensity\": 0.6, \"source\": \"mood\" },\n    \"reaction\": { \"emotion\": \"playful\",  \"intensity\": 0.8, \"source\": \"reaction\", \"expires_at\": 1710... }\n  },\n  \"visual_layers\": [\n    { \"source\": \"reaction\", \"emotion\": \"playful\", \"intensity\": 0.8, \"priority\": 10, \"weight\": 1.0 },\n    { \"source\": \"mood\",     \"emotion\": \"happy\",   \"intensity\": 0.6, \"priority\": 5,  \"weight\": 0.7 },\n    { \"source\": \"base\",     \"emotion\": \"content\", \"intensity\": 0.4, \"priority\": 1,  \"weight\": 0.5 }\n  ],\n  \"visual_primary\": \"playful\"\n}\n```\n\n## Animation \u0026 Sound Hints\n\n### animations\n`purr` `scared` `excited` `startle` `hide` `run_hide` `run_to_food` `playful_approach` `rub_legs` `tail_flick` `ignore` `pounce` `alert` `slow_approach` `knead`\n\n### sounds\n`purr` `purr_soft` `meow_excited` `meow_annoyed` `meow_urgent` `meow_response` `meow_demand` `hiss` `chirp` `growl` `trill`\n\n## Behavioral Patterns\n\n| pattern | trigger | actions |\n|---------|---------|---------|\n| zoomies | high energy burst | play + explore chains |\n| lazy_sunday | low energy | idle + sleep + groom |\n| midnight_madness | nighttime + energy | explore + meow chains |\n| morning_routine | morning | groom + eat + explore |\n| food_obsession | high hunger | move_to_food + meow_at_bowl |\n\n## Key Config\n\n```\nMODEL_PATH         = ./models\nTOTAL_TIMESTEPS    = 100,000\nCACHE_ENABLED      = false (optional redis)\nCACHE_TTL          = 300s\nMEMORY_SIZE        = 50 actions per cat\nHISTORY_MAX        = 500 entries per cat JSONL\nRANDOMNESS         = 20%\n```\n\n## Customization\n\n### add personality\nedit `src/core/config.py`:\n```python\n\"custom\": {\n    \"hunger\": 1.2,\n    \"energy\": 0.9,\n    \"distance_food\": 0.8,\n    \"distance_toy\": 1.1\n}\n```\n\n### add reaction\nedit `src/core/reactions.py`:\n```python\n(StimulusType.PLAYER_PET, EmotionType.HAPPY): ReactionModifier(\n    action_probabilities={4: 0.6},\n    mood_delta=15.0,\n    animation_hint=\"purr\",\n    sound_hint=\"purr\",\n    probability=0.85\n)\n```\n\n### add emotion\nedit `src/core/emotions.py`:\n```python\nclass EmotionType(Enum):\n    MISCHIEVOUS = \"mischievous\"\n\nEMOTION_THRESHOLDS = {\n    EmotionType.MISCHIEVOUS: {\n        \"mood_min\": 60, \"energy_min\": 70, \"arousal_min\": 0.6\n    }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftantaneity%2Fcat-brain-service","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftantaneity%2Fcat-brain-service","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftantaneity%2Fcat-brain-service/lists"}