├── .gitignore ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── _static ├── 0B147C7D-BEB0-4E61-9397-64A460C8CE22.png └── logo.png ├── demo ├── demo.py ├── pokemon.jsonl ├── pokemon_hyperdb.pickle └── pokemon_hyperdb.pickle.gz ├── hyperdb ├── __init__.py ├── galaxy_brain_math_shit.py └── hyperdb.py ├── requirements.txt ├── setup.py └── tests ├── __init__.py └── test_galaxy_brain_math_shit.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "[python]": { 3 | "editor.defaultFormatter": "ms-python.autopep8" 4 | }, 5 | "python.formatting.provider": "none" 6 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 John Dagdelen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # HyperDB 2 |
3 | HyperDB Logo 4 |
5 | 6 | A hyper-fast local vector database for use with LLM Agents. Not entirely a joke. 7 | 8 | Want to invest? [Now accepting SAFEs ($135M cap minimum.)](https://www.youtube.com/watch?v=QH2-TGUlwu4) 9 | 10 | Join the [HyperDBiscord](https://discord.gg/8YQzexAA) 11 | 12 | ## Advantages 13 | * Simple interface compatible with _all_ large language model agents. 14 | * Highly optimized C++ backend vector store with HW accelerated operations via MKL BLAS. 15 | * Enables users to index documents with advanced features such as _ids_ and _metadata_. 16 | 17 | ## Installation 18 | 19 | Install the package from PyPI: 20 | 21 | ```bash 22 | pip install hyperdb-python 23 | ``` 24 | 25 | ## Optional dependency for locally embedding 26 | 27 | If you want to use Hugging Face models with this package, you need to install the `sentence-transformers` package: 28 | 29 | ```bash 30 | pip install sentence-transformers 31 | ``` 32 | 33 | ## Usage 34 | 35 | Here's an example of using HyperDB to store and query documents with information about all 151 original pokemon _in an instant_: 36 | 37 | ```python 38 | import json 39 | from hyperdb import HyperDB 40 | 41 | # Load documents from the JSONL file 42 | documents = [] 43 | 44 | with open("demo/pokemon.jsonl", "r") as f: 45 | for line in f: 46 | documents.append(json.loads(line)) 47 | 48 | # Instantiate HyperDB with the list of documents 49 | db = HyperDB(documents, key="info.description") 50 | 51 | # Save the HyperDB instance to a file 52 | db.save("demo/pokemon_hyperdb.pickle.gz") 53 | 54 | # Load the HyperDB instance from the save file 55 | db.load("demo/pokemon_hyperdb.pickle.gz") 56 | 57 | # Query the HyperDB instance with a text input 58 | results = db.query("Likes to sleep.", top_k=5) 59 | ``` 60 | 61 | Returns 62 | ``` 63 | Name: Snorlax 64 | Pokedex ID: 143 65 | HP: 160 66 | Type: normal 67 | Weakness: fighting 68 | Description: Very lazy. Just eats and sleeps. As its rotund bulk builds, it becomes steadily more slothful. 69 | 70 | Name: Drowzee 71 | Pokedex ID: 96 72 | HP: 230 73 | Type: psychic 74 | Weakness: dark 75 | Description: Puts enemies to sleep then eats their dreams. Occasionally gets sick from eating bad dreams. 76 | 77 | Name: Pinsir 78 | Pokedex ID: 127 79 | HP: 160 80 | Type: bug 81 | Weakness: fire 82 | Description: When the temperature drops at night, it sleeps on treetops or among roots where it is well hidden. 83 | 84 | Name: Abra 85 | Pokedex ID: 63 86 | HP: 160 87 | Type: psychic 88 | Weakness: dark 89 | Description: Sleeps 18 hours a day. If it senses danger, it will teleport itself to safety even as it sleeps. 90 | 91 | Name: Venonat 92 | Pokedex ID: 48 93 | HP: 160 94 | Type: bug 95 | Weakness: fire 96 | Description: Lives in the shadows of tall trees where it eats insects. It is attracted by light at night. 97 | ``` 98 | 99 | 100 | 101 | *Benchmark Credit: Benim Kıçım 102 | -------------------------------------------------------------------------------- /_static/0B147C7D-BEB0-4E61-9397-64A460C8CE22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdagdelen/hyperDB/bf3b1c489eaa3c044e0be0d5c8b22de192f0be04/_static/0B147C7D-BEB0-4E61-9397-64A460C8CE22.png -------------------------------------------------------------------------------- /_static/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdagdelen/hyperDB/bf3b1c489eaa3c044e0be0d5c8b22de192f0be04/_static/logo.png -------------------------------------------------------------------------------- /demo/demo.py: -------------------------------------------------------------------------------- 1 | import json 2 | from hyperdb import HyperDB 3 | 4 | # Load documents from the JSONL file 5 | documents = [] 6 | 7 | with open("demo/pokemon.jsonl", "r") as f: 8 | for line in f: 9 | documents.append(json.loads(line)) 10 | 11 | # Instantiate HyperDB with the list of documents and the key "description" 12 | db = HyperDB(documents, key="info.description") 13 | 14 | # Save the HyperDB instance to a file 15 | db.save("demo/pokemon_hyperdb.pickle.gz") 16 | 17 | # Load the HyperDB instance from the file 18 | db.load("demo/pokemon_hyperdb.pickle.gz") 19 | 20 | print("Querying the HyperDB instance with a text input:") 21 | print("\"Likes to sleep.\"\n") 22 | # Query the HyperDB instance with a text input 23 | results = db.query("Likes to sleep.", top_k=5) 24 | 25 | # Define a function to pretty print the results 26 | def format_entry(pokemon): 27 | pokemon = pokemon[0] 28 | name = pokemon["name"] 29 | hp = pokemon["hp"] 30 | info = pokemon["info"] 31 | pokedex_id = info["id"] 32 | pkm_type = info["type"] 33 | weakness = info["weakness"] 34 | description = info["description"] 35 | 36 | pretty_pokemon = f"""Name: {name} 37 | Pokedex ID: {pokedex_id} 38 | HP: {hp} 39 | Type: {pkm_type} 40 | Weakness: {weakness} 41 | Description: {description} 42 | """ 43 | return pretty_pokemon 44 | 45 | # Print the top 5 most similar Pokémon descriptions 46 | for result in results: 47 | print(format_entry(result)) -------------------------------------------------------------------------------- /demo/pokemon.jsonl: -------------------------------------------------------------------------------- 1 | {"name": "Abra", "shortname": "abra", "hp": 160, "info": {"id": 63, "type": "psychic", "weakness": "dark", "description": "Sleeps 18 hours a day. If it senses danger, it will teleport itself to safety even as it sleeps."}, "images": {"photo": "images/abra.jpg", "typeIcon": "icons/psychic.jpg", "weaknessIcon": "icons/dark.jpg"}, "moves": [{"name": "Double Team", "type": "normal"}, {"name": "Energy Ball", "dp": 90, "type": "grass"}, {"name": "Psychic", "dp": 90, "type": "psychic"}, {"name": "Thief", "dp": 60, "type": "dark"}]} 2 | {"name": "Aerodactyl", "shortname": "aerodactyl", "hp": 270, "info": {"id": 142, "type": "flying", "weakness": "water", "description": "This vicious Pokemon is said to have flown in ancient skies while shrieking high-pitched cries."}, "images": {"photo": "images/aerodactyl.jpg", "typeIcon": "icons/flying.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Bite", "dp": 60, "type": "dark"}, {"name": "Double Team", "type": "normal"}, {"name": "Ice Fang", "dp": 65, "type": "ice"}, {"name": "Wing Attack", "dp": 60, "type": "flying"}]} 3 | {"name": "Alakazam", "shortname": "alakazam", "hp": 220, "info": {"id": 65, "type": "psychic", "weakness": "dark", "description": "Its brain can outperform a supercomputer. Its intelligence quotient is said to be 5,000."}, "images": {"photo": "images/alakazam.jpg", "typeIcon": "icons/psychic.jpg", "weaknessIcon": "icons/dark.jpg"}, "moves": [{"name": "Focus Blast", "dp": 120, "type": "fighting"}, {"name": "Kinesis", "type": "psychic"}, {"name": "Psychic", "dp": 90, "type": "psychic"}, {"name": "Shadow Ball", "dp": 80, "type": "ghost"}]} 4 | {"name": "Arbok", "shortname": "arbok", "hp": 230, "info": {"id": 24, "type": "poison", "weakness": "psychic", "description": "It is rumored that the ferocious warning markings on its belly differ from area to area."}, "images": {"photo": "images/arbok.jpg", "typeIcon": "icons/poison.jpg", "weaknessIcon": "icons/psychic.jpg"}, "moves": [{"name": "Acid", "dp": 40, "type": "poison"}, {"name": "Bite", "dp": 60, "type": "dark"}, {"name": "Screech", "type": "normal"}, {"name": "Thunder Fang", "dp": 65, "type": "electric"}]} 5 | {"name": "Arcanine", "shortname": "arcanine", "hp": 290, "info": {"id": 59, "type": "fire", "weakness": "water", "description": "This legendary Chinese Pokemon is considered magnificent. Many people are enchanted by its grand mane."}, "images": {"photo": "images/arcanine.jpg", "typeIcon": "icons/fire.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Bite", "dp": 60, "type": "dark"}, {"name": "Double Team", "type": "normal"}, {"name": "Extreme Speed", "dp": 80, "type": "normal"}, {"name": "Fire Fang", "dp": 65, "type": "fire"}]} 6 | {"name": "Articuno", "shortname": "articuno", "hp": 290, "info": {"id": 144, "type": "ice", "weakness": "rock", "description": "A legendary bird Pokemon that is said to appear to doomed people who are lost in icy mountains."}, "images": {"photo": "images/articuno.jpg", "typeIcon": "icons/ice.jpg", "weaknessIcon": "icons/rock.jpg"}, "moves": [{"name": "Ancient Power", "dp": 60, "type": "rock"}, {"name": "Double Team", "type": "normal"}, {"name": "Hurricane", "dp": 110, "type": "flying"}, {"name": "Ice Beam", "dp": 90, "type": "ice"}]} 7 | {"name": "Beedrill", "shortname": "beedrill", "hp": 240, "info": {"id": 15, "type": "flying", "weakness": "fire", "description": "Flies at high speed and attacks using its large venomous stingers on its forelegs and tail."}, "images": {"photo": "images/beedrill.jpg", "typeIcon": "icons/flying.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Pursuit", "dp": 40, "type": "dark"}, {"name": "Swords Dance", "type": "normal"}, {"name": "Twineedle", "dp": 25, "type": "bug"}, {"name": "Venoshock", "dp": 60, "type": "poison"}]} 8 | {"name": "Bellsprout", "shortname": "bellsprout", "hp": 210, "info": {"id": 69, "type": "grass", "weakness": "fire", "description": "A carnivorous Pokemon that traps and eats bugs. It uses its root feet to soak up needed moisture."}, "images": {"photo": "images/bellsprout.jpg", "typeIcon": "icons/grass.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Acid", "dp": 40, "type": "poison"}, {"name": "Growth", "type": "grass"}, {"name": "Vine Whip", "dp": 45, "type": "grass"}, {"name": "Wrap", "dp": 15, "type": "normal"}]} 9 | {"name": "Blastoise", "shortname": "blastoise", "hp": 268, "info": {"id": 9, "type": "water", "weakness": "grass", "description": "The rocket cannons on its shell fire jets of water capable of punching holes through thick steel."}, "images": {"photo": "images/blastoise.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/grass.jpg"}, "moves": [{"name": "Bite", "dp": 60, "type": "dark"}, {"name": "Flash Cannon", "dp": 80, "type": "steel"}, {"name": "Hydro Pump", "dp": 110, "type": "water"}, {"name": "Withdraw", "type": "water"}]} 10 | {"name": "Bulbasaur", "shortname": "bulbasaur", "hp": 200, "info": {"id": 1, "type": "grass", "weakness": "fire", "description": "A strange seed was planted on its back at birth. The plant sprouts and grows with this Pokemon."}, "images": {"photo": "images/bulbasaur.jpg", "typeIcon": "icons/grass.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Amnesia", "type": "psychic"}, {"name": "Magical Leaf", "dp": 60, "type": "grass"}, {"name": "Vine Whip", "dp": 45, "type": "grass"}]} 11 | {"name": "Butterfree", "shortname": "butterfree", "hp": 230, "info": {"id": 12, "type": "flying", "weakness": "fire", "description": "In battle, it flaps its wings at high speed to release highly toxic dust into the air."}, "images": {"photo": "images/butterfree.jpg", "typeIcon": "icons/flying.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Double Team", "type": "normal"}, {"name": "Gust", "dp": 40, "type": "flying"}, {"name": "Psybeam", "dp": 65, "type": "psychic"}, {"name": "Silver Wind", "dp": 60, "type": "bug"}]} 12 | {"name": "Caterpie", "shortname": "caterpie", "hp": 200, "info": {"id": 10, "type": "grass", "weakness": "fire", "description": "Its short feet are tipped with suction pads that enable it to tirelessly climb slopes and walls."}, "images": {"photo": "images/caterpie.jpg", "typeIcon": "icons/grass.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Bug Bite", "dp": 60, "type": "bug"}, {"name": "Tackle", "dp": 60, "type": "normal"}]} 13 | {"name": "Chansey", "shortname": "chansey", "hp": 610, "info": {"id": 113, "type": "normal", "weakness": "fighting", "description": "Being few in number and difficult to capture, it is said to bring happiness to the Trainer who catches it."}, "images": {"photo": "images/chansey.jpg", "typeIcon": "icons/normal.jpg", "weaknessIcon": "icons/fighting.jpg"}, "moves": [{"name": "Defense Curl", "type": "normal"}, {"name": "Egg Bomb", "dp": 100, "type": "normal"}, {"name": "Growl", "type": "normal"}, {"name": "Pound", "dp": 40, "type": "normal"}]} 14 | {"name": "Charizard", "shortname": "charizard", "hp": 266, "info": {"id": 6, "type": "fire", "weakness": "water", "description": "Spits fire that is hot enough to melt boulders. Known to cause forest fires unintentionally."}, "images": {"photo": "images/charizard.jpg", "typeIcon": "icons/fire.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Air Slash", "dp": 75, "type": "flying"}, {"name": "Flare Blitz", "dp": 120, "type": "fire"}, {"name": "Slash", "dp": 70, "type": "normal"}, {"name": "Smokescreen", "type": "normal"}]} 15 | {"name": "Charmander", "shortname": "charmander", "hp": 188, "info": {"id": 4, "type": "fire", "weakness": "water", "description": "Obviously prefers hot places. When it rains, steam is said to spout from the tip of its tail."}, "images": {"photo": "images/charmander.jpg", "typeIcon": "icons/fire.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Dragon Rage", "dp": 40, "type": "dragon"}, {"name": "Ember", "dp": 40, "type": "fire"}, {"name": "Growl", "type": "normal"}, {"name": "Scratch", "dp": 40, "type": "normal"}]} 16 | {"name": "Charmeleon", "shortname": "charmeleon", "hp": 226, "info": {"id": 5, "type": "fire", "weakness": "water", "description": "When it swings its burning tail, it elevates the temperature to unbearably high levels."}, "images": {"photo": "images/charmeleon.jpg", "typeIcon": "icons/fire.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Dragon Rage", "dp": 40, "type": "dragon"}, {"name": "Flame Burst", "dp": 70, "type": "fire"}, {"name": "Slash", "dp": 70, "type": "normal"}, {"name": "Smokescreen", "type": "normal"}]} 17 | {"name": "Clefable", "shortname": "clefable", "hp": 300, "info": {"id": 36, "type": "fairy", "weakness": "poison", "description": "With its acute hearing, it can pick up sounds from far away. It usually hides in quiet places."}, "images": {"photo": "images/clefable.jpg", "typeIcon": "icons/fairy.jpg", "weaknessIcon": "icons/poison.jpg"}, "moves": [{"name": "Covet", "dp": 60, "type": "normal"}, {"name": "Disarming Voice", "dp": 40, "type": "fairy"}, {"name": "Minimize", "type": "normal"}, {"name": "Pound", "dp": 40, "type": "normal"}]} 18 | {"name": "Clefairy", "shortname": "clefairy", "hp": 250, "info": {"id": 35, "type": "fairy", "weakness": "poison", "description": "The moonlight that it stores in the wings on its back apparently gives it the ability to float in midair."}, "images": {"photo": "images/clefairy.jpg", "typeIcon": "icons/fairy.jpg", "weaknessIcon": "icons/poison.jpg"}, "moves": [{"name": "Disarming Voice", "dp": 40, "type": "fairy"}, {"name": "Growl", "type": "normal"}, {"name": "Pound", "dp": 40, "type": "normal"}, {"name": "Wakeup Slap", "dp": 70, "type": "fighting"}]} 19 | {"name": "Cloyster", "shortname": "cloyster", "hp": 210, "info": {"id": 91, "type": "water", "weakness": "electric", "description": "Even a missile can't break the spikes it uses to stab opponents. They're even harder than its shell."}, "images": {"photo": "images/cloyster.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Aurora Beam", "dp": 65, "type": "ice"}, {"name": "Hydro Pump", "dp": 110, "type": "water"}, {"name": "Poison Jab", "dp": 80, "type": "poison"}, {"name": "Withdraw", "type": "water"}]} 20 | {"name": "Cubone", "shortname": "cubone", "hp": 210, "info": {"id": 104, "type": "ground", "weakness": "water", "description": "Jack's favorite Pokemon! Cubone's both cute and completely hardcore."}, "images": {"photo": "images/cubone.jpg", "typeIcon": "icons/ground.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Bone Club", "dp": 65, "type": "ground"}, {"name": "Growl", "type": "normal"}, {"name": "Headbutt", "dp": 70, "type": "normal"}, {"name": "Stomping Tantrum", "dp": 75, "type": "ground"}]} 21 | {"name": "Dewgong", "shortname": "dewgong", "hp": 290, "info": {"id": 87, "type": "water", "weakness": "electric", "description": "Its entire body is a snowy-white. Unharmed by even intense cold, it swims powerfully in icy waters."}, "images": {"photo": "images/dewgong.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Aqua Tail", "dp": 90, "type": "water"}, {"name": "Growl", "type": "normal"}, {"name": "Headbutt", "dp": 70, "type": "normal"}, {"name": "Ice Beam", "dp": 90, "type": "ice"}]} 22 | {"name": "Diglett", "shortname": "diglett", "hp": 130, "info": {"id": 50, "type": "ground", "weakness": "water", "description": "It burrows through the ground at a shallow depth. It leaves raised earth in its wake, making it easy to spot."}, "images": {"photo": "images/diglett.jpg", "typeIcon": "icons/ground.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Astonish", "dp": 30, "type": "ghost"}, {"name": "Growl", "type": "normal"}, {"name": "Mud Bomb", "dp": 65, "type": "ground"}, {"name": "Scratch", "dp": 40, "type": "normal"}]} 23 | {"name": "Ditto", "shortname": "ditto", "hp": 206, "info": {"id": 132, "type": "normal", "weakness": "fighting", "description": "Duncan's favorite Pokemon (he has an awesome painting of Ditto on his wall). It can transform into anything. When it sleeps, it changes into a stone to avoid being attacked."}, "images": {"photo": "images/ditto.jpg", "typeIcon": "icons/normal.jpg", "weaknessIcon": "icons/fighting.jpg"}, "moves": [{"name": "Transform", "dp": 40, "type": "normal"}]} 24 | {"name": "Dodrio", "shortname": "dodrio", "hp": 230, "info": {"id": 85, "type": "flying", "weakness": "electric", "description": "Uses its three brains to execute complex plans. While two heads sleep, one head stays awake."}, "images": {"photo": "images/dodrio.jpg", "typeIcon": "icons/flying.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Drill Peck", "dp": 80, "type": "flying"}, {"name": "Pursuit", "dp": 40, "type": "dark"}, {"name": "Swords Dance", "type": "normal"}, {"name": "Tri Attack", "dp": 80, "type": "normal"}]} 25 | {"name": "Doduo", "shortname": "doduo", "hp": 180, "info": {"id": 84, "type": "flying", "weakness": "electric", "description": "It races through grassy plains with powerful strides, leaving footprints up to four inches deep."}, "images": {"photo": "images/doduo.jpg", "typeIcon": "icons/flying.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Growl", "type": "normal"}, {"name": "Peck", "dp": 35, "type": "flying"}, {"name": "Pursuit", "dp": 40, "type": "dark"}, {"name": "Quick Attack", "dp": 40, "type": "normal"}]} 26 | {"name": "Dragonair", "shortname": "dragonair", "hp": 232, "info": {"id": 148, "type": "dragon", "weakness": "fairy", "description": "They say that if it emits an aura from its whole body, the weather will begin to change instantly."}, "images": {"photo": "images/dragonair.jpg", "typeIcon": "icons/dragon.jpg", "weaknessIcon": "icons/fairy.jpg"}, "moves": [{"name": "Aqua Tail", "dp": 90, "type": "water"}, {"name": "Dragon Dance", "type": "dragon"}, {"name": "Dragon Rage", "dp": 40, "type": "dragon"}, {"name": "Slam", "dp": 80, "type": "normal"}]} 27 | {"name": "Dragonite", "shortname": "dragonite", "hp": 292, "info": {"id": 149, "type": "dragon", "weakness": "fairy", "description": "It is said to make its home somewhere in the sea. It guides crews of shipwrecks to shore."}, "images": {"photo": "images/dragonite.jpg", "typeIcon": "icons/dragon.jpg", "weaknessIcon": "icons/fairy.jpg"}, "moves": [{"name": "Dragon Dance", "type": "dragon"}, {"name": "Hurricane", "dp": 110, "type": "flying"}, {"name": "Outrage", "dp": 120, "type": "dragon"}, {"name": "Thunder Punch", "dp": 75, "type": "electric"}]} 28 | {"name": "Dratini", "shortname": "dratini", "hp": 192, "info": {"id": 147, "type": "dragon", "weakness": "fairy", "description": "Long considered a mythical Pokemon until recently when a small colony was found living underwater."}, "images": {"photo": "images/dratini.jpg", "typeIcon": "icons/dragon.jpg", "weaknessIcon": "icons/fairy.jpg"}, "moves": [{"name": "Dragon Dance", "type": "dragon"}, {"name": "Dragon Rage", "dp": 40, "type": "dragon"}, {"name": "Slam", "dp": 80, "type": "normal"}, {"name": "Water Gun", "dp": 40, "type": "water"}]} 29 | {"name": "Drowzee", "shortname": "drowzee", "hp": 230, "info": {"id": 96, "type": "psychic", "weakness": "dark", "description": "Puts enemies to sleep then eats their dreams. Occasionally gets sick from eating bad dreams."}, "images": {"photo": "images/drowzee.jpg", "typeIcon": "icons/psychic.jpg", "weaknessIcon": "icons/dark.jpg"}, "moves": [{"name": "Headbutt", "dp": 70, "type": "normal"}, {"name": "Ice Punch", "dp": 75, "type": "ice"}, {"name": "Meditate", "type": "psychic"}, {"name": "Psybeam", "dp": 65, "type": "psychic"}]} 30 | {"name": "Dugtrio", "shortname": "dugtrio", "hp": 180, "info": {"id": 51, "type": "ground", "weakness": "water", "description": "A team of triplets that can burrow over 60 MPH. Due to this, some people think it's an earthquake."}, "images": {"photo": "images/dugtrio.jpg", "typeIcon": "icons/ground.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Earthquake", "dp": 100, "type": "ground"}, {"name": "Growl", "type": "normal"}, {"name": "Night Slash", "dp": 70, "type": "dark"}, {"name": "Tri Attack", "dp": 80, "type": "normal"}]} 31 | {"name": "Eevee", "shortname": "eevee", "hp": 220, "info": {"id": 133, "type": "normal", "weakness": "fighting", "description": "Sven's favorite Pokemon! Due to its unstable genetic makeup, this special Pokemon conceals many different possible evolutions."}, "images": {"photo": "images/eevee.jpg", "typeIcon": "icons/normal.jpg", "weaknessIcon": "icons/fighting.jpg"}, "moves": [{"name": "Bite", "dp": 60, "type": "dark"}, {"name": "Growl", "type": "normal"}, {"name": "Shadow Ball", "dp": 80, "type": "ghost"}, {"name": "Swift", "dp": 60, "type": "normal"}]} 32 | {"name": "Ekans", "shortname": "ekans", "hp": 180, "info": {"id": 23, "type": "poison", "weakness": "psychic", "description": "It always hides in grass. When first born, it has no poison, so its bite is painful, but harmless."}, "images": {"photo": "images/ekans.jpg", "typeIcon": "icons/poison.jpg", "weaknessIcon": "icons/psychic.jpg"}, "moves": [{"name": "Acid", "dp": 40, "type": "poison"}, {"name": "Bite", "dp": 60, "type": "dark"}, {"name": "Leer", "type": "normal"}, {"name": "Mud Bomb", "dp": 65, "type": "ground"}]} 33 | {"name": "Electabuzz", "shortname": "electabuzz", "hp": 240, "info": {"id": 125, "type": "electric", "weakness": "ground", "description": "Electricity runs across the surface of its body. In darkness, its entire body glows a whitish-blue."}, "images": {"photo": "images/electabuzz.jpg", "typeIcon": "icons/electric.jpg", "weaknessIcon": "icons/ground.jpg"}, "moves": [{"name": "Karate Chop", "dp": 50, "type": "fighting"}, {"name": "Leer", "type": "normal"}, {"name": "Swift", "dp": 60, "type": "normal"}, {"name": "Thunder Punch", "dp": 75, "type": "electric"}]} 34 | {"name": "Electrode", "shortname": "electrode", "hp": 230, "info": {"id": 101, "type": "electric", "weakness": "ground", "description": "It is dangerous. If it has too much electricity and has nothing to do, it amuses itself by exploding."}, "images": {"photo": "images/electrode.jpg", "typeIcon": "icons/electric.jpg", "weaknessIcon": "icons/ground.jpg"}, "moves": [{"name": "Screech", "type": "normal"}, {"name": "Tackle", "dp": 40, "type": "electric"}, {"name": "Thief", "dp": 60, "type": "dark"}, {"name": "Thunder", "dp": 120, "type": "electric"}]} 35 | {"name": "Exeggcute", "shortname": "exeggcute", "hp": 230, "info": {"id": 102, "type": "grass", "weakness": "fire", "description": "Often mistaken for eggs. When disturbed, they quickly gather and attack in swarms."}, "images": {"photo": "images/exeggcute.jpg", "typeIcon": "icons/grass.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Bullet Seed", "dp": 25, "type": "grass"}, {"name": "Double Team", "type": "normal"}, {"name": "Hidden Power", "dp": 60, "type": "normal"}, {"name": "Uproar", "dp": 90, "type": "normal"}]} 36 | {"name": "Exeggutor", "shortname": "exeggutor", "hp": 300, "info": {"id": 103, "type": "grass", "weakness": "fire", "description": "Its cries are very noisy. This is because each of the 3 heads thinks about whatever it likes."}, "images": {"photo": "images/exeggutor.jpg", "typeIcon": "icons/grass.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Barrage", "dp": 15, "type": "normal"}, {"name": "Confide", "type": "normal"}, {"name": "Seed Bomb", "dp": 80, "type": "grass"}, {"name": "Stomp", "dp": 65, "type": "normal"}]} 37 | {"name": "Farfetch'd", "shortname": "farfetchd", "hp": 214, "info": {"id": 83, "type": "flying", "weakness": "electric", "description": "The sprig of green onions it holds is its weapon. It is used much like a metal sword."}, "images": {"photo": "images/farfetchd.jpg", "typeIcon": "icons/flying.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Air Cutter", "dp": 60, "type": "flying"}, {"name": "Fury Cutter", "dp": 40, "type": "bug"}, {"name": "Slash", "dp": 70, "type": "normal"}, {"name": "Swords Dance", "type": "normal"}]} 38 | {"name": "Fearow", "shortname": "fearow", "hp": 240, "info": {"id": 22, "type": "flying", "weakness": "electric", "description": "With its huge and magnificent wings, it can keep aloft without ever having to land for rest."}, "images": {"photo": "images/fearow.jpg", "typeIcon": "icons/flying.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Assurance", "dp": 60, "type": "dark"}, {"name": "Drill Peck", "dp": 80, "type": "flying"}, {"name": "Drill Run", "dp": 80, "type": "ground"}, {"name": "Leer", "type": "normal"}]} 39 | {"name": "Flareon", "shortname": "flareon", "hp": 240, "info": {"id": 136, "type": "fire", "weakness": "water", "description": "It fluffs out its fur collar to cool down its body temperature, which can reach 1,650 degrees Fahrenheit."}, "images": {"photo": "images/flareon.jpg", "typeIcon": "icons/fire.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Bite", "dp": 60, "type": "dark"}, {"name": "Ember", "dp": 40, "type": "fire"}, {"name": "Quick Attack", "dp": 40, "type": "normal"}, {"name": "Sand Attack", "type": "ground"}]} 40 | {"name": "Gastly", "shortname": "gastly", "hp": 170, "info": {"id": 92, "type": "ghost", "weakness": "dark", "description": "With its gas-like body, it can sneak into any place it desires. However, it can be blown away by wind."}, "images": {"photo": "images/gastly.jpg", "typeIcon": "icons/ghost.jpg", "weaknessIcon": "icons/dark.jpg"}, "moves": [{"name": "Double Team", "type": "normal"}, {"name": "Lick", "dp": 30, "type": "ghost"}, {"name": "Payback", "dp": 50, "type": "dark"}, {"name": "Thief", "dp": 60, "type": "dark"}]} 41 | {"name": "Gengar", "shortname": "gengar", "hp": 230, "info": {"id": 94, "type": "ghost", "weakness": "dark", "description": "Chadi's favorite Pokemon! It is said to emerge from darkness to steal the lives of those who become lost in mountains."}, "images": {"photo": "images/gengar.jpg", "typeIcon": "icons/ghost.jpg", "weaknessIcon": "icons/dark.jpg"}, "moves": [{"name": "Dark Pulse", "dp": 80, "type": "dark"}, {"name": "Double Team", "type": "normal"}, {"name": "Shadow Ball", "dp": 80, "type": "ghost"}, {"name": "Venoshock", "dp": 65, "type": "poison"}]} 42 | {"name": "Geodude", "shortname": "geodude", "hp": 190, "info": {"id": 74, "type": "rock", "weakness": "water", "description": "Found in fields and mountains. Mistaking them for boulders, people often step or trip on them."}, "images": {"photo": "images/geodude.jpg", "typeIcon": "icons/rock.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Bulldoze", "dp": 60, "type": "ground"}, {"name": "Defense Curl", "type": "normal"}, {"name": "Rock Throw", "dp": 50, "type": "rock"}, {"name": "Tackle", "dp": 40, "type": "normal"}]} 43 | {"name": "Gloom", "shortname": "gloom", "hp": 230, "info": {"id": 44, "type": "grass", "weakness": "fire", "description": "Smells incredibly foul! However, around 1 out of 1,000 people enjoy sniffing its nose-bending stink."}, "images": {"photo": "images/gloom.jpg", "typeIcon": "icons/grass.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Acid", "dp": 40, "type": "poison"}, {"name": "Growth", "type": "grass"}, {"name": "Hidden Power", "dp": 60, "type": "normal"}, {"name": "Razor Leaf", "dp": 55, "type": "grass"}]} 44 | {"name": "Golbat", "shortname": "golbat", "hp": 260, "info": {"id": 42, "type": "poison", "weakness": "psychic", "description": "It attacks in a stealthy manner, without warning. Its sharp fangs are used to bite and suck blood."}, "images": {"photo": "images/golbat.jpg", "typeIcon": "icons/poison.jpg", "weaknessIcon": "icons/psychic.jpg"}, "moves": [{"name": "Bite", "dp": 60, "type": "dark"}, {"name": "Screech", "type": "normal"}, {"name": "Swift", "dp": 60, "type": "normal"}, {"name": "Wing Attack", "dp": 60, "type": "flying"}]} 45 | {"name": "Goldeen", "shortname": "goldeen", "hp": 200, "info": {"id": 118, "type": "water", "weakness": "electric", "description": "A strong swimmer, it is capable of swimming nonstop up fast streams at a steady speed of five knots."}, "images": {"photo": "images/goldeen.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Double Team", "type": "normal"}, {"name": "Horn Attack", "dp": 65, "type": "normal"}, {"name": "Peck", "dp": 35, "type": "flying"}, {"name": "Water Pulse", "dp": 60, "type": "water"}]} 46 | {"name": "Golduck", "shortname": "golduck", "hp": 270, "info": {"id": 55, "type": "water", "weakness": "electric", "description": "Often seen swimming elegantly by lake shores. It is often mistaken for the Japanese monster, Kappa."}, "images": {"photo": "images/golduck.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Amnesia", "type": "psychic"}, {"name": "Scratch", "dp": 40, "type": "normal"}, {"name": "Water Pulse", "dp": 60, "type": "water"}, {"name": "Zen Headbutt", "dp": 90, "type": "psychic"}]} 47 | {"name": "Golem", "shortname": "golem", "hp": 270, "info": {"id": 76, "type": "rock", "weakness": "water", "description": "It is enclosed in a hard shell that is as rugged as slabs of rock. It sheds skin once a year to grow larger."}, "images": {"photo": "images/golem.jpg", "typeIcon": "icons/rock.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Defense Curl", "type": "normal"}, {"name": "Earthquake", "dp": 100, "type": "ground"}, {"name": "Rock Throw", "dp": 50, "type": "rock"}, {"name": "Steamroller", "dp": 65, "type": "bug"}]} 48 | {"name": "Graveler", "shortname": "graveler", "hp": 220, "info": {"id": 75, "type": "rock", "weakness": "water", "description": "Rolls down slopes to move. It rolls over any obstacle without slowing or changing its direction."}, "images": {"photo": "images/graveler.jpg", "typeIcon": "icons/rock.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Bulldoze", "dp": 60, "type": "ground"}, {"name": "Defense Curl", "type": "normal"}, {"name": "Hidden Power", "dp": 60, "type": "normal"}, {"name": "Smack Down", "dp": 50, "type": "rock"}]} 49 | {"name": "Grimer", "shortname": "grimer", "hp": 270, "info": {"id": 88, "type": "poison", "weakness": "psychic", "description": "Appears in filthy areas. Thrives by sucking up polluted sludge that is pumped out of factories."}, "images": {"photo": "images/grimer.jpg", "typeIcon": "icons/poison.jpg", "weaknessIcon": "icons/psychic.jpg"}, "moves": [{"name": "Harden", "type": "normal"}, {"name": "Mud Bomb", "dp": 65, "type": "ground"}, {"name": "Pound", "dp": 40, "type": "normal"}, {"name": "Sludge", "dp": 65, "type": "poison"}]} 50 | {"name": "Growlithe", "shortname": "growlithe", "hp": 220, "info": {"id": 58, "type": "fire", "weakness": "water", "description": "Conner's favorite Pokemon ('It's adorable'). It has a brave and trustworthy nature and fearlessly stands up to bigger and stronger foes."}, "images": {"photo": "images/growlithe.jpg", "typeIcon": "icons/fire.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Bite", "dp": 60, "type": "dark"}, {"name": "Fire Fang", "dp": 65, "type": "fire"}, {"name": "Iron Tail", "dp": 100, "type": "steel"}, {"name": "Leer", "type": "normal"}]} 51 | {"name": "Gyarados", "shortname": "gyarados", "hp": 300, "info": {"id": 130, "type": "water", "weakness": "electric", "description": "It appears whenever there is world conflict, burning down any place it travels through."}, "images": {"photo": "images/gyarados.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Crunch", "dp": 80, "type": "dark"}, {"name": "Dragon Dance", "type": "dragon"}, {"name": "Dragon Tail", "dp": 60, "type": "dragon"}, {"name": "Hydro Pump", "dp": 110, "type": "water"}]} 52 | {"name": "Haunter", "shortname": "haunter", "hp": 200, "info": {"id": 93, "type": "ghost", "weakness": "dark", "description": "It hides in the dark, planning to take the life of the next living thing that wanders close by."}, "images": {"photo": "images/haunter.jpg", "typeIcon": "icons/ghost.jpg", "weaknessIcon": "icons/dark.jpg"}, "moves": [{"name": "Double Team", "type": "normal"}, {"name": "Shadow Punch", "dp": 60, "type": "ghost"}, {"name": "Thief", "dp": 60, "type": "dark"}, {"name": "Venoshock", "dp": 65, "type": "poison"}]} 53 | {"name": "Hitmonchan", "shortname": "hitmonchan", "hp": 210, "info": {"id": 107, "type": "fighting", "weakness": "flying", "description": "Its punches slice the air. They are launched at such high speed, even a slight graze could cause a burn."}, "images": {"photo": "images/hitmonchan.jpg", "typeIcon": "icons/fighting.jpg", "weaknessIcon": "icons/flying.jpg"}, "moves": [{"name": "Fire Punch", "dp": 75, "type": "fire"}, {"name": "Ice Punch", "dp": 75, "type": "ice"}, {"name": "Mach Punch", "dp": 40, "type": "fighting"}, {"name": "Work Up", "type": "normal"}]} 54 | {"name": "Hitmonlee", "shortname": "hitmonlee", "hp": 210, "info": {"id": 106, "type": "fighting", "weakness": "flying", "description": "If it starts kicking repeatedly, both legs will stretch even longer to strike a fleeing foe."}, "images": {"photo": "images/hitmonlee.jpg", "typeIcon": "icons/fighting.jpg", "weaknessIcon": "icons/flying.jpg"}, "moves": [{"name": "Blaze Kick", "dp": 85, "type": "fire"}, {"name": "Double Kick", "dp": 60, "type": "fighting"}, {"name": "Meditate", "type": "psychic"}, {"name": "Mega Kick", "dp": 120, "type": "normal"}]} 55 | {"name": "Horsea", "shortname": "horsea", "hp": 170, "info": {"id": 116, "type": "water", "weakness": "electric", "description": "It maintains balance using its tail, which is wound up like a coil. It may spray ink from its mouth."}, "images": {"photo": "images/horsea.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Aurora Beam", "dp": 65, "type": "ice"}, {"name": "Bubble", "dp": 40, "type": "water"}, {"name": "Smokescreen", "type": "normal"}, {"name": "Twister", "dp": 40, "type": "dragon"}]} 56 | {"name": "Hypno", "shortname": "hypno", "hp": 280, "info": {"id": 97, "type": "psychic", "weakness": "dark", "description": "It carries a pendulum-like device. There once was an incident in which it took away a child it hypnotized."}, "images": {"photo": "images/hypno.jpg", "typeIcon": "icons/psychic.jpg", "weaknessIcon": "icons/dark.jpg"}, "moves": [{"name": "Fire Punch", "dp": 75, "type": "fire"}, {"name": "Headbutt", "dp": 70, "type": "normal"}, {"name": "Meditate", "type": "psychic"}, {"name": "Psychic", "dp": 90, "type": "psychic"}]} 57 | {"name": "Ivysaur", "shortname": "ivysaur", "hp": 230, "info": {"id": 2, "type": "grass", "weakness": "fire", "description": "When the bulb on its back grows large, it appears to lose the ability to stand on its hind legs."}, "images": {"photo": "images/ivysaur.jpg", "typeIcon": "icons/grass.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Growl", "type": "normal"}, {"name": "Magical Leaf", "dp": 60, "type": "grass"}, {"name": "Razor Leaf", "dp": 55, "type": "grass"}, {"name": "Venoshock", "dp": 65, "type": "poison"}]} 58 | {"name": "Jigglypuff", "shortname": "jigglypuff", "hp": 340, "info": {"id": 39, "type": "fairy", "weakness": "poison", "description": "Garrett's favorite pokemon! When its huge eyes light up, it sings a mysteriously soothing melody that lulls its enemies to sleep."}, "images": {"photo": "images/jigglypuff.jpg", "typeIcon": "icons/fairy.jpg", "weaknessIcon": "icons/poison.jpg"}, "moves": [{"name": "Defense Curl", "type": "normal"}, {"name": "Pound", "dp": 40, "type": "normal"}, {"name": "Rollout", "dp": 30, "type": "rock"}, {"name": "Wakeup Slap", "dp": 70, "type": "fighting"}]} 59 | {"name": "Jolteon", "shortname": "jolteon", "hp": 240, "info": {"id": 135, "type": "electric", "weakness": "ground", "description": "It concentrates the weak electric charges emitted by its cells and launches wicked lightning bolts."}, "images": {"photo": "images/jolteon.jpg", "typeIcon": "icons/electric.jpg", "weaknessIcon": "icons/ground.jpg"}, "moves": [{"name": "Double Kick", "dp": 60, "type": "fighting"}, {"name": "Quick Attack", "dp": 40, "type": "normal"}, {"name": "Sand Attack", "type": "ground"}, {"name": "Thunder Shock", "dp": 40, "type": "electric"}]} 60 | {"name": "Jynx", "shortname": "jynx", "hp": 240, "info": {"id": 124, "type": "psychic", "weakness": "dark", "description": "It has several different cry patterns, each of which seems to have its own meaning."}, "images": {"photo": "images/jynx.jpg", "typeIcon": "icons/psychic.jpg", "weaknessIcon": "icons/dark.jpg"}, "moves": [{"name": "Blizzard", "dp": 110, "type": "ice"}, {"name": "Fake Tears", "type": "dark"}, {"name": "Pound", "dp": 40, "type": "normal"}, {"name": "Powder Snow", "dp": 40, "type": "ice"}]} 61 | {"name": "Kabuto", "shortname": "kabuto", "hp": 170, "info": {"id": 140, "type": "rock", "weakness": "grass", "description": "It is thought to have inhabited beaches 300 million years ago. It is protected by a stiff shell."}, "images": {"photo": "images/kabuto.jpg", "typeIcon": "icons/rock.jpg", "weaknessIcon": "icons/grass.jpg"}, "moves": [{"name": "Aqua Jet", "dp": 40, "type": "water"}, {"name": "Harden", "type": "normal"}, {"name": "Mud Shot", "dp": 55, "type": "ground"}, {"name": "Scratch", "dp": 40, "type": "normal"}]} 62 | {"name": "Kabutops", "shortname": "kabutops", "hp": 230, "info": {"id": 141, "type": "rock", "weakness": "grass", "description": "Its sleek shape is perfect for swimming. It slashes prey with its claws and drains the body fluids."}, "images": {"photo": "images/kabutops.jpg", "typeIcon": "icons/rock.jpg", "weaknessIcon": "icons/grass.jpg"}, "moves": [{"name": "Ancient Power", "dp": 60, "type": "rock"}, {"name": "Harden", "type": "normal"}, {"name": "Night Slash", "dp": 70, "type": "dark"}, {"name": "Slash", "dp": 70, "type": "normal"}]} 63 | {"name": "Kadabra", "shortname": "kadabra", "hp": 190, "info": {"id": 64, "type": "psychic", "weakness": "dark", "description": "It emits special alpha waves from its body that induce headaches just by being close by."}, "images": {"photo": "images/kadabra.jpg", "typeIcon": "icons/psychic.jpg", "weaknessIcon": "icons/dark.jpg"}, "moves": [{"name": "Fire Punch", "dp": 75, "type": "fire"}, {"name": "Ice Punch", "dp": 75, "type": "ice"}, {"name": "Kinesis", "type": "psychic"}, {"name": "Psychic", "dp": 90, "type": "psychic"}]} 64 | {"name": "Kakuna", "shortname": "kakuna", "hp": 200, "info": {"id": 14, "type": "grass", "weakness": "fire", "description": "While awaiting evolution, it hides from predators under leaves and in nooks of branches."}, "images": {"photo": "images/kakuna.jpg", "typeIcon": "icons/grass.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Harden", "type": "normal"}, {"name": "Tackle", "dp": 60, "type": "normal"}]} 65 | {"name": "Kangaskhan", "shortname": "kangaskhan", "hp": 320, "info": {"id": 115, "type": "normal", "weakness": "fighting", "description": "To protect its young, it will never give up during battle, no matter how badly wounded it is."}, "images": {"photo": "images/kangaskhan.jpg", "typeIcon": "icons/normal.jpg", "weaknessIcon": "icons/fighting.jpg"}, "moves": [{"name": "Bite", "dp": 60, "type": "dark"}, {"name": "Dizzy Punch", "dp": 70, "type": "normal"}, {"name": "Leer", "type": "normal"}, {"name": "Mega Punch", "dp": 80, "type": "normal"}]} 66 | {"name": "Kingler", "shortname": "kingler", "hp": 220, "info": {"id": 99, "type": "water", "weakness": "electric", "description": "It can hardly lift its massive, overgrown pincer. The pincer's size makes it difficult to aim properly."}, "images": {"photo": "images/kingler.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Crabhammer", "dp": 100, "type": "water"}, {"name": "Harden", "type": "normal"}, {"name": "Mud Shot", "dp": 65, "type": "ground"}, {"name": "Vice Grip", "dp": 55, "type": "normal"}]} 67 | {"name": "Koffing", "shortname": "koffing", "hp": 190, "info": {"id": 109, "type": "poison", "weakness": "psychic", "description": "If one gets close enough to it when it expels poisonous gas, the gas swirling inside it can be seen."}, "images": {"photo": "images/koffing.jpg", "typeIcon": "icons/poison.jpg", "weaknessIcon": "icons/psychic.jpg"}, "moves": [{"name": "Tackle", "dp": 40, "type": "normal"}, {"name": "Assurance", "dp": 60, "type": "dark"}, {"name": "Sludge", "dp": 65, "type": "poison"}, {"name": "Smokescreen", "type": "normal"}]} 68 | {"name": "Krabby", "shortname": "krabby", "hp": 170, "info": {"id": 98, "type": "water", "weakness": "electric", "description": "Its pincers are superb weapons. They sometimes break off during battle, but they grow back fast."}, "images": {"photo": "images/krabby.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Bubble", "dp": 40, "type": "water"}, {"name": "Harden", "type": "normal"}, {"name": "Metal Claw", "dp": 50, "type": "steel"}, {"name": "Vice Grip", "dp": 55, "type": "normal"}]} 69 | {"name": "Lapras", "shortname": "lapras", "hp": 370, "info": {"id": 131, "type": "water", "weakness": "electric", "description": "Nicole's favorite Pokemon! Its high intelligence enables it to understand human speech. It likes to ferry people on its back."}, "images": {"photo": "images/lapras.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Growl", "type": "normal"}, {"name": "Hydro Pump", "dp": 110, "type": "water"}, {"name": "Thunder", "dp": 110, "type": "electric"}, {"name": "Ice Beam", "dp": 90, "type": "ice"}]} 70 | {"name": "Lickitung", "shortname": "lickitung", "hp": 160, "info": {"id": 108, "type": "normal", "weakness": "fighting", "description": "Its tongue spans almost 7 feet and moves more freely than its forelegs. Its licks can cause paralysis."}, "images": {"photo": "images/lickitung.jpg", "typeIcon": "icons/normal.jpg", "weaknessIcon": "icons/fighting.jpg"}, "moves": [{"name": "Slam", "dp": 80, "type": "normal"}, {"name": "Stomp", "dp": 65, "type": "normal"}]} 71 | {"name": "Machamp", "shortname": "machamp", "hp": 160, "info": {"id": 68, "type": "fighting", "weakness": "flying", "description": "Using its heavy muscles, it throws powerful punches that can send the victim clear over the horizon."}, "images": {"photo": "images/machamp.jpg", "typeIcon": "icons/fighting.jpg", "weaknessIcon": "icons/flying.jpg"}, "moves": [{"name": "Leer", "type": "normal"}, {"name": "Low Sweep", "dp": 65, "type": "fighting"}, {"name": "Strength", "dp": 80, "type": "normal"}, {"name": "Ice Punch", "dp": 75, "type": "ice"}]} 72 | {"name": "Machoke", "shortname": "machoke", "hp": 160, "info": {"id": 67, "type": "fighting", "weakness": "flying", "description": "Its muscular body is so powerful, it must wear a power save belt to be able to regulate its motions."}, "images": {"photo": "images/machoke.jpg", "typeIcon": "icons/fighting.jpg", "weaknessIcon": "icons/flying.jpg"}, "moves": [{"name": "Karate chop", "dp": 50, "type": "fighting"}, {"name": "Leer", "type": "normal"}]} 73 | {"name": "Machop", "shortname": "machop", "hp": 160, "info": {"id": 66, "type": "fighting", "weakness": "flying", "description": "Always brimming with power, it passes time by lifting boulders. Doing so makes it even stronger."}, "images": {"photo": "images/machop.jpg", "typeIcon": "icons/fighting.jpg", "weaknessIcon": "icons/flying.jpg"}, "moves": [{"name": "Karate chop", "dp": 50, "type": "fighting"}, {"name": "Leer", "type": "normal"}]} 74 | {"name": "Magikarp", "shortname": "magikarp", "hp": 80, "info": {"id": 129, "type": "water", "weakness": "electric", "description": "A pathetic excuse for a Pokemon that is only capable of flopping and splashing. This behavior prompted scientists to undertake research into it."}, "images": {"photo": "images/magikarp.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Splash", "dp": 1, "type": "water"}]} 75 | {"name": "Magmar", "shortname": "magmar", "hp": 160, "info": {"id": 126, "type": "fire", "weakness": "water", "description": "The fiery surface of its body gives off a wavering, rippling glare that is similar to the sun."}, "images": {"photo": "images/magmar.jpg", "typeIcon": "icons/fire.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Ember", "dp": 40, "type": "fire"}, {"name": "Fire Punch", "dp": 75, "type": "fire"}, {"name": "Leer", "type": "normal"}]} 76 | {"name": "Magnemite", "shortname": "magnemite", "hp": 160, "info": {"id": 81, "type": "steel", "weakness": "fire", "description": "The electricity emitted by the units on each side of its body cause it to become a strong magnet."}, "images": {"photo": "images/magnemite.jpg", "typeIcon": "icons/steel.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Screech", "type": "normal"}, {"name": "Thunder Shock", "dp": 40, "type": "electric"}]} 77 | {"name": "Magneton", "shortname": "magneton", "hp": 160, "info": {"id": 82, "type": "steel", "weakness": "fire", "description": "Generates strange radio signals. It raises the temperature by 3.6F degrees within 3,300 feet."}, "images": {"photo": "images/magneton.jpg", "typeIcon": "icons/steel.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Screech", "type": "normal"}, {"name": "Tri Attack", "dp": 80, "type": "normal"}]} 78 | {"name": "Mankey", "shortname": "mankey", "hp": 160, "info": {"id": 56, "type": "fighting", "weakness": "flying", "description": "Extremely quick to anger. It could be docile one moment then thrashing away the next instant."}, "images": {"photo": "images/mankey.jpg", "typeIcon": "icons/fighting.jpg", "weaknessIcon": "icons/flying.jpg"}, "moves": [{"name": "Karate chop", "dp": 50, "type": "fighting"}, {"name": "Leer", "type": "normal"}, {"name": "Scratch", "dp": 40, "type": "normal"}]} 79 | {"name": "Marowak", "shortname": "marowak", "hp": 160, "info": {"id": 105, "type": "ground", "weakness": "water", "description": "The bone it holds is its key weapon. It throws the bone skillfully like a boomerang to KO targets."}, "images": {"photo": "images/marowak.jpg", "typeIcon": "icons/ground.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Bone Club", "dp": 65, "type": "ground"}, {"name": "Growl", "type": "normal"}, {"name": "Headbutt", "dp": 70, "type": "normal"}]} 80 | {"name": "Meowth", "shortname": "meowth", "hp": 160, "info": {"id": 52, "type": "normal", "weakness": "fighting", "description": "Adores circular objects. Wanders the streets on a nightly basis to look for dropped loose change."}, "images": {"photo": "images/meowth.jpg", "typeIcon": "icons/normal.jpg", "weaknessIcon": "icons/fighting.jpg"}, "moves": [{"name": "Bite", "dp": 60, "type": "dark"}, {"name": "Growl", "type": "normal"}, {"name": "Scratch", "dp": 40, "type": "normal"}]} 81 | {"name": "Metapod", "shortname": "metapod", "hp": 160, "info": {"id": 11, "type": "grass", "weakness": "fire", "description": "A steel-hard shell protects its tender body. It quietly endures hardships while awaiting evolution."}, "images": {"photo": "images/metapod.jpg", "typeIcon": "icons/grass.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Harden", "type": "normal"}, {"name": "Tackle", "dp": 60, "type": "normal"}]} 82 | {"name": "Mew", "shortname": "mew", "hp": 160, "info": {"id": 151, "type": "psychic", "weakness": "dark", "description": "Its DNA is said to contain the genetic codes of all Pokemon."}, "images": {"photo": "images/mew.jpg", "typeIcon": "icons/psychic.jpg", "weaknessIcon": "icons/dark.jpg"}, "moves": [{"name": "Amnesia", "type": "psychic"}, {"name": "Psychic", "dp": 90, "type": "psychic"}]} 83 | {"name": "Mewtwo", "shortname": "mewtwo", "hp": 160, "info": {"id": 150, "type": "psychic", "weakness": "dark", "description": "It was created by a scientist after years of horrific gene splicing and DNA engineering experiments."}, "images": {"photo": "images/mewtwo.jpg", "typeIcon": "icons/psychic.jpg", "weaknessIcon": "icons/dark.jpg"}, "moves": [{"name": "Amnesia", "type": "psychic"}, {"name": "Psychic", "dp": 90, "type": "psychic"}, {"name": "Swift", "dp": 60, "type": "normal"}]} 84 | {"name": "Moltres", "shortname": "moltres", "hp": 160, "info": {"id": 146, "type": "fire", "weakness": "rock", "description": "This legendary Pokemon scatters embers with every flap of its wings. It is a thrilling sight to behold."}, "images": {"photo": "images/moltres.jpg", "typeIcon": "icons/fire.jpg", "weaknessIcon": "icons/rock.jpg"}, "moves": [{"name": "Flamethrower", "dp": 90, "type": "fire"}, {"name": "Sky Attack", "dp": 140, "type": "flying"}]} 85 | {"name": "Mr. Mime", "shortname": "mr-mime", "hp": 160, "info": {"id": 122, "type": "psychic", "weakness": "ghost", "description": "Always practices its pantomime act. It makes enemies believe something exists that really doesn't."}, "images": {"photo": "images/mr-mime.jpg", "typeIcon": "icons/psychic.jpg", "weaknessIcon": "icons/ghost.jpg"}, "moves": [{"name": "Barrier", "type": "psychic"}, {"name": "Psybeam", "dp": 65, "type": "psychic"}]} 86 | {"name": "Muk", "shortname": "muk", "hp": 160, "info": {"id": 89, "type": "poison", "weakness": "psychic", "description": "As it moves, a very strong poison leaks from it, making the ground there barren for three years."}, "images": {"photo": "images/muk.jpg", "typeIcon": "icons/poison.jpg", "weaknessIcon": "icons/psychic.jpg"}, "moves": [{"name": "Harden", "type": "normal"}, {"name": "Mud Bomb", "dp": 65, "type": "ground"}, {"name": "Sludge", "dp": 65, "type": "poison"}]} 87 | {"name": "Nidoking", "shortname": "nidoking", "hp": 160, "info": {"id": 34, "type": "poison", "weakness": "psychic", "description": "One swing of its mighty tail can snap a telephone pole as if it were a matchstick."}, "images": {"photo": "images/nidoking.jpg", "typeIcon": "icons/poison.jpg", "weaknessIcon": "icons/psychic.jpg"}, "moves": [{"name": "Venoshock", "dp": 65, "type": "poison"}, {"name": "Mega Horn", "dp": 125, "type": "bug"}, {"name": "Earth Power", "dp": 90, "type": "ground"}, {"name": "Amnesia", "type": "psychic"}]} 88 | {"name": "Nidoqueen", "shortname": "nidoqueen", "hp": 160, "info": {"id": 31, "type": "poison", "weakness": "psychic", "description": "Its hard scales provide strong protection. It uses its hefty bulk to execute powerful moves."}, "images": {"photo": "images/nidoqueen.jpg", "typeIcon": "icons/poison.jpg", "weaknessIcon": "icons/psychic.jpg"}, "moves": [{"name": "Venoshock", "dp": 65, "type": "poison"}, {"name": "Superpower", "dp": 120, "type": "fighting"}, {"name": "Earth Power", "dp": 90, "type": "ground"}, {"name": "Charm", "type": "fairy"}]} 89 | {"name": "Nidoran(F)", "shortname": "nidoran-f", "hp": 160, "info": {"id": 29, "type": "poison", "weakness": "psychic", "description": "Although small, its venomous barbs render this Pokemon dangerous. The female has smaller horns."}, "images": {"photo": "images/nidoran-f.jpg", "typeIcon": "icons/poison.jpg", "weaknessIcon": "icons/psychic.jpg"}, "moves": [{"name": "Bite", "dp": 60, "type": "dark"}, {"name": "Double Kick", "dp": 60, "type": "fighting"}, {"name": "Growl", "type": "normal"}, {"name": "Peck", "dp": 35, "type": "flying"}]} 90 | {"name": "Nidoran(M)", "shortname": "nidoran-m", "hp": 160, "info": {"id": 32, "type": "poison", "weakness": "psychic", "description": "It stiffens its ears to sense danger. The larger its horns, the more powerful its secreted venom."}, "images": {"photo": "images/nidoran-m.jpg", "typeIcon": "icons/poison.jpg", "weaknessIcon": "icons/psychic.jpg"}, "moves": [{"name": "Bite", "dp": 60, "type": "dark"}, {"name": "Double Kick", "dp": 60, "type": "fighting"}, {"name": "Growl", "type": "normal"}, {"name": "Peck", "dp": 35, "type": "flying"}]} 91 | {"name": "Nidorina", "shortname": "nidorina", "hp": 160, "info": {"id": 30, "type": "poison", "weakness": "psychic", "description": "When resting deep in its burrow, its thorns always retract. This is proof that it is relaxed."}, "images": {"photo": "images/nidorina.jpg", "typeIcon": "icons/poison.jpg", "weaknessIcon": "icons/psychic.jpg"}, "moves": [{"name": "Bite", "dp": 60, "type": "dark"}, {"name": "Cut", "dp": 50, "type": "normal"}, {"name": "Double Kick", "dp": 60, "type": "fighting"}, {"name": "Leer", "type": "normal"}]} 92 | {"name": "Nidorino", "shortname": "nidorino", "hp": 160, "info": {"id": 33, "type": "poison", "weakness": "psychic", "description": "It raises its big ears to check its surroundings. If it senses anything, it attacks immediately."}, "images": {"photo": "images/nidorino.jpg", "typeIcon": "icons/poison.jpg", "weaknessIcon": "icons/psychic.jpg"}, "moves": [{"name": "Bite", "dp": 60, "type": "dark"}, {"name": "Double Kick", "dp": 60, "type": "fighting"}, {"name": "Horn Attack", "dp": 65, "type": "normal"}, {"name": "Leer", "type": "normal"}]} 93 | {"name": "Ninetales", "shortname": "ninetales", "hp": 160, "info": {"id": 38, "type": "fire", "weakness": "water", "description": "Very smart and very vengeful. Grabbing one of its many tails could result in a 1000-year curse."}, "images": {"photo": "images/ninetales.jpg", "typeIcon": "icons/fire.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Flamethrower", "dp": 90, "type": "fire"}, {"name": "Quick Attack", "dp": 40, "type": "normal"}]} 94 | {"name": "Oddish", "shortname": "oddish", "hp": 160, "info": {"id": 43, "type": "grass", "weakness": "fire", "description": "It may be mistaken for a clump of weeds. If you try to yank it out of the ground, it shrieks horribly."}, "images": {"photo": "images/oddish.jpg", "typeIcon": "icons/grass.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Acid", "dp": 40, "type": "poison"}]} 95 | {"name": "Omanyte", "shortname": "omanyte", "hp": 160, "info": {"id": 138, "type": "water", "weakness": "electric", "description": "Revived from an ancient fossil, this Pokemon uses air stored in its shell to sink and rise in water."}, "images": {"photo": "images/omanyte.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Bite", "dp": 60, "type": "dark"}, {"name": "Leer", "type": "normal"}]} 96 | {"name": "Omastar", "shortname": "omastar", "hp": 160, "info": {"id": 139, "type": "water", "weakness": "electric", "description": "Apparently, it cracked Shellder's shell with its sharp fangs and sucked out the insides."}, "images": {"photo": "images/omastar.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Bite", "dp": 60, "type": "dark"}, {"name": "Hydro Pump", "dp": 110, "type": "water"}]} 97 | {"name": "Onix", "shortname": "onix", "hp": 160, "info": {"id": 95, "type": "rock", "weakness": "water", "description": "It rapidly bores through the ground at 50 mph by squirming and twisting its massive, rugged body."}, "images": {"photo": "images/onix.jpg", "typeIcon": "icons/rock.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Dig", "dp": 80, "type": "ground", "warmup": 1}, {"name": "Harden", "type": "normal"}, {"name": "Rock Slide", "dp": 75, "type": "rock"}, {"name": "Slam", "dp": 80, "type": "normal"}]} 98 | {"name": "Paras", "shortname": "paras", "hp": 160, "info": {"id": 46, "type": "bug", "weakness": "fire", "description": "Mushrooms named tochukaso grow on its back. They grow along with the host Paras."}, "images": {"photo": "images/paras.jpg", "typeIcon": "icons/bug.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Peck", "dp": 35, "type": "flying"}, {"name": "Scratch", "dp": 40, "type": "normal"}]} 99 | {"name": "Parasect", "shortname": "parasect", "hp": 160, "info": {"id": 47, "type": "bug", "weakness": "fire", "description": "A host-parasite pair in which the parasite mushroom has taken over the host bug. Prefers damp places."}, "images": {"photo": "images/parasect.jpg", "typeIcon": "icons/bug.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Slash", "dp": 70, "type": "normal"}]} 100 | {"name": "Persian", "shortname": "persian", "hp": 160, "info": {"id": 53, "type": "normal", "weakness": "fighting", "description": "Many adore it for its sophisticated air. However, it will lash out and scratch for little reason."}, "images": {"photo": "images/persian.jpg", "typeIcon": "icons/normal.jpg", "weaknessIcon": "icons/fighting.jpg"}, "moves": [{"name": "Bite", "dp": 60, "type": "dark"}, {"name": "Screech", "type": "normal"}, {"name": "Swift", "dp": 60, "type": "normal"}]} 101 | {"name": "Pidgeot", "shortname": "pidgeot", "hp": 160, "info": {"id": 18, "type": "flying", "weakness": "electric", "description": "It spreads its gorgeous wings widely to intimidate enemies. It races through the skies at Mach-2 speed."}, "images": {"photo": "images/pidgeot.jpg", "typeIcon": "icons/flying.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Quick Attack", "dp": 40, "type": "normal"}, {"name": "Sand Attack", "type": "ground"}]} 102 | {"name": "Pidgeotto", "shortname": "pidgeotto", "hp": 160, "info": {"id": 17, "type": "flying", "weakness": "electric", "description": "It has outstanding vision. However high it flies, it is able to distinguish the movements of its prey."}, "images": {"photo": "images/pidgeotto.jpg", "typeIcon": "icons/flying.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Sand Attack", "type": "ground"}, {"name": "Wing Attack", "dp": 60, "type": "flying"}]} 103 | {"name": "Pidgey", "shortname": "pidgey", "hp": 160, "info": {"id": 16, "type": "flying", "weakness": "electric", "description": "Jeffrey's favorite Pokemon! Because it dislikes fighting, it protects itself by kicking up sand."}, "images": {"photo": "images/pidgey.jpg", "typeIcon": "icons/flying.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Peck", "dp": 35, "type": "flying"}, {"name": "Quick Attack", "dp": 40, "type": "normal"}, {"name": "Sand Attack", "type": "ground"}]} 104 | {"name": "Pikachu", "shortname": "pikachu", "hp": 160, "info": {"id": 25, "type": "electric", "weakness": "ground", "description": "Melissa's favorite Pokemon! When several Pikachu gather, their electricity could build and cause lightning storms."}, "images": {"photo": "images/pikachu.jpg", "typeIcon": "icons/electric.jpg", "weaknessIcon": "icons/ground.jpg"}, "moves": [{"name": "Growl", "type": "normal"}, {"name": "Quick Attack", "dp": 40, "type": "normal"}, {"name": "Thunderbolt", "dp": 90, "type": "electric"}]} 105 | {"name": "Pinsir", "shortname": "pinsir", "hp": 160, "info": {"id": 127, "type": "bug", "weakness": "fire", "description": "When the temperature drops at night, it sleeps on treetops or among roots where it is well hidden."}, "images": {"photo": "images/pinsir.jpg", "typeIcon": "icons/bug.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Harden", "type": "normal"}, {"name": "Vice Grip", "dp": 55, "type": "normal"}]} 106 | {"name": "Poliwag", "shortname": "poliwag", "hp": 160, "info": {"id": 60, "type": "water", "weakness": "electric", "description": "Its newly grown legs prevent it from running. It appears to prefer swimming than trying to stand."}, "images": {"photo": "images/poliwag.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Water Gun", "dp": 40, "type": "water"}]} 107 | {"name": "Poliwhirl", "shortname": "poliwhirl", "hp": 160, "info": {"id": 61, "type": "water", "weakness": "electric", "description": "Its two legs are well developed. Even though it can live on the ground, it prefers living in water."}, "images": {"photo": "images/poliwhirl.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Bubble Beam", "dp": 65, "type": "water"}, {"name": "Mud Bomb", "dp": 65, "type": "ground"}, {"name": "Tackle", "dp": 60, "type": "normal"}]} 108 | {"name": "Poliwrath", "shortname": "poliwrath", "hp": 160, "info": {"id": 62, "type": "water", "weakness": "electric", "description": "Although an energetic, skilled swimmer that uses all of its muscles, it lives on dry land."}, "images": {"photo": "images/poliwrath.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Bubble Beam", "dp": 65, "type": "water"}]} 109 | {"name": "Ponyta", "shortname": "ponyta", "hp": 160, "info": {"id": 77, "type": "fire", "weakness": "water", "description": "It has a brave and trustworthy nature. It fearlessly stands up to bigger and stronger foes. Not to be confused with the 20% cooler PonyTA."}, "images": {"photo": "images/ponyta.jpg", "typeIcon": "icons/fire.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Ember", "dp": 40, "type": "fire"}, {"name": "Growl", "type": "normal"}, {"name": "Stomp", "dp": 65, "type": "normal"}]} 110 | {"name": "Porygon", "shortname": "porygon", "hp": 160, "info": {"id": 137, "type": "normal", "weakness": "fighting", "description": "A manmade Pokemon that came about as a result of research. It is programmed with only basic motions."}, "images": {"photo": "images/porygon.jpg", "typeIcon": "icons/normal.jpg", "weaknessIcon": "icons/fighting.jpg"}, "moves": [{"name": "Psybeam", "dp": 65, "type": "psychic"}, {"name": "Sharpen", "type": "normal"}, {"name": "Tri Attack", "dp": 80, "type": "normal"}]} 111 | {"name": "Primeape", "shortname": "primeape", "hp": 240, "info": {"id": 57, "type": "fighting", "weakness": "flying", "description": "Always furious and tenacious to boot. It will not abandon chasing its quarry until it is caught."}, "images": {"photo": "images/primeape.jpg", "typeIcon": "icons/fighting.jpg", "weaknessIcon": "icons/flying.jpg"}, "moves": [{"name": "Assurance", "dp": 60, "type": "dark"}, {"name": "Karate chop", "dp": 50, "type": "fighting"}, {"name": "Leer", "type": "normal"}, {"name": "Scratch", "dp": 40, "type": "normal"}]} 112 | {"name": "Psyduck", "shortname": "psyduck", "hp": 210, "info": {"id": 54, "type": "water", "weakness": "electric", "description": "Always tormented by headaches. It uses psychic powers, but it is not known if it intends to do so."}, "images": {"photo": "images/psyduck.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Amnesia", "type": "psychic"}, {"name": "Scratch", "dp": 40, "type": "normal"}, {"name": "Water Gun", "dp": 40, "type": "normal"}, {"name": "Zen Headbutt", "dp": 80, "type": "psychic"}]} 113 | {"name": "Raichu", "shortname": "raichu", "hp": 160, "info": {"id": 26, "type": "electric", "weakness": "ground", "description": "Its long tail serves as a ground to protect itself from its own high voltage power."}, "images": {"photo": "images/raichu.jpg", "typeIcon": "icons/electric.jpg", "weaknessIcon": "icons/ground.jpg"}, "moves": [{"name": "Quick Attack", "dp": 40, "type": "normal"}, {"name": "Tackle", "dp": 60, "type": "normal"}, {"name": "Thunder", "dp": 120, "type": "electric"}, {"name": "Thunderbolt", "dp": 90, "type": "electric"}]} 114 | {"name": "Rapidash", "shortname": "rapidash", "hp": 160, "info": {"id": 78, "type": "fire", "weakness": "water", "description": "Very competitive, this Pokemon will chase anything that moves fast in the hopes of racing it."}, "images": {"photo": "images/rapidash.jpg", "typeIcon": "icons/fire.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Fire Blast", "dp": 110, "type": "fire"}, {"name": "Stomp", "dp": 65, "type": "normal"}, {"name": "Tackle", "dp": 60, "type": "normal"}]} 115 | {"name": "Raticate", "shortname": "raticate", "hp": 160, "info": {"id": 20, "type": "normal", "weakness": "fighting", "description": "Its whiskers help it to maintain balance. Its fangs never stop growing, so it gnaws to pare them down."}, "images": {"photo": "images/raticate.jpg", "typeIcon": "icons/normal.jpg", "weaknessIcon": "icons/fighting.jpg"}, "moves": [{"name": "Assurance", "dp": 60, "type": "dark"}, {"name": "Quick Attack", "dp": 40, "type": "normal"}]} 116 | {"name": "Rattata", "shortname": "rattata", "hp": 160, "info": {"id": 19, "type": "normal", "weakness": "fighting", "description": "Bites anything when it attacks. Small and very quick, it is a common sight in many places."}, "images": {"photo": "images/rattata.jpg", "typeIcon": "icons/normal.jpg", "weaknessIcon": "icons/fighting.jpg"}, "moves": [{"name": "Bite", "dp": 60, "type": "dark"}]} 117 | {"name": "Rhydon", "shortname": "rhydon", "hp": 160, "info": {"id": 112, "type": "rock", "weakness": "water", "description": "Protected by an armor-like hide, it is capable of living in molten lava of 3,600 degrees Fahrenheit."}, "images": {"photo": "images/rhydon.jpg", "typeIcon": "icons/rock.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Earthquake", "dp": 100, "type": "ground"}, {"name": "Horn Attack", "dp": 70, "type": "normal"}]} 118 | {"name": "Rhyhorn", "shortname": "rhyhorn", "hp": 160, "info": {"id": 111, "type": "rock", "weakness": "water", "description": "It doesn't care if there is anything in its way. It just charges and destroys all obstacles."}, "images": {"photo": "images/rhyhorn.jpg", "typeIcon": "icons/rock.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Horn Attack", "dp": 65, "type": "normal"}, {"name": "Peck", "dp": 35, "type": "flying"}]} 119 | {"name": "Sandshrew", "shortname": "sandshrew", "hp": 160, "info": {"id": 27, "type": "ground", "weakness": "water", "description": "Its body is dry. When it gets cold at night, its hide is said to become coated with a fine dew."}, "images": {"photo": "images/sandshrew.jpg", "typeIcon": "icons/ground.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Dig", "dp": 80, "type": "ground", "warmup": 1}, {"name": "Sand Attack", "type": "ground"}, {"name": "Scratch", "dp": 40, "type": "normal"}, {"name": "Swift", "dp": 60, "type": "normal"}]} 120 | {"name": "Sandslash", "shortname": "sandslash", "hp": 160, "info": {"id": 28, "type": "ground", "weakness": "water", "description": "Curls up into a spiny ball when threatened. It can roll while curled up to attack or escape."}, "images": {"photo": "images/sandslash.jpg", "typeIcon": "icons/ground.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Earthquake", "dp": 100, "type": "ground"}, {"name": "Slash", "dp": 70, "type": "normal"}, {"name": "Swords Dance", "type": "normal"}]} 121 | {"name": "Scyther", "shortname": "scyther", "hp": 160, "info": {"id": 123, "type": "bug", "weakness": "fire", "description": "Its blindingly fast speed adds to the sharpness of its twin forearm scythes which can slice through thick logs in one wicked stroke."}, "images": {"photo": "images/scyther.jpg", "typeIcon": "icons/bug.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Slash", "dp": 70, "type": "normal"}, {"name": "Swords Dance", "type": "normal"}, {"name": "Wing Attack", "dp": 60, "type": "flying"}]} 122 | {"name": "Seadra", "shortname": "seadra", "hp": 160, "info": {"id": 117, "type": "water", "weakness": "electric", "description": "Capable of swimming backwards by rapidly flapping its wing-like pectoral fins and stout tail."}, "images": {"photo": "images/seadra.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Bubble Beam", "dp": 65, "type": "water"}, {"name": "Smokescreen", "type": "normal"}]} 123 | {"name": "Seaking", "shortname": "seaking", "hp": 160, "info": {"id": 119, "type": "water", "weakness": "electric", "description": "The horn on its head is sharp like a drill. It bores a hole in a boulder to make its nest."}, "images": {"photo": "images/seaking.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Horn Attack", "dp": 70, "type": "normal"}, {"name": "Waterfall", "dp": 80, "type": "water"}]} 124 | {"name": "Seel", "shortname": "seel", "hp": 160, "info": {"id": 86, "type": "water", "weakness": "electric", "description": "The light blue fur that covers it keeps it protected against the cold. It loves iceberg-filled oceans."}, "images": {"photo": "images/seel.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Growl", "type": "normal"}, {"name": "Headbutt", "dp": 70, "type": "normal"}]} 125 | {"name": "Shellder", "shortname": "shellder", "hp": 160, "info": {"id": 90, "type": "water", "weakness": "electric", "description": "It swims backward by opening and closing its two shells. Its large tongue is always kept hanging out."}, "images": {"photo": "images/shellder.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Leer", "type": "normal"}, {"name": "Water Gun", "dp": 40, "type": "water"}]} 126 | {"name": "Slowbro", "shortname": "slowbro", "hp": 160, "info": {"id": 80, "type": "psychic", "weakness": "dark", "description": "An attached Shellder won't let go because of the tasty flavor that oozes out of its tail."}, "images": {"photo": "images/slowbro.jpg", "typeIcon": "icons/psychic.jpg", "weaknessIcon": "icons/dark.jpg"}, "moves": [{"name": "Amnesia", "type": "psychic"}, {"name": "Headbutt", "dp": 70, "type": "normal"}, {"name": "Psychic", "dp": 90, "type": "psychic"}]} 127 | {"name": "Slowpoke", "shortname": "slowpoke", "hp": 160, "info": {"id": 79, "type": "psychic", "weakness": "dark", "description": "Incredibly slow and dopey. It takes 5 seconds for it to feel pain when under attack."}, "images": {"photo": "images/slowpoke.jpg", "typeIcon": "icons/psychic.jpg", "weaknessIcon": "icons/dark.jpg"}, "moves": [{"name": "Amnesia", "type": "psychic"}, {"name": "Headbutt", "dp": 70, "type": "normal"}]} 128 | {"name": "Snorlax", "shortname": "snorlax", "hp": 160, "info": {"id": 143, "type": "normal", "weakness": "fighting", "description": "Very lazy. Just eats and sleeps. As its rotund bulk builds, it becomes steadily more slothful."}, "images": {"photo": "images/snorlax.jpg", "typeIcon": "icons/normal.jpg", "weaknessIcon": "icons/fighting.jpg"}, "moves": [{"name": "Amnesia", "type": "psychic"}]} 129 | {"name": "Spearow", "shortname": "spearow", "hp": 160, "info": {"id": 21, "type": "flying", "weakness": "electric", "description": "Inept at flying high. However, it can fly around very fast to protect its territory."}, "images": {"photo": "images/spearow.jpg", "typeIcon": "icons/flying.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Growl", "type": "normal"}, {"name": "Peck", "dp": 35, "type": "flying"}, {"name": "Tackle", "dp": 60, "type": "normal"}]} 130 | {"name": "Squirtle", "shortname": "squirtle", "hp": 198, "info": {"id": 7, "type": "water", "weakness": "grass", "description": "Whitaker's favorite Pokemon! After birth, its back swells and hardens into a shell. Powerfully sprays foam from its mouth."}, "images": {"photo": "images/squirtle.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/grass.jpg"}, "moves": [{"name": "Bite", "dp": 60, "type": "dark"}, {"name": "Tackle", "dp": 60, "type": "normal"}, {"name": "Water Gun", "dp": 40, "type": "water"}, {"name": "Withdraw", "type": "water"}]} 131 | {"name": "Starmie", "shortname": "starmie", "hp": 160, "info": {"id": 121, "type": "water", "weakness": "electric", "description": "The center section is named the core. People think it is communicating when it glows in 7 colors."}, "images": {"photo": "images/starmie.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Bubble Beam", "dp": 65, "type": "water"}, {"name": "Harden", "type": "normal"}, {"name": "Swift", "dp": 60, "type": "normal"}]} 132 | {"name": "Staryu", "shortname": "staryu", "hp": 160, "info": {"id": 120, "type": "water", "weakness": "electric", "description": "An enigmatic Pokemon that can effortlessly regenerate any appendage it loses in battle."}, "images": {"photo": "images/staryu.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Harden", "type": "normal"}, {"name": "Water Gun", "dp": 40, "type": "water"}]} 133 | {"name": "Tangela", "shortname": "tangela", "hp": 160, "info": {"id": 114, "type": "grass", "weakness": "fire", "description": "The whole body is swathed with wide vines that are similar to seaweed. Its vines shake as it walks."}, "images": {"photo": "images/tangela.jpg", "typeIcon": "icons/grass.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Slam", "dp": 80, "type": "normal"}, {"name": "Vine Whip", "dp": 45, "type": "grass"}]} 134 | {"name": "Tauros", "shortname": "tauros", "hp": 160, "info": {"id": 128, "type": "normal", "weakness": "fighting", "description": "They fight each other by locking horns. The herd's protector takes pride in its battle-scarred horns."}, "images": {"photo": "images/tauros.jpg", "typeIcon": "icons/normal.jpg", "weaknessIcon": "icons/fighting.jpg"}, "moves": [{"name": "Horn Attack", "dp": 70, "type": "normal"}]} 135 | {"name": "Tentacool", "shortname": "tentacool", "hp": 160, "info": {"id": 72, "type": "water", "weakness": "electric", "description": "Drifts in shallow seas. Anglers who hook them by accident are often punished by its stinging acid."}, "images": {"photo": "images/tentacool.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Acid", "dp": 40, "type": "poison"}, {"name": "Barrier", "type": "psychic"}, {"name": "Water Gun", "dp": 40, "type": "water"}]} 136 | {"name": "Tentacruel", "shortname": "tentacruel", "hp": 270, "info": {"id": 73, "type": "water", "weakness": "electric", "description": "The tentacles are normally kept short. On hunts, they are extended to ensnare and immobilize prey."}, "images": {"photo": "images/tentacruel.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/electric.jpg"}, "moves": [{"name": "Acid Spray", "dp": 40, "type": "poison"}, {"name": "Barrier", "type": "psychic"}, {"name": "Hydro Pump", "dp": 110, "type": "water"}, {"name": "Screech", "type": "normal"}]} 137 | {"name": "Vaporeon", "shortname": "vaporeon", "hp": 370, "info": {"id": 134, "type": "water", "weakness": "grass", "description": "As it uses the fins on the tip of its tail to swim, it blends with the water perfectly."}, "images": {"photo": "images/vaporeon.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/grass.jpg"}, "moves": [{"name": "Hydro Pump", "dp": 110, "type": "water"}, {"name": "Ice Beam", "dp": 100, "type": "ice"}, {"name": "Quick Attack", "dp": 40, "type": "normal"}, {"name": "Sand Attack", "type": "ground"}]} 138 | {"name": "Venomoth", "shortname": "venomoth", "hp": 160, "info": {"id": 49, "type": "bug", "weakness": "fire", "description": "The dust-like scales covering its wings are color-coded to indicate the kinds of poison it has."}, "images": {"photo": "images/venomoth.jpg", "typeIcon": "icons/bug.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Psychic", "dp": 90, "type": "psychic"}]} 139 | {"name": "Venonat", "shortname": "venonat", "hp": 160, "info": {"id": 48, "type": "bug", "weakness": "fire", "description": "Lives in the shadows of tall trees where it eats insects. It is attracted by light at night."}, "images": {"photo": "images/venonat.jpg", "typeIcon": "icons/bug.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Psybeam", "dp": 65, "type": "psychic"}]} 140 | {"name": "Venusaur", "shortname": "venusaur", "hp": 160, "info": {"id": 3, "type": "grass", "weakness": "fire", "description": "The plant blooms when it is absorbing solar energy. It stays on the move to seek sunlight."}, "images": {"photo": "images/venusaur.jpg", "typeIcon": "icons/grass.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Razor Leaf", "dp": 55, "type": "grass"}]} 141 | {"name": "Victreebel", "shortname": "victreebel", "hp": 80, "info": {"id": 71, "type": "grass", "weakness": "fire", "description": "Said to live in huge colonies deep in jungles, although no one has ever returned from there."}, "images": {"photo": "images/victreebel.jpg", "typeIcon": "icons/grass.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Acid Spray", "dp": 40, "type": "poison"}, {"name": "Leaf Tornado", "dp": 65, "type": "flying"}, {"name": "Razor Leaf", "dp": 55, "type": "grass"}, {"name": "Tickle", "type": "normal"}]} 142 | {"name": "Vileplume", "shortname": "vileplume", "hp": 160, "info": {"id": 45, "type": "grass", "weakness": "fire", "description": "It has the world's largest petals. With every step, the petals shake out heavy clouds of toxic pollen."}, "images": {"photo": "images/vileplume.jpg", "typeIcon": "icons/grass.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Hidden Power", "dp": 60, "type": "normal"}, {"name": "Petal Blizzard", "dp": 90, "type": "grass"}, {"name": "Swords Dance", "type": "normal"}, {"name": "Venoshock", "dp": 65, "type": "poison"}]} 143 | {"name": "Voltorb", "shortname": "voltorb", "hp": 160, "info": {"id": 100, "type": "electric", "weakness": "ground", "description": "It was discovered when Poke balls were introduced. It is said that there is some connection."}, "images": {"photo": "images/voltorb.jpg", "typeIcon": "icons/electric.jpg", "weaknessIcon": "icons/ground.jpg"}, "moves": [{"name": "Charge Beam", "dp": 50, "type": "electric"}, {"name": "Rollout", "dp": 30, "type": "rock"}, {"name": "Screech", "type": "normal"}, {"name": "Tackle", "dp": 40, "type": "normal"}]} 144 | {"name": "Vulpix", "shortname": "vulpix", "hp": 160, "info": {"id": 37, "type": "fire", "weakness": "water", "description": "At the time of birth, it has just one tail. The tail splits from its tip as it grows older."}, "images": {"photo": "images/vulpix.jpg", "typeIcon": "icons/fire.jpg", "weaknessIcon": "icons/water.jpg"}, "moves": [{"name": "Double Team", "type": "normal"}, {"name": "Ember", "dp": 40, "type": "fire"}, {"name": "Feint Attack", "dp": 60, "type": "dark"}, {"name": "Quick Attack", "dp": 40, "type": "normal"}]} 145 | {"name": "Wartortle", "shortname": "wartortle", "hp": 160, "info": {"id": 8, "type": "water", "weakness": "grass", "description": "It cleverly controls its furry ears and tail to maintain its balance while swimming."}, "images": {"photo": "images/wartortle.jpg", "typeIcon": "icons/water.jpg", "weaknessIcon": "icons/grass.jpg"}, "moves": [{"name": "Bite", "dp": 60, "type": "dark"}, {"name": "Iron Defense", "type": "steel"}, {"name": "Tackle", "dp": 60, "type": "normal"}, {"name": "Water Pulse", "dp": 60, "type": "water"}]} 146 | {"name": "Weedle", "shortname": "weedle", "hp": 160, "info": {"id": 13, "type": "grass", "weakness": "fire", "description": "Its poison stinger is very powerful. Its bright-colored body is intended to warn off its enemies."}, "images": {"photo": "images/weedle.jpg", "typeIcon": "icons/grass.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Bug Bite", "dp": 60, "type": "bug"}, {"name": "Poison String", "dp": 15, "type": "poison"}]} 147 | {"name": "Weepinbell", "shortname": "weepinbell", "hp": 160, "info": {"id": 70, "type": "grass", "weakness": "fire", "description": "When hungry, it swallows anything that moves. Its hapless prey is melted inside by strong acids."}, "images": {"photo": "images/weepinbell.jpg", "typeIcon": "icons/grass.jpg", "weaknessIcon": "icons/fire.jpg"}, "moves": [{"name": "Acid", "dp": 40, "type": "poison"}, {"name": "Growth", "type": "grass"}, {"name": "Slam", "dp": 80, "type": "normal"}, {"name": "Vine Whip", "dp": 45, "type": "grass"}]} 148 | {"name": "Weezing", "shortname": "weezing", "hp": 160, "info": {"id": 110, "type": "poison", "weakness": "psychic", "description": "Very rarely, a sudden mutation can result in two small Koffing twins becoming conjoined as a Weezing."}, "images": {"photo": "images/weezing.jpg", "typeIcon": "icons/poison.jpg", "weaknessIcon": "icons/psychic.jpg"}, "moves": [{"name": "Assurance", "dp": 60, "type": "dark"}, {"name": "Sludge", "dp": 65, "type": "poison"}, {"name": "Smokescreen", "type": "normal"}, {"name": "Tackle", "dp": 40, "type": "normal"}]} 149 | {"name": "Wigglytuff", "shortname": "wigglytuff", "hp": 160, "info": {"id": 40, "type": "fairy", "weakness": "poison", "description": "Its body is full of elasticity. By inhaling deeply, it can continue to inflate itself without limit."}, "images": {"photo": "images/wigglytuff.jpg", "typeIcon": "icons/fairy.jpg", "weaknessIcon": "icons/poison.jpg"}, "moves": [{"name": "Brick Break", "dp": 75, "type": "fighting"}, {"name": "Covet", "dp": 60, "type": "normal"}, {"name": "Defense Curl", "type": "normal"}, {"name": "Feint Attack", "dp": 60, "type": "dark"}]} 150 | {"name": "Zapdos", "shortname": "zapdos", "hp": 160, "info": {"id": 145, "type": "electric", "weakness": "rock", "description": "A legendary Pok\u00e9mon that is said to live in thunderclouds. It freely controls lightning bolts."}, "images": {"photo": "images/zapdos.jpg", "typeIcon": "icons/electric.jpg", "weaknessIcon": "icons/rock.jpg"}, "moves": [{"name": "Ancient Power", "dp": 120, "type": "rock"}, {"name": "Charge", "type": "electric"}, {"name": "Drill Peck", "dp": 80, "type": "flying"}, {"name": "Thunder", "dp": 110, "type": "electric"}]} 151 | {"name": "Zubat", "shortname": "zubat", "hp": 160, "info": {"id": 41, "type": "poison", "weakness": "psychic", "description": "Forms colonies in perpetually dark places. Uses ultrasonic waves to identify and approach targets."}, "images": {"photo": "images/zubat.jpg", "typeIcon": "icons/poison.jpg", "weaknessIcon": "icons/psychic.jpg"}, "moves": [{"name": "Bite", "dp": 60, "type": "dark"}, {"name": "Double Team", "type": "normal"}, {"name": "Poison Fang", "dp": 50, "type": "poison"}, {"name": "Wing Attack", "dp": 60, "type": "flying"}]} 152 | -------------------------------------------------------------------------------- /demo/pokemon_hyperdb.pickle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdagdelen/hyperDB/bf3b1c489eaa3c044e0be0d5c8b22de192f0be04/demo/pokemon_hyperdb.pickle -------------------------------------------------------------------------------- /demo/pokemon_hyperdb.pickle.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdagdelen/hyperDB/bf3b1c489eaa3c044e0be0d5c8b22de192f0be04/demo/pokemon_hyperdb.pickle.gz -------------------------------------------------------------------------------- /hyperdb/__init__.py: -------------------------------------------------------------------------------- 1 | from .hyperdb import * -------------------------------------------------------------------------------- /hyperdb/galaxy_brain_math_shit.py: -------------------------------------------------------------------------------- 1 | """Super valuable proprietary algorithm for ranking vector similarity. Top secret.""" 2 | import numpy as np 3 | import random 4 | 5 | def get_norm_vector(vector): 6 | if len(vector.shape) == 1: 7 | return vector / np.linalg.norm(vector) 8 | else: 9 | return vector / np.linalg.norm(vector, axis=1)[:, np.newaxis] 10 | 11 | def dot_product(vectors, query_vector): 12 | similarities = np.dot(vectors, query_vector.T) 13 | return similarities 14 | 15 | def cosine_similarity(vectors, query_vector): 16 | norm_vectors = get_norm_vector(vectors) 17 | norm_query_vector = get_norm_vector(query_vector) 18 | similarities = np.dot(norm_vectors, norm_query_vector.T) 19 | return similarities 20 | 21 | def euclidean_metric(vectors, query_vector, get_similarity_score=True): 22 | similarities = np.linalg.norm(vectors - query_vector, axis=1) 23 | if get_similarity_score: 24 | similarities = 1 / (1 + similarities) 25 | return similarities 26 | 27 | def derridaean_similarity(vectors, query_vector): 28 | def random_change(value): 29 | return value + random.uniform(-0.2, 0.2) 30 | 31 | similarities = cosine_similarity(vectors, query_vector) 32 | derrida_similarities = np.vectorize(random_change)(similarities) 33 | return derrida_similarities 34 | 35 | def adams_similarity(vectors, query_vector): 36 | def adams_change(value): 37 | return 0.42 38 | 39 | similarities = cosine_similarity(vectors, query_vector) 40 | adams_similarities = np.vectorize(adams_change)(similarities) 41 | return adams_similarities 42 | 43 | def hyper_SVM_ranking_algorithm_sort(vectors, query_vector, top_k=5, metric=cosine_similarity): 44 | """HyperSVMRanking (Such Vector, Much Ranking) algorithm proposed by Andrej Karpathy (2023) https://arxiv.org/abs/2303.18231""" 45 | similarities = metric(vectors, query_vector) 46 | top_indices = np.argsort(similarities, axis=0)[-top_k:][::-1] 47 | return top_indices.flatten(), similarities[top_indices].flatten() 48 | -------------------------------------------------------------------------------- /hyperdb/hyperdb.py: -------------------------------------------------------------------------------- 1 | import gzip 2 | import pickle 3 | 4 | import numpy as np 5 | from openai import OpenAI 6 | 7 | client = OpenAI() 8 | from sentence_transformers import SentenceTransformer 9 | 10 | 11 | from hyperdb.galaxy_brain_math_shit import ( 12 | dot_product, 13 | adams_similarity, 14 | cosine_similarity, 15 | derridaean_similarity, 16 | euclidean_metric, 17 | hyper_SVM_ranking_algorithm_sort, 18 | ) 19 | 20 | MAX_BATCH_SIZE = 2048 # OpenAI batch endpoint max size https://github.com/openai/openai-python/blob/main/openai/embeddings_utils.py#L43 21 | 22 | def get_embedding(documents, key=None, model="text-embedding-ada-002", model_type='openai'): 23 | """Default embedding function that uses OpenAI Embeddings.""" 24 | 25 | if isinstance(documents, list): 26 | if isinstance(documents[0], dict): 27 | texts = [] 28 | if isinstance(key, str): 29 | if "." in key: 30 | key_chain = key.split(".") 31 | else: 32 | key_chain = [key] 33 | for doc in documents: 34 | for key in key_chain: 35 | doc = doc[key] 36 | texts.append(doc.replace("\n", " ")) 37 | elif key is None: 38 | for doc in documents: 39 | text = ", ".join([f"{key}: {value}" for key, value in doc.items()]) 40 | texts.append(text) 41 | elif isinstance(documents[0], str): 42 | texts = documents 43 | batches = [ 44 | texts[i: i + MAX_BATCH_SIZE] for i in range(0, len(texts), MAX_BATCH_SIZE) 45 | ] 46 | embeddings = [] 47 | if model_type == 'openai': 48 | for batch in batches: 49 | response = client.embeddings.create(input=batch, model=model) 50 | embeddings.extend(np.array(item.embedding) 51 | for item in response.data) 52 | elif model_type == 'huggingface': 53 | if not importlib.util.find_spec("sentence_transformers"): 54 | raise ImportError( 55 | "The 'sentence-transformers' package is required for Hugging Face models but is not installed. " 56 | "Please install it with 'pip install sentence-transformers'." 57 | ) 58 | from sentence_transformers import SentenceTransformer 59 | model = SentenceTransformer(model) 60 | for batch in batches: 61 | response = model.encode(batch) 62 | embeddings.append(response) 63 | else: 64 | raise Exception( 65 | "Issue with encoding model" 66 | ) 67 | 68 | return embeddings 69 | 70 | 71 | class HyperDB: 72 | def __init__( 73 | self, 74 | documents=None, 75 | vectors=None, 76 | key=None, 77 | embedding_function=None, 78 | similarity_metric="cosine", 79 | ): 80 | documents = documents or [] 81 | self.documents = [] 82 | self.vectors = None 83 | self.embedding_function = embedding_function or ( 84 | lambda docs: get_embedding(docs, key=key) 85 | ) 86 | if vectors is not None: 87 | self.vectors = vectors 88 | self.documents = documents 89 | else: 90 | self.add_documents(documents) 91 | 92 | if similarity_metric.__contains__("dot"): 93 | self.similarity_metric = dot_product 94 | elif similarity_metric.__contains__("cosine"): 95 | self.similarity_metric = cosine_similarity 96 | elif similarity_metric.__contains__("euclidean"): 97 | self.similarity_metric = euclidean_metric 98 | elif similarity_metric.__contains__("derrida"): 99 | self.similarity_metric = derridaean_similarity 100 | elif similarity_metric.__contains__("adams"): 101 | self.similarity_metric = adams_similarity 102 | else: 103 | raise Exception( 104 | "Similarity metric not supported. Please use either 'dot', 'cosine', 'euclidean', 'adams', or 'derrida'." 105 | ) 106 | 107 | def dict(self, vectors=False): 108 | if vectors: 109 | return [ 110 | {"document": document, "vector": vector.tolist(), "index": index} 111 | for index, (document, vector) in enumerate( 112 | zip(self.documents, self.vectors) 113 | ) 114 | ] 115 | return [ 116 | {"document": document, "index": index} 117 | for index, document in enumerate(self.documents) 118 | ] 119 | 120 | def add(self, documents, vectors=None): 121 | if not isinstance(documents, list): 122 | return self.add_document(documents, vectors) 123 | self.add_documents(documents, vectors) 124 | 125 | def add_document(self, document: dict, vector=None): 126 | vector = ( 127 | vector if vector is not None else self.embedding_function([document])[ 128 | 0] 129 | ) 130 | if self.vectors is None: 131 | self.vectors = np.empty((0, len(vector)), dtype=np.float32) 132 | elif len(vector) != self.vectors.shape[1]: 133 | raise ValueError("All vectors must have the same length.") 134 | self.vectors = np.vstack([self.vectors, vector]).astype(np.float32) 135 | self.documents.append(document) 136 | 137 | def remove_document(self, index): 138 | self.vectors = np.delete(self.vectors, index, axis=0) 139 | self.documents.pop(index) 140 | 141 | def add_documents(self, documents, vectors=None): 142 | if not documents: 143 | return 144 | vectors = vectors or np.array(self.embedding_function(documents)).astype( 145 | np.float32 146 | ) 147 | for vector, document in zip(vectors, documents): 148 | self.add_document(document, vector) 149 | 150 | def save(self, storage_file): 151 | if self.vectors is None or self.documents is None: 152 | return 153 | 154 | data = {"vectors": self.vectors, "documents": self.documents} 155 | if storage_file.endswith(".gz"): 156 | with gzip.open(storage_file, "wb") as f: 157 | pickle.dump(data, f) 158 | else: 159 | with open(storage_file, "wb") as f: 160 | pickle.dump(data, f) 161 | 162 | def load(self, storage_file): 163 | if storage_file.endswith(".gz"): 164 | with gzip.open(storage_file, "rb") as f: 165 | data = pickle.load(f) 166 | else: 167 | with open(storage_file, "rb") as f: 168 | data = pickle.load(f) 169 | self.vectors = data["vectors"].astype(np.float32) 170 | self.documents = data["documents"] 171 | 172 | def query(self, query_text, top_k=5, return_similarities=True): 173 | if self.vectors is None: 174 | return [] 175 | 176 | query_vector = self.embedding_function([query_text])[0] 177 | ranked_results, similarities = hyper_SVM_ranking_algorithm_sort( 178 | self.vectors, query_vector, top_k=top_k, metric=self.similarity_metric 179 | ) 180 | if return_similarities: 181 | return list( 182 | zip([self.documents[index] 183 | for index in ranked_results], similarities) 184 | ) 185 | return [self.documents[index] for index in ranked_results] 186 | 187 | def similar_vectors(self, vector, top_k=5, return_similarities=True): 188 | if self.vectors is None: 189 | return [] 190 | 191 | ranked_results, similarities = hyper_SVM_ranking_algorithm_sort( 192 | self.vectors, vector, top_k=top_k, metric=self.similarity_metric 193 | ) 194 | if return_similarities: 195 | return list( 196 | zip([self.documents[index] for index in ranked_results], similarities) 197 | ) 198 | return [self.documents[index] for index in ranked_results] 199 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | numpy 2 | pytest 3 | openai 4 | importlib -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | 3 | with open("README.md", "r") as fh: 4 | long_description = fh.read() 5 | 6 | setup( 7 | name="hyperdb-python", 8 | version="0.1.4", 9 | author="John Dagdelen", 10 | author_email="jjdagdelen@gmail.com", 11 | description="A hyper-fast local vector database for use with LLM Agents.", 12 | long_description=long_description, 13 | long_description_content_type="text/markdown", 14 | url="https://github.com/jdagdelen/hyperdb", 15 | packages=find_packages(), 16 | install_requires=[ 17 | "numpy", 18 | "openai", 19 | ], 20 | classifiers=[ 21 | "Development Status :: 3 - Alpha", 22 | "Intended Audience :: Developers", 23 | "License :: OSI Approved :: MIT License", 24 | "Programming Language :: Python :: 3", 25 | "Programming Language :: Python :: 3.8", 26 | "Programming Language :: Python :: 3.9", 27 | "Programming Language :: Python :: 3.10", 28 | ], 29 | python_requires='>=3.8', 30 | ) 31 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdagdelen/hyperDB/bf3b1c489eaa3c044e0be0d5c8b22de192f0be04/tests/__init__.py -------------------------------------------------------------------------------- /tests/test_galaxy_brain_math_shit.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from hyperdb import euclidean_metric 3 | 4 | # Test totally written by me and not gpt/co-pilot 5 | def test_euclid_bros_metric(): 6 | data_vectors = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) 7 | query_vector = np.array([1, 1, 1]) 8 | result = euclidean_metric(data_vectors, query_vector) 9 | 10 | # All important test to see if shapes are based 11 | try: 12 | assert result.shape == (3,) 13 | except AssertionError: 14 | raise AssertionError("Oh my god, you killed Euclid! You bas-turd!") --------------------------------------------------------------------------------