|
34 | 34 | "from fastcore.utils import patch\n", |
35 | 35 | "\n", |
36 | 36 | "from ragas_annotator.project.core import Project\n", |
37 | | - "from ragas_annotator.model.notion_model import NotionModel\n", |
| 37 | + "from ragas_annotator.model.pydantic_model import ExtendedPydanticBaseModel as BaseModel\n", |
| 38 | + "from ragas_annotator.utils import async_to_sync, create_nano_id\n", |
| 39 | + "from ragas_annotator.dataset import Dataset, BaseModelType\n", |
38 | 40 | "from ragas_annotator.experiment import Experiment\n", |
39 | | - "from ragas_annotator.dataset import Dataset" |
| 41 | + "import ragas_annotator.typing as rt" |
40 | 42 | ] |
41 | 43 | }, |
42 | 44 | { |
|
48 | 50 | "# | export\n", |
49 | 51 | "@patch\n", |
50 | 52 | "def create_experiment(\n", |
51 | | - " self: Project, name: str, model: t.Type[NotionModel]\n", |
| 53 | + " self: Project, name: str, model: t.Type[BaseModel]\n", |
52 | 54 | ") -> Experiment:\n", |
53 | | - " \"\"\"Create a new experiment view.\n", |
| 55 | + " \"\"\"Create a new experiment.\n", |
54 | 56 | "\n", |
55 | 57 | " Args:\n", |
56 | 58 | " name: Name of the experiment\n", |
57 | 59 | " model: Model class defining the experiment structure\n", |
58 | 60 | "\n", |
59 | 61 | " Returns:\n", |
60 | | - " ExperimentView: View for managing experiment results\n", |
| 62 | + " Experiment: An experiment object for managing results\n", |
61 | 63 | " \"\"\"\n", |
62 | | - " if self.experiments_page_id == \"\":\n", |
63 | | - " raise ValueError(\"Experiments page ID is not set\")\n", |
64 | | - "\n", |
65 | | - " # Collect all properties from model fields\n", |
66 | | - " properties = {}\n", |
67 | | - " for field_name, field in model._fields.items():\n", |
68 | | - " properties.update(field._to_notion_property())\n", |
69 | | - "\n", |
70 | | - " # Create the database\n", |
71 | | - " database_id = self._notion_backend.create_new_database(\n", |
72 | | - " parent_page_id=self.experiments_page_id, title=name, properties=properties\n", |
| 64 | + " # Create the experiment\n", |
| 65 | + " sync_version = async_to_sync(self._ragas_api_client.create_experiment)\n", |
| 66 | + " experiment_info = sync_version(\n", |
| 67 | + " project_id=self.project_id,\n", |
| 68 | + " name=name,\n", |
73 | 69 | " )\n", |
74 | 70 | "\n", |
| 71 | + " # Create the columns for the experiment\n", |
| 72 | + " column_types = rt.ModelConverter.model_to_columns(model)\n", |
| 73 | + " sync_version = async_to_sync(create_experiment_columns)\n", |
| 74 | + " sync_version(\n", |
| 75 | + " project_id=self.project_id,\n", |
| 76 | + " experiment_id=experiment_info[\"id\"],\n", |
| 77 | + " columns=column_types,\n", |
| 78 | + " create_experiment_column_func=self._ragas_api_client.create_experiment_column,\n", |
| 79 | + " )\n", |
| 80 | + " \n", |
| 81 | + " # Return a new Experiment instance\n", |
75 | 82 | " return Experiment(\n", |
76 | 83 | " name=name,\n", |
77 | 84 | " model=model,\n", |
78 | | - " database_id=database_id,\n", |
79 | | - " notion_backend=self._notion_backend,\n", |
80 | | - " )" |
| 85 | + " project_id=self.project_id,\n", |
| 86 | + " experiment_id=experiment_info[\"id\"],\n", |
| 87 | + " ragas_api_client=self._ragas_api_client,\n", |
| 88 | + " )\n", |
| 89 | + "\n", |
| 90 | + "# Add this helper function similar to create_dataset_columns in core.ipynb\n", |
| 91 | + "async def create_experiment_columns(project_id, experiment_id, columns, create_experiment_column_func):\n", |
| 92 | + " tasks = []\n", |
| 93 | + " for column in columns:\n", |
| 94 | + " tasks.append(create_experiment_column_func(\n", |
| 95 | + " project_id=project_id,\n", |
| 96 | + " experiment_id=experiment_id,\n", |
| 97 | + " id=create_nano_id(),\n", |
| 98 | + " name=column[\"name\"],\n", |
| 99 | + " type=column[\"type\"],\n", |
| 100 | + " settings={\n", |
| 101 | + " \"max_length\": 255,\n", |
| 102 | + " \"is_required\": True,\n", |
| 103 | + " },\n", |
| 104 | + " ))\n", |
| 105 | + " return await asyncio.gather(*tasks)" |
| 106 | + ] |
| 107 | + }, |
| 108 | + { |
| 109 | + "cell_type": "code", |
| 110 | + "execution_count": null, |
| 111 | + "metadata": {}, |
| 112 | + "outputs": [ |
| 113 | + { |
| 114 | + "data": { |
| 115 | + "text/plain": [ |
| 116 | + "Project(name='SuperMe')" |
| 117 | + ] |
| 118 | + }, |
| 119 | + "execution_count": null, |
| 120 | + "metadata": {}, |
| 121 | + "output_type": "execute_result" |
| 122 | + } |
| 123 | + ], |
| 124 | + "source": [ |
| 125 | + "import os\n", |
| 126 | + "\n", |
| 127 | + "RAGAS_APP_TOKEN = \"apt.47bd-c55e4a45b27c-02f8-8446-1441f09b-651a8\"\n", |
| 128 | + "RAGAS_API_BASE_URL = \"https://api.dev.app.ragas.io\"\n", |
| 129 | + "\n", |
| 130 | + "os.environ[\"RAGAS_APP_TOKEN\"] = RAGAS_APP_TOKEN\n", |
| 131 | + "os.environ[\"RAGAS_API_BASE_URL\"] = RAGAS_API_BASE_URL\n", |
| 132 | + "\n", |
| 133 | + "PROJECT_ID = \"a6ccabe0-7b8d-4866-98af-f167a36b94ff\"\n", |
| 134 | + "p = Project(project_id=PROJECT_ID)\n", |
| 135 | + "p" |
| 136 | + ] |
| 137 | + }, |
| 138 | + { |
| 139 | + "cell_type": "code", |
| 140 | + "execution_count": null, |
| 141 | + "metadata": {}, |
| 142 | + "outputs": [], |
| 143 | + "source": [ |
| 144 | + "class TestModel(BaseModel):\n", |
| 145 | + " name: str\n", |
| 146 | + " description: str\n", |
| 147 | + " price: float\n" |
| 148 | + ] |
| 149 | + }, |
| 150 | + { |
| 151 | + "cell_type": "code", |
| 152 | + "execution_count": null, |
| 153 | + "metadata": {}, |
| 154 | + "outputs": [ |
| 155 | + { |
| 156 | + "data": { |
| 157 | + "text/plain": [ |
| 158 | + "Experiment(name=just name, desc, price 2, model=TestModel)" |
| 159 | + ] |
| 160 | + }, |
| 161 | + "execution_count": null, |
| 162 | + "metadata": {}, |
| 163 | + "output_type": "execute_result" |
| 164 | + } |
| 165 | + ], |
| 166 | + "source": [ |
| 167 | + "experiment_id = \"5d7752ab-17bf-46bc-a302-afe04ce1a763\"\n", |
| 168 | + "exp = p.create_experiment(name=\"just name, desc, price 2\", model=TestModel)\n", |
| 169 | + "#exp = p.create_dataset(name=\"just name and desc 2\", model=TestModel)\n", |
| 170 | + "\n", |
| 171 | + "exp" |
81 | 172 | ] |
82 | 173 | }, |
83 | 174 | { |
|
88 | 179 | "source": [ |
89 | 180 | "# | export\n", |
90 | 181 | "@patch\n", |
91 | | - "def get_experiment(self: Project, name: str, model: t.Type[NotionModel]) -> Experiment:\n", |
92 | | - " \"\"\"Get an existing experiment by name.\"\"\"\n", |
93 | | - " if self.experiments_page_id == \"\":\n", |
94 | | - " raise ValueError(\"Experiments page ID is not set\")\n", |
95 | | - "\n", |
96 | | - " # Search for database with given name\n", |
97 | | - " database_id = self._notion_backend.get_database_id(\n", |
98 | | - " parent_page_id=self.experiments_page_id, name=name, return_multiple=False\n", |
| 182 | + "def get_experiment(self: Project, experiment_id: str, model: t.Type[BaseModel]) -> Experiment:\n", |
| 183 | + " \"\"\"Get an existing experiment by ID.\"\"\"\n", |
| 184 | + " # Get experiment info\n", |
| 185 | + " sync_version = async_to_sync(self._ragas_api_client.get_experiment)\n", |
| 186 | + " experiment_info = sync_version(\n", |
| 187 | + " project_id=self.project_id,\n", |
| 188 | + " experiment_id=experiment_id\n", |
99 | 189 | " )\n", |
100 | 190 | "\n", |
101 | 191 | " return Experiment(\n", |
102 | | - " name=name,\n", |
| 192 | + " name=experiment_info[\"name\"],\n", |
103 | 193 | " model=model,\n", |
104 | | - " database_id=database_id,\n", |
105 | | - " notion_backend=self._notion_backend,\n", |
| 194 | + " project_id=self.project_id,\n", |
| 195 | + " experiment_id=experiment_id,\n", |
| 196 | + " ragas_api_client=self._ragas_api_client,\n", |
106 | 197 | " )" |
107 | 198 | ] |
108 | 199 | }, |
| 200 | + { |
| 201 | + "cell_type": "code", |
| 202 | + "execution_count": null, |
| 203 | + "metadata": {}, |
| 204 | + "outputs": [ |
| 205 | + { |
| 206 | + "data": { |
| 207 | + "text/plain": [ |
| 208 | + "'22bbb40c-1fc0-4a09-b26a-ccc93c8bd595'" |
| 209 | + ] |
| 210 | + }, |
| 211 | + "execution_count": null, |
| 212 | + "metadata": {}, |
| 213 | + "output_type": "execute_result" |
| 214 | + } |
| 215 | + ], |
| 216 | + "source": [ |
| 217 | + "exp.dataset_id" |
| 218 | + ] |
| 219 | + }, |
| 220 | + { |
| 221 | + "cell_type": "code", |
| 222 | + "execution_count": null, |
| 223 | + "metadata": {}, |
| 224 | + "outputs": [ |
| 225 | + { |
| 226 | + "data": { |
| 227 | + "text/plain": [ |
| 228 | + "Project(name='SuperMe')" |
| 229 | + ] |
| 230 | + }, |
| 231 | + "execution_count": null, |
| 232 | + "metadata": {}, |
| 233 | + "output_type": "execute_result" |
| 234 | + } |
| 235 | + ], |
| 236 | + "source": [ |
| 237 | + "p" |
| 238 | + ] |
| 239 | + }, |
| 240 | + { |
| 241 | + "cell_type": "code", |
| 242 | + "execution_count": null, |
| 243 | + "metadata": {}, |
| 244 | + "outputs": [ |
| 245 | + { |
| 246 | + "data": { |
| 247 | + "text/plain": [ |
| 248 | + "Experiment(name=just name, desc, price 2, model=TestModel)" |
| 249 | + ] |
| 250 | + }, |
| 251 | + "execution_count": null, |
| 252 | + "metadata": {}, |
| 253 | + "output_type": "execute_result" |
| 254 | + } |
| 255 | + ], |
| 256 | + "source": [ |
| 257 | + "p.get_experiment(exp.dataset_id, TestModel)" |
| 258 | + ] |
| 259 | + }, |
109 | 260 | { |
110 | 261 | "cell_type": "code", |
111 | 262 | "execution_count": null, |
|
160 | 311 | "# | export\n", |
161 | 312 | "@patch\n", |
162 | 313 | "def experiment(\n", |
163 | | - " self: Project, experiment_model: t.Type[NotionModel], name_prefix: str = \"\"\n", |
| 314 | + " self: Project, experiment_model, name_prefix: str = \"\"\n", |
164 | 315 | "):\n", |
165 | 316 | " \"\"\"Decorator for creating experiment functions without Langfuse integration.\n", |
166 | 317 | "\n", |
|
183 | 334 | " # if name is not provided, generate a memorable name\n", |
184 | 335 | " if name is None:\n", |
185 | 336 | " name = memorable_names.generate_unique_name()\n", |
| 337 | + " if name_prefix:\n", |
| 338 | + " name = f\"{name_prefix}-{name}\"\n", |
186 | 339 | "\n", |
187 | 340 | " # Create tasks for all items\n", |
188 | 341 | " tasks = []\n", |
|
219 | 372 | "# | export\n", |
220 | 373 | "@patch\n", |
221 | 374 | "def langfuse_experiment(\n", |
222 | | - " self: Project, experiment_model: t.Type[NotionModel], name_prefix: str = \"\"\n", |
| 375 | + " self: Project, experiment_model, name_prefix: str = \"\"\n", |
223 | 376 | "):\n", |
224 | 377 | " \"\"\"Decorator for creating experiment functions with Langfuse integration.\n", |
225 | 378 | "\n", |
|
0 commit comments