Upload 6 files
Browse files- README.md +48 -7
- fr_to_en_pokemon.json +1027 -0
- generate-translation- name.py +45 -0
- import-data.py +66 -0
- pokedex.py +233 -0
- requirements.txt +3 -0
README.md
CHANGED
@@ -1,14 +1,55 @@
|
|
1 |
---
|
2 |
-
title:
|
3 |
-
emoji:
|
4 |
-
colorFrom:
|
5 |
colorTo: yellow
|
6 |
sdk: gradio
|
7 |
-
sdk_version: 5.
|
8 |
app_file: app.py
|
9 |
pinned: false
|
10 |
-
license:
|
11 |
-
short_description:
|
|
|
12 |
---
|
13 |
|
14 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
---
|
2 |
+
title: PokeAPI-MCP
|
3 |
+
emoji: 🐾
|
4 |
+
colorFrom: red
|
5 |
colorTo: yellow
|
6 |
sdk: gradio
|
7 |
+
sdk_version: 5.32.1
|
8 |
app_file: app.py
|
9 |
pinned: false
|
10 |
+
license: mit
|
11 |
+
short_description: Expose full access to PokéAPI as MCP.
|
12 |
+
tags: [mcp-server-track, pokeapi, pokemon, agent, api-wrapper]
|
13 |
---
|
14 |
|
15 |
+
# 🐾 PokeAPI-MCP – Agent Access to the Entire PokéAPI
|
16 |
+
|
17 |
+
**PokeAPI-MCP** is a modular Gradio-based agent toolset that exposes nearly all major endpoints of the [PokéAPI v2](https://pokeapi.co/docs/v2) via a Multi-Component Protocol (MCP) interface. It allows agents to query real-time Pokémon data like species, stats, types, evolutions, and much more — without writing a single line of API code.
|
18 |
+
|
19 |
+
## 🎥 Demo Video
|
20 |
+
|
21 |
+
▶️ [Watch the demo](https://youtu.be/Hyovc5FYOYo)
|
22 |
+
|
23 |
+
|
24 |
+
## 🎯 What This App Does
|
25 |
+
|
26 |
+
- Wraps all key PokéAPI endpoints (species, evolution, moves, items, abilities, etc.)
|
27 |
+
- Exposes each endpoint as a Gradio `Interface`, usable via MCP
|
28 |
+
- Dynamically generates JSON outputs for agent-friendly consumption
|
29 |
+
- Supports queries by both name and numeric ID
|
30 |
+
- Provides automatic error handling and clean descriptions for each tool
|
31 |
+
|
32 |
+
## ✨ Available Tools
|
33 |
+
|
34 |
+
- 🔍 `get_pokemon` — full data about a Pokémon
|
35 |
+
- 📖 `get_pokemon_species` — flavor text, gender rate, evolution chain
|
36 |
+
- 🧠 `get_ability`, `get_stat`, `get_type` — detailed mechanics
|
37 |
+
- 🎒 `get_item`, `get_berry` — held/useable item details
|
38 |
+
- 🧬 `get_evolution_chain` — structured evolution trees
|
39 |
+
- 🌍 `get_region`, `get_location` — geographical data
|
40 |
+
- 🗺️ `get_pokedex`, `get_generation`, `get_version`, `get_version_group`
|
41 |
+
- 🧬 `get_egg_group`, `get_pokemon_form`, `get_pokemon_shape`, `get_pokemon_color`, `get_pokemon_habitat`
|
42 |
+
|
43 |
+
...and more.
|
44 |
+
|
45 |
+
## 🔧 Tech Stack
|
46 |
+
|
47 |
+
- **Gradio** – for exposing interfaces and MCP support
|
48 |
+
- **requests** – lightweight HTTP client for API access
|
49 |
+
- **PokéAPI v2** – the full public REST API of the Pokémon world
|
50 |
+
|
51 |
+
## 💻 Run Locally
|
52 |
+
|
53 |
+
```bash
|
54 |
+
pip install -r requirements.txt
|
55 |
+
python app.py
|
fr_to_en_pokemon.json
ADDED
@@ -0,0 +1,1027 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"bulbizarre": "bulbasaur",
|
3 |
+
"herbizarre": "ivysaur",
|
4 |
+
"florizarre": "venusaur",
|
5 |
+
"salamèche": "charmander",
|
6 |
+
"reptincel": "charmeleon",
|
7 |
+
"dracaufeu": "charizard",
|
8 |
+
"carapuce": "squirtle",
|
9 |
+
"carabaffe": "wartortle",
|
10 |
+
"tortank": "blastoise",
|
11 |
+
"chenipan": "caterpie",
|
12 |
+
"chrysacier": "metapod",
|
13 |
+
"papilusion": "butterfree",
|
14 |
+
"aspicot": "weedle",
|
15 |
+
"coconfort": "kakuna",
|
16 |
+
"dardargnan": "beedrill",
|
17 |
+
"roucool": "pidgey",
|
18 |
+
"roucoups": "pidgeotto",
|
19 |
+
"roucarnage": "pidgeot",
|
20 |
+
"rattata": "rattata",
|
21 |
+
"rattatac": "raticate",
|
22 |
+
"piafabec": "spearow",
|
23 |
+
"rapasdepic": "fearow",
|
24 |
+
"abo": "ekans",
|
25 |
+
"arbok": "arbok",
|
26 |
+
"pikachu": "pikachu",
|
27 |
+
"raichu": "raichu",
|
28 |
+
"sabelette": "sandshrew",
|
29 |
+
"sablaireau": "sandslash",
|
30 |
+
"nidoran♀": "nidoran♀",
|
31 |
+
"nidorina": "nidorina",
|
32 |
+
"nidoqueen": "nidoqueen",
|
33 |
+
"nidoran♂": "nidoran♂",
|
34 |
+
"nidorino": "nidorino",
|
35 |
+
"nidoking": "nidoking",
|
36 |
+
"mélofée": "clefairy",
|
37 |
+
"mélodelfe": "clefable",
|
38 |
+
"goupix": "vulpix",
|
39 |
+
"feunard": "ninetales",
|
40 |
+
"rondoudou": "jigglypuff",
|
41 |
+
"grodoudou": "wigglytuff",
|
42 |
+
"nosferapti": "zubat",
|
43 |
+
"nosferalto": "golbat",
|
44 |
+
"mystherbe": "oddish",
|
45 |
+
"ortide": "gloom",
|
46 |
+
"rafflesia": "vileplume",
|
47 |
+
"paras": "paras",
|
48 |
+
"parasect": "parasect",
|
49 |
+
"mimitoss": "venonat",
|
50 |
+
"aéromite": "venomoth",
|
51 |
+
"taupiqueur": "diglett",
|
52 |
+
"triopikeur": "dugtrio",
|
53 |
+
"miaouss": "meowth",
|
54 |
+
"persian": "persian",
|
55 |
+
"psykokwak": "psyduck",
|
56 |
+
"akwakwak": "golduck",
|
57 |
+
"férosinge": "mankey",
|
58 |
+
"colossinge": "primeape",
|
59 |
+
"caninos": "growlithe",
|
60 |
+
"arcanin": "arcanine",
|
61 |
+
"ptitard": "poliwag",
|
62 |
+
"têtarte": "poliwhirl",
|
63 |
+
"tartard": "poliwrath",
|
64 |
+
"abra": "abra",
|
65 |
+
"kadabra": "kadabra",
|
66 |
+
"alakazam": "alakazam",
|
67 |
+
"machoc": "machop",
|
68 |
+
"machopeur": "machoke",
|
69 |
+
"mackogneur": "machamp",
|
70 |
+
"chétiflor": "bellsprout",
|
71 |
+
"boustiflor": "weepinbell",
|
72 |
+
"empiflor": "victreebel",
|
73 |
+
"tentacool": "tentacool",
|
74 |
+
"tentacruel": "tentacruel",
|
75 |
+
"racaillou": "geodude",
|
76 |
+
"gravalanch": "graveler",
|
77 |
+
"grolem": "golem",
|
78 |
+
"ponyta": "ponyta",
|
79 |
+
"galopa": "rapidash",
|
80 |
+
"ramoloss": "slowpoke",
|
81 |
+
"flagadoss": "slowbro",
|
82 |
+
"magnéti": "magnemite",
|
83 |
+
"magnéton": "magneton",
|
84 |
+
"canarticho": "farfetch’d",
|
85 |
+
"doduo": "doduo",
|
86 |
+
"dodrio": "dodrio",
|
87 |
+
"otaria": "seel",
|
88 |
+
"lamantine": "dewgong",
|
89 |
+
"tadmorv": "grimer",
|
90 |
+
"grotadmorv": "muk",
|
91 |
+
"kokiyas": "shellder",
|
92 |
+
"crustabri": "cloyster",
|
93 |
+
"fantominus": "gastly",
|
94 |
+
"spectrum": "haunter",
|
95 |
+
"ectoplasma": "gengar",
|
96 |
+
"onix": "onix",
|
97 |
+
"soporifik": "drowzee",
|
98 |
+
"hypnomade": "hypno",
|
99 |
+
"krabby": "krabby",
|
100 |
+
"krabboss": "kingler",
|
101 |
+
"voltorbe": "voltorb",
|
102 |
+
"électrode": "electrode",
|
103 |
+
"noeunoeuf": "exeggcute",
|
104 |
+
"noadkoko": "exeggutor",
|
105 |
+
"osselait": "cubone",
|
106 |
+
"ossatueur": "marowak",
|
107 |
+
"kicklee": "hitmonlee",
|
108 |
+
"tygnon": "hitmonchan",
|
109 |
+
"excelangue": "lickitung",
|
110 |
+
"smogo": "koffing",
|
111 |
+
"smogogo": "weezing",
|
112 |
+
"rhinocorne": "rhyhorn",
|
113 |
+
"rhinoféros": "rhydon",
|
114 |
+
"leveinard": "chansey",
|
115 |
+
"saquedeneu": "tangela",
|
116 |
+
"kangourex": "kangaskhan",
|
117 |
+
"hypotrempe": "horsea",
|
118 |
+
"hypocéan": "seadra",
|
119 |
+
"poissirène": "goldeen",
|
120 |
+
"poissoroy": "seaking",
|
121 |
+
"stari": "staryu",
|
122 |
+
"staross": "starmie",
|
123 |
+
"m. mime": "mr. mime",
|
124 |
+
"insécateur": "scyther",
|
125 |
+
"lippoutou": "jynx",
|
126 |
+
"élektek": "electabuzz",
|
127 |
+
"magmar": "magmar",
|
128 |
+
"scarabrute": "pinsir",
|
129 |
+
"tauros": "tauros",
|
130 |
+
"magicarpe": "magikarp",
|
131 |
+
"léviator": "gyarados",
|
132 |
+
"lokhlass": "lapras",
|
133 |
+
"métamorph": "ditto",
|
134 |
+
"évoli": "eevee",
|
135 |
+
"aquali": "vaporeon",
|
136 |
+
"voltali": "jolteon",
|
137 |
+
"pyroli": "flareon",
|
138 |
+
"porygon": "porygon",
|
139 |
+
"amonita": "omanyte",
|
140 |
+
"amonistar": "omastar",
|
141 |
+
"kabuto": "kabuto",
|
142 |
+
"kabutops": "kabutops",
|
143 |
+
"ptéra": "aerodactyl",
|
144 |
+
"ronflex": "snorlax",
|
145 |
+
"artikodin": "articuno",
|
146 |
+
"électhor": "zapdos",
|
147 |
+
"sulfura": "moltres",
|
148 |
+
"minidraco": "dratini",
|
149 |
+
"draco": "dragonair",
|
150 |
+
"dracolosse": "dragonite",
|
151 |
+
"mewtwo": "mewtwo",
|
152 |
+
"mew": "mew",
|
153 |
+
"germignon": "chikorita",
|
154 |
+
"macronium": "bayleef",
|
155 |
+
"méganium": "meganium",
|
156 |
+
"héricendre": "cyndaquil",
|
157 |
+
"feurisson": "quilava",
|
158 |
+
"typhlosion": "typhlosion",
|
159 |
+
"kaiminus": "totodile",
|
160 |
+
"crocrodil": "croconaw",
|
161 |
+
"aligatueur": "feraligatr",
|
162 |
+
"fouinette": "sentret",
|
163 |
+
"fouinar": "furret",
|
164 |
+
"hoothoot": "hoothoot",
|
165 |
+
"noarfang": "noctowl",
|
166 |
+
"coxy": "ledyba",
|
167 |
+
"coxyclaque": "ledian",
|
168 |
+
"mimigal": "spinarak",
|
169 |
+
"migalos": "ariados",
|
170 |
+
"nostenfer": "crobat",
|
171 |
+
"loupio": "chinchou",
|
172 |
+
"lanturn": "lanturn",
|
173 |
+
"pichu": "pichu",
|
174 |
+
"mélo": "cleffa",
|
175 |
+
"toudoudou": "igglybuff",
|
176 |
+
"togepi": "togepi",
|
177 |
+
"togetic": "togetic",
|
178 |
+
"natu": "natu",
|
179 |
+
"xatu": "xatu",
|
180 |
+
"wattouat": "mareep",
|
181 |
+
"lainergie": "flaaffy",
|
182 |
+
"pharamp": "ampharos",
|
183 |
+
"joliflor": "bellossom",
|
184 |
+
"marill": "marill",
|
185 |
+
"azumarill": "azumarill",
|
186 |
+
"simularbre": "sudowoodo",
|
187 |
+
"tarpaud": "politoed",
|
188 |
+
"granivol": "hoppip",
|
189 |
+
"floravol": "skiploom",
|
190 |
+
"cotovol": "jumpluff",
|
191 |
+
"capumain": "aipom",
|
192 |
+
"tournegrin": "sunkern",
|
193 |
+
"héliatronc": "sunflora",
|
194 |
+
"yanma": "yanma",
|
195 |
+
"axoloto": "wooper",
|
196 |
+
"maraiste": "quagsire",
|
197 |
+
"mentali": "espeon",
|
198 |
+
"noctali": "umbreon",
|
199 |
+
"cornèbre": "murkrow",
|
200 |
+
"roigada": "slowking",
|
201 |
+
"feuforêve": "misdreavus",
|
202 |
+
"zarbi": "unown",
|
203 |
+
"qulbutoké": "wobbuffet",
|
204 |
+
"girafarig": "girafarig",
|
205 |
+
"pomdepik": "pineco",
|
206 |
+
"foretress": "forretress",
|
207 |
+
"insolourdo": "dunsparce",
|
208 |
+
"scorplane": "gligar",
|
209 |
+
"steelix": "steelix",
|
210 |
+
"snubbull": "snubbull",
|
211 |
+
"granbull": "granbull",
|
212 |
+
"qwilfish": "qwilfish",
|
213 |
+
"cizayox": "scizor",
|
214 |
+
"caratroc": "shuckle",
|
215 |
+
"scarhino": "heracross",
|
216 |
+
"farfuret": "sneasel",
|
217 |
+
"teddiursa": "teddiursa",
|
218 |
+
"ursaring": "ursaring",
|
219 |
+
"limagma": "slugma",
|
220 |
+
"volcaropod": "magcargo",
|
221 |
+
"marcacrin": "swinub",
|
222 |
+
"cochignon": "piloswine",
|
223 |
+
"corayon": "corsola",
|
224 |
+
"rémoraid": "remoraid",
|
225 |
+
"octillery": "octillery",
|
226 |
+
"cadoizo": "delibird",
|
227 |
+
"démanta": "mantine",
|
228 |
+
"airmure": "skarmory",
|
229 |
+
"malosse": "houndour",
|
230 |
+
"démolosse": "houndoom",
|
231 |
+
"hyporoi": "kingdra",
|
232 |
+
"phanpy": "phanpy",
|
233 |
+
"donphan": "donphan",
|
234 |
+
"porygon2": "porygon2",
|
235 |
+
"cerfrousse": "stantler",
|
236 |
+
"queulorior": "smeargle",
|
237 |
+
"debugant": "tyrogue",
|
238 |
+
"kapoera": "hitmontop",
|
239 |
+
"lippouti": "smoochum",
|
240 |
+
"élekid": "elekid",
|
241 |
+
"magby": "magby",
|
242 |
+
"écrémeuh": "miltank",
|
243 |
+
"leuphorie": "blissey",
|
244 |
+
"raikou": "raikou",
|
245 |
+
"entei": "entei",
|
246 |
+
"suicune": "suicune",
|
247 |
+
"embrylex": "larvitar",
|
248 |
+
"ymphect": "pupitar",
|
249 |
+
"tyranocif": "tyranitar",
|
250 |
+
"lugia": "lugia",
|
251 |
+
"ho-oh": "ho-oh",
|
252 |
+
"celebi": "celebi",
|
253 |
+
"arcko": "treecko",
|
254 |
+
"massko": "grovyle",
|
255 |
+
"jungko": "sceptile",
|
256 |
+
"poussifeu": "torchic",
|
257 |
+
"galifeu": "combusken",
|
258 |
+
"braségali": "blaziken",
|
259 |
+
"gobou": "mudkip",
|
260 |
+
"flobio": "marshtomp",
|
261 |
+
"laggron": "swampert",
|
262 |
+
"medhyèna": "poochyena",
|
263 |
+
"grahyèna": "mightyena",
|
264 |
+
"zigzaton": "zigzagoon",
|
265 |
+
"linéon": "linoone",
|
266 |
+
"chenipotte": "wurmple",
|
267 |
+
"armulys": "silcoon",
|
268 |
+
"charmillon": "beautifly",
|
269 |
+
"blindalys": "cascoon",
|
270 |
+
"papinox": "dustox",
|
271 |
+
"nénupiot": "lotad",
|
272 |
+
"lombre": "lombre",
|
273 |
+
"ludicolo": "ludicolo",
|
274 |
+
"grainipiot": "seedot",
|
275 |
+
"pifeuil": "nuzleaf",
|
276 |
+
"tengalice": "shiftry",
|
277 |
+
"nirondelle": "taillow",
|
278 |
+
"hélédelle": "swellow",
|
279 |
+
"goélise": "wingull",
|
280 |
+
"bekipan": "pelipper",
|
281 |
+
"tarsal": "ralts",
|
282 |
+
"kirlia": "kirlia",
|
283 |
+
"gardevoir": "gardevoir",
|
284 |
+
"arakdo": "surskit",
|
285 |
+
"maskadra": "masquerain",
|
286 |
+
"balignon": "shroomish",
|
287 |
+
"chapignon": "breloom",
|
288 |
+
"parecool": "slakoth",
|
289 |
+
"vigoroth": "vigoroth",
|
290 |
+
"monaflèmit": "slaking",
|
291 |
+
"ningale": "nincada",
|
292 |
+
"ninjask": "ninjask",
|
293 |
+
"munja": "shedinja",
|
294 |
+
"chuchmur": "whismur",
|
295 |
+
"ramboum": "loudred",
|
296 |
+
"brouhabam": "exploud",
|
297 |
+
"makuhita": "makuhita",
|
298 |
+
"hariyama": "hariyama",
|
299 |
+
"azurill": "azurill",
|
300 |
+
"tarinor": "nosepass",
|
301 |
+
"skitty": "skitty",
|
302 |
+
"delcatty": "delcatty",
|
303 |
+
"ténéfix": "sableye",
|
304 |
+
"mysdibule": "mawile",
|
305 |
+
"galekid": "aron",
|
306 |
+
"galegon": "lairon",
|
307 |
+
"galeking": "aggron",
|
308 |
+
"méditikka": "meditite",
|
309 |
+
"charmina": "medicham",
|
310 |
+
"dynavolt": "electrike",
|
311 |
+
"élecsprint": "manectric",
|
312 |
+
"posipi": "plusle",
|
313 |
+
"négapi": "minun",
|
314 |
+
"muciole": "volbeat",
|
315 |
+
"lumivole": "illumise",
|
316 |
+
"rosélia": "roselia",
|
317 |
+
"gloupti": "gulpin",
|
318 |
+
"avaltout": "swalot",
|
319 |
+
"carvanha": "carvanha",
|
320 |
+
"sharpedo": "sharpedo",
|
321 |
+
"wailmer": "wailmer",
|
322 |
+
"wailord": "wailord",
|
323 |
+
"chamallot": "numel",
|
324 |
+
"camérupt": "camerupt",
|
325 |
+
"chartor": "torkoal",
|
326 |
+
"spoink": "spoink",
|
327 |
+
"groret": "grumpig",
|
328 |
+
"spinda": "spinda",
|
329 |
+
"kraknoix": "trapinch",
|
330 |
+
"vibraninf": "vibrava",
|
331 |
+
"libégon": "flygon",
|
332 |
+
"cacnea": "cacnea",
|
333 |
+
"cacturne": "cacturne",
|
334 |
+
"tylton": "swablu",
|
335 |
+
"altaria": "altaria",
|
336 |
+
"mangriff": "zangoose",
|
337 |
+
"séviper": "seviper",
|
338 |
+
"séléroc": "lunatone",
|
339 |
+
"solaroc": "solrock",
|
340 |
+
"barloche": "barboach",
|
341 |
+
"barbicha": "whiscash",
|
342 |
+
"écrapince": "corphish",
|
343 |
+
"colhomard": "crawdaunt",
|
344 |
+
"balbuto": "baltoy",
|
345 |
+
"kaorine": "claydol",
|
346 |
+
"lilia": "lileep",
|
347 |
+
"vacilys": "cradily",
|
348 |
+
"anorith": "anorith",
|
349 |
+
"armaldo": "armaldo",
|
350 |
+
"barpau": "feebas",
|
351 |
+
"milobellus": "milotic",
|
352 |
+
"morphéo": "castform",
|
353 |
+
"kecleon": "kecleon",
|
354 |
+
"polichombr": "shuppet",
|
355 |
+
"branette": "banette",
|
356 |
+
"skelénox": "duskull",
|
357 |
+
"téraclope": "dusclops",
|
358 |
+
"tropius": "tropius",
|
359 |
+
"éoko": "chimecho",
|
360 |
+
"absol": "absol",
|
361 |
+
"okéoké": "wynaut",
|
362 |
+
"stalgamin": "snorunt",
|
363 |
+
"oniglali": "glalie",
|
364 |
+
"obalie": "spheal",
|
365 |
+
"phogleur": "sealeo",
|
366 |
+
"kaimorse": "walrein",
|
367 |
+
"coquiperl": "clamperl",
|
368 |
+
"serpang": "huntail",
|
369 |
+
"rosabyss": "gorebyss",
|
370 |
+
"relicanth": "relicanth",
|
371 |
+
"lovdisc": "luvdisc",
|
372 |
+
"draby": "bagon",
|
373 |
+
"drackhaus": "shelgon",
|
374 |
+
"drattak": "salamence",
|
375 |
+
"terhal": "beldum",
|
376 |
+
"métang": "metang",
|
377 |
+
"métalosse": "metagross",
|
378 |
+
"regirock": "regirock",
|
379 |
+
"regice": "regice",
|
380 |
+
"registeel": "registeel",
|
381 |
+
"latias": "latias",
|
382 |
+
"latios": "latios",
|
383 |
+
"kyogre": "kyogre",
|
384 |
+
"groudon": "groudon",
|
385 |
+
"rayquaza": "rayquaza",
|
386 |
+
"jirachi": "jirachi",
|
387 |
+
"deoxys": "deoxys",
|
388 |
+
"tortipouss": "turtwig",
|
389 |
+
"boskara": "grotle",
|
390 |
+
"torterra": "torterra",
|
391 |
+
"ouisticram": "chimchar",
|
392 |
+
"chimpenfeu": "monferno",
|
393 |
+
"simiabraz": "infernape",
|
394 |
+
"tiplouf": "piplup",
|
395 |
+
"prinplouf": "prinplup",
|
396 |
+
"pingoléon": "empoleon",
|
397 |
+
"étourmi": "starly",
|
398 |
+
"étourvol": "staravia",
|
399 |
+
"étouraptor": "staraptor",
|
400 |
+
"keunotor": "bidoof",
|
401 |
+
"castorno": "bibarel",
|
402 |
+
"crikzik": "kricketot",
|
403 |
+
"mélokrik": "kricketune",
|
404 |
+
"lixy": "shinx",
|
405 |
+
"luxio": "luxio",
|
406 |
+
"luxray": "luxray",
|
407 |
+
"rozbouton": "budew",
|
408 |
+
"roserade": "roserade",
|
409 |
+
"kranidos": "cranidos",
|
410 |
+
"charkos": "rampardos",
|
411 |
+
"dinoclier": "shieldon",
|
412 |
+
"bastiodon": "bastiodon",
|
413 |
+
"cheniti": "burmy",
|
414 |
+
"cheniselle": "wormadam",
|
415 |
+
"papilord": "mothim",
|
416 |
+
"apitrini": "combee",
|
417 |
+
"apireine": "vespiquen",
|
418 |
+
"pachirisu": "pachirisu",
|
419 |
+
"mustébouée": "buizel",
|
420 |
+
"mustéflott": "floatzel",
|
421 |
+
"ceribou": "cherubi",
|
422 |
+
"ceriflor": "cherrim",
|
423 |
+
"sancoki": "shellos",
|
424 |
+
"tritosor": "gastrodon",
|
425 |
+
"capidextre": "ambipom",
|
426 |
+
"baudrive": "drifloon",
|
427 |
+
"grodrive": "drifblim",
|
428 |
+
"laporeille": "buneary",
|
429 |
+
"lockpin": "lopunny",
|
430 |
+
"magirêve": "mismagius",
|
431 |
+
"corboss": "honchkrow",
|
432 |
+
"chaglam": "glameow",
|
433 |
+
"chaffreux": "purugly",
|
434 |
+
"korillon": "chingling",
|
435 |
+
"moufouette": "stunky",
|
436 |
+
"moufflair": "skuntank",
|
437 |
+
"archéomire": "bronzor",
|
438 |
+
"archéodong": "bronzong",
|
439 |
+
"manzaï": "bonsly",
|
440 |
+
"mime jr.": "mime jr.",
|
441 |
+
"ptiravi": "happiny",
|
442 |
+
"pijako": "chatot",
|
443 |
+
"spiritomb": "spiritomb",
|
444 |
+
"griknot": "gible",
|
445 |
+
"carmache": "gabite",
|
446 |
+
"carchacrok": "garchomp",
|
447 |
+
"goinfrex": "munchlax",
|
448 |
+
"riolu": "riolu",
|
449 |
+
"lucario": "lucario",
|
450 |
+
"hippopotas": "hippopotas",
|
451 |
+
"hippodocus": "hippowdon",
|
452 |
+
"rapion": "skorupi",
|
453 |
+
"drascore": "drapion",
|
454 |
+
"cradopaud": "croagunk",
|
455 |
+
"coatox": "toxicroak",
|
456 |
+
"vortente": "carnivine",
|
457 |
+
"écayon": "finneon",
|
458 |
+
"luminéon": "lumineon",
|
459 |
+
"babimanta": "mantyke",
|
460 |
+
"blizzi": "snover",
|
461 |
+
"blizzaroi": "abomasnow",
|
462 |
+
"dimoret": "weavile",
|
463 |
+
"magnézone": "magnezone",
|
464 |
+
"coudlangue": "lickilicky",
|
465 |
+
"rhinastoc": "rhyperior",
|
466 |
+
"bouldeneu": "tangrowth",
|
467 |
+
"élekable": "electivire",
|
468 |
+
"maganon": "magmortar",
|
469 |
+
"togekiss": "togekiss",
|
470 |
+
"yanmega": "yanmega",
|
471 |
+
"phyllali": "leafeon",
|
472 |
+
"givrali": "glaceon",
|
473 |
+
"scorvol": "gliscor",
|
474 |
+
"mammochon": "mamoswine",
|
475 |
+
"porygon-z": "porygon-z",
|
476 |
+
"gallame": "gallade",
|
477 |
+
"tarinorme": "probopass",
|
478 |
+
"noctunoir": "dusknoir",
|
479 |
+
"momartik": "froslass",
|
480 |
+
"motisma": "rotom",
|
481 |
+
"créhelf": "uxie",
|
482 |
+
"créfollet": "mesprit",
|
483 |
+
"créfadet": "azelf",
|
484 |
+
"dialga": "dialga",
|
485 |
+
"palkia": "palkia",
|
486 |
+
"heatran": "heatran",
|
487 |
+
"regigigas": "regigigas",
|
488 |
+
"giratina": "giratina",
|
489 |
+
"cresselia": "cresselia",
|
490 |
+
"phione": "phione",
|
491 |
+
"manaphy": "manaphy",
|
492 |
+
"darkrai": "darkrai",
|
493 |
+
"shaymin": "shaymin",
|
494 |
+
"arceus": "arceus",
|
495 |
+
"victini": "victini",
|
496 |
+
"vipélierre": "snivy",
|
497 |
+
"lianaja": "servine",
|
498 |
+
"majaspic": "serperior",
|
499 |
+
"gruikui": "tepig",
|
500 |
+
"grotichon": "pignite",
|
501 |
+
"roitiflam": "emboar",
|
502 |
+
"moustillon": "oshawott",
|
503 |
+
"mateloutre": "dewott",
|
504 |
+
"clamiral": "samurott",
|
505 |
+
"ratentif": "patrat",
|
506 |
+
"miradar": "watchog",
|
507 |
+
"ponchiot": "lillipup",
|
508 |
+
"ponchien": "herdier",
|
509 |
+
"mastouffe": "stoutland",
|
510 |
+
"chacripan": "purrloin",
|
511 |
+
"léopardus": "liepard",
|
512 |
+
"feuillajou": "pansage",
|
513 |
+
"feuiloutan": "simisage",
|
514 |
+
"flamajou": "pansear",
|
515 |
+
"flamoutan": "simisear",
|
516 |
+
"flotajou": "panpour",
|
517 |
+
"flotoutan": "simipour",
|
518 |
+
"munna": "munna",
|
519 |
+
"mushana": "musharna",
|
520 |
+
"poichigeon": "pidove",
|
521 |
+
"colombeau": "tranquill",
|
522 |
+
"déflaisan": "unfezant",
|
523 |
+
"zébibron": "blitzle",
|
524 |
+
"zéblitz": "zebstrika",
|
525 |
+
"nodulithe": "roggenrola",
|
526 |
+
"géolithe": "boldore",
|
527 |
+
"gigalithe": "gigalith",
|
528 |
+
"chovsourir": "woobat",
|
529 |
+
"rhinolove": "swoobat",
|
530 |
+
"rototaupe": "drilbur",
|
531 |
+
"minotaupe": "excadrill",
|
532 |
+
"nanméouïe": "audino",
|
533 |
+
"charpenti": "timburr",
|
534 |
+
"ouvrifier": "gurdurr",
|
535 |
+
"bétochef": "conkeldurr",
|
536 |
+
"tritonde": "tympole",
|
537 |
+
"batracné": "palpitoad",
|
538 |
+
"crapustule": "seismitoad",
|
539 |
+
"judokrak": "throh",
|
540 |
+
"karaclée": "sawk",
|
541 |
+
"larveyette": "sewaddle",
|
542 |
+
"couverdure": "swadloon",
|
543 |
+
"manternel": "leavanny",
|
544 |
+
"venipatte": "venipede",
|
545 |
+
"scobolide": "whirlipede",
|
546 |
+
"brutapode": "scolipede",
|
547 |
+
"doudouvet": "cottonee",
|
548 |
+
"farfaduvet": "whimsicott",
|
549 |
+
"chlorobule": "petilil",
|
550 |
+
"fragilady": "lilligant",
|
551 |
+
"bargantua": "basculin",
|
552 |
+
"mascaïman": "sandile",
|
553 |
+
"escroco": "krokorok",
|
554 |
+
"crocorible": "krookodile",
|
555 |
+
"darumarond": "darumaka",
|
556 |
+
"darumacho": "darmanitan",
|
557 |
+
"maracachi": "maractus",
|
558 |
+
"crabicoque": "dwebble",
|
559 |
+
"crabaraque": "crustle",
|
560 |
+
"baggiguane": "scraggy",
|
561 |
+
"baggaïd": "scrafty",
|
562 |
+
"cryptéro": "sigilyph",
|
563 |
+
"tutafeh": "yamask",
|
564 |
+
"tutankafer": "cofagrigus",
|
565 |
+
"carapagos": "tirtouga",
|
566 |
+
"mégapagos": "carracosta",
|
567 |
+
"arkéapti": "archen",
|
568 |
+
"aéroptéryx": "archeops",
|
569 |
+
"miamiasme": "trubbish",
|
570 |
+
"miasmax": "garbodor",
|
571 |
+
"zorua": "zorua",
|
572 |
+
"zoroark": "zoroark",
|
573 |
+
"chinchidou": "minccino",
|
574 |
+
"pashmilla": "cinccino",
|
575 |
+
"scrutella": "gothita",
|
576 |
+
"mesmérella": "gothorita",
|
577 |
+
"sidérella": "gothitelle",
|
578 |
+
"nucléos": "solosis",
|
579 |
+
"méios": "duosion",
|
580 |
+
"symbios": "reuniclus",
|
581 |
+
"couaneton": "ducklett",
|
582 |
+
"lakmécygne": "swanna",
|
583 |
+
"sorbébé": "vanillite",
|
584 |
+
"sorboul": "vanillish",
|
585 |
+
"sorbouboul": "vanilluxe",
|
586 |
+
"vivaldaim": "deerling",
|
587 |
+
"haydaim": "sawsbuck",
|
588 |
+
"emolga": "emolga",
|
589 |
+
"carabing": "karrablast",
|
590 |
+
"lançargot": "escavalier",
|
591 |
+
"trompignon": "foongus",
|
592 |
+
"gaulet": "amoonguss",
|
593 |
+
"viskuse": "frillish",
|
594 |
+
"moyade": "jellicent",
|
595 |
+
"mamanbo": "alomomola",
|
596 |
+
"statitik": "joltik",
|
597 |
+
"mygavolt": "galvantula",
|
598 |
+
"grindur": "ferroseed",
|
599 |
+
"noacier": "ferrothorn",
|
600 |
+
"tic": "klink",
|
601 |
+
"clic": "klang",
|
602 |
+
"cliticlic": "klinklang",
|
603 |
+
"anchwatt": "tynamo",
|
604 |
+
"lampéroie": "eelektrik",
|
605 |
+
"ohmassacre": "eelektross",
|
606 |
+
"lewsor": "elgyem",
|
607 |
+
"neitram": "beheeyem",
|
608 |
+
"funécire": "litwick",
|
609 |
+
"mélancolux": "lampent",
|
610 |
+
"lugulabre": "chandelure",
|
611 |
+
"coupenotte": "axew",
|
612 |
+
"incisache": "fraxure",
|
613 |
+
"tranchodon": "haxorus",
|
614 |
+
"polarhume": "cubchoo",
|
615 |
+
"polagriffe": "beartic",
|
616 |
+
"hexagel": "cryogonal",
|
617 |
+
"escargaume": "shelmet",
|
618 |
+
"limaspeed": "accelgor",
|
619 |
+
"limonde": "stunfisk",
|
620 |
+
"kungfouine": "mienfoo",
|
621 |
+
"shaofouine": "mienshao",
|
622 |
+
"drakkarmin": "druddigon",
|
623 |
+
"gringolem": "golett",
|
624 |
+
"golemastoc": "golurk",
|
625 |
+
"scalpion": "pawniard",
|
626 |
+
"scalproie": "bisharp",
|
627 |
+
"frison": "bouffalant",
|
628 |
+
"furaiglon": "rufflet",
|
629 |
+
"gueriaigle": "braviary",
|
630 |
+
"vostourno": "vullaby",
|
631 |
+
"vaututrice": "mandibuzz",
|
632 |
+
"aflamanoir": "heatmor",
|
633 |
+
"fermite": "durant",
|
634 |
+
"solochi": "deino",
|
635 |
+
"diamat": "zweilous",
|
636 |
+
"trioxhydre": "hydreigon",
|
637 |
+
"pyronille": "larvesta",
|
638 |
+
"pyrax": "volcarona",
|
639 |
+
"cobaltium": "cobalion",
|
640 |
+
"terrakium": "terrakion",
|
641 |
+
"viridium": "virizion",
|
642 |
+
"boréas": "tornadus",
|
643 |
+
"fulguris": "thundurus",
|
644 |
+
"reshiram": "reshiram",
|
645 |
+
"zekrom": "zekrom",
|
646 |
+
"démétéros": "landorus",
|
647 |
+
"kyurem": "kyurem",
|
648 |
+
"keldeo": "keldeo",
|
649 |
+
"meloetta": "meloetta",
|
650 |
+
"genesect": "genesect",
|
651 |
+
"marisson": "chespin",
|
652 |
+
"boguérisse": "quilladin",
|
653 |
+
"blindépique": "chesnaught",
|
654 |
+
"feunnec": "fennekin",
|
655 |
+
"roussil": "braixen",
|
656 |
+
"goupelin": "delphox",
|
657 |
+
"grenousse": "froakie",
|
658 |
+
"croâporal": "frogadier",
|
659 |
+
"amphinobi": "greninja",
|
660 |
+
"sapereau": "bunnelby",
|
661 |
+
"excavarenne": "diggersby",
|
662 |
+
"passerouge": "fletchling",
|
663 |
+
"braisillon": "fletchinder",
|
664 |
+
"flambusard": "talonflame",
|
665 |
+
"lépidonille": "scatterbug",
|
666 |
+
"pérégrain": "spewpa",
|
667 |
+
"prismillon": "vivillon",
|
668 |
+
"hélionceau": "litleo",
|
669 |
+
"némélios": "pyroar",
|
670 |
+
"flabébé": "flabébé",
|
671 |
+
"floette": "floette",
|
672 |
+
"florges": "florges",
|
673 |
+
"cabriolaine": "skiddo",
|
674 |
+
"chevroum": "gogoat",
|
675 |
+
"pandespiègle": "pancham",
|
676 |
+
"pandarbare": "pangoro",
|
677 |
+
"couafarel": "furfrou",
|
678 |
+
"psystigri": "espurr",
|
679 |
+
"mistigrix": "meowstic",
|
680 |
+
"monorpale": "honedge",
|
681 |
+
"dimoclès": "doublade",
|
682 |
+
"exagide": "aegislash",
|
683 |
+
"fluvetin": "spritzee",
|
684 |
+
"cocotine": "aromatisse",
|
685 |
+
"sucroquin": "swirlix",
|
686 |
+
"cupcanaille": "slurpuff",
|
687 |
+
"sepiatop": "inkay",
|
688 |
+
"sepiatroce": "malamar",
|
689 |
+
"opermine": "binacle",
|
690 |
+
"golgopathe": "barbaracle",
|
691 |
+
"venalgue": "skrelp",
|
692 |
+
"kravarech": "dragalge",
|
693 |
+
"flingouste": "clauncher",
|
694 |
+
"gamblast": "clawitzer",
|
695 |
+
"galvaran": "helioptile",
|
696 |
+
"iguolta": "heliolisk",
|
697 |
+
"ptyranidur": "tyrunt",
|
698 |
+
"rexillius": "tyrantrum",
|
699 |
+
"amagara": "amaura",
|
700 |
+
"dragmara": "aurorus",
|
701 |
+
"nymphali": "sylveon",
|
702 |
+
"brutalibré": "hawlucha",
|
703 |
+
"dedenne": "dedenne",
|
704 |
+
"strassie": "carbink",
|
705 |
+
"mucuscule": "goomy",
|
706 |
+
"colimucus": "sliggoo",
|
707 |
+
"muplodocus": "goodra",
|
708 |
+
"trousselin": "klefki",
|
709 |
+
"brocélôme": "phantump",
|
710 |
+
"desséliande": "trevenant",
|
711 |
+
"pitrouille": "pumpkaboo",
|
712 |
+
"banshitrouye": "gourgeist",
|
713 |
+
"grelaçon": "bergmite",
|
714 |
+
"séracrawl": "avalugg",
|
715 |
+
"sonistrelle": "noibat",
|
716 |
+
"bruyverne": "noivern",
|
717 |
+
"xerneas": "xerneas",
|
718 |
+
"yveltal": "yveltal",
|
719 |
+
"zygarde": "zygarde",
|
720 |
+
"diancie": "diancie",
|
721 |
+
"hoopa": "hoopa",
|
722 |
+
"volcanion": "volcanion",
|
723 |
+
"brindibou": "rowlet",
|
724 |
+
"efflèche": "dartrix",
|
725 |
+
"archéduc": "decidueye",
|
726 |
+
"flamiaou": "litten",
|
727 |
+
"matoufeu": "torracat",
|
728 |
+
"félinferno": "incineroar",
|
729 |
+
"otaquin": "popplio",
|
730 |
+
"otarlette": "brionne",
|
731 |
+
"oratoria": "primarina",
|
732 |
+
"picassaut": "pikipek",
|
733 |
+
"piclairon": "trumbeak",
|
734 |
+
"bazoucan": "toucannon",
|
735 |
+
"manglouton": "yungoos",
|
736 |
+
"argouste": "gumshoos",
|
737 |
+
"larvibule": "grubbin",
|
738 |
+
"chrysapile": "charjabug",
|
739 |
+
"lucanon": "vikavolt",
|
740 |
+
"crabagarre": "crabrawler",
|
741 |
+
"crabominable": "crabominable",
|
742 |
+
"plumeline": "oricorio",
|
743 |
+
"bombydou": "cutiefly",
|
744 |
+
"rubombelle": "ribombee",
|
745 |
+
"rocabot": "rockruff",
|
746 |
+
"lougaroc": "lycanroc",
|
747 |
+
"froussardine": "wishiwashi",
|
748 |
+
"vorastérie": "mareanie",
|
749 |
+
"prédastérie": "toxapex",
|
750 |
+
"tiboudet": "mudbray",
|
751 |
+
"bourrinos": "mudsdale",
|
752 |
+
"araqua": "dewpider",
|
753 |
+
"tarenbulle": "araquanid",
|
754 |
+
"mimantis": "fomantis",
|
755 |
+
"floramantis": "lurantis",
|
756 |
+
"spododo": "morelull",
|
757 |
+
"lampignon": "shiinotic",
|
758 |
+
"tritox": "salandit",
|
759 |
+
"malamandre": "salazzle",
|
760 |
+
"nounourson": "stufful",
|
761 |
+
"chelours": "bewear",
|
762 |
+
"croquine": "bounsweet",
|
763 |
+
"candine": "steenee",
|
764 |
+
"sucreine": "tsareena",
|
765 |
+
"guérilande": "comfey",
|
766 |
+
"gouroutan": "oranguru",
|
767 |
+
"quartermac": "passimian",
|
768 |
+
"sovkipou": "wimpod",
|
769 |
+
"sarmuraï": "golisopod",
|
770 |
+
"bacabouh": "sandygast",
|
771 |
+
"trépassable": "palossand",
|
772 |
+
"concombaffe": "pyukumuku",
|
773 |
+
"type:0": "type: null",
|
774 |
+
"silvallié": "silvally",
|
775 |
+
"météno": "minior",
|
776 |
+
"dodoala": "komala",
|
777 |
+
"boumata": "turtonator",
|
778 |
+
"togedemaru": "togedemaru",
|
779 |
+
"mimiqui": "mimikyu",
|
780 |
+
"denticrisse": "bruxish",
|
781 |
+
"draïeul": "drampa",
|
782 |
+
"sinistrail": "dhelmise",
|
783 |
+
"bébécaille": "jangmo-o",
|
784 |
+
"écaïd": "hakamo-o",
|
785 |
+
"ékaïser": "kommo-o",
|
786 |
+
"tokorico": "tapu koko",
|
787 |
+
"tokopiyon": "tapu lele",
|
788 |
+
"tokotoro": "tapu bulu",
|
789 |
+
"tokopisco": "tapu fini",
|
790 |
+
"cosmog": "cosmog",
|
791 |
+
"cosmovum": "cosmoem",
|
792 |
+
"solgaleo": "solgaleo",
|
793 |
+
"lunala": "lunala",
|
794 |
+
"zéroïd": "nihilego",
|
795 |
+
"mouscoto": "buzzwole",
|
796 |
+
"cancrelove": "pheromosa",
|
797 |
+
"câblifère": "xurkitree",
|
798 |
+
"bamboiselle": "celesteela",
|
799 |
+
"katagami": "kartana",
|
800 |
+
"engloutyran": "guzzlord",
|
801 |
+
"necrozma": "necrozma",
|
802 |
+
"magearna": "magearna",
|
803 |
+
"marshadow": "marshadow",
|
804 |
+
"vémini": "poipole",
|
805 |
+
"mandrillon": "naganadel",
|
806 |
+
"ama-ama": "stakataka",
|
807 |
+
"pierroteknik": "blacephalon",
|
808 |
+
"zeraora": "zeraora",
|
809 |
+
"meltan": "meltan",
|
810 |
+
"melmetal": "melmetal",
|
811 |
+
"ouistempo": "grookey",
|
812 |
+
"badabouin": "thwackey",
|
813 |
+
"gorythmic": "rillaboom",
|
814 |
+
"flambino": "scorbunny",
|
815 |
+
"lapyro": "raboot",
|
816 |
+
"pyrobut": "cinderace",
|
817 |
+
"larméléon": "sobble",
|
818 |
+
"arrozard": "drizzile",
|
819 |
+
"lézargus": "inteleon",
|
820 |
+
"rongourmand": "skwovet",
|
821 |
+
"rongrigou": "greedent",
|
822 |
+
"minisange": "rookidee",
|
823 |
+
"bleuseille": "corvisquire",
|
824 |
+
"corvaillus": "corviknight",
|
825 |
+
"larvadar": "blipbug",
|
826 |
+
"coléodôme": "dottler",
|
827 |
+
"astronelle": "orbeetle",
|
828 |
+
"goupilou": "nickit",
|
829 |
+
"roublenard": "thievul",
|
830 |
+
"tournicoton": "gossifleur",
|
831 |
+
"blancoton": "eldegoss",
|
832 |
+
"moumouton": "wooloo",
|
833 |
+
"moumouflon": "dubwool",
|
834 |
+
"khélocrok": "chewtle",
|
835 |
+
"torgamord": "drednaw",
|
836 |
+
"voltoutou": "yamper",
|
837 |
+
"fulgudog": "boltund",
|
838 |
+
"charbi": "rolycoly",
|
839 |
+
"wagomine": "carkol",
|
840 |
+
"monthracite": "coalossal",
|
841 |
+
"verpom": "applin",
|
842 |
+
"pomdrapi": "flapple",
|
843 |
+
"dratatin": "appletun",
|
844 |
+
"dunaja": "silicobra",
|
845 |
+
"dunaconda": "sandaconda",
|
846 |
+
"nigosier": "cramorant",
|
847 |
+
"embrochet": "arrokuda",
|
848 |
+
"hastacuda": "barraskewda",
|
849 |
+
"toxizap": "toxel",
|
850 |
+
"salarsen": "toxtricity",
|
851 |
+
"grillepattes": "sizzlipede",
|
852 |
+
"scolocendre": "centiskorch",
|
853 |
+
"poulpaf": "clobbopus",
|
854 |
+
"krakos": "grapploct",
|
855 |
+
"théffroi": "sinistea",
|
856 |
+
"polthégeist": "polteageist",
|
857 |
+
"bibichut": "hatenna",
|
858 |
+
"chapotus": "hattrem",
|
859 |
+
"sorcilence": "hatterene",
|
860 |
+
"grimalin": "impidimp",
|
861 |
+
"fourbelin": "morgrem",
|
862 |
+
"angoliath": "grimmsnarl",
|
863 |
+
"ixon": "obstagoon",
|
864 |
+
"berserkatt": "perrserker",
|
865 |
+
"corayôme": "cursola",
|
866 |
+
"palarticho": "sirfetch’d",
|
867 |
+
"m. glaquette": "mr. rime",
|
868 |
+
"tutétékri": "runerigus",
|
869 |
+
"crèmy": "milcery",
|
870 |
+
"charmilly": "alcremie",
|
871 |
+
"hexadron": "falinks",
|
872 |
+
"wattapik": "pincurchin",
|
873 |
+
"frissonille": "snom",
|
874 |
+
"beldeneige": "frosmoth",
|
875 |
+
"dolman": "stonjourner",
|
876 |
+
"bekaglaçon": "eiscue",
|
877 |
+
"wimessir": "indeedee",
|
878 |
+
"morpeko": "morpeko",
|
879 |
+
"charibari": "cufant",
|
880 |
+
"pachyradjah": "copperajah",
|
881 |
+
"galvagon": "dracozolt",
|
882 |
+
"galvagla": "arctozolt",
|
883 |
+
"hydragon": "dracovish",
|
884 |
+
"hydragla": "arctovish",
|
885 |
+
"duralugon": "duraludon",
|
886 |
+
"fantyrm": "dreepy",
|
887 |
+
"dispareptil": "drakloak",
|
888 |
+
"lanssorien": "dragapult",
|
889 |
+
"zacian": "zacian",
|
890 |
+
"zamazenta": "zamazenta",
|
891 |
+
"éthernatos": "eternatus",
|
892 |
+
"wushours": "kubfu",
|
893 |
+
"shifours": "urshifu",
|
894 |
+
"zarude": "zarude",
|
895 |
+
"regieleki": "regieleki",
|
896 |
+
"regidrago": "regidrago",
|
897 |
+
"blizzeval": "glastrier",
|
898 |
+
"spectreval": "spectrier",
|
899 |
+
"sylveroy": "calyrex",
|
900 |
+
"cerbyllin": "wyrdeer",
|
901 |
+
"hachécateur": "kleavor",
|
902 |
+
"ursaking": "ursaluna",
|
903 |
+
"paragruel": "basculegion",
|
904 |
+
"farfurex": "sneasler",
|
905 |
+
"qwilpik": "overqwil",
|
906 |
+
"amovénus": "enamorus",
|
907 |
+
"poussacha": "sprigatito",
|
908 |
+
"matourgeon": "floragato",
|
909 |
+
"miascarade": "meowscarada",
|
910 |
+
"chochodile": "fuecoco",
|
911 |
+
"crocogril": "crocalor",
|
912 |
+
"flâmigator": "skeledirge",
|
913 |
+
"coiffeton": "quaxly",
|
914 |
+
"canarbello": "quaxwell",
|
915 |
+
"palmaval": "quaquaval",
|
916 |
+
"gourmelet": "lechonk",
|
917 |
+
"fragroin": "oinkologne",
|
918 |
+
"tissenboule": "tarountula",
|
919 |
+
"filentrappe": "spidops",
|
920 |
+
"lilliterelle": "nymble",
|
921 |
+
"gambex": "lokix",
|
922 |
+
"pohm": "pawmi",
|
923 |
+
"pohmotte": "pawmo",
|
924 |
+
"pohmarmotte": "pawmot",
|
925 |
+
"compagnol": "tandemaus",
|
926 |
+
"famignol": "maushold",
|
927 |
+
"pâtachiot": "fidough",
|
928 |
+
"briochien": "dachsbun",
|
929 |
+
"olivini": "smoliv",
|
930 |
+
"olivado": "dolliv",
|
931 |
+
"arboliva": "arboliva",
|
932 |
+
"tapatoès": "squawkabilly",
|
933 |
+
"selutin": "nacli",
|
934 |
+
"amassel": "naclstack",
|
935 |
+
"gigansel": "garganacl",
|
936 |
+
"charbambin": "charcadet",
|
937 |
+
"carmadura": "armarouge",
|
938 |
+
"malvalame": "ceruledge",
|
939 |
+
"têtampoule": "tadbulb",
|
940 |
+
"ampibidou": "bellibolt",
|
941 |
+
"zapétrel": "wattrel",
|
942 |
+
"fulgulairo": "kilowattrel",
|
943 |
+
"grondogue": "maschiff",
|
944 |
+
"dogrino": "mabosstiff",
|
945 |
+
"gribouraigne": "shroodle",
|
946 |
+
"tag-tag": "grafaiai",
|
947 |
+
"virovent": "bramblin",
|
948 |
+
"virevorreur": "brambleghast",
|
949 |
+
"terracool": "toedscool",
|
950 |
+
"terracruel": "toedscruel",
|
951 |
+
"craparoi": "klawf",
|
952 |
+
"pimito": "capsakid",
|
953 |
+
"scovilain": "scovillain",
|
954 |
+
"léboulérou": "rellor",
|
955 |
+
"bérasca": "rabsca",
|
956 |
+
"flotillon": "flittle",
|
957 |
+
"cléopsytra": "espathra",
|
958 |
+
"forgerette": "tinkatink",
|
959 |
+
"forgella": "tinkatuff",
|
960 |
+
"forgelina": "tinkaton",
|
961 |
+
"taupikeau": "wiglett",
|
962 |
+
"triopikeau": "wugtrio",
|
963 |
+
"lestombaile": "bombirdier",
|
964 |
+
"dofin": "finizen",
|
965 |
+
"superdofin": "palafin",
|
966 |
+
"vrombi": "varoom",
|
967 |
+
"vrombotor": "revavroom",
|
968 |
+
"motorizard": "cyclizar",
|
969 |
+
"ferdeter": "orthworm",
|
970 |
+
"germéclat": "glimmet",
|
971 |
+
"floréclat": "glimmora",
|
972 |
+
"toutombe": "greavard",
|
973 |
+
"tomberro": "houndstone",
|
974 |
+
"flamenroule": "flamigo",
|
975 |
+
"piétacé": "cetoddle",
|
976 |
+
"balbalèze": "cetitan",
|
977 |
+
"délestin": "veluza",
|
978 |
+
"oyacata": "dondozo",
|
979 |
+
"nigirigon": "tatsugiri",
|
980 |
+
"courrousinge": "annihilape",
|
981 |
+
"terraiste": "clodsire",
|
982 |
+
"farigiraf": "farigiraf",
|
983 |
+
"deusolourdo": "dudunsparce",
|
984 |
+
"scalpereur": "kingambit",
|
985 |
+
"fort-ivoire": "great tusk",
|
986 |
+
"hurle-queue": "scream tail",
|
987 |
+
"fongus-furie": "brute bonnet",
|
988 |
+
"flotte-mèche": "flutter mane",
|
989 |
+
"rampe-ailes": "slither wing",
|
990 |
+
"pelage-sablé": "sandy shocks",
|
991 |
+
"roue-de-fer": "iron treads",
|
992 |
+
"hotte-de-fer": "iron bundle",
|
993 |
+
"paume-de-fer": "iron hands",
|
994 |
+
"têtes-de-fer": "iron jugulis",
|
995 |
+
"mite-de-fer": "iron moth",
|
996 |
+
"épine-de-fer": "iron thorns",
|
997 |
+
"frigodo": "frigibax",
|
998 |
+
"cryodo": "arctibax",
|
999 |
+
"glaivodo": "baxcalibur",
|
1000 |
+
"mordudor": "gimmighoul",
|
1001 |
+
"gromago": "gholdengo",
|
1002 |
+
"chongjian": "wo-chien",
|
1003 |
+
"baojian": "chien-pao",
|
1004 |
+
"dinglu": "ting-lu",
|
1005 |
+
"yuyu": "chi-yu",
|
1006 |
+
"rugit-lune": "roaring moon",
|
1007 |
+
"garde-de-fer": "iron valiant",
|
1008 |
+
"koraidon": "koraidon",
|
1009 |
+
"miraidon": "miraidon",
|
1010 |
+
"serpente-eau": "walking wake",
|
1011 |
+
"vert-de-fer": "iron leaves",
|
1012 |
+
"pomdramour": "dipplin",
|
1013 |
+
"poltchageist": "poltchageist",
|
1014 |
+
"théffroyable": "sinistcha",
|
1015 |
+
"félicanis": "okidogi",
|
1016 |
+
"fortusimia": "munkidori",
|
1017 |
+
"favianos": "fezandipiti",
|
1018 |
+
"ogerpon": "ogerpon",
|
1019 |
+
"pondralugon": "archaludon",
|
1020 |
+
"pomdorochi": "hydrapple",
|
1021 |
+
"feu-perçant": "gouging fire",
|
1022 |
+
"ire-foudre": "raging bolt",
|
1023 |
+
"roc-de-fer": "iron boulder",
|
1024 |
+
"chef-de-fer": "iron crown",
|
1025 |
+
"terapagos": "terapagos",
|
1026 |
+
"pêchaminus": "pecharunt"
|
1027 |
+
}
|
generate-translation- name.py
ADDED
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import requests
|
2 |
+
import json
|
3 |
+
import time
|
4 |
+
|
5 |
+
def build_fr_to_en_map():
|
6 |
+
fr_to_en = {}
|
7 |
+
total_species = 1025 # nombre approximatif de Pokémon en 2025
|
8 |
+
print("⏳ Récupération des noms depuis PokéAPI...")
|
9 |
+
|
10 |
+
for species_id in range(1, total_species + 1):
|
11 |
+
url = f"https://pokeapi.co/api/v2/pokemon-species/{species_id}/"
|
12 |
+
try:
|
13 |
+
res = requests.get(url)
|
14 |
+
res.raise_for_status()
|
15 |
+
data = res.json()
|
16 |
+
|
17 |
+
name_en = None
|
18 |
+
name_fr = None
|
19 |
+
for entry in data["names"]:
|
20 |
+
lang = entry["language"]["name"]
|
21 |
+
if lang == "en":
|
22 |
+
name_en = entry["name"]
|
23 |
+
elif lang == "fr":
|
24 |
+
name_fr = entry["name"]
|
25 |
+
|
26 |
+
if name_en and name_fr:
|
27 |
+
fr_to_en[name_fr.lower()] = name_en.lower()
|
28 |
+
|
29 |
+
print(f"✅ {species_id}: {name_fr} ➝ {name_en}")
|
30 |
+
time.sleep(0.1) # pour éviter de spam l'API
|
31 |
+
|
32 |
+
except Exception as e:
|
33 |
+
print(f"⚠️ Erreur à l'ID {species_id} : {e}")
|
34 |
+
continue
|
35 |
+
|
36 |
+
return fr_to_en
|
37 |
+
|
38 |
+
if __name__ == "__main__":
|
39 |
+
mapping = build_fr_to_en_map()
|
40 |
+
|
41 |
+
# Sauvegarde dans un fichier JSON
|
42 |
+
with open("fr_to_en_pokemon.json", "w", encoding="utf-8") as f:
|
43 |
+
json.dump(mapping, f, ensure_ascii=False, indent=2)
|
44 |
+
|
45 |
+
print("\n✅ Fichier 'fr_to_en_pokemon.json' généré avec succès.")
|
import-data.py
ADDED
@@ -0,0 +1,66 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import torch
|
2 |
+
from datasets import load_dataset
|
3 |
+
from PIL import Image
|
4 |
+
from io import BytesIO
|
5 |
+
import requests
|
6 |
+
import open_clip
|
7 |
+
import chromadb
|
8 |
+
|
9 |
+
# 1. Setup CLIP
|
10 |
+
device = "cuda" if torch.cuda.is_available() else "cpu"
|
11 |
+
model, _, preprocess = open_clip.create_model_and_transforms('ViT-B-32', pretrained='openai')
|
12 |
+
model = model.to(device).eval()
|
13 |
+
|
14 |
+
# 2. Load Pokémon cards dataset
|
15 |
+
dataset = load_dataset("TheFusion21/PokemonCards", split="train")
|
16 |
+
|
17 |
+
# 3. Setup ChromaDB client
|
18 |
+
client = chromadb.PersistentClient(path="./chroma_db")
|
19 |
+
collection = client.get_or_create_collection(
|
20 |
+
name="pokemon_cards_clip",
|
21 |
+
metadata={"hnsw:space": "cosine"}
|
22 |
+
)
|
23 |
+
|
24 |
+
# 4. Insert embeddings into ChromaDB if not already indexed
|
25 |
+
if collection.count() == 0:
|
26 |
+
print("📦 Indexing images into ChromaDB...")
|
27 |
+
|
28 |
+
for i, entry in enumerate(dataset):
|
29 |
+
try:
|
30 |
+
url = entry.get("image_url")
|
31 |
+
if not url:
|
32 |
+
continue
|
33 |
+
|
34 |
+
# Téléchargement et prétraitement de l'image
|
35 |
+
response = requests.get(url, timeout=10)
|
36 |
+
image = Image.open(BytesIO(response.content)).convert("RGB")
|
37 |
+
image_input = preprocess(image).unsqueeze(0).to(device)
|
38 |
+
|
39 |
+
# Extraction de l'embedding
|
40 |
+
with torch.no_grad():
|
41 |
+
image_features = model.encode_image(image_input)
|
42 |
+
image_features /= image_features.norm(dim=-1, keepdim=True)
|
43 |
+
|
44 |
+
# Ajout dans la collection
|
45 |
+
collection.add(
|
46 |
+
ids=[f"card-{i}"],
|
47 |
+
embeddings=[image_features.squeeze().cpu().tolist()],
|
48 |
+
metadatas=[{
|
49 |
+
"name": entry.get("name", ""),
|
50 |
+
"set": entry.get("set_name", ""),
|
51 |
+
"hp": entry.get("hp", ""),
|
52 |
+
"image_url": url,
|
53 |
+
"caption": entry.get("caption", "")
|
54 |
+
}]
|
55 |
+
)
|
56 |
+
|
57 |
+
if i % 100 == 0:
|
58 |
+
print(f"✅ {i} cartes indexées...")
|
59 |
+
|
60 |
+
except Exception as e:
|
61 |
+
print(f"❌ Erreur sur carte {i}: {e}")
|
62 |
+
|
63 |
+
print("✅ Indexation terminée.")
|
64 |
+
|
65 |
+
else:
|
66 |
+
print("✅ Les embeddings sont déjà présents dans ChromaDB.")
|
pokedex.py
ADDED
@@ -0,0 +1,233 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import requests
|
2 |
+
import math
|
3 |
+
import json
|
4 |
+
import os
|
5 |
+
import chromadb
|
6 |
+
|
7 |
+
with open("fr_to_en_pokemon.json", "r", encoding="utf-8") as f:
|
8 |
+
FR_TO_EN_MAP = json.load(f)
|
9 |
+
|
10 |
+
client = chromadb.PersistentClient(path="./chroma_db")
|
11 |
+
collection = client.get_or_create_collection(name="pokemon_cards_clip")
|
12 |
+
print(f"📦 Nombre de cartesen base : {collection.count()}")
|
13 |
+
|
14 |
+
def get_english_name(pokemon_name: str) -> str:
|
15 |
+
name = pokemon_name.strip().lower().replace(" ", "-")
|
16 |
+
|
17 |
+
if name in [v.replace(" ", "-") for v in FR_TO_EN_MAP.values()]:
|
18 |
+
return name
|
19 |
+
|
20 |
+
english = FR_TO_EN_MAP.get(name)
|
21 |
+
if english:
|
22 |
+
return english.lower().replace(" ", "-")
|
23 |
+
|
24 |
+
return "❌ nom-non-reconnu"
|
25 |
+
|
26 |
+
def calculate_stat(base, level, iv=31, ev=0, nature=1.0, stat_name="hp"):
|
27 |
+
if stat_name == "hp":
|
28 |
+
return math.floor(((2 * base + iv + (ev // 4)) * level) / 100) + level + 10
|
29 |
+
else:
|
30 |
+
return math.floor((((2 * base + iv + (ev // 4)) * level) / 100 + 5) * nature)
|
31 |
+
|
32 |
+
def estimate_level_from_hp(observed_hp, base_hp, iv=31, ev=0, tolerance=1):
|
33 |
+
for level in range(1, 101):
|
34 |
+
computed_hp = math.floor(((2 * base_hp + iv + (ev // 4)) * level) / 100) + level + 10
|
35 |
+
if abs(computed_hp - observed_hp) <= tolerance:
|
36 |
+
return level
|
37 |
+
return None
|
38 |
+
|
39 |
+
def get_base_hp(pokemon_name: str) -> int:
|
40 |
+
base_url = "https://pokeapi.co/api/v2/pokemon/"
|
41 |
+
try:
|
42 |
+
res = requests.get(base_url + pokemon_name.lower())
|
43 |
+
res.raise_for_status()
|
44 |
+
data = res.json()
|
45 |
+
|
46 |
+
# Trouver la stat HP
|
47 |
+
for stat in data["stats"]:
|
48 |
+
if stat["stat"]["name"] == "hp":
|
49 |
+
return stat["base_stat"]
|
50 |
+
|
51 |
+
raise ValueError("❌ Stat HP non trouvée.")
|
52 |
+
|
53 |
+
except requests.exceptions.HTTPError:
|
54 |
+
raise ValueError("❌ Pokémon introuvable. Vérifie le nom.")
|
55 |
+
except Exception as e:
|
56 |
+
raise RuntimeError(f"⚠️ Erreur : {str(e)}")
|
57 |
+
|
58 |
+
|
59 |
+
def get_move_details(move_url: str) -> dict:
|
60 |
+
res = requests.get(move_url)
|
61 |
+
res.raise_for_status()
|
62 |
+
move_data = res.json()
|
63 |
+
|
64 |
+
# Description in French if available, fallback to default
|
65 |
+
effect = next(
|
66 |
+
(entry['effect'] for entry in move_data['effect_entries'] if entry['language']['name'] == 'en'),
|
67 |
+
move_data['effect_entries'][0]['effect'] if move_data['effect_entries'] else "No known effect."
|
68 |
+
)
|
69 |
+
|
70 |
+
effect = effect.replace("$effect_chance", str(move_data.get("effect_chance", "")))
|
71 |
+
|
72 |
+
return {
|
73 |
+
"name": move_data['name'],
|
74 |
+
"type": move_data['type']['name'],
|
75 |
+
"power": move_data['power'],
|
76 |
+
"accuracy": move_data['accuracy'],
|
77 |
+
"category": move_data['damage_class']['name'],
|
78 |
+
"effect": effect
|
79 |
+
}
|
80 |
+
|
81 |
+
def get_pokemon_info(pokemon_name: str, level=50, version_group='sword-shield') -> str:
|
82 |
+
base_url = "https://pokeapi.co/api/v2/"
|
83 |
+
try:
|
84 |
+
res_pokemon = requests.get(base_url + f"pokemon/{pokemon_name.lower()}")
|
85 |
+
res_pokemon.raise_for_status()
|
86 |
+
data = res_pokemon.json()
|
87 |
+
|
88 |
+
res_species = requests.get(base_url + f"pokemon-species/{pokemon_name.lower()}")
|
89 |
+
res_species.raise_for_status()
|
90 |
+
species = res_species.json()
|
91 |
+
|
92 |
+
evo_url = species['evolution_chain']['url']
|
93 |
+
res_evo = requests.get(evo_url)
|
94 |
+
res_evo.raise_for_status()
|
95 |
+
evolution_chain = res_evo.json()
|
96 |
+
|
97 |
+
name = data['name'].capitalize()
|
98 |
+
pokemon_id = data['id']
|
99 |
+
types = ", ".join([t['type']['name'].capitalize() for t in data['types']])
|
100 |
+
height = data['height'] / 10
|
101 |
+
weight = data['weight'] / 10
|
102 |
+
base_stats = {s['stat']['name']: s['base_stat'] for s in data['stats']}
|
103 |
+
stats_lv = {k: calculate_stat(v, level, stat_name=k) for k, v in base_stats.items()}
|
104 |
+
|
105 |
+
flavor_text = next(
|
106 |
+
(entry['flavor_text'].replace("\n", " ").replace("\f", " ")
|
107 |
+
for entry in species['flavor_text_entries']
|
108 |
+
if entry['language']['name'] == 'en'),
|
109 |
+
"No description available."
|
110 |
+
)
|
111 |
+
|
112 |
+
def get_evolutions(chain):
|
113 |
+
evols = [chain['species']['name'].capitalize()]
|
114 |
+
if chain['evolves_to']:
|
115 |
+
for evo in chain['evolves_to']:
|
116 |
+
evols.extend(get_evolutions(evo))
|
117 |
+
return evols
|
118 |
+
|
119 |
+
def get_moves(data, level_max, version_group):
|
120 |
+
moves = []
|
121 |
+
for m in data['moves']:
|
122 |
+
for v in m['version_group_details']:
|
123 |
+
if (
|
124 |
+
v['version_group']['name'] == version_group and
|
125 |
+
v['move_learn_method']['name'] == 'level-up' and
|
126 |
+
v['level_learned_at'] <= level_max
|
127 |
+
):
|
128 |
+
move_details = get_move_details(m['move']['url'])
|
129 |
+
move_details['level'] = v['level_learned_at']
|
130 |
+
moves.append(move_details)
|
131 |
+
moves.sort(key=lambda m: m['level'])
|
132 |
+
return moves
|
133 |
+
|
134 |
+
evolutions = get_evolutions(evolution_chain['chain'])
|
135 |
+
evolution_text = " → ".join(evolutions)
|
136 |
+
|
137 |
+
moves = get_moves(data, level, version_group)
|
138 |
+
|
139 |
+
# Markdown attack section
|
140 |
+
if moves:
|
141 |
+
moves_text = "\n".join([
|
142 |
+
f"### 🔹 Lv {m['level']} : **{m['name']}**\n"
|
143 |
+
f"- Type: {m['type'].capitalize()} \n"
|
144 |
+
f"- Category: {m['category'].capitalize()} \n"
|
145 |
+
f"- Power: {m['power'] or '—'} \n"
|
146 |
+
f"- Accuracy: {m['accuracy'] or '—'} \n"
|
147 |
+
f"- Effect: {m['effect']}"
|
148 |
+
for m in moves
|
149 |
+
])
|
150 |
+
else:
|
151 |
+
moves_text = "No available moves at this level."
|
152 |
+
|
153 |
+
card_image_url = get_card_image_url(pokemon_name)
|
154 |
+
card_image_md = f"" if card_image_url else "_Carte non trouvée dans la base._"
|
155 |
+
|
156 |
+
markdown = f"""
|
157 |
+
# 📘 Pokémon Sheet: **{name}** (#{pokemon_id})
|
158 |
+
|
159 |
+
---
|
160 |
+
|
161 |
+
{card_image_md}
|
162 |
+
|
163 |
+
---
|
164 |
+
|
165 |
+
**Type(s)**: {types}
|
166 |
+
**Height**: {height} m
|
167 |
+
**Weight**: {weight} kg
|
168 |
+
|
169 |
+
---
|
170 |
+
|
171 |
+
## 🔢 Base Stats
|
172 |
+
|
173 |
+
| Stat | Value |
|
174 |
+
|----------------|--------|
|
175 |
+
| HP | {base_stats['hp']} |
|
176 |
+
| Attack | {base_stats['attack']} |
|
177 |
+
| Defense | {base_stats['defense']} |
|
178 |
+
| Sp. Atk | {base_stats['special-attack']} |
|
179 |
+
| Sp. Def | {base_stats['special-defense']} |
|
180 |
+
| Speed | {base_stats['speed']} |
|
181 |
+
|
182 |
+
---
|
183 |
+
|
184 |
+
## 🎯 Stats at Level {level}
|
185 |
+
|
186 |
+
| Stat | Value |
|
187 |
+
|----------------|--------|
|
188 |
+
| HP | {stats_lv['hp']} |
|
189 |
+
| Attack | {stats_lv['attack']} |
|
190 |
+
| Defense | {stats_lv['defense']} |
|
191 |
+
| Sp. Atk | {stats_lv['special-attack']} |
|
192 |
+
| Sp. Def | {stats_lv['special-defense']} |
|
193 |
+
| Speed | {stats_lv['speed']} |
|
194 |
+
|
195 |
+
---
|
196 |
+
|
197 |
+
## 🔁 Evolution Chain
|
198 |
+
|
199 |
+
{evolution_text}
|
200 |
+
|
201 |
+
---
|
202 |
+
|
203 |
+
## 📜 Moves up to Level {level} (version: {version_group.replace('-', ' ').title()})
|
204 |
+
|
205 |
+
{moves_text}
|
206 |
+
|
207 |
+
---
|
208 |
+
|
209 |
+
## 📖 Description
|
210 |
+
|
211 |
+
> {flavor_text}
|
212 |
+
"""
|
213 |
+
return markdown.strip()
|
214 |
+
|
215 |
+
except requests.exceptions.HTTPError:
|
216 |
+
return "❌ Pokémon not found. Check the name."
|
217 |
+
except Exception as e:
|
218 |
+
return f"⚠️ Error: {str(e)}"
|
219 |
+
|
220 |
+
|
221 |
+
# Example usage
|
222 |
+
#print(get_pokemon_info("scyther", level=50))
|
223 |
+
|
224 |
+
|
225 |
+
def get_card_image_url(pokemon_name: str) -> str:
|
226 |
+
"""
|
227 |
+
Recherche dans ChromaDB une carte dont le nom correspond au Pokémon donné.
|
228 |
+
Retourne l'URL de l'image ou None.
|
229 |
+
"""
|
230 |
+
results = collection.get(where={"name": pokemon_name.capitalize()})
|
231 |
+
if results and results['metadatas']:
|
232 |
+
return results['metadatas'][0].get('image_url')
|
233 |
+
return None
|
requirements.txt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
gradio[mcp]
|
2 |
+
easyocr
|
3 |
+
chromadb
|