{"id":48288107,"url":"https://github.com/recombee/keboola-writer","last_synced_at":"2026-04-04T23:00:09.388Z","repository":{"id":303632010,"uuid":"1015449427","full_name":"recombee/keboola-writer","owner":"recombee","description":"Sync catalog and interactions from Keboola into Recombee for personalized recommendations and search.","archived":false,"fork":false,"pushed_at":"2025-07-08T16:36:54.000Z","size":19,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-08T16:49:02.980Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/recombee.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-07T14:14:43.000Z","updated_at":"2025-07-08T16:31:12.000Z","dependencies_parsed_at":"2025-07-08T16:49:14.355Z","dependency_job_id":"bd35aeb1-fdee-43ab-94de-9170806f354f","html_url":"https://github.com/recombee/keboola-writer","commit_stats":null,"previous_names":["recombee/keboola-writer"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/recombee/keboola-writer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/recombee%2Fkeboola-writer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/recombee%2Fkeboola-writer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/recombee%2Fkeboola-writer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/recombee%2Fkeboola-writer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/recombee","download_url":"https://codeload.github.com/recombee/keboola-writer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/recombee%2Fkeboola-writer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31418285,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T20:09:54.854Z","status":"ssl_error","status_checked_at":"2026-04-04T20:09:44.350Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-04T23:00:08.445Z","updated_at":"2026-04-04T23:00:09.294Z","avatar_url":"https://github.com/recombee.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Recombee Writer for Keboola\r\n\r\nA Keboola Writer component that uploads items, users, and interactions to [Recombee](https://www.recombee.com/).\r\n\r\n---\r\n\r\n## ✨ Features\r\n\r\n- Uploads [**Items Catalog**](https://docs.recombee.com/api.html#set-item-values) and [**Users Catalog**](https://docs.recombee.com/api.html#set-user-values)\r\n- Supports all standard **Recombee interactions**:\r\n  - [`AddDetailView`](https://docs.recombee.com/api.html#add-detail-view)\r\n  - [`AddPurchase`](https://docs.recombee.com/api.html#add-purchase)\r\n  - [`AddRating`](https://docs.recombee.com/api.html#add-rating)\r\n  - [`AddBookmark`](https://docs.recombee.com/api.html#add-bookmark)\r\n  - [`AddCartAddition`](https://docs.recombee.com/api.html#add-cart-addition)\r\n  - [`SetViewPortion`](https://docs.recombee.com/api.html#set-view-portion)\r\n- Supports **optional fields** (e.g., `timestamp`, `recomm_id`, `additional_data`)\r\n- Gracefully handles bad data (e.g. `NaN`, invalid types) and logs summarizations\r\n- Retries on **timeouts** and **server-side errors**\r\n\r\n\r\n---\r\n\r\n## 🔧 Configuration Parameters\r\n\r\nSet via Keboola UI or `config.json`:\r\n\r\n```json\r\n{\r\n  \"parameters\": {\r\n    \"database_id\": \"your-recombee-db-id\",\r\n    \"#private_token\": \"your-recombee-private-token\",\r\n    \"region\": \"eu-west\"\r\n  }\r\n}\r\n```\r\n\r\n\r\n---\r\n\r\n## 🧱 Input Structure\r\n\r\nPlace CSV files in the standard Keboola input directory:  \r\n`/data/in/tables/`\r\n\r\nSupported filenames:\r\n\r\n| Filename             | Request Type                                                                 |\r\n|----------------------|------------------------------------------------------------------------------|\r\n| `items.csv`          | [Set Item Values](https://docs.recombee.com/api.html#set-item-values)       |\r\n| `users.csv`          | [Set User Values](https://docs.recombee.com/api.html#set-user-values)       |\r\n| `detail_views.csv`   | [Add Detail View](https://docs.recombee.com/api.html#add-detail-view)       |\r\n| `purchases.csv`      | [Add Purchase](https://docs.recombee.com/api.html#add-purchase)             |\r\n| `ratings.csv`        | [Add Rating](https://docs.recombee.com/api.html#add-rating)                 |\r\n| `bookmarks.csv`      | [Add Bookmark](https://docs.recombee.com/api.html#add-bookmark)             |\r\n| `cart_additions.csv` | [Add Cart Addition](https://docs.recombee.com/api.html#add-cart-addition)   |\r\n| `view_portions.csv`  | [Set View Portion](https://docs.recombee.com/api.html#set-view-portion)     |\r\n\r\n\r\n---\r\n\r\n## 📤 Example Input: `detail_views.csv`\r\n\r\n```csv\r\nuser_id,item_id,timestamp,recomm_id,additional_data\r\nuser-1,item-10,2025-07-06T21:12:43Z,644c005f-aa99-4bce-aa55-a0c610e80df0,\"{\"\"source\"\": \"\"newsletter\"\"}\"\r\nuser-2,item-09,2025-07-06T21:09:13Z,,\"{\"\"source\"\": \"\"newsletter\"\"}\"\r\nuser-3,item-05,2025-07-06T21:14:45Z,2d2eb48f-cd65-421a-943b-0e015055fd8e,\"{\"\"source\"\": \"\"homepage\"\"}\"\r\n```\r\n\r\n## 📤 Example Input: `items.csv`\r\n\r\nProperties (columns) shall be created in the [Recombee Admin UI](https://admin.recombee.com/).\r\n\r\n```csv\r\nitem_id,title,price,available,date_added,tags\r\nitem-01,Wireless Mouse,25.99,true,2025-07-20T10:11:49.039302,\"[\"\"electronics\"\", \"\"accessory\"\", \"\"mouse\"\"]\"\r\nitem-42,Mechanical Keyboard,75.49,false,2025-08-04T10:11:49.039318,\"[\"\"electronics\"\", \"\"keyboard\"\"]\"\r\nitem-77,USB-C Hub,34.9,true,2025-08-19T10:11:49.039321,\"[\"\"electronics\"\", \"\"usb\"\", \"\"hub\"\"]\"\r\n```\r\n\r\n---\r\n\r\n## 🐳 Local Development\r\n\r\n### Build the Docker image:\r\n```bash\r\ndocker build -t recombee-writer .\r\n```\r\n\r\n### Run locally with test data:\r\n```bash\r\ndocker run --rm -v $(pwd)/data:/data recombee-writer\r\n```\r\n\r\n---\r\n\r\n## 📋 Error Handling\r\n\r\n- Retries on:\r\n  - `ResponseException` (5xx status codes)\r\n  - `ApiTimeoutException`\r\n- Aggregates and logs:\r\n  - Success/failure counts\r\n  - Example errors (up to 5)\r\n  - Error code frequency\r\n\r\n---\r\n\r\n## 🛠 Tech Stack\r\n\r\n- Python 3.11\r\n- [Recombee Python API Client](https://github.com/recombee/python-api-client)\r\n- Dockerized for Keboola compatibility\r\n\r\n---\r\n\r\n## 📄 License\r\n\r\nThe Recombee Writer for Keboola is provided under the [MIT License](https://opensource.org/licenses/MIT).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frecombee%2Fkeboola-writer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frecombee%2Fkeboola-writer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frecombee%2Fkeboola-writer/lists"}