From 1295d519972f48ef933196dd57fdb7cef8bd0c18 Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Tue, 25 Nov 2025 12:16:13 +0100 Subject: [PATCH 01/35] add feature flag --- packages/compass-preferences-model/src/feature-flags.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/compass-preferences-model/src/feature-flags.ts b/packages/compass-preferences-model/src/feature-flags.ts index b2517c6aa51..d3d1ebfcb92 100644 --- a/packages/compass-preferences-model/src/feature-flags.ts +++ b/packages/compass-preferences-model/src/feature-flags.ts @@ -224,6 +224,14 @@ export const FEATURE_FLAG_DEFINITIONS = [ 'Enable automatic relationship inference during data model generation', }, }, + { + name: 'enableChatbotEndpointForGenAI', + stage: 'development', + atlasCloudFeatureFlagName: null, + description: { + short: 'Enable Chatbot API for Generative AI', + }, + }, ] as const satisfies ReadonlyArray; type FeatureFlagDefinitions = typeof FEATURE_FLAG_DEFINITIONS; From 7a44de4464413bed1fb958473e9c7042e2fb4aef Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Tue, 25 Nov 2025 12:16:22 +0100 Subject: [PATCH 02/35] migrate prompts to compass --- .../src/utils/gen-api-prompt.ts | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 packages/compass-generative-ai/src/utils/gen-api-prompt.ts diff --git a/packages/compass-generative-ai/src/utils/gen-api-prompt.ts b/packages/compass-generative-ai/src/utils/gen-api-prompt.ts new file mode 100644 index 00000000000..92b0995b509 --- /dev/null +++ b/packages/compass-generative-ai/src/utils/gen-api-prompt.ts @@ -0,0 +1,130 @@ +const MAX_TOTAL_PROMPT_LENGTH = 512000; +const MIN_SAMPLE_DOCUMENTS = 1; + +function getCurrentTimeString() { + const dateTime = new Date(); + const options: Intl.DateTimeFormatOptions = { + weekday: 'short', + year: 'numeric', + month: 'short', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + timeZoneName: 'short', + hour12: false, + }; + // Tue, Nov 25, 2025, 12:06:20 GMT+1 + return dateTime.toLocaleString('en-US', options); +} + +function buildInstructionsForFindQuery() { + return [ + 'Reduce prose to the minimum, your output will be parsed by a machine. ' + + 'You generate MongoDB find query arguments. Provide filter, project, sort, skip, ' + + 'limit and aggregation in shell syntax, wrap each argument with XML delimiters as follows:', + '{}', + '{}', + '{}', + '0', + '0', + '[]', + 'Additional instructions:', + '- Only use the aggregation field when the request cannot be represented with the other fields.', + '- Do not use the aggregation field if a find query fulfills the objective.', + '- If specifying latitude and longitude coordinates, list the longitude first, and then latitude.', + `- The current date is ${getCurrentTimeString()}`, + ].join('\n'); +} + +function buildInstructionsForAggregateQuery() { + return [ + 'Reduce prose to the minimum, your output will be parsed by a machine. ' + + 'You generate MongoDB aggregation pipelines. Provide only the aggregation ' + + 'pipeline contents in an array in shell syntax, wrapped with XML delimiters as follows:', + '[]', + 'Additional instructions:', + '- If specifying latitude and longitude coordinates, list the longitude first, and then latitude.', + '- Only pass the contents of the aggregation, no surrounding syntax.', + `- The current date is ${getCurrentTimeString()}`, + ].join('\n'); +} + +type QueryType = 'find' | 'aggregate'; + +export type UserPromptForQueryOptions = { + type: QueryType; + userPrompt: string; + databaseName?: string; + collectionName?: string; + schema?: unknown; + sampleDocuments?: unknown[]; +}; + +export function buildInstructionsForQuery({ type }: { type: QueryType }) { + return type === 'find' + ? buildInstructionsForFindQuery() + : buildInstructionsForAggregateQuery(); +} + +export function buildUserPromptForQuery({ + type, + userPrompt, + databaseName, + collectionName, + schema, + sampleDocuments, +}: UserPromptForQueryOptions): string { + const messages = []; + + const queryPrompt = [ + type === 'find' ? 'Write a query' : 'Generate an aggregation', + 'that does the following:', + `"${userPrompt}"`, + ].join(' '); + + if (databaseName) { + messages.push(`Database name: "${databaseName}"`); + } + if (collectionName) { + messages.push(`Collection name: "${collectionName}"`); + } + if (schema) { + messages.push( + 'Schema from a sample of documents from the collection: ```' + + JSON.stringify(schema) + + '```' + ); + } + if (sampleDocuments) { + // When attaching the sample documents, we want to ensure that we do not + // exceed the token limit. So we try following: + // 1. If attaching all the sample documents exceeds then limit, we attach only 1 document. + // 2. If attaching 1 document still exceeds the limit, we do not attach any sample documents. + const sampleDocumentsStr = JSON.stringify(sampleDocuments); + const singleDocumentStr = JSON.stringify( + sampleDocuments.slice(0, MIN_SAMPLE_DOCUMENTS) + ); + if ( + sampleDocumentsStr.length + + messages.join('\n').length + + queryPrompt.length <= + MAX_TOTAL_PROMPT_LENGTH + ) { + messages.push( + 'Sample documents from the collection: ```' + sampleDocumentsStr + '```' + ); + } else if ( + singleDocumentStr.length + + messages.join('\n').length + + queryPrompt.length <= + MAX_TOTAL_PROMPT_LENGTH + ) { + messages.push( + 'Sample document from the collection: ```' + singleDocumentStr + '```' + ); + } + } + messages.push(queryPrompt); + return messages.join('\n'); +} From d52468238fe08a6dce87bfa23584e57023f0990e Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Tue, 25 Nov 2025 13:41:11 +0100 Subject: [PATCH 03/35] co-pilot feedback --- .../src/utils/gen-api-prompt.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/compass-generative-ai/src/utils/gen-api-prompt.ts b/packages/compass-generative-ai/src/utils/gen-api-prompt.ts index 92b0995b509..a67f0e22b6c 100644 --- a/packages/compass-generative-ai/src/utils/gen-api-prompt.ts +++ b/packages/compass-generative-ai/src/utils/gen-api-prompt.ts @@ -1,3 +1,7 @@ +// When including sample documents, we want to ensure that we do not +// attach large documents and exceed the limit. OpenAI roughly estimates +// 4 characters = 1 token and we should not exceed context window limits. +// This roughly translates to 128k tokens. const MAX_TOTAL_PROMPT_LENGTH = 512000; const MIN_SAMPLE_DOCUMENTS = 1; @@ -14,7 +18,7 @@ function getCurrentTimeString() { timeZoneName: 'short', hour12: false, }; - // Tue, Nov 25, 2025, 12:06:20 GMT+1 + // e.g. Tue, Nov 25, 2025, 12:00:00 GMT+1 return dateTime.toLocaleString('en-US', options); } @@ -105,19 +109,17 @@ export function buildUserPromptForQuery({ const singleDocumentStr = JSON.stringify( sampleDocuments.slice(0, MIN_SAMPLE_DOCUMENTS) ); + const promptLengthWithoutSampleDocs = + messages.join('\n').length + queryPrompt.length; if ( - sampleDocumentsStr.length + - messages.join('\n').length + - queryPrompt.length <= + sampleDocumentsStr.length + promptLengthWithoutSampleDocs <= MAX_TOTAL_PROMPT_LENGTH ) { messages.push( 'Sample documents from the collection: ```' + sampleDocumentsStr + '```' ); } else if ( - singleDocumentStr.length + - messages.join('\n').length + - queryPrompt.length <= + singleDocumentStr.length + promptLengthWithoutSampleDocs <= MAX_TOTAL_PROMPT_LENGTH ) { messages.push( From c96161be71aff540bb886be766bb0ba1aaf12263 Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Mon, 1 Dec 2025 10:13:31 +0300 Subject: [PATCH 04/35] clean up --- .../{gen-api-prompt.ts => gen-ai-prompt.ts} | 68 ++++++++++++++++--- 1 file changed, 57 insertions(+), 11 deletions(-) rename packages/compass-generative-ai/src/utils/{gen-api-prompt.ts => gen-ai-prompt.ts} (79%) diff --git a/packages/compass-generative-ai/src/utils/gen-api-prompt.ts b/packages/compass-generative-ai/src/utils/gen-ai-prompt.ts similarity index 79% rename from packages/compass-generative-ai/src/utils/gen-api-prompt.ts rename to packages/compass-generative-ai/src/utils/gen-ai-prompt.ts index a67f0e22b6c..caa8d7f6639 100644 --- a/packages/compass-generative-ai/src/utils/gen-api-prompt.ts +++ b/packages/compass-generative-ai/src/utils/gen-ai-prompt.ts @@ -54,10 +54,7 @@ function buildInstructionsForAggregateQuery() { ].join('\n'); } -type QueryType = 'find' | 'aggregate'; - export type UserPromptForQueryOptions = { - type: QueryType; userPrompt: string; databaseName?: string; collectionName?: string; @@ -65,20 +62,14 @@ export type UserPromptForQueryOptions = { sampleDocuments?: unknown[]; }; -export function buildInstructionsForQuery({ type }: { type: QueryType }) { - return type === 'find' - ? buildInstructionsForFindQuery() - : buildInstructionsForAggregateQuery(); -} - -export function buildUserPromptForQuery({ +function buildUserPromptForQuery({ type, userPrompt, databaseName, collectionName, schema, sampleDocuments, -}: UserPromptForQueryOptions): string { +}: UserPromptForQueryOptions & { type: 'find' | 'aggregate' }): string { const messages = []; const queryPrompt = [ @@ -130,3 +121,58 @@ export function buildUserPromptForQuery({ messages.push(queryPrompt); return messages.join('\n'); } + +export type AiQueryPrompt = { + prompt: string; + metadata: { + instructions: string; + }; +}; + +export function buildFindQueryPrompt({ + userPrompt, + databaseName, + collectionName, + schema, + sampleDocuments, +}: UserPromptForQueryOptions): AiQueryPrompt { + const prompt = buildUserPromptForQuery({ + type: 'find', + userPrompt, + databaseName, + collectionName, + schema, + sampleDocuments, + }); + const instructions = buildInstructionsForFindQuery(); + return { + prompt, + metadata: { + instructions, + }, + }; +} + +export function buildAggregateQueryPrompt({ + userPrompt, + databaseName, + collectionName, + schema, + sampleDocuments, +}: UserPromptForQueryOptions): AiQueryPrompt { + const prompt = buildUserPromptForQuery({ + type: 'aggregate', + userPrompt, + databaseName, + collectionName, + schema, + sampleDocuments, + }); + const instructions = buildInstructionsForAggregateQuery(); + return { + prompt, + metadata: { + instructions, + }, + }; +} From f4d05a773a9a265bd74707dc58b9f7fe3e3bf1b9 Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Mon, 1 Dec 2025 17:27:39 +0300 Subject: [PATCH 05/35] use edu api for gen ai --- package-lock.json | 140 ++++++++++++++ packages/compass-generative-ai/package.json | 4 +- .../src/atlas-ai-errors.ts | 13 +- .../src/atlas-ai-service.ts | 172 ++++++++++++++++-- .../src/utils/ai-chat-transport.ts | 81 +++++++++ .../src/utils/gen-ai-prompt.ts | 38 ++-- packages/compass-web/src/entrypoint.tsx | 8 +- .../compass/src/app/components/entrypoint.tsx | 1 + 8 files changed, 412 insertions(+), 45 deletions(-) create mode 100644 packages/compass-generative-ai/src/utils/ai-chat-transport.ts diff --git a/package-lock.json b/package-lock.json index c60ba80e5c7..3f105fcfda1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16785,6 +16785,15 @@ } } }, + "node_modules/@vercel/oidc": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.0.5.tgz", + "integrity": "sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 20" + } + }, "node_modules/@vue/compiler-core": { "version": "3.5.6", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.6.tgz", @@ -25641,6 +25650,15 @@ "node": ">=0.4.x" } }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", @@ -49683,6 +49701,7 @@ "version": "0.68.0", "license": "SSPL", "dependencies": { + "@ai-sdk/openai": "^2.0.4", "@mongodb-js/atlas-service": "^0.73.0", "@mongodb-js/compass-app-registry": "^9.4.29", "@mongodb-js/compass-components": "^1.59.2", @@ -49691,6 +49710,7 @@ "@mongodb-js/compass-telemetry": "^1.19.5", "@mongodb-js/compass-utils": "^0.9.23", "@mongodb-js/connection-info": "^0.24.0", + "ai": "^5.0.26", "bson": "^6.10.4", "compass-preferences-model": "^2.66.3", "mongodb": "^6.19.0", @@ -49723,6 +49743,74 @@ "xvfb-maybe": "^0.2.1" } }, + "packages/compass-generative-ai/node_modules/@ai-sdk/gateway": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.17.tgz", + "integrity": "sha512-oVAG6q72KsjKlrYdLhWjRO7rcqAR8CjokAbYuyVZoCO4Uh2PH/VzZoxZav71w2ipwlXhHCNaInGYWNs889MMDA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18", + "@vercel/oidc": "3.0.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "packages/compass-generative-ai/node_modules/@ai-sdk/openai": { + "version": "2.0.75", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-2.0.75.tgz", + "integrity": "sha512-ThDHg1+Jes7S0AOXa01EyLBSzZiZwzB5do9vAlufNkoiRHGTH1BmoShrCyci/TUsg4ky1HwbK4hPK+Z0isiE6g==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "packages/compass-generative-ai/node_modules/@ai-sdk/provider-utils": { + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.18.tgz", + "integrity": "sha512-ypv1xXMsgGcNKUP+hglKqtdDuMg68nWHucPPAhIENrbFAI+xCHiqPVN8Zllxyv1TNZwGWUghPxJXU+Mqps0YRQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.6" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "packages/compass-generative-ai/node_modules/ai": { + "version": "5.0.104", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.104.tgz", + "integrity": "sha512-MZOkL9++nY5PfkpWKBR3Rv+Oygxpb9S16ctv8h91GvrSif7UnNEdPMVZe3bUyMd2djxf0AtBk/csBixP0WwWZQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/gateway": "2.0.17", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18", + "@opentelemetry/api": "1.9.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, "packages/compass-generative-ai/node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -62394,6 +62482,7 @@ "@mongodb-js/compass-generative-ai": { "version": "file:packages/compass-generative-ai", "requires": { + "@ai-sdk/openai": "^2.0.4", "@mongodb-js/atlas-service": "^0.73.0", "@mongodb-js/compass-app-registry": "^9.4.29", "@mongodb-js/compass-components": "^1.59.2", @@ -62412,6 +62501,7 @@ "@types/mocha": "^9.0.0", "@types/react": "^17.0.5", "@types/sinon-chai": "^3.2.5", + "ai": "^5.0.26", "bson": "^6.10.4", "chai": "^4.3.6", "compass-preferences-model": "^2.66.3", @@ -62432,6 +62522,46 @@ "zod": "^3.25.76" }, "dependencies": { + "@ai-sdk/gateway": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.17.tgz", + "integrity": "sha512-oVAG6q72KsjKlrYdLhWjRO7rcqAR8CjokAbYuyVZoCO4Uh2PH/VzZoxZav71w2ipwlXhHCNaInGYWNs889MMDA==", + "requires": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18", + "@vercel/oidc": "3.0.5" + } + }, + "@ai-sdk/openai": { + "version": "2.0.75", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-2.0.75.tgz", + "integrity": "sha512-ThDHg1+Jes7S0AOXa01EyLBSzZiZwzB5do9vAlufNkoiRHGTH1BmoShrCyci/TUsg4ky1HwbK4hPK+Z0isiE6g==", + "requires": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18" + } + }, + "@ai-sdk/provider-utils": { + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.18.tgz", + "integrity": "sha512-ypv1xXMsgGcNKUP+hglKqtdDuMg68nWHucPPAhIENrbFAI+xCHiqPVN8Zllxyv1TNZwGWUghPxJXU+Mqps0YRQ==", + "requires": { + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.6" + } + }, + "ai": { + "version": "5.0.104", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.104.tgz", + "integrity": "sha512-MZOkL9++nY5PfkpWKBR3Rv+Oygxpb9S16ctv8h91GvrSif7UnNEdPMVZe3bUyMd2djxf0AtBk/csBixP0WwWZQ==", + "requires": { + "@ai-sdk/gateway": "2.0.17", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18", + "@opentelemetry/api": "1.9.0" + } + }, "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -70995,6 +71125,11 @@ "dev": true, "requires": {} }, + "@vercel/oidc": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.0.5.tgz", + "integrity": "sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==" + }, "@vue/compiler-core": { "version": "3.5.6", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.6.tgz", @@ -78150,6 +78285,11 @@ "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==" }, + "eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==" + }, "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", diff --git a/packages/compass-generative-ai/package.json b/packages/compass-generative-ai/package.json index 5b9b01abb92..5450a68ea6e 100644 --- a/packages/compass-generative-ai/package.json +++ b/packages/compass-generative-ai/package.json @@ -68,7 +68,9 @@ "react-redux": "^8.1.3", "redux": "^4.2.1", "redux-thunk": "^2.4.2", - "zod": "^3.25.76" + "zod": "^3.25.76", + "@ai-sdk/openai": "^2.0.4", + "ai": "^5.0.26" }, "devDependencies": { "@mongodb-js/eslint-config-compass": "^1.4.12", diff --git a/packages/compass-generative-ai/src/atlas-ai-errors.ts b/packages/compass-generative-ai/src/atlas-ai-errors.ts index 992377cf18b..e8160b88324 100644 --- a/packages/compass-generative-ai/src/atlas-ai-errors.ts +++ b/packages/compass-generative-ai/src/atlas-ai-errors.ts @@ -18,4 +18,15 @@ class AtlasAiServiceApiResponseParseError extends Error { } } -export { AtlasAiServiceInvalidInputError, AtlasAiServiceApiResponseParseError }; +class AtlasAiServiceGenAiResponseError extends Error { + constructor(message: string) { + super(message); + this.name = 'AtlasAiServiceGenAiResponseError'; + } +} + +export { + AtlasAiServiceInvalidInputError, + AtlasAiServiceApiResponseParseError, + AtlasAiServiceGenAiResponseError, +}; diff --git a/packages/compass-generative-ai/src/atlas-ai-service.ts b/packages/compass-generative-ai/src/atlas-ai-service.ts index 04f75a90161..a6ceb53a68e 100644 --- a/packages/compass-generative-ai/src/atlas-ai-service.ts +++ b/packages/compass-generative-ai/src/atlas-ai-service.ts @@ -15,7 +15,17 @@ import { optIntoGenAIWithModalPrompt } from './store/atlas-optin-reducer'; import { AtlasAiServiceInvalidInputError, AtlasAiServiceApiResponseParseError, + AtlasAiServiceGenAiResponseError, } from './atlas-ai-errors'; +import { createOpenAI } from '@ai-sdk/openai'; +import { + AiChatTransport, + type SendMessagesPayload, +} from './utils/ai-chat-transport'; +import { + buildAggregateQueryPrompt, + buildFindQueryPrompt, +} from './utils/gen-ai-prompt'; type GenerativeAiInput = { userInput: string; @@ -40,14 +50,6 @@ type AIAggregation = { }; }; -type AIFeatureEnablement = { - features: { - [featureName: string]: { - enabled: boolean; - }; - }; -}; - type AIQuery = { content: { query: Record< @@ -100,6 +102,40 @@ function hasExtraneousKeys(obj: any, expectedKeys: string[]) { return Object.keys(obj).some((key) => !expectedKeys.includes(key)); } +/** + * For generating queries with the AI chatbot, currently we don't + * have a chat interface and only need to send a single message. + * This function builds the message so it can be sent to the AI model. + */ +function buildChatMessageForAiModel( + { signal, ...restOfInput }: Omit, + { type }: { type: 'find' | 'aggregate' } +): SendMessagesPayload { + const { prompt, metadata } = + type === 'aggregate' + ? buildAggregateQueryPrompt(restOfInput) + : buildFindQueryPrompt(restOfInput); + return { + trigger: 'submit-message', + chatId: crypto.randomUUID(), + messageId: undefined, + messages: [ + { + id: crypto.randomUUID(), + role: 'user', + parts: [ + { + type: 'text', + text: prompt, + }, + ], + metadata, + }, + ], + abortSignal: signal, + }; +} + export function validateAIQueryResponse( response: any ): asserts response is AIQuery { @@ -271,6 +307,8 @@ export class AtlasAiService { private preferences: PreferencesAccess; private logger: Logger; + private chatTransport: AiChatTransport; + constructor({ apiURLPreset, atlasService, @@ -286,8 +324,16 @@ export class AtlasAiService { this.atlasService = atlasService; this.preferences = preferences; this.logger = logger; - this.initPromise = this.setupAIAccess(); + + const model = createOpenAI({ + apiKey: '', + baseURL: this.atlasService.assistantApiEndpoint(), + fetch: this.atlasService.authenticatedFetch.bind(this.atlasService), + // TODO(COMPASS-10125): Switch the model to `mongodb-slim-latest` when + // enabling this feature (to use edu-chatbot for GenAI). + }).responses('mongodb-chat-latest'); + this.chatTransport = new AiChatTransport({ model }); } /** @@ -423,6 +469,13 @@ export class AtlasAiService { input: GenerativeAiInput, connectionInfo: ConnectionInfo ) { + if (this.preferences.getPreferences().enableChatbotEndpointForGenAI) { + return this.generateQueryUsingChatbot( + input, + validateAIAggregationResponse, + { type: 'aggregate' } + ); + } return this.getQueryOrAggregationFromUserInput( { connectionInfo, @@ -437,6 +490,11 @@ export class AtlasAiService { input: GenerativeAiInput, connectionInfo: ConnectionInfo ) { + if (this.preferences.getPreferences().enableChatbotEndpointForGenAI) { + return this.generateQueryUsingChatbot(input, validateAIQueryResponse, { + type: 'find', + }); + } return this.getQueryOrAggregationFromUserInput( { urlId: 'query', @@ -527,12 +585,96 @@ export class AtlasAiService { }); } - private validateAIFeatureEnablementResponse( - response: any - ): asserts response is AIFeatureEnablement { - const { features } = response; - if (typeof features !== 'object') { - throw new Error('Unexpected response: expected features to be an object'); + private parseXmlResponseAndMapToMmsJsonResponse(responseStr: string): any { + const expectedTags = [ + 'filter', + 'project', + 'sort', + 'skip', + 'limit', + 'aggregation', + ]; + + // Currently the prompt forces LLM to return xml-styled data + const result: any = {}; + for (const tag of expectedTags) { + const regex = new RegExp(`<${tag}>([\\s\\S]*?)<\\/${tag}>`, 'i'); + const match = responseStr.match(regex); + if (match && match[1]) { + const value = match[1].trim(); + try { + // Here the value is valid js string, but not valid json, so we use eval to parse it. + const tagValue = eval(`(${value})`); + if ( + !tagValue || + (typeof tagValue === 'object' && Object.keys(tagValue).length === 0) + ) { + result[tag] = null; + } else { + result[tag] = JSON.stringify(tagValue); + } + } catch (e) { + this.logger.log.warn( + this.logger.mongoLogId(1_001_000_309), + 'AtlasAiService', + `Failed to parse value for tag <${tag}>: ${value}`, + { error: e } + ); + result[tag] = null; + } + } } + + // Keep the response same as we have from mms api + return { + content: { + aggregation: { + pipeline: result.aggregation, + }, + query: { + filter: result.filter, + project: result.project, + sort: result.sort, + skip: result.skip, + limit: result.limit, + }, + }, + }; + } + + private async generateQueryUsingChatbot( + // TODO(COMPASS-10083): When storing data, we want have requestId as well. + input: Omit, + validateFn: (res: any) => asserts res is T, + options: { type: 'find' | 'aggregate' } + ): Promise { + this.throwIfAINotEnabled(); + const response = await this.chatTransport.sendMessages( + buildChatMessageForAiModel(input, options) + ); + + const chunks: string[] = []; + let done = false; + const reader = response.getReader(); + while (!done) { + const { done: _done, value } = await reader.read(); + if (_done) { + done = true; + break; + } + if (value.type === 'text-delta') { + chunks.push(value.delta); + } + if (value.type === 'error') { + throw new AtlasAiServiceGenAiResponseError(value.errorText); + } + } + + const responseText = chunks.join(''); + const parsedResponse = + this.parseXmlResponseAndMapToMmsJsonResponse(responseText); + validateFn(parsedResponse); + + return parsedResponse; } } diff --git a/packages/compass-generative-ai/src/utils/ai-chat-transport.ts b/packages/compass-generative-ai/src/utils/ai-chat-transport.ts new file mode 100644 index 00000000000..bc51640b627 --- /dev/null +++ b/packages/compass-generative-ai/src/utils/ai-chat-transport.ts @@ -0,0 +1,81 @@ +import { + type ChatTransport, + type LanguageModel, + type UIMessageChunk, + type UIMessage, + convertToModelMessages, + streamText, +} from 'ai'; + +type ChatMessageMetadata = { + confirmation?: boolean; + instructions?: string; + sendWithoutHistory?: boolean; +}; +type ChatMessage = UIMessage; + +export type SendMessagesPayload = Parameters< + ChatTransport['sendMessages'] +>[0]; + +/** Returns true if the message should be excluded from being sent to the API. */ +export function shouldExcludeMessage({ metadata }: ChatMessage) { + if (metadata?.confirmation) { + return true; + } + return false; +} + +export class AiChatTransport implements ChatTransport { + private model: LanguageModel; + + constructor({ model }: { model: LanguageModel }) { + this.model = model; + } + + static emptyStream = new ReadableStream({ + start(controller) { + controller.close(); + }, + }); + + sendMessages({ messages, abortSignal }: SendMessagesPayload) { + // If the most recent message is a message that is meant to be excluded + // then we do not need to send this request to the assistant API as it's likely + // redundant otherwise. + if (shouldExcludeMessage(messages[messages.length - 1])) { + return Promise.resolve(AiChatTransport.emptyStream); + } + + const filteredMessages = messages.filter( + (message) => !shouldExcludeMessage(message) + ); + + // If no messages remain after filtering, return an empty stream + if (filteredMessages.length === 0) { + return Promise.resolve(AiChatTransport.emptyStream); + } + + const lastMessage = filteredMessages[filteredMessages.length - 1]; + const result = streamText({ + model: this.model, + messages: lastMessage.metadata?.sendWithoutHistory + ? convertToModelMessages([lastMessage]) + : convertToModelMessages(filteredMessages), + abortSignal: abortSignal, + providerOptions: { + openai: { + store: false, + instructions: lastMessage.metadata?.instructions ?? '', + }, + }, + }); + + return Promise.resolve(result.toUIMessageStream({ sendSources: true })); + } + + reconnectToStream(): Promise | null> { + // For this implementation, we don't support reconnecting to streams + return Promise.resolve(null); + } +} diff --git a/packages/compass-generative-ai/src/utils/gen-ai-prompt.ts b/packages/compass-generative-ai/src/utils/gen-ai-prompt.ts index caa8d7f6639..eb8d61459c1 100644 --- a/packages/compass-generative-ai/src/utils/gen-ai-prompt.ts +++ b/packages/compass-generative-ai/src/utils/gen-ai-prompt.ts @@ -55,7 +55,7 @@ function buildInstructionsForAggregateQuery() { } export type UserPromptForQueryOptions = { - userPrompt: string; + userInput: string; databaseName?: string; collectionName?: string; schema?: unknown; @@ -64,7 +64,7 @@ export type UserPromptForQueryOptions = { function buildUserPromptForQuery({ type, - userPrompt, + userInput, databaseName, collectionName, schema, @@ -75,7 +75,7 @@ function buildUserPromptForQuery({ const queryPrompt = [ type === 'find' ? 'Write a query' : 'Generate an aggregation', 'that does the following:', - `"${userPrompt}"`, + `"${userInput}"`, ].join(' '); if (databaseName) { @@ -129,20 +129,12 @@ export type AiQueryPrompt = { }; }; -export function buildFindQueryPrompt({ - userPrompt, - databaseName, - collectionName, - schema, - sampleDocuments, -}: UserPromptForQueryOptions): AiQueryPrompt { +export function buildFindQueryPrompt( + options: UserPromptForQueryOptions +): AiQueryPrompt { const prompt = buildUserPromptForQuery({ type: 'find', - userPrompt, - databaseName, - collectionName, - schema, - sampleDocuments, + ...options, }); const instructions = buildInstructionsForFindQuery(); return { @@ -153,20 +145,12 @@ export function buildFindQueryPrompt({ }; } -export function buildAggregateQueryPrompt({ - userPrompt, - databaseName, - collectionName, - schema, - sampleDocuments, -}: UserPromptForQueryOptions): AiQueryPrompt { +export function buildAggregateQueryPrompt( + options: UserPromptForQueryOptions +): AiQueryPrompt { const prompt = buildUserPromptForQuery({ type: 'aggregate', - userPrompt, - databaseName, - collectionName, - schema, - sampleDocuments, + ...options, }); const instructions = buildInstructionsForAggregateQuery(); return { diff --git a/packages/compass-web/src/entrypoint.tsx b/packages/compass-web/src/entrypoint.tsx index 830c297ed22..a6efbce17d0 100644 --- a/packages/compass-web/src/entrypoint.tsx +++ b/packages/compass-web/src/entrypoint.tsx @@ -105,7 +105,13 @@ const WithAtlasProviders: React.FC<{ children: React.ReactNode }> = ({ return ( - + {children} diff --git a/packages/compass/src/app/components/entrypoint.tsx b/packages/compass/src/app/components/entrypoint.tsx index ec6911bdd65..2cbf3e97d99 100644 --- a/packages/compass/src/app/components/entrypoint.tsx +++ b/packages/compass/src/app/components/entrypoint.tsx @@ -61,6 +61,7 @@ export const WithAtlasProviders: React.FC = ({ children }) => { options={{ defaultHeaders: { 'User-Agent': `${getAppName()}/${getAppVersion()}`, + 'X-Request-Origin': 'mongodb-compass', }, }} > From 17635315c80460b5bcaef72934000f5bb7eef63f Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Mon, 1 Dec 2025 18:15:18 +0300 Subject: [PATCH 06/35] clean up a bit --- .../src/atlas-ai-service.spec.ts | 1 + .../src/atlas-ai-service.ts | 65 ++--------------- .../src/utils/xml-to-mms-response.spec.ts | 69 +++++++++++++++++++ .../src/utils/xml-to-mms-response.ts | 58 ++++++++++++++++ 4 files changed, 133 insertions(+), 60 deletions(-) create mode 100644 packages/compass-generative-ai/src/utils/xml-to-mms-response.spec.ts create mode 100644 packages/compass-generative-ai/src/utils/xml-to-mms-response.ts diff --git a/packages/compass-generative-ai/src/atlas-ai-service.spec.ts b/packages/compass-generative-ai/src/atlas-ai-service.spec.ts index 1767fef6dd5..a9dc4016f0f 100644 --- a/packages/compass-generative-ai/src/atlas-ai-service.spec.ts +++ b/packages/compass-generative-ai/src/atlas-ai-service.spec.ts @@ -51,6 +51,7 @@ class MockAtlasService { getCurrentUser = () => Promise.resolve(ATLAS_USER); cloudEndpoint = (url: string) => `${['/cloud', url].join('/')}`; adminApiEndpoint = (url: string) => `${[BASE_URL, url].join('/')}`; + assistantApiEndpoint = (url: string) => `${[BASE_URL, url].join('/')}`; authenticatedFetch = (url: string, init: RequestInit) => { return fetch(url, init); }; diff --git a/packages/compass-generative-ai/src/atlas-ai-service.ts b/packages/compass-generative-ai/src/atlas-ai-service.ts index a6ceb53a68e..f8b40576252 100644 --- a/packages/compass-generative-ai/src/atlas-ai-service.ts +++ b/packages/compass-generative-ai/src/atlas-ai-service.ts @@ -26,6 +26,7 @@ import { buildAggregateQueryPrompt, buildFindQueryPrompt, } from './utils/gen-ai-prompt'; +import { parseXmlToMmsJsonResponse } from './utils/xml-to-mms-response'; type GenerativeAiInput = { userInput: string; @@ -585,63 +586,6 @@ export class AtlasAiService { }); } - private parseXmlResponseAndMapToMmsJsonResponse(responseStr: string): any { - const expectedTags = [ - 'filter', - 'project', - 'sort', - 'skip', - 'limit', - 'aggregation', - ]; - - // Currently the prompt forces LLM to return xml-styled data - const result: any = {}; - for (const tag of expectedTags) { - const regex = new RegExp(`<${tag}>([\\s\\S]*?)<\\/${tag}>`, 'i'); - const match = responseStr.match(regex); - if (match && match[1]) { - const value = match[1].trim(); - try { - // Here the value is valid js string, but not valid json, so we use eval to parse it. - const tagValue = eval(`(${value})`); - if ( - !tagValue || - (typeof tagValue === 'object' && Object.keys(tagValue).length === 0) - ) { - result[tag] = null; - } else { - result[tag] = JSON.stringify(tagValue); - } - } catch (e) { - this.logger.log.warn( - this.logger.mongoLogId(1_001_000_309), - 'AtlasAiService', - `Failed to parse value for tag <${tag}>: ${value}`, - { error: e } - ); - result[tag] = null; - } - } - } - - // Keep the response same as we have from mms api - return { - content: { - aggregation: { - pipeline: result.aggregation, - }, - query: { - filter: result.filter, - project: result.project, - sort: result.sort, - skip: result.skip, - limit: result.limit, - }, - }, - }; - } - private async generateQueryUsingChatbot( // TODO(COMPASS-10083): When storing data, we want have requestId as well. input: Omit, @@ -670,9 +614,10 @@ export class AtlasAiService { } } - const responseText = chunks.join(''); - const parsedResponse = - this.parseXmlResponseAndMapToMmsJsonResponse(responseText); + const parsedResponse = parseXmlToMmsJsonResponse( + chunks.join(''), + this.logger + ); validateFn(parsedResponse); return parsedResponse; diff --git a/packages/compass-generative-ai/src/utils/xml-to-mms-response.spec.ts b/packages/compass-generative-ai/src/utils/xml-to-mms-response.spec.ts new file mode 100644 index 00000000000..ca02709890e --- /dev/null +++ b/packages/compass-generative-ai/src/utils/xml-to-mms-response.spec.ts @@ -0,0 +1,69 @@ +import { expect } from 'chai'; +import { parseXmlToMmsJsonResponse } from './xml-to-mms-response'; +import type { Logger } from '@mongodb-js/compass-logging'; + +const loggerMock = { + log: { + warn: () => { + /* noop */ + }, + }, + mongoLogId: (id: number) => id, +} as unknown as Logger; +describe('parseXmlToMmsJsonResponse', function () { + it('should parse valid XML string to MMS JSON response', function () { + const xmlString = ` + { age: { $gt: 25 } } + { name: 1, age: 1 } + { age: -1 } + 5 + 10 + [{ $match: { status: "A" } }] + `; + + const result = parseXmlToMmsJsonResponse(xmlString, loggerMock); + + expect(result).to.deep.equal({ + content: { + aggregation: { + pipeline: '[{"$match":{"status":"A"}}]', + }, + query: { + filter: '{"age":{"$gt":25}}', + project: '{"name":1,"age":1}', + sort: '{"age":-1}', + skip: '5', + limit: '10', + }, + }, + }); + }); + + context('it should return null values for invalid data', function () { + it('invalid json', function () { + const result = parseXmlToMmsJsonResponse( + `{ age: { $gt: 25 `, + loggerMock + ); + expect(result.content.query.filter).to.equal(null); + }); + it('empty object', function () { + const result = parseXmlToMmsJsonResponse( + `{}`, + loggerMock + ); + expect(result.content.query.filter).to.equal(null); + }); + it('empty array', function () { + const result = parseXmlToMmsJsonResponse( + `[]`, + loggerMock + ); + expect(result.content.aggregation.pipeline).to.equal(null); + }); + it('zero value', function () { + const result = parseXmlToMmsJsonResponse(`0`, loggerMock); + expect(result.content.query.limit).to.equal(null); + }); + }); +}); diff --git a/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts b/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts new file mode 100644 index 00000000000..e62c122d1f3 --- /dev/null +++ b/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts @@ -0,0 +1,58 @@ +import type { Logger } from '@mongodb-js/compass-logging'; + +export function parseXmlToMmsJsonResponse(xmlString: string, logger: Logger) { + const expectedTags = [ + 'filter', + 'project', + 'sort', + 'skip', + 'limit', + 'aggregation', + ]; + + // Currently the prompt forces LLM to return xml-styled data + const result: any = {}; + for (const tag of expectedTags) { + const regex = new RegExp(`<${tag}>([\\s\\S]*?)<\\/${tag}>`, 'i'); + const match = xmlString.match(regex); + if (match && match[1]) { + const value = match[1].trim(); + try { + // Here the value is valid js string, but not valid json, so we use eval to parse it. + const tagValue = eval(`(${value})`); + if ( + !tagValue || + (typeof tagValue === 'object' && Object.keys(tagValue).length === 0) + ) { + result[tag] = null; + } else { + result[tag] = JSON.stringify(tagValue); + } + } catch (e) { + logger.log.warn( + logger.mongoLogId(1_001_000_309), + 'AtlasAiService', + `Failed to parse value for tag <${tag}>: ${value}`, + { error: e } + ); + result[tag] = null; + } + } + } + + // Keep the response same as we have from mms api + return { + content: { + aggregation: { + pipeline: result.aggregation, + }, + query: { + filter: result.filter, + project: result.project, + sort: result.sort, + skip: result.skip, + limit: result.limit, + }, + }, + }; +} From d5e2c8454ba1048a39adfa450a59c64df9c10ad5 Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Wed, 3 Dec 2025 01:37:44 +0300 Subject: [PATCH 07/35] fix url for test and ensure aggregations have content --- .../compass-generative-ai/src/atlas-ai-service.ts | 14 ++++++++++++-- .../src/utils/xml-to-mms-response.ts | 4 +--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/compass-generative-ai/src/atlas-ai-service.ts b/packages/compass-generative-ai/src/atlas-ai-service.ts index f8b40576252..521563118e2 100644 --- a/packages/compass-generative-ai/src/atlas-ai-service.ts +++ b/packages/compass-generative-ai/src/atlas-ai-service.ts @@ -327,10 +327,20 @@ export class AtlasAiService { this.logger = logger; this.initPromise = this.setupAIAccess(); + const initialBaseUrl = 'http://PLACEHOLDER_BASE_URL_TO_BE_REPLACED.invalid'; const model = createOpenAI({ apiKey: '', - baseURL: this.atlasService.assistantApiEndpoint(), - fetch: this.atlasService.authenticatedFetch.bind(this.atlasService), + baseURL: initialBaseUrl, + fetch: (url, init) => { + // The `baseUrl` can be dynamically changed, but `createOpenAI` + // doesn't allow us to change it after initial call. Instead + // we're going to update it every time the fetch call happens + const uri = String(url).replace( + initialBaseUrl, + this.atlasService.assistantApiEndpoint() + ); + return this.atlasService.authenticatedFetch(uri, init); + }, // TODO(COMPASS-10125): Switch the model to `mongodb-slim-latest` when // enabling this feature (to use edu-chatbot for GenAI). }).responses('mongodb-chat-latest'); diff --git a/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts b/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts index e62c122d1f3..bd543aa1444 100644 --- a/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts +++ b/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts @@ -43,9 +43,7 @@ export function parseXmlToMmsJsonResponse(xmlString: string, logger: Logger) { // Keep the response same as we have from mms api return { content: { - aggregation: { - pipeline: result.aggregation, - }, + ...(result.aggregation ? { aggregation: result.aggregation } : {}), query: { filter: result.filter, project: result.project, From 07815800e112776264c939af1c3e18d44c78e4e6 Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Wed, 3 Dec 2025 10:47:36 +0300 Subject: [PATCH 08/35] tests --- .../helpers/assistant-service.ts | 2 +- .../tests/collection-ai-query.test.ts | 145 ++++++++++++++++++ 2 files changed, 146 insertions(+), 1 deletion(-) diff --git a/packages/compass-e2e-tests/helpers/assistant-service.ts b/packages/compass-e2e-tests/helpers/assistant-service.ts index c36a3d9ae3d..5abca2c7d5f 100644 --- a/packages/compass-e2e-tests/helpers/assistant-service.ts +++ b/packages/compass-e2e-tests/helpers/assistant-service.ts @@ -212,8 +212,8 @@ export async function startMockAssistantServer( }); if (response.status !== 200) { - res.writeHead(response.status); res.setHeader('Content-Type', 'application/json'); + res.writeHead(response.status); return res.end(JSON.stringify({ error: response.body })); } diff --git a/packages/compass-e2e-tests/tests/collection-ai-query.test.ts b/packages/compass-e2e-tests/tests/collection-ai-query.test.ts index 919aa54490b..e84159481f1 100644 --- a/packages/compass-e2e-tests/tests/collection-ai-query.test.ts +++ b/packages/compass-e2e-tests/tests/collection-ai-query.test.ts @@ -8,12 +8,14 @@ import { cleanup, screenshotIfFailed, DEFAULT_CONNECTION_NAME_1, + screenshotPathName, } from '../helpers/compass'; import type { Compass } from '../helpers/compass'; import * as Selectors from '../helpers/selectors'; import { createNumbersCollection } from '../helpers/insert-data'; import { startMockAtlasServiceServer } from '../helpers/mock-atlas-service'; import type { MockAtlasServerResponse } from '../helpers/mock-atlas-service'; +import { startMockAssistantServer } from '../helpers/assistant-service'; describe('Collection ai query (with mocked backend)', function () { let compass: Compass; @@ -171,3 +173,146 @@ describe('Collection ai query (with mocked backend)', function () { }); }); }); + +async function setup( + browser: CompassBrowser, + dbName: string, + collName: string +) { + await createNumbersCollection(); + await browser.setupDefaultConnections(); + await browser.connectToDefaults(); + await browser.navigateToCollectionTab( + DEFAULT_CONNECTION_NAME_1, + dbName, + collName, + 'Documents' + ); + + await browser.setFeature('enableChatbotEndpointForGenAI', true); + await browser.setFeature('enableGenAIFeatures', true); + await browser.setFeature('enableGenAISampleDocumentPassing', true); + await browser.setFeature('optInGenAIFeatures', true); +} + +describe.only('Collection ai query with chatbot (with mocked backend)', function () { + const dbName = 'test'; + const collName = 'numbers'; + let compass: Compass; + let browser: CompassBrowser; + + let mockAssistantServer: Awaited>; + + before(async function () { + mockAssistantServer = await startMockAssistantServer(); + compass = await init(this.test?.fullTitle()); + browser = compass.browser; + + await browser.setEnv( + 'COMPASS_ASSISTANT_BASE_URL_OVERRIDE', + mockAssistantServer.endpoint + ); + }); + + after(async function () { + await mockAssistantServer.stop(); + await cleanup(compass); + }); + + afterEach(async function () { + await screenshotIfFailed(compass, this.currentTest); + try { + mockAssistantServer.clearRequests(); + } catch (err) { + await browser.screenshot(screenshotPathName('afterEach-GenAi-Query')); + throw err; + } + }); + + describe('when the ai model response is valid', function () { + beforeEach(async function () { + await setup(browser, dbName, collName); + mockAssistantServer.setResponse({ + status: 200, + body: '{i: {$gt: 50}}', + }); + }); + + it('makes request to the server and updates the query bar with the response', async function () { + await new Promise((resolve) => setTimeout(resolve, 10000)); + // Click the ai entry button. + await browser.clickVisible(Selectors.GenAIEntryButton); + + // Enter the ai prompt. + await browser.clickVisible(Selectors.GenAITextInput); + + const testUserInput = 'find all documents where i is greater than 50'; + await browser.setValueVisible(Selectors.GenAITextInput, testUserInput); + + // Click generate. + await browser.clickVisible(Selectors.GenAIGenerateQueryButton); + + // Wait for the ipc events to succeed. + await browser.waitUntil(async function () { + // Make sure the query bar was updated. + const queryBarFilterContent = await browser.getCodemirrorEditorText( + Selectors.queryBarOptionInputFilter('Documents') + ); + return queryBarFilterContent === '{"i":{"$gt":50}}'; + }); + + // Check that the request was made with the correct parameters. + const requests = mockAssistantServer.getRequests(); + expect(requests.length).to.equal(1); + + const queryRequest = requests[0]; + // TODO(COMPASS-10125): Switch the model to `mongodb-slim-latest` when + // enabling this feature. + expect(queryRequest.content.model).to.equal('mongodb-chat-latest'); + expect(queryRequest.content.instructions).to.be.string; + expect(queryRequest.content.input).to.be.an('array').of.length(1); + + const message = queryRequest.content.input[0]; + expect(message.role).to.equal('user'); + expect(message.content).to.be.an('array').of.length(1); + expect(message.content[0]).to.have.property('type'); + expect(message.content[0]).to.have.property('text'); + + // Run it and check that the correct documents are shown. + await browser.runFind('Documents', true); + const modifiedResult = await browser.getFirstListDocument(); + expect(modifiedResult.i).to.be.equal('51'); + }); + }); + + describe.only('when the chatbot api request errors', function () { + beforeEach(async function () { + await setup(browser, dbName, collName); + mockAssistantServer.setResponse({ + status: 500, + body: '', + }); + }); + + it('the error is shown to the user', async function () { + // Click the ai entry button. + await browser.clickVisible(Selectors.GenAIEntryButton); + + // Enter the ai prompt. + await browser.clickVisible(Selectors.GenAITextInput); + + const testUserInput = 'find all documents where i is greater than 50'; + await browser.setValueVisible(Selectors.GenAITextInput, testUserInput); + + // Click generate. + await browser.clickVisible(Selectors.GenAIGenerateQueryButton); + + // Check that the error is shown. + const errorBanner = browser.$(Selectors.GenAIErrorMessageBanner); + await errorBanner.waitForDisplayed(); + expect(await errorBanner.getText()).to.equal( + 'Sorry, we were unable to generate the query, please try again. If the error persists, try changing your prompt.' + ); + }); + }); +}); From 058e950003387a49de5e9c7301d872590efe0176 Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Wed, 3 Dec 2025 13:57:07 +0300 Subject: [PATCH 09/35] fix error handling --- .../tests/collection-ai-query.test.ts | 3 +-- .../src/atlas-ai-errors.ts | 13 +----------- .../src/atlas-ai-service.ts | 4 ++-- .../src/chatbot-errors.ts | 20 +++++++++++++++++++ 4 files changed, 24 insertions(+), 16 deletions(-) create mode 100644 packages/compass-generative-ai/src/chatbot-errors.ts diff --git a/packages/compass-e2e-tests/tests/collection-ai-query.test.ts b/packages/compass-e2e-tests/tests/collection-ai-query.test.ts index e84159481f1..67de96ed58d 100644 --- a/packages/compass-e2e-tests/tests/collection-ai-query.test.ts +++ b/packages/compass-e2e-tests/tests/collection-ai-query.test.ts @@ -239,7 +239,6 @@ describe.only('Collection ai query with chatbot (with mocked backend)', function }); it('makes request to the server and updates the query bar with the response', async function () { - await new Promise((resolve) => setTimeout(resolve, 10000)); // Click the ai entry button. await browser.clickVisible(Selectors.GenAIEntryButton); @@ -285,7 +284,7 @@ describe.only('Collection ai query with chatbot (with mocked backend)', function }); }); - describe.only('when the chatbot api request errors', function () { + describe('when the chatbot api request errors', function () { beforeEach(async function () { await setup(browser, dbName, collName); mockAssistantServer.setResponse({ diff --git a/packages/compass-generative-ai/src/atlas-ai-errors.ts b/packages/compass-generative-ai/src/atlas-ai-errors.ts index e8160b88324..992377cf18b 100644 --- a/packages/compass-generative-ai/src/atlas-ai-errors.ts +++ b/packages/compass-generative-ai/src/atlas-ai-errors.ts @@ -18,15 +18,4 @@ class AtlasAiServiceApiResponseParseError extends Error { } } -class AtlasAiServiceGenAiResponseError extends Error { - constructor(message: string) { - super(message); - this.name = 'AtlasAiServiceGenAiResponseError'; - } -} - -export { - AtlasAiServiceInvalidInputError, - AtlasAiServiceApiResponseParseError, - AtlasAiServiceGenAiResponseError, -}; +export { AtlasAiServiceInvalidInputError, AtlasAiServiceApiResponseParseError }; diff --git a/packages/compass-generative-ai/src/atlas-ai-service.ts b/packages/compass-generative-ai/src/atlas-ai-service.ts index 521563118e2..54d5ffd7538 100644 --- a/packages/compass-generative-ai/src/atlas-ai-service.ts +++ b/packages/compass-generative-ai/src/atlas-ai-service.ts @@ -15,7 +15,6 @@ import { optIntoGenAIWithModalPrompt } from './store/atlas-optin-reducer'; import { AtlasAiServiceInvalidInputError, AtlasAiServiceApiResponseParseError, - AtlasAiServiceGenAiResponseError, } from './atlas-ai-errors'; import { createOpenAI } from '@ai-sdk/openai'; import { @@ -27,6 +26,7 @@ import { buildFindQueryPrompt, } from './utils/gen-ai-prompt'; import { parseXmlToMmsJsonResponse } from './utils/xml-to-mms-response'; +import { AiChatbotInvalidResponseError } from './chatbot-errors'; type GenerativeAiInput = { userInput: string; @@ -620,7 +620,7 @@ export class AtlasAiService { chunks.push(value.delta); } if (value.type === 'error') { - throw new AtlasAiServiceGenAiResponseError(value.errorText); + throw new AiChatbotInvalidResponseError(value.errorText); } } diff --git a/packages/compass-generative-ai/src/chatbot-errors.ts b/packages/compass-generative-ai/src/chatbot-errors.ts new file mode 100644 index 00000000000..2d778a46b8f --- /dev/null +++ b/packages/compass-generative-ai/src/chatbot-errors.ts @@ -0,0 +1,20 @@ +export class AiChatbotError extends Error { + statusCode: number; + errorCode: string; + detail: string; + + constructor(statusCode: number, detail: string, errorCode: string) { + super(`${errorCode}: ${detail}`); + this.name = 'ServerError'; + this.statusCode = statusCode; + this.errorCode = errorCode; + this.detail = detail; + } +} + +export class AiChatbotInvalidResponseError extends AiChatbotError { + constructor(message: string) { + super(500, message, 'INVALID_RESPONSE'); + this.name = 'AiChatbotInvalidResponseError'; + } +} From 7d54d4d0f19f5e128c03d57a7a54e18cff374dae Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Wed, 3 Dec 2025 14:48:19 +0300 Subject: [PATCH 10/35] clean up transport --- .../src/atlas-ai-service.ts | 92 ++++--------------- .../src/utils/ai-chat-transport.ts | 81 ---------------- .../src/utils/gen-ai-response.ts | 42 +++++++++ .../src/utils/xml-to-mms-response.spec.ts | 77 ++++++++++++++-- .../src/utils/xml-to-mms-response.ts | 32 +++++-- 5 files changed, 156 insertions(+), 168 deletions(-) delete mode 100644 packages/compass-generative-ai/src/utils/ai-chat-transport.ts create mode 100644 packages/compass-generative-ai/src/utils/gen-ai-response.ts diff --git a/packages/compass-generative-ai/src/atlas-ai-service.ts b/packages/compass-generative-ai/src/atlas-ai-service.ts index 54d5ffd7538..80ab92a6120 100644 --- a/packages/compass-generative-ai/src/atlas-ai-service.ts +++ b/packages/compass-generative-ai/src/atlas-ai-service.ts @@ -17,16 +17,14 @@ import { AtlasAiServiceApiResponseParseError, } from './atlas-ai-errors'; import { createOpenAI } from '@ai-sdk/openai'; -import { - AiChatTransport, - type SendMessagesPayload, -} from './utils/ai-chat-transport'; +import { type LanguageModel } from 'ai'; +import type { AiQueryPrompt } from './utils/gen-ai-prompt'; import { buildAggregateQueryPrompt, buildFindQueryPrompt, } from './utils/gen-ai-prompt'; import { parseXmlToMmsJsonResponse } from './utils/xml-to-mms-response'; -import { AiChatbotInvalidResponseError } from './chatbot-errors'; +import { getAiQueryResponse } from './utils/gen-ai-response'; type GenerativeAiInput = { userInput: string; @@ -103,40 +101,6 @@ function hasExtraneousKeys(obj: any, expectedKeys: string[]) { return Object.keys(obj).some((key) => !expectedKeys.includes(key)); } -/** - * For generating queries with the AI chatbot, currently we don't - * have a chat interface and only need to send a single message. - * This function builds the message so it can be sent to the AI model. - */ -function buildChatMessageForAiModel( - { signal, ...restOfInput }: Omit, - { type }: { type: 'find' | 'aggregate' } -): SendMessagesPayload { - const { prompt, metadata } = - type === 'aggregate' - ? buildAggregateQueryPrompt(restOfInput) - : buildFindQueryPrompt(restOfInput); - return { - trigger: 'submit-message', - chatId: crypto.randomUUID(), - messageId: undefined, - messages: [ - { - id: crypto.randomUUID(), - role: 'user', - parts: [ - { - type: 'text', - text: prompt, - }, - ], - metadata, - }, - ], - abortSignal: signal, - }; -} - export function validateAIQueryResponse( response: any ): asserts response is AIQuery { @@ -308,7 +272,7 @@ export class AtlasAiService { private preferences: PreferencesAccess; private logger: Logger; - private chatTransport: AiChatTransport; + private aiModel: LanguageModel; constructor({ apiURLPreset, @@ -328,7 +292,7 @@ export class AtlasAiService { this.initPromise = this.setupAIAccess(); const initialBaseUrl = 'http://PLACEHOLDER_BASE_URL_TO_BE_REPLACED.invalid'; - const model = createOpenAI({ + this.aiModel = createOpenAI({ apiKey: '', baseURL: initialBaseUrl, fetch: (url, init) => { @@ -344,7 +308,6 @@ export class AtlasAiService { // TODO(COMPASS-10125): Switch the model to `mongodb-slim-latest` when // enabling this feature (to use edu-chatbot for GenAI). }).responses('mongodb-chat-latest'); - this.chatTransport = new AiChatTransport({ model }); } /** @@ -481,10 +444,11 @@ export class AtlasAiService { connectionInfo: ConnectionInfo ) { if (this.preferences.getPreferences().enableChatbotEndpointForGenAI) { + const message = buildAggregateQueryPrompt(input); return this.generateQueryUsingChatbot( - input, + message, validateAIAggregationResponse, - { type: 'aggregate' } + { signal: input.signal } ); } return this.getQueryOrAggregationFromUserInput( @@ -502,8 +466,9 @@ export class AtlasAiService { connectionInfo: ConnectionInfo ) { if (this.preferences.getPreferences().enableChatbotEndpointForGenAI) { - return this.generateQueryUsingChatbot(input, validateAIQueryResponse, { - type: 'find', + const message = buildFindQueryPrompt(input); + return this.generateQueryUsingChatbot(message, validateAIQueryResponse, { + signal: input.signal, }); } return this.getQueryOrAggregationFromUserInput( @@ -597,39 +562,18 @@ export class AtlasAiService { } private async generateQueryUsingChatbot( - // TODO(COMPASS-10083): When storing data, we want have requestId as well. - input: Omit, + message: AiQueryPrompt, validateFn: (res: any) => asserts res is T, - options: { type: 'find' | 'aggregate' } + options: { signal: AbortSignal } ): Promise { this.throwIfAINotEnabled(); - const response = await this.chatTransport.sendMessages( - buildChatMessageForAiModel(input, options) - ); - - const chunks: string[] = []; - let done = false; - const reader = response.getReader(); - while (!done) { - const { done: _done, value } = await reader.read(); - if (_done) { - done = true; - break; - } - if (value.type === 'text-delta') { - chunks.push(value.delta); - } - if (value.type === 'error') { - throw new AiChatbotInvalidResponseError(value.errorText); - } - } - - const parsedResponse = parseXmlToMmsJsonResponse( - chunks.join(''), - this.logger + const response = await getAiQueryResponse( + this.aiModel, + message, + options.signal ); + const parsedResponse = parseXmlToMmsJsonResponse(response, this.logger); validateFn(parsedResponse); - return parsedResponse; } } diff --git a/packages/compass-generative-ai/src/utils/ai-chat-transport.ts b/packages/compass-generative-ai/src/utils/ai-chat-transport.ts deleted file mode 100644 index bc51640b627..00000000000 --- a/packages/compass-generative-ai/src/utils/ai-chat-transport.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { - type ChatTransport, - type LanguageModel, - type UIMessageChunk, - type UIMessage, - convertToModelMessages, - streamText, -} from 'ai'; - -type ChatMessageMetadata = { - confirmation?: boolean; - instructions?: string; - sendWithoutHistory?: boolean; -}; -type ChatMessage = UIMessage; - -export type SendMessagesPayload = Parameters< - ChatTransport['sendMessages'] ->[0]; - -/** Returns true if the message should be excluded from being sent to the API. */ -export function shouldExcludeMessage({ metadata }: ChatMessage) { - if (metadata?.confirmation) { - return true; - } - return false; -} - -export class AiChatTransport implements ChatTransport { - private model: LanguageModel; - - constructor({ model }: { model: LanguageModel }) { - this.model = model; - } - - static emptyStream = new ReadableStream({ - start(controller) { - controller.close(); - }, - }); - - sendMessages({ messages, abortSignal }: SendMessagesPayload) { - // If the most recent message is a message that is meant to be excluded - // then we do not need to send this request to the assistant API as it's likely - // redundant otherwise. - if (shouldExcludeMessage(messages[messages.length - 1])) { - return Promise.resolve(AiChatTransport.emptyStream); - } - - const filteredMessages = messages.filter( - (message) => !shouldExcludeMessage(message) - ); - - // If no messages remain after filtering, return an empty stream - if (filteredMessages.length === 0) { - return Promise.resolve(AiChatTransport.emptyStream); - } - - const lastMessage = filteredMessages[filteredMessages.length - 1]; - const result = streamText({ - model: this.model, - messages: lastMessage.metadata?.sendWithoutHistory - ? convertToModelMessages([lastMessage]) - : convertToModelMessages(filteredMessages), - abortSignal: abortSignal, - providerOptions: { - openai: { - store: false, - instructions: lastMessage.metadata?.instructions ?? '', - }, - }, - }); - - return Promise.resolve(result.toUIMessageStream({ sendSources: true })); - } - - reconnectToStream(): Promise | null> { - // For this implementation, we don't support reconnecting to streams - return Promise.resolve(null); - } -} diff --git a/packages/compass-generative-ai/src/utils/gen-ai-response.ts b/packages/compass-generative-ai/src/utils/gen-ai-response.ts new file mode 100644 index 00000000000..13ca53c786a --- /dev/null +++ b/packages/compass-generative-ai/src/utils/gen-ai-response.ts @@ -0,0 +1,42 @@ +import { AiChatbotInvalidResponseError } from '../chatbot-errors'; +import { type AiQueryPrompt } from './gen-ai-prompt'; +import type { LanguageModel } from 'ai'; +import { streamText } from 'ai'; +/** + * Function that takes an LanguageModel and a message of type + * AiQueryPrompt and returns a Promise that resolves to a string response + */ +export async function getAiQueryResponse( + model: LanguageModel, + message: AiQueryPrompt, + abortSignal: AbortSignal +): Promise { + const response = streamText({ + model, + messages: [{ role: 'user', content: message.prompt }], + providerOptions: { + openai: { + store: false, + instructions: message.metadata.instructions || '', + }, + }, + abortSignal, + }).toUIMessageStream(); + const chunks: string[] = []; + let done = false; + const reader = response.getReader(); + while (!done) { + const { done: _done, value } = await reader.read(); + if (_done) { + done = true; + break; + } + if (value.type === 'text-delta') { + chunks.push(value.delta); + } + if (value.type === 'error') { + throw new AiChatbotInvalidResponseError(value.errorText); + } + } + return chunks.join(''); +} diff --git a/packages/compass-generative-ai/src/utils/xml-to-mms-response.spec.ts b/packages/compass-generative-ai/src/utils/xml-to-mms-response.spec.ts index ca02709890e..c0b5571b208 100644 --- a/packages/compass-generative-ai/src/utils/xml-to-mms-response.spec.ts +++ b/packages/compass-generative-ai/src/utils/xml-to-mms-response.spec.ts @@ -11,13 +11,9 @@ const loggerMock = { mongoLogId: (id: number) => id, } as unknown as Logger; describe('parseXmlToMmsJsonResponse', function () { - it('should parse valid XML string to MMS JSON response', function () { + it('should prioritize aggregation over query fields', function () { const xmlString = ` { age: { $gt: 25 } } - { name: 1, age: 1 } - { age: -1 } - 5 - 10 [{ $match: { status: "A" } }] `; @@ -28,6 +24,75 @@ describe('parseXmlToMmsJsonResponse', function () { aggregation: { pipeline: '[{"$match":{"status":"A"}}]', }, + query: { + filter: null, + project: null, + sort: null, + skip: null, + limit: null, + }, + }, + }); + }); + + it('should return null for aggregation if not provided', function () { + const xmlString = ` + { age: { $gt: 25 } } + `; + + const result = parseXmlToMmsJsonResponse(xmlString, loggerMock); + expect(result).to.deep.equal({ + content: { + aggregation: null, + query: { + filter: '{"age":{"$gt":25}}', + project: null, + sort: null, + skip: null, + limit: null, + }, + }, + }); + }); + + it('should return null for query fields if not provided', function () { + const xmlString = ` + [{ $match: { status: "A" } }] + `; + + const result = parseXmlToMmsJsonResponse(xmlString, loggerMock); + + expect(result).to.deep.equal({ + content: { + aggregation: { + pipeline: '[{"$match":{"status":"A"}}]', + }, + query: { + filter: null, + project: null, + sort: null, + skip: null, + limit: null, + }, + }, + }); + }); + + it('should return all the query fields if provided', function () { + const xmlString = ` + { age: { $gt: 25 } } + { name: 1, age: 1 } + { age: -1 } + 5 + 10 + + `; + + const result = parseXmlToMmsJsonResponse(xmlString, loggerMock); + + expect(result).to.deep.equal({ + content: { + aggregation: null, query: { filter: '{"age":{"$gt":25}}', project: '{"name":1,"age":1}', @@ -59,7 +124,7 @@ describe('parseXmlToMmsJsonResponse', function () { `[]`, loggerMock ); - expect(result.content.aggregation.pipeline).to.equal(null); + expect(result.content.aggregation).to.equal(null); }); it('zero value', function () { const result = parseXmlToMmsJsonResponse(`0`, loggerMock); diff --git a/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts b/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts index bd543aa1444..8dc83e9142c 100644 --- a/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts +++ b/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts @@ -40,16 +40,34 @@ export function parseXmlToMmsJsonResponse(xmlString: string, logger: Logger) { } } - // Keep the response same as we have from mms api + // Keep the response same as we have from mms api. If llm generated + // an aggregation, we want to return that instead of a query + if (result.aggregation) { + return { + content: { + aggregation: { + pipeline: result.aggregation, + }, + query: { + filter: null, + project: null, + sort: null, + skip: null, + limit: null, + }, + }, + }; + } + return { content: { - ...(result.aggregation ? { aggregation: result.aggregation } : {}), + aggregation: null, query: { - filter: result.filter, - project: result.project, - sort: result.sort, - skip: result.skip, - limit: result.limit, + filter: result.filter ?? null, + project: result.project ?? null, + sort: result.sort ?? null, + skip: result.skip ?? null, + limit: result.limit ?? null, }, }, }; From 309335acd1605f8ea8f1116ec8e64de59771deed Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Wed, 3 Dec 2025 14:52:43 +0300 Subject: [PATCH 11/35] changes in field name --- .../src/utils/gen-ai-prompt.spec.ts | 6 +++--- .../src/utils/gen-ai-prompt.ts | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/compass-generative-ai/src/utils/gen-ai-prompt.spec.ts b/packages/compass-generative-ai/src/utils/gen-ai-prompt.spec.ts index 526861c71af..3ae68818975 100644 --- a/packages/compass-generative-ai/src/utils/gen-ai-prompt.spec.ts +++ b/packages/compass-generative-ai/src/utils/gen-ai-prompt.spec.ts @@ -8,7 +8,7 @@ import { toJSString } from 'mongodb-query-parser'; import { ObjectId } from 'bson'; const OPTIONS: UserPromptForQueryOptions = { - userPrompt: 'Find all users older than 30', + userInput: 'Find all users older than 30', databaseName: 'airbnb', collectionName: 'listings', schema: { @@ -50,7 +50,7 @@ describe('GenAI Prompts', function () { expect(prompt).to.be.a('string'); expect(prompt).to.include( - `Write a query that does the following: "${OPTIONS.userPrompt}"`, + `Write a query that does the following: "${OPTIONS.userInput}"`, 'includes user prompt' ); expect(prompt).to.include( @@ -93,7 +93,7 @@ describe('GenAI Prompts', function () { expect(prompt).to.be.a('string'); expect(prompt).to.include( - `Generate an aggregation that does the following: "${OPTIONS.userPrompt}"`, + `Generate an aggregation that does the following: "${OPTIONS.userInput}"`, 'includes user prompt' ); expect(prompt).to.include( diff --git a/packages/compass-generative-ai/src/utils/gen-ai-prompt.ts b/packages/compass-generative-ai/src/utils/gen-ai-prompt.ts index c235feaabf0..1d8e22d8d81 100644 --- a/packages/compass-generative-ai/src/utils/gen-ai-prompt.ts +++ b/packages/compass-generative-ai/src/utils/gen-ai-prompt.ts @@ -58,7 +58,7 @@ function buildInstructionsForAggregateQuery() { } export type UserPromptForQueryOptions = { - userPrompt: string; + userInput: string; databaseName?: string; collectionName?: string; schema?: unknown; @@ -76,7 +76,7 @@ function withCodeFence(code: string): string { function buildUserPromptForQuery({ type, - userPrompt, + userInput, databaseName, collectionName, schema, @@ -87,7 +87,7 @@ function buildUserPromptForQuery({ const queryPrompt = [ type === 'find' ? 'Write a query' : 'Generate an aggregation', 'that does the following:', - `"${userPrompt}"`, + `"${userInput}"`, ].join(' '); if (databaseName) { @@ -148,7 +148,7 @@ export type AiQueryPrompt = { }; export function buildFindQueryPrompt({ - userPrompt, + userInput, databaseName, collectionName, schema, @@ -156,7 +156,7 @@ export function buildFindQueryPrompt({ }: UserPromptForQueryOptions): AiQueryPrompt { const prompt = buildUserPromptForQuery({ type: 'find', - userPrompt, + userInput, databaseName, collectionName, schema, @@ -172,7 +172,7 @@ export function buildFindQueryPrompt({ } export function buildAggregateQueryPrompt({ - userPrompt, + userInput, databaseName, collectionName, schema, @@ -180,7 +180,7 @@ export function buildAggregateQueryPrompt({ }: UserPromptForQueryOptions): AiQueryPrompt { const prompt = buildUserPromptForQuery({ type: 'aggregate', - userPrompt, + userInput, databaseName, collectionName, schema, From feacddce085defcde5c85542e009fd974af6b23f Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Wed, 3 Dec 2025 15:31:21 +0300 Subject: [PATCH 12/35] use query parser --- .../src/utils/xml-to-mms-response.spec.ts | 12 ++++++------ .../src/utils/xml-to-mms-response.ts | 7 ++++--- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/compass-generative-ai/src/utils/xml-to-mms-response.spec.ts b/packages/compass-generative-ai/src/utils/xml-to-mms-response.spec.ts index c0b5571b208..d461c3ece44 100644 --- a/packages/compass-generative-ai/src/utils/xml-to-mms-response.spec.ts +++ b/packages/compass-generative-ai/src/utils/xml-to-mms-response.spec.ts @@ -22,7 +22,7 @@ describe('parseXmlToMmsJsonResponse', function () { expect(result).to.deep.equal({ content: { aggregation: { - pipeline: '[{"$match":{"status":"A"}}]', + pipeline: "[{$match:{status:'A'}}]", }, query: { filter: null, @@ -45,7 +45,7 @@ describe('parseXmlToMmsJsonResponse', function () { content: { aggregation: null, query: { - filter: '{"age":{"$gt":25}}', + filter: '{age:{$gt:25}}', project: null, sort: null, skip: null, @@ -65,7 +65,7 @@ describe('parseXmlToMmsJsonResponse', function () { expect(result).to.deep.equal({ content: { aggregation: { - pipeline: '[{"$match":{"status":"A"}}]', + pipeline: "[{$match:{status:'A'}}]", }, query: { filter: null, @@ -94,9 +94,9 @@ describe('parseXmlToMmsJsonResponse', function () { content: { aggregation: null, query: { - filter: '{"age":{"$gt":25}}', - project: '{"name":1,"age":1}', - sort: '{"age":-1}', + filter: '{age:{$gt:25}}', + project: '{name:1,age:1}', + sort: '{age:-1}', skip: '5', limit: '10', }, diff --git a/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts b/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts index 8dc83e9142c..48b9facbffd 100644 --- a/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts +++ b/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts @@ -1,4 +1,5 @@ import type { Logger } from '@mongodb-js/compass-logging'; +import parse, { toJSString } from 'mongodb-query-parser'; export function parseXmlToMmsJsonResponse(xmlString: string, logger: Logger) { const expectedTags = [ @@ -18,15 +19,15 @@ export function parseXmlToMmsJsonResponse(xmlString: string, logger: Logger) { if (match && match[1]) { const value = match[1].trim(); try { - // Here the value is valid js string, but not valid json, so we use eval to parse it. - const tagValue = eval(`(${value})`); + const tagValue = parse(value); if ( !tagValue || (typeof tagValue === 'object' && Object.keys(tagValue).length === 0) ) { result[tag] = null; } else { - result[tag] = JSON.stringify(tagValue); + // No indentation + result[tag] = toJSString(tagValue, 0); } } catch (e) { logger.log.warn( From c32198335aa1c71fc0d3da09c1abfffccaed509a Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Wed, 3 Dec 2025 15:32:28 +0300 Subject: [PATCH 13/35] fix check --- package-lock.json | 2 +- packages/compass-generative-ai/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index d2dcbb22080..8a999c4c449 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49692,6 +49692,7 @@ "bson": "^6.10.4", "compass-preferences-model": "^2.66.3", "mongodb": "^6.19.0", + "mongodb-query-parser": "^4.5.0", "mongodb-schema": "^12.6.3", "react": "^17.0.2", "react-redux": "^8.1.3", @@ -49714,7 +49715,6 @@ "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", - "mongodb-query-parser": "^4.5.0", "nyc": "^15.1.0", "p-queue": "^7.4.1", "sinon": "^9.2.3", diff --git a/packages/compass-generative-ai/package.json b/packages/compass-generative-ai/package.json index 751880946c6..1ba664073fb 100644 --- a/packages/compass-generative-ai/package.json +++ b/packages/compass-generative-ai/package.json @@ -63,6 +63,7 @@ "bson": "^6.10.4", "compass-preferences-model": "^2.66.3", "mongodb": "^6.19.0", + "mongodb-query-parser": "^4.5.0", "mongodb-schema": "^12.6.3", "react": "^17.0.2", "react-redux": "^8.1.3", @@ -87,7 +88,6 @@ "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", - "mongodb-query-parser": "^4.5.0", "nyc": "^15.1.0", "p-queue": "^7.4.1", "sinon": "^9.2.3", From f5a34dfe20b41d9e9ae5384c80446e0258efdbbb Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Wed, 3 Dec 2025 15:38:40 +0300 Subject: [PATCH 14/35] fix test --- packages/compass-e2e-tests/tests/collection-ai-query.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/compass-e2e-tests/tests/collection-ai-query.test.ts b/packages/compass-e2e-tests/tests/collection-ai-query.test.ts index 67de96ed58d..ac09eaae4c9 100644 --- a/packages/compass-e2e-tests/tests/collection-ai-query.test.ts +++ b/packages/compass-e2e-tests/tests/collection-ai-query.test.ts @@ -195,7 +195,7 @@ async function setup( await browser.setFeature('optInGenAIFeatures', true); } -describe.only('Collection ai query with chatbot (with mocked backend)', function () { +describe('Collection ai query with chatbot (with mocked backend)', function () { const dbName = 'test'; const collName = 'numbers'; let compass: Compass; @@ -257,7 +257,7 @@ describe.only('Collection ai query with chatbot (with mocked backend)', function const queryBarFilterContent = await browser.getCodemirrorEditorText( Selectors.queryBarOptionInputFilter('Documents') ); - return queryBarFilterContent === '{"i":{"$gt":50}}'; + return queryBarFilterContent === '{i:{$gt:50}}'; }); // Check that the request was made with the correct parameters. From 91b17d560eebcef297eeaca169de2edc2e6f61f6 Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Wed, 3 Dec 2025 15:43:28 +0300 Subject: [PATCH 15/35] clean up --- .../compass-generative-ai/src/utils/gen-ai-response.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/compass-generative-ai/src/utils/gen-ai-response.ts b/packages/compass-generative-ai/src/utils/gen-ai-response.ts index 13ca53c786a..50e5b956fef 100644 --- a/packages/compass-generative-ai/src/utils/gen-ai-response.ts +++ b/packages/compass-generative-ai/src/utils/gen-ai-response.ts @@ -2,10 +2,7 @@ import { AiChatbotInvalidResponseError } from '../chatbot-errors'; import { type AiQueryPrompt } from './gen-ai-prompt'; import type { LanguageModel } from 'ai'; import { streamText } from 'ai'; -/** - * Function that takes an LanguageModel and a message of type - * AiQueryPrompt and returns a Promise that resolves to a string response - */ + export async function getAiQueryResponse( model: LanguageModel, message: AiQueryPrompt, @@ -17,7 +14,7 @@ export async function getAiQueryResponse( providerOptions: { openai: { store: false, - instructions: message.metadata.instructions || '', + instructions: message.metadata.instructions, }, }, abortSignal, From ea4dfdf40ecabe42ace8d9ba502f201329c5bf98 Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Wed, 3 Dec 2025 15:53:18 +0300 Subject: [PATCH 16/35] copilot feedback --- packages/compass-generative-ai/src/atlas-ai-service.ts | 7 ++++--- .../compass-generative-ai/src/utils/xml-to-mms-response.ts | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/compass-generative-ai/src/atlas-ai-service.ts b/packages/compass-generative-ai/src/atlas-ai-service.ts index 80ab92a6120..3001f6ec3ca 100644 --- a/packages/compass-generative-ai/src/atlas-ai-service.ts +++ b/packages/compass-generative-ai/src/atlas-ai-service.ts @@ -291,16 +291,17 @@ export class AtlasAiService { this.logger = logger; this.initPromise = this.setupAIAccess(); - const initialBaseUrl = 'http://PLACEHOLDER_BASE_URL_TO_BE_REPLACED.invalid'; + const PLACEHOLDER_BASE_URL = + 'http://PLACEHOLDER_BASE_URL_TO_BE_REPLACED.invalid'; this.aiModel = createOpenAI({ apiKey: '', - baseURL: initialBaseUrl, + baseURL: PLACEHOLDER_BASE_URL, fetch: (url, init) => { // The `baseUrl` can be dynamically changed, but `createOpenAI` // doesn't allow us to change it after initial call. Instead // we're going to update it every time the fetch call happens const uri = String(url).replace( - initialBaseUrl, + PLACEHOLDER_BASE_URL, this.atlasService.assistantApiEndpoint() ); return this.atlasService.authenticatedFetch(uri, init); diff --git a/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts b/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts index 48b9facbffd..363ca616add 100644 --- a/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts +++ b/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts @@ -9,10 +9,11 @@ export function parseXmlToMmsJsonResponse(xmlString: string, logger: Logger) { 'skip', 'limit', 'aggregation', - ]; + ] as const; // Currently the prompt forces LLM to return xml-styled data - const result: any = {}; + const result: Partial> = + {}; for (const tag of expectedTags) { const regex = new RegExp(`<${tag}>([\\s\\S]*?)<\\/${tag}>`, 'i'); const match = xmlString.match(regex); @@ -27,7 +28,7 @@ export function parseXmlToMmsJsonResponse(xmlString: string, logger: Logger) { result[tag] = null; } else { // No indentation - result[tag] = toJSString(tagValue, 0); + result[tag] = toJSString(tagValue, 0) ?? null; } } catch (e) { logger.log.warn( From f8a4c43494868ac15da316220654efd4dfa12c98 Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Wed, 3 Dec 2025 18:25:26 +0300 Subject: [PATCH 17/35] fix log id --- packages/compass-generative-ai/src/utils/xml-to-mms-response.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts b/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts index 363ca616add..ad5e5e74976 100644 --- a/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts +++ b/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts @@ -32,7 +32,7 @@ export function parseXmlToMmsJsonResponse(xmlString: string, logger: Logger) { } } catch (e) { logger.log.warn( - logger.mongoLogId(1_001_000_309), + logger.mongoLogId(1_001_000_384), 'AtlasAiService', `Failed to parse value for tag <${tag}>: ${value}`, { error: e } From 8190219d73c54561fc91b84cccbd40ea9e81dbef Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Thu, 4 Dec 2025 10:38:20 +0300 Subject: [PATCH 18/35] fix cors issue on e2e tests --- packages/compass-e2e-tests/helpers/assistant-service.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/compass-e2e-tests/helpers/assistant-service.ts b/packages/compass-e2e-tests/helpers/assistant-service.ts index 5abca2c7d5f..970f8edd6dd 100644 --- a/packages/compass-e2e-tests/helpers/assistant-service.ts +++ b/packages/compass-e2e-tests/helpers/assistant-service.ts @@ -170,12 +170,13 @@ export async function startMockAssistantServer( let response = _response; const server = http .createServer((req, res) => { - res.setHeader('Access-Control-Allow-Origin', '*'); + res.setHeader('Access-Control-Allow-Origin', req.headers.origin || '*'); res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS'); res.setHeader( 'Access-Control-Allow-Headers', - 'Content-Type, Authorization, X-Request-Origin, User-Agent' + 'Content-Type, Authorization, X-Request-Origin, User-Agent, X-CSRF-Token, X-CSRF-Time' ); + res.setHeader('Access-Control-Allow-Credentials', 'true'); // Handle preflight requests if (req.method === 'OPTIONS') { From c444cb9fe1b0e7dbbfeb8a54b83d03f19d3e0f7b Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Thu, 4 Dec 2025 15:07:22 +0300 Subject: [PATCH 19/35] more tests --- .../src/atlas-ai-service.spec.ts | 353 ++++++++++++++++++ .../src/utils/gen-ai-prompt.spec.ts | 59 +++ .../src/utils/gen-ai-prompt.ts | 8 + .../src/utils/xml-to-mms-response.spec.ts | 25 +- .../src/utils/xml-to-mms-response.ts | 37 +- 5 files changed, 450 insertions(+), 32 deletions(-) diff --git a/packages/compass-generative-ai/src/atlas-ai-service.spec.ts b/packages/compass-generative-ai/src/atlas-ai-service.spec.ts index a9dc4016f0f..e56ffbcef2f 100644 --- a/packages/compass-generative-ai/src/atlas-ai-service.spec.ts +++ b/packages/compass-generative-ai/src/atlas-ai-service.spec.ts @@ -737,4 +737,357 @@ describe('AtlasAiService', function () { }); }); } + + describe('with chatbot api', function () { + describe('getQueryFromUserInput and getAggregationFromUserInput', function () { + type Chunk = { type: 'text' | 'error'; content: string }; + let atlasAiService: AtlasAiService; + const mockConnectionInfo = getMockConnectionInfo(); + + function streamChunkResponse( + readableStreamController: ReadableStreamController, + chunks: Chunk[] + ) { + const responseId = `resp_${Date.now()}`; + const itemId = `item_${Date.now()}`; + let sequenceNumber = 0; + + const encoder = new TextEncoder(); + + // openai response format: + // https://github.com/vercel/ai/blob/811119c1808d7b62a4857bcad42353808cdba17c/packages/openai/src/responses/openai-responses-api.ts#L322 + + // Send response.created event + readableStreamController.enqueue( + encoder.encode( + `data: ${JSON.stringify({ + type: 'response.created', + response: { + id: responseId, + object: 'realtime.response', + status: 'in_progress', + output: [], + usage: { + input_tokens: 0, + output_tokens: 0, + total_tokens: 0, + }, + }, + sequence_number: sequenceNumber++, + })}\n\n` + ) + ); + + // Send output_item.added event + readableStreamController.enqueue( + encoder.encode( + `data: ${JSON.stringify({ + type: 'response.output_item.added', + response_id: responseId, + output_index: 0, + item: { + id: itemId, + object: 'realtime.item', + type: 'message', + role: 'assistant', + content: [], + }, + sequence_number: sequenceNumber++, + })}\n\n` + ) + ); + + for (const chunk of chunks) { + if (chunk.type === 'error') { + readableStreamController.enqueue( + encoder.encode( + `data: ${JSON.stringify({ + type: `error`, + response_id: responseId, + item_id: itemId, + output_index: 0, + error: { + type: 'model_error', + code: 'model_error', + message: chunk.content, + }, + sequence_number: sequenceNumber++, + })}\n\n` + ) + ); + } else { + readableStreamController.enqueue( + encoder.encode( + `data: ${JSON.stringify({ + type: 'response.output_text.delta', + response_id: responseId, + item_id: itemId, + output_index: 0, + delta: chunk.content, + sequence_number: sequenceNumber++, + })}\n\n` + ) + ); + } + } + + const content = chunks + .filter((c) => c.type === 'text') + .map((c) => c.content) + .join(''); + + // Send output_item.done event + readableStreamController.enqueue( + encoder.encode( + `data: ${JSON.stringify({ + type: 'response.output_item.done', + response_id: responseId, + output_index: 0, + item: { + id: itemId, + object: 'realtime.item', + type: 'message', + role: 'assistant', + content: [ + { + type: 'text', + text: content, + }, + ], + }, + sequence_number: sequenceNumber++, + })}\n\n` + ) + ); + + // Send response.completed event + const tokenCount = Math.ceil(content.length / 4); // assume 4 chars per token + readableStreamController.enqueue( + encoder.encode( + `data: ${JSON.stringify({ + type: 'response.completed', + response: { + id: responseId, + object: 'realtime.response', + status: 'completed', + output: [ + { + id: itemId, + object: 'realtime.item', + type: 'message', + role: 'assistant', + content: [ + { + type: 'text', + text: content, + }, + ], + }, + ], + usage: { + input_tokens: 10, + output_tokens: tokenCount, + total_tokens: 10 + tokenCount, + }, + }, + sequence_number: sequenceNumber++, + })}\n\n` + ) + ); + } + + function streamableFetchMock(chunks: Chunk[]) { + const readableStream = new ReadableStream({ + start(controller) { + streamChunkResponse(controller, chunks); + controller.close(); + }, + }); + return new Response(readableStream, { + headers: { 'Content-Type': 'text/event-stream' }, + }); + } + + beforeEach(async function () { + const mockAtlasService = new MockAtlasService(); + await preferences.savePreferences({ + enableChatbotEndpointForGenAI: true, + }); + atlasAiService = new AtlasAiService({ + apiURLPreset: 'cloud', + atlasService: mockAtlasService as any, + preferences, + logger: createNoopLogger(), + }); + // Enable the AI feature + const fetchStub = sandbox.stub().resolves( + makeResponse({ + features: { + GEN_AI_COMPASS: { + enabled: true, + }, + }, + }) + ); + global.fetch = fetchStub; + await atlasAiService['setupAIAccess'](); + }); + + after(function () { + global.fetch = initialFetch; + }); + + const testCases = [ + { + functionName: 'getQueryFromUserInput', + successResponse: { + request: [ + { type: 'text', content: 'Hello' }, + { type: 'text', content: ' world' }, + { + type: 'text', + content: '. This is some non relevant text in the output', + }, + { type: 'text', content: '{test: ' }, + { type: 'text', content: '"pineapple"' }, + { type: 'text', content: '}' }, + ] as Chunk[], + response: { + content: { + query: { + filter: "{test:'pineapple'}", + project: null, + sort: null, + skip: null, + limit: null, + }, + }, + }, + }, + invalidModelResponse: { + request: [ + { type: 'text', content: 'Hello' }, + { type: 'text', content: ' world.' }, + { type: 'text', content: '{test: ' }, + { type: 'text', content: '"pineapple"' }, + { type: 'text', content: '}' }, + { type: 'error', content: 'Model crashed!' }, + ] as Chunk[], + errorMessage: 'Model crashed!', + }, + }, + { + functionName: 'getAggregationFromUserInput', + successResponse: { + request: [ + { type: 'text', content: 'Hello' }, + { type: 'text', content: ' world' }, + { + type: 'text', + content: '. This is some non relevant text in the output', + }, + { type: 'text', content: '[{$count: ' }, + { type: 'text', content: '"pineapple"' }, + { type: 'text', content: '}]' }, + ] as Chunk[], + response: { + content: { + aggregation: { + pipeline: "[{$count:'pineapple'}]", + }, + }, + }, + }, + invalidModelResponse: { + request: [ + { type: 'text', content: 'Hello' }, + { type: 'text', content: ' world.' }, + { type: 'text', content: '[{test: ' }, + { type: 'text', content: '"pineapple"' }, + { type: 'text', content: '}]' }, + { type: 'error', content: 'Model crashed!' }, + ] as Chunk[], + errorMessage: 'Model crashed!', + }, + }, + ] as const; + + for (const { + functionName, + successResponse, + invalidModelResponse, + } of testCases) { + describe(functionName, function () { + it('makes a post request with the user input to the endpoint in the environment', async function () { + const fetchStub = sandbox + .stub() + .resolves(streamableFetchMock(successResponse.request)); + global.fetch = fetchStub; + + const input = { + userInput: 'test', + signal: new AbortController().signal, + collectionName: 'jam', + databaseName: 'peanut', + schema: { _id: { types: [{ bsonType: 'ObjectId' }] } }, + sampleDocuments: [ + { _id: new ObjectId('642d766b7300158b1f22e972') }, + ], + requestId: 'abc', + }; + + const res = await atlasAiService[functionName]( + input as any, + mockConnectionInfo + ); + + expect(fetchStub).to.have.been.calledOnce; + + const { args } = fetchStub.firstCall; + const requestBody = JSON.parse(args[1].body as string); + + expect(requestBody.model).to.equal('mongodb-chat-latest'); + expect(requestBody.store).to.equal(false); + expect(requestBody.instructions).to.be.a('string'); + expect(requestBody.input).to.be.an('array'); + + const { role, content } = requestBody.input[0]; + expect(role).to.equal('user'); + expect(content[0].text).to.include( + `Database name: "${input.databaseName}"` + ); + expect(content[0].text).to.include( + `Collection name: "${input.collectionName}"` + ); + expect(res).to.deep.eq(successResponse.response); + }); + + it('should throw an error when the stream contains an error chunk', async function () { + const fetchStub = sandbox + .stub() + .resolves(streamableFetchMock(invalidModelResponse.request)); + global.fetch = fetchStub; + + try { + await atlasAiService[functionName]( + { + userInput: 'test', + collectionName: 'test', + databaseName: 'peanut', + requestId: 'abc', + signal: new AbortController().signal, + }, + mockConnectionInfo + ); + expect.fail(`Expected ${functionName} to throw`); + } catch (err) { + expect((err as Error).message).to.match( + new RegExp(invalidModelResponse.errorMessage, 'i') + ); + } + }); + }); + } + }); + }); }); diff --git a/packages/compass-generative-ai/src/utils/gen-ai-prompt.spec.ts b/packages/compass-generative-ai/src/utils/gen-ai-prompt.spec.ts index 3ae68818975..ec55525fb69 100644 --- a/packages/compass-generative-ai/src/utils/gen-ai-prompt.spec.ts +++ b/packages/compass-generative-ai/src/utils/gen-ai-prompt.spec.ts @@ -121,4 +121,63 @@ describe('GenAI Prompts', function () { 'includes actual sample documents' ); }); + + it('throws if user prompt exceeds the max size', function () { + try { + buildFindQueryPrompt({ + ...OPTIONS, + userInput: 'a'.repeat(512001), + }); + expect.fail('Expected buildFindQueryPrompt to throw'); + } catch (err) { + expect(err).to.have.property( + 'message', + 'Sorry, your request is too large. Please use a smaller prompt or try using this feature on a collection with smaller documents.' + ); + } + }); + + context('handles large sample documents', function () { + it('sends all the sample docs if within limits', function () { + const sampleDocuments = [ + { a: '1' }, + { a: '2' }, + { a: '3' }, + { a: '4'.repeat(5120) }, + ]; + const prompt = buildFindQueryPrompt({ + ...OPTIONS, + sampleDocuments, + }).prompt; + + expect(prompt).to.include(toJSString(sampleDocuments)); + }); + it('sends only one sample doc if all exceed limits', function () { + const sampleDocuments = [ + { a: '1'.repeat(5120) }, + { a: '2'.repeat(5120001) }, + { a: '3'.repeat(5120001) }, + { a: '4'.repeat(5120001) }, + ]; + const prompt = buildFindQueryPrompt({ + ...OPTIONS, + sampleDocuments, + }).prompt; + expect(prompt).to.include(toJSString([sampleDocuments[0]])); + }); + it('should not send sample docs if even one exceeds limits', function () { + const sampleDocuments = [ + { a: '1'.repeat(5120001) }, + { a: '2'.repeat(5120001) }, + { a: '3'.repeat(5120001) }, + { a: '4'.repeat(5120001) }, + ]; + const prompt = buildFindQueryPrompt({ + ...OPTIONS, + sampleDocuments, + }).prompt; + expect(prompt).to.not.include('Sample document from the collection:'); + expect(prompt).to.not.include('Sample documents from the collection:'); + }); + }); }); diff --git a/packages/compass-generative-ai/src/utils/gen-ai-prompt.ts b/packages/compass-generative-ai/src/utils/gen-ai-prompt.ts index 1d8e22d8d81..8ee6ec8bbe3 100644 --- a/packages/compass-generative-ai/src/utils/gen-ai-prompt.ts +++ b/packages/compass-generative-ai/src/utils/gen-ai-prompt.ts @@ -137,6 +137,14 @@ function buildUserPromptForQuery({ } } messages.push(queryPrompt); + + // If at this point we have exceeded the limit, throw an error. + const totalPromptLength = messages.join('\n').length; + if (totalPromptLength > MAX_TOTAL_PROMPT_LENGTH) { + throw new Error( + 'Sorry, your request is too large. Please use a smaller prompt or try using this feature on a collection with smaller documents.' + ); + } return messages.join('\n'); } diff --git a/packages/compass-generative-ai/src/utils/xml-to-mms-response.spec.ts b/packages/compass-generative-ai/src/utils/xml-to-mms-response.spec.ts index d461c3ece44..863d42ad502 100644 --- a/packages/compass-generative-ai/src/utils/xml-to-mms-response.spec.ts +++ b/packages/compass-generative-ai/src/utils/xml-to-mms-response.spec.ts @@ -11,7 +11,7 @@ const loggerMock = { mongoLogId: (id: number) => id, } as unknown as Logger; describe('parseXmlToMmsJsonResponse', function () { - it('should prioritize aggregation over query fields', function () { + it('should return prioritize aggregation over query when available and valid', function () { const xmlString = ` { age: { $gt: 25 } } [{ $match: { status: "A" } }] @@ -35,7 +35,7 @@ describe('parseXmlToMmsJsonResponse', function () { }); }); - it('should return null for aggregation if not provided', function () { + it('should not return aggregation if its not available in the response', function () { const xmlString = ` { age: { $gt: 25 } } `; @@ -43,7 +43,6 @@ describe('parseXmlToMmsJsonResponse', function () { const result = parseXmlToMmsJsonResponse(xmlString, loggerMock); expect(result).to.deep.equal({ content: { - aggregation: null, query: { filter: '{age:{$gt:25}}', project: null, @@ -55,7 +54,7 @@ describe('parseXmlToMmsJsonResponse', function () { }); }); - it('should return null for query fields if not provided', function () { + it('should not return query if its not available in the response', function () { const xmlString = ` [{ $match: { status: "A" } }] `; @@ -67,13 +66,6 @@ describe('parseXmlToMmsJsonResponse', function () { aggregation: { pipeline: "[{$match:{status:'A'}}]", }, - query: { - filter: null, - project: null, - sort: null, - skip: null, - limit: null, - }, }, }); }); @@ -92,7 +84,6 @@ describe('parseXmlToMmsJsonResponse', function () { expect(result).to.deep.equal({ content: { - aggregation: null, query: { filter: '{age:{$gt:25}}', project: '{name:1,age:1}', @@ -104,31 +95,31 @@ describe('parseXmlToMmsJsonResponse', function () { }); }); - context('it should return null values for invalid data', function () { + context('it should handle invalid data', function () { it('invalid json', function () { const result = parseXmlToMmsJsonResponse( `{ age: { $gt: 25 `, loggerMock ); - expect(result.content.query.filter).to.equal(null); + expect(result.content).to.not.have.property('query'); }); it('empty object', function () { const result = parseXmlToMmsJsonResponse( `{}`, loggerMock ); - expect(result.content.query.filter).to.equal(null); + expect(result.content).to.not.have.property('query'); }); it('empty array', function () { const result = parseXmlToMmsJsonResponse( `[]`, loggerMock ); - expect(result.content.aggregation).to.equal(null); + expect(result.content).to.not.have.property('aggregation'); }); it('zero value', function () { const result = parseXmlToMmsJsonResponse(`0`, loggerMock); - expect(result.content.query.limit).to.equal(null); + expect(result.content).to.not.have.property('query'); }); }); }); diff --git a/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts b/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts index ad5e5e74976..0ce0058518b 100644 --- a/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts +++ b/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts @@ -12,8 +12,14 @@ export function parseXmlToMmsJsonResponse(xmlString: string, logger: Logger) { ] as const; // Currently the prompt forces LLM to return xml-styled data - const result: Partial> = - {}; + const result: Record<(typeof expectedTags)[number], string | null> = { + filter: null, + project: null, + sort: null, + skip: null, + limit: null, + aggregation: null, + }; for (const tag of expectedTags) { const regex = new RegExp(`<${tag}>([\\s\\S]*?)<\\/${tag}>`, 'i'); const match = xmlString.match(regex); @@ -42,13 +48,15 @@ export function parseXmlToMmsJsonResponse(xmlString: string, logger: Logger) { } } - // Keep the response same as we have from mms api. If llm generated - // an aggregation, we want to return that instead of a query - if (result.aggregation) { + const { aggregation, ...query } = result; + const isQueryEmpty = Object.values(query).every((v) => v === null); + + // It prioritizes aggregation over query if both are present + if (aggregation && !isQueryEmpty) { return { content: { aggregation: { - pipeline: result.aggregation, + pipeline: aggregation, }, query: { filter: null, @@ -60,17 +68,16 @@ export function parseXmlToMmsJsonResponse(xmlString: string, logger: Logger) { }, }; } - return { content: { - aggregation: null, - query: { - filter: result.filter ?? null, - project: result.project ?? null, - sort: result.sort ?? null, - skip: result.skip ?? null, - limit: result.limit ?? null, - }, + ...(aggregation + ? { + aggregation: { + pipeline: aggregation, + }, + } + : {}), + ...(isQueryEmpty ? {} : { query }), }, }; } From 6eec8db3e162b15d2812d1906105ba4e0c31d5a9 Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Thu, 4 Dec 2025 15:20:34 +0300 Subject: [PATCH 20/35] add type --- .../src/utils/xml-to-mms-response.ts | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts b/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts index 0ce0058518b..9287d35f6e2 100644 --- a/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts +++ b/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts @@ -1,7 +1,25 @@ import type { Logger } from '@mongodb-js/compass-logging'; import parse, { toJSString } from 'mongodb-query-parser'; -export function parseXmlToMmsJsonResponse(xmlString: string, logger: Logger) { +type MmsJsonResponse = { + content: { + query?: { + filter: string | null; + project: string | null; + sort: string | null; + skip: string | null; + limit: string | null; + }; + aggregation?: { + pipeline: string; + }; + }; +}; + +export function parseXmlToMmsJsonResponse( + xmlString: string, + logger: Logger +): MmsJsonResponse { const expectedTags = [ 'filter', 'project', From 25c8089d425f9c73505e9aa35fafeedae8a1cff0 Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Mon, 8 Dec 2025 15:12:50 +0300 Subject: [PATCH 21/35] wip --- .../src/evals/gen-ai.eval.ts | 115 +++++ .../src/evals/use-cases/aggregate-query.ts | 462 ++++++++++++++++++ .../src/evals/use-cases/find-query.ts | 280 +++++++++++ .../src/evals/use-cases/index.ts | 4 + 4 files changed, 861 insertions(+) create mode 100644 packages/compass-generative-ai/src/evals/gen-ai.eval.ts create mode 100644 packages/compass-generative-ai/src/evals/use-cases/aggregate-query.ts create mode 100644 packages/compass-generative-ai/src/evals/use-cases/find-query.ts create mode 100644 packages/compass-generative-ai/src/evals/use-cases/index.ts diff --git a/packages/compass-generative-ai/src/evals/gen-ai.eval.ts b/packages/compass-generative-ai/src/evals/gen-ai.eval.ts new file mode 100644 index 00000000000..eab97e2a0a0 --- /dev/null +++ b/packages/compass-generative-ai/src/evals/gen-ai.eval.ts @@ -0,0 +1,115 @@ +import { createOpenAI } from '@ai-sdk/openai'; +import { streamText } from 'ai'; +import { init, Factuality as _Factuality } from 'autoevals'; +import { Eval } from 'braintrust'; +import type { EvalScorer } from 'braintrust'; +import { OpenAI } from 'openai'; +import { genAiUsecases } from './use-cases'; + +type Message = { + content: string; +}; +type InputMessage = Message & { role: 'user' | 'assistant' | 'system' }; +type OutputMessage = Message; +type ExpectedMessage = OutputMessage; + +type ConversationEvalCaseInput = { + messages: InputMessage[]; + instructions: Message; +}; + +type ConversationEvalCaseExpected = { + messages: OutputMessage[]; +}; + +type ConversationTaskOutput = { + messages: ExpectedMessage[]; +}; + +type ConversationEvalScorer = EvalScorer< + ConversationEvalCaseInput, + ConversationTaskOutput, + ConversationEvalCaseExpected +>; + +const client = new OpenAI({ + baseURL: 'https://api.braintrust.dev/v1/proxy', + apiKey: process.env.BRAINTRUST_API_KEY, +}); + +init({ client }); + +async function makeAssistantCall( + input: ConversationEvalCaseInput +): Promise { + const openai = createOpenAI({ + baseURL: + process.env.COMPASS_ASSISTANT_BASE_URL_OVERRIDE ?? + 'https://knowledge.mongodb.com/api/v1', + apiKey: '', + headers: { + 'X-Request-Origin': 'compass-assistant-braintrust', + 'User-Agent': 'mongodb-compass/x.x.x', + }, + }); + const result = streamText({ + model: openai.responses('mongodb-chat-latest'), + temperature: undefined, + prompt: input.messages, + providerOptions: { + openai: { + instructions: input.instructions.content, + store: false, + }, + }, + }); + + const chunks: string[] = []; + + for await (const chunk of result.toUIMessageStream()) { + const t = ((chunk as any).delta as string) || ''; + if (t) { + chunks.push(t); + } + } + return { + messages: [{ content: chunks.join('') }], + }; +} + +function allText(messages: Message[]): string { + return messages.map((m) => m.text).join('\n'); +} + +const Factuality: ConversationEvalScorer = ({ input, output, expected }) => { + return _Factuality({ + input: allText(input.messages), + output: allText(output.messages), + expected: allText(expected.messages), + model: 'gpt-4.1', + temperature: undefined, + }); +}; + +void Eval< + ConversationEvalCaseInput, + ConversationTaskOutput, + ConversationEvalCaseExpected +>('Compass Gen AI', { + data: () => { + return genAiUsecases.map((usecase) => { + return { + name: usecase.name, + input: { + messages: [{ content: usecase.prompt.prompt, role: 'user' }], + instructions: { content: usecase.prompt.metadata.instructions }, + }, + expected: { + messages: [{ content: JSON.stringify(usecase.expectedOutput) }], + }, + }; + }); + }, + task: makeAssistantCall, + scores: [Factuality], +}); diff --git a/packages/compass-generative-ai/src/evals/use-cases/aggregate-query.ts b/packages/compass-generative-ai/src/evals/use-cases/aggregate-query.ts new file mode 100644 index 00000000000..db7b0b6fbc8 --- /dev/null +++ b/packages/compass-generative-ai/src/evals/use-cases/aggregate-query.ts @@ -0,0 +1,462 @@ +import { buildAggregateQueryPrompt } from '../../utils/gen-ai-prompt'; + +export const aggregateQueries = [ + { + prompt: buildAggregateQueryPrompt({ + userInput: 'find all the movies released in 1983', + databaseName: 'netflix', + collectionName: 'movies', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [ + { + $match: { year: 1983 }, + }, + ], + name: 'basic aggregate query', + }, + { + prompt: buildAggregateQueryPrompt({ + userInput: + 'find three movies with alien in the title, show earliest movies first, only the _id, title and year', + databaseName: 'netflix', + collectionName: 'movies', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [ + { + $match: { title: { $regex: 'alien', $options: 'i' } }, + }, + { + $project: { _id: 1, title: 1, year: 1 }, + }, + { + $sort: { year: 1 }, + }, + { + $limit: 3, + }, + ], + name: 'aggregate with filter projection sort and limit', + }, + { + prompt: buildAggregateQueryPrompt({ + userInput: + 'find all the violations for the violation code 21 and only return the car plate', + databaseName: 'NYC', + collectionName: 'parking_2015', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [ + { + $match: { 'Violation Code': 21 }, + $project: { 'Plate ID': 1 }, + }, + ], + name: 'aggregate with filter and projection', + }, + { + prompt: buildAggregateQueryPrompt({ + // TODO: check this + userInput: + 'find all the bars 10km from the berlin center, only return their names', + databaseName: 'berlin', + collectionName: 'cocktailbars', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [ + { + $match: { _id: 'ObjectId("5ca652bf56618187558b4de3")' }, + }, + { + $project: { name: 1 }, + }, + ], + name: 'geo-based aggregate', + }, + { + prompt: buildAggregateQueryPrompt({ + userInput: + 'Return all the properties of type "Hotel" and with ratings lte 70', + databaseName: 'sample_airbnb', + collectionName: 'listingsAndReviews', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [ + { + $match: { + $and: [ + { property_type: 'Hotel' }, + { 'review_scores.review_scores_rating': { $lte: 70 } }, + ], + }, + }, + ], + name: 'complex aggregate with nested fields', + }, + { + prompt: buildAggregateQueryPrompt({ + userInput: + 'what is the bed count that occurs the most? return it in a field called bedCount (only return the bedCount field)', + databaseName: 'sample_airbnb', + collectionName: 'listingsAndReviews', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [ + { + $group: { + _id: null, + totalReviewsOverall: { $sum: '$number_of_reviews' }, + }, + }, + ], + name: 'aggregate with a group', + }, + { + prompt: buildAggregateQueryPrompt({ + userInput: + 'what is the bed count that occurs the most? return it in a field called bedCount (only return the bedCount field)', + databaseName: 'sample_airbnb', + collectionName: 'listingsAndReviews', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [ + { $group: { _id: '$beds', count: { $sum: 1 } } }, + { $sort: { count: -1 } }, + { $limit: 1 }, + { $project: { bedCount: '$_id' } }, + ], + name: 'complex aggregate 1', + }, + { + prompt: buildAggregateQueryPrompt({ + userInput: + 'which host id has the most reviews across all listings? return it in a field called hostId', + databaseName: 'sample_airbnb', + collectionName: 'listingsAndReviews', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [ + { + $group: { + _id: '$host.host_id', + totalReviews: { $sum: '$number_of_reviews' }, + }, + }, + { $sort: { totalReviews: -1 } }, + { $limit: 1 }, + { $project: { hostId: '$_id' } }, + ], + name: 'complex aggregate 2', + }, + { + prompt: buildAggregateQueryPrompt({ + userInput: + 'Which customers will be 30 in this calendar year (jan to dec)? return name and birthdate', + databaseName: 'sample_analytics', + collectionName: 'customers', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [ + { + $match: { + $and: [ + { + birthdate: { + $gte: new Date(`${new Date().getFullYear() - 30}-01-01`), + }, + }, + { + birthdate: { + $lt: new Date(`${new Date().getFullYear() - 29}-01-01`), + }, + }, + ], + }, + }, + { + $project: { name: 1, birthdate: 1 }, + }, + ], + name: 'relative date aggregate 1', + }, + { + prompt: buildAggregateQueryPrompt({ + userInput: + 'Give me all of the documents of sightings that happened last year, no _id', + databaseName: 'UFO', + collectionName: 'sightings', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [ + { + $match: { year: new Date().getFullYear() - 1 }, + }, + ], + name: 'relative date aggregate 2', + }, + { + prompt: buildAggregateQueryPrompt({ + userInput: + 'give me just the price and the first 3 amenities (in a field called amenities) of the listing has "Step-free access" in its amenities.', + databaseName: 'sample_airbnb', + collectionName: 'listingsAndReviews', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [ + { $match: { amenities: 'Step-free access' } }, + { $project: { price: 1, amenities: { $slice: 3 } } }, + ], + name: 'complex projection aggregate', + }, + { + prompt: buildAggregateQueryPrompt({ + userInput: + 'Return only the Plate IDs of Acura vehicles registered in New York', + databaseName: 'NYC', + collectionName: 'parking_2015', + schema: {}, + // withSamples: true, + sampleDocuments: [], + }), + expectedOutput: [ + { + $match: { + $and: [{ 'Vehicle Make': 'ACURA' }, { 'Registration State': 'NY' }], + }, + }, + { + $project: { 'Plate ID': 1 }, + }, + ], + name: 'with sample documents aggregate', + }, + { + prompt: buildAggregateQueryPrompt({ + userInput: + '¿Qué alojamiento tiene el precio más bajo? devolver el número en un campo llamado "precio"', + databaseName: 'sample_airbnb', + collectionName: 'listingsAndReviews', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [ + { + $project: { _id: 0, precio: '$price' }, + $sort: { price: 1 }, + $limit: 1, + }, + ], + name: 'aggregate with non-english prompt', + }, + { + prompt: buildAggregateQueryPrompt({ + userInput: + 'give only me the cancellation policy and host url of the most expensive listing', + databaseName: 'sample_airbnb', + collectionName: 'listingsAndReviews', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [ + { $sort: { price: -1 } }, + { $project: { cancellation_policy: 1, 'host.host_url': 1 } }, + { $limit: 1 }, + ], + name: 'simple aggregate with sort and limit', + }, + { + prompt: buildAggregateQueryPrompt({ + userInput: + 'get the average price of all the items for each distinct tag, the resulting documents should only have 2 properties tag and avgPrice', + databaseName: 'sample_supplies', + collectionName: 'sales', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [ + { $unwind: '$items' }, + { $unwind: '$items.tags' }, + { $group: { _id: '$items.tags', avgPrice: { $avg: '$items.price' } } }, + { $project: { _id: 0, tag: '$_id', avgPrice: 1 } }, + ], + name: 'aggregate with unwind and group', + }, + { + prompt: buildAggregateQueryPrompt({ + userInput: + 'which listing has the most amenities? the resulting documents should only have the _id', + databaseName: 'sample_airbnb', + collectionName: 'listingsAndReviews', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [ + { $project: { _id: 1, numAmenities: { $size: '$amenities' } } }, + { $sort: { numAmenities: -1 } }, + { $limit: 1 }, + { $project: { _id: 1 } }, + ], + name: 'aggregate with size operator', + }, + { + prompt: buildAggregateQueryPrompt({ + userInput: + 'What are the 5 most frequent words (case sensitive) used in movie titles in the 1980s and 1990s combined? Sorted first by frequency count then alphabetically. output fields count and word', + databaseName: 'netflix', + collectionName: 'movies', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [ + { $match: { year: { $regex: '^(198[0-9]|199[0-9])$' } } }, + { $addFields: { titleWords: { $split: ['$title', ' '] } } }, + { $unwind: '$titleWords' }, + { $group: { _id: '$titleWords', count: { $sum: 1 } } }, + { $sort: { count: -1, _id: 1 } }, + { $limit: 5 }, + { $project: { _id: 0, count: 1, word: '$_id' } }, + ], + name: 'aggregate with regex, addFields and split', + }, + { + prompt: buildAggregateQueryPrompt({ + userInput: + 'what percentage of listings have a "Washer" in their amenities? Only consider listings with more than 2 beds. Return is as a string named "washerPercentage" like "75%", rounded to the nearest whole number.', + databaseName: 'sample_airbnb', + collectionName: 'listingsAndReviews', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [ + { $match: { beds: { $gt: 2 } } }, + { + $group: { + _id: null, + totalListings: { $sum: 1 }, + withWasher: { + $sum: { + $cond: [{ $in: ['Washer', '$amenities'] }, 1, 0], + }, + }, + }, + }, + { + $project: { + washerPercentage: { + $concat: [ + { + $toString: { + $round: { + $multiply: [ + { $divide: ['$withWasher', '$totalListings'] }, + 100, + ], + }, + }, + }, + '%', + ], + }, + }, + }, + ], + name: 'super complex aggregate with complex project', + }, + { + prompt: buildAggregateQueryPrompt({ + userInput: + 'Write a query that does the following: find all of the parking incidents that occurred on an ave (match all ways to write ave). Return all of the plate ids involved with their summons number and vehicle make and body type. Put the vehicle make and body type into lower case. No _id, sorted by the summons number lowest first.', + databaseName: 'NYC', + collectionName: 'parking_2015', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [ + { + $match: { 'Street Name': { $regex: 'ave', $options: 'i' } }, + }, + { + $sort: { 'Summons Number': 1 }, + }, + { + $project: { + 'Summons Number': 1, + 'Plate ID': 1, + 'Vehicle Make': { $toLower: '$Vehicle Make' }, + 'Vehicle Body Type': { $toLower: '$Vehicle Body Type' }, + _id: 0, + }, + }, + ], + name: 'complex aggregate with regex and string operators', + }, + { + prompt: buildAggregateQueryPrompt({ + userInput: + 'join with "movies" based on a movie_id and return one document for each comment with movie_title (from movie.title) and comment_text', + databaseName: 'netflix', + collectionName: 'comments', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [ + { + $lookup: { + from: 'movies', + localField: 'movie_id', + foreignField: '_id', + as: 'movies', + }, + }, + { $unwind: '$movies' }, + { $project: { movie_title: '$movies.title', comment_text: '$text' } }, + ], + name: 'prompt with sql join', + }, + { + prompt: buildAggregateQueryPrompt({ + userInput: 'return only the customer names', + databaseName: 'security', + collectionName: 'usergenerated', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [{ $project: { customer_name: 1 } }], + name: 'simple projection aggregate', + }, + { + prompt: buildAggregateQueryPrompt({ + userInput: + 'find all documents where the boolean field "isActive" is true', + databaseName: 'sample_db', + collectionName: 'users', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [ + { + $lookup: { + from: 'movies', + localField: 'movie_id', + foreignField: '_id', + as: 'movies', + }, + }, + { $unwind: '$movies' }, + { $project: { movie_title: '$movies.title', comment_text: '$text' } }, + ], + name: 'prompt with sql join', + }, +]; diff --git a/packages/compass-generative-ai/src/evals/use-cases/find-query.ts b/packages/compass-generative-ai/src/evals/use-cases/find-query.ts new file mode 100644 index 00000000000..9b4d8f7c525 --- /dev/null +++ b/packages/compass-generative-ai/src/evals/use-cases/find-query.ts @@ -0,0 +1,280 @@ +import { buildFindQueryPrompt } from '../../utils/gen-ai-prompt'; + +export const findQueries = [ + { + prompt: buildFindQueryPrompt({ + userInput: 'find all the movies released in 1983', + databaseName: 'netflix', + collectionName: 'movies', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: { + filter: { year: 1983 }, + }, + name: 'simple find', + }, + { + prompt: buildFindQueryPrompt({ + userInput: + 'find three movies with alien in the title, show earliest movies first, only the _id, title and year', + databaseName: 'netflix', + collectionName: 'movies', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: { + filter: { title: { $regex: 'alien', $options: 'i' } }, + projection: { _id: 1, title: 1, year: 1 }, + sort: { year: 1 }, + limit: 3, + }, + name: 'find with filter projection sort and limit', + }, + { + prompt: buildFindQueryPrompt({ + userInput: + 'find all users older than 30 and younger than 50, only return their name and age', + databaseName: 'appdata', + collectionName: 'users', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: { + filter: { 'Violation Code': 21 }, + projection: { 'Plate ID': 1 }, + }, + name: 'find with filter and projection', + }, + { + prompt: buildFindQueryPrompt({ + userInput: + 'find all the bars 10km from the berlin center, only return their names', + databaseName: 'berlin', + collectionName: 'cocktailbars', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: { + filter: { _id: 'ObjectId("5ca652bf56618187558b4de3")' }, + projection: { name: 1 }, + }, + name: 'geo-based find', + }, + { + prompt: buildFindQueryPrompt({ + userInput: + 'Return all the properties of type "Hotel" and with ratings lte 70', + databaseName: 'sample_airbnb', + collectionName: 'listingsAndReviews', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: { + filter: { + $and: [ + { property_type: 'Hotel' }, + { 'review_scores.review_scores_rating': { $lte: 70 } }, + ], + }, + }, + name: 'complex find with nested fields', + }, + { + prompt: buildFindQueryPrompt({ + userInput: + 'what is the bed count that occurs the most? return it in a field called bedCount (only return the bedCount field)', + databaseName: 'sample_airbnb', + collectionName: 'listingsAndReviews', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [ + { $group: { _id: '$beds', count: { $sum: 1 } } }, + { $sort: { count: -1 } }, + { $limit: 1 }, + { $project: { bedCount: '$_id' } }, + ], + name: 'find query that translates to aggregation 1', + }, + { + prompt: buildFindQueryPrompt({ + userInput: + 'whats the total number of reviews across all listings? return it in a field called totalReviewsOverall', + databaseName: 'sample_airbnb', + collectionName: 'listingsAndReviews', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [ + { + $group: { + _id: null, + totalReviewsOverall: { $sum: '$number_of_reviews' }, + }, + }, + ], + name: 'find query that translates to aggregation 2', + }, + { + prompt: buildFindQueryPrompt({ + userInput: + 'which host id has the most reviews across all listings? return it in a field called hostId', + databaseName: 'sample_airbnb', + collectionName: 'listingsAndReviews', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: [ + { + $group: { + _id: '$host.host_id', + totalReviews: { $sum: '$number_of_reviews' }, + }, + }, + { $sort: { totalReviews: -1 } }, + { $limit: 1 }, + { $project: { hostId: '$_id' } }, + ], + name: 'find query that translates to aggregation 3', + }, + { + prompt: buildFindQueryPrompt({ + userInput: + 'find all of the documents of sightings that happened last year, no _id', + databaseName: 'UFO', + collectionName: 'sightings', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: { + filter: { year: new Date().getFullYear() - 1 }, + }, + name: 'relative date find 1', + }, + { + prompt: buildFindQueryPrompt({ + userInput: + 'Which customers will be 30 in this calendar year (jan to dec)? return name and birthdate', + databaseName: 'sample_analytics', + collectionName: 'customers', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: { + filter: { + $and: [ + { + birthdate: { + $gte: new Date(`${new Date().getFullYear() - 30}-01-01`), + }, + }, + { + birthdate: { + $lt: new Date(`${new Date().getFullYear() - 29}-01-01`), + }, + }, + ], + }, + projection: { name: 1, birthdate: 1 }, + }, + name: 'relative date find 2', + }, + { + prompt: buildFindQueryPrompt({ + userInput: 'get all docs where filter is true', + databaseName: 'delimiters', + collectionName: 'filter', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: { + filter: { filter: true }, + }, + name: 'boolean field find', + }, + { + prompt: buildFindQueryPrompt({ + userInput: + 'give me just the price and the first 3 amenities (in a field called amenities) of the listing has "Step-free access" in its amenities.', + databaseName: 'sample_airbnb', + collectionName: 'listingsAndReviews', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: { + filter: { amenities: 'Step-free access' }, + projection: { price: 1, amenities: { $slice: 3 } }, + }, + name: 'complex projection find', + }, + { + prompt: buildFindQueryPrompt({ + userInput: + 'Return only the Plate IDs of Acura vehicles registered in New York', + databaseName: 'NYC', + collectionName: 'parking_2015', + schema: {}, + // withSamples: true, + sampleDocuments: [], + }), + expectedOutput: { + filter: { + $and: [{ 'Vehicle Make': 'ACURA' }, { 'Registration State': 'NY' }], + }, + projection: { 'Plate ID': 1 }, + }, + name: 'with sample documents find', + }, + { + prompt: buildFindQueryPrompt({ + userInput: + '¿Qué alojamiento tiene el precio más bajo? devolver el número en un campo llamado "precio" en español', + databaseName: 'sample_airbnb', + collectionName: 'listingsAndReviews', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: { + projection: { _id: 0, precio: '$price' }, + sort: { precio: 1 }, + limit: 1, + }, + name: 'find with non-english prompt', + }, + { + prompt: buildFindQueryPrompt({ + userInput: + 'Write a query that does the following: find all of the parking incidents that occurred on an ave (match all ways to write ave). Return all of the plate ids involved with their summons number and vehicle make and body type. Put the vehicle make and body type into lower case. No _id, sorted by the summons number lowest first.', + databaseName: 'NYC', + collectionName: 'parking_2015', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: { + filter: { 'Street Name': { $regex: 'ave', $options: 'i' } }, + sort: { 'Summons Number': 1 }, + projection: { + 'Summons Number': 1, + 'Plate ID': 1, + 'Vehicle Make': { $toLower: '$Vehicle Make' }, + 'Vehicle Body Type': { $toLower: '$Vehicle Body Type' }, + _id: 0, + }, + }, + name: 'complex find with regex and string operators', + }, + { + prompt: buildFindQueryPrompt({ + userInput: 'return only the customer names', + databaseName: 'security', + collectionName: 'usergenerated', + schema: {}, + sampleDocuments: [], + }), + expectedOutput: { + projection: { customer_name: 1 }, + }, + name: 'simple projection find', + }, +]; diff --git a/packages/compass-generative-ai/src/evals/use-cases/index.ts b/packages/compass-generative-ai/src/evals/use-cases/index.ts new file mode 100644 index 00000000000..b644492f895 --- /dev/null +++ b/packages/compass-generative-ai/src/evals/use-cases/index.ts @@ -0,0 +1,4 @@ +import { findQueries } from './find-query'; +import { aggregateQueries } from './aggregate-query'; + +export const genAiUsecases = [...findQueries, ...aggregateQueries]; From 9b4c9b77d23b5da14772bffbd996a96130948539 Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Tue, 9 Dec 2025 01:12:17 +0300 Subject: [PATCH 22/35] fix alltext --- packages/compass-generative-ai/src/evals/gen-ai.eval.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/compass-generative-ai/src/evals/gen-ai.eval.ts b/packages/compass-generative-ai/src/evals/gen-ai.eval.ts index eab97e2a0a0..80f103f1bff 100644 --- a/packages/compass-generative-ai/src/evals/gen-ai.eval.ts +++ b/packages/compass-generative-ai/src/evals/gen-ai.eval.ts @@ -65,11 +65,9 @@ async function makeAssistantCall( }); const chunks: string[] = []; - for await (const chunk of result.toUIMessageStream()) { - const t = ((chunk as any).delta as string) || ''; - if (t) { - chunks.push(t); + if (chunk.type === 'text-delta') { + chunks.push(chunk.delta); } } return { @@ -78,7 +76,7 @@ async function makeAssistantCall( } function allText(messages: Message[]): string { - return messages.map((m) => m.text).join('\n'); + return messages.map((m) => m.content).join('\n'); } const Factuality: ConversationEvalScorer = ({ input, output, expected }) => { From 5e6d5374da722259e93c8d3bf04f3a5ecc2c5791 Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Tue, 9 Dec 2025 10:04:13 +0300 Subject: [PATCH 23/35] make expected output xml string --- .../src/evals/gen-ai.eval.ts | 13 +- .../src/evals/use-cases/aggregate-query.ts | 386 +++++++++--------- .../src/evals/use-cases/find-query.ts | 179 ++++---- 3 files changed, 287 insertions(+), 291 deletions(-) diff --git a/packages/compass-generative-ai/src/evals/gen-ai.eval.ts b/packages/compass-generative-ai/src/evals/gen-ai.eval.ts index 80f103f1bff..d056876e0f2 100644 --- a/packages/compass-generative-ai/src/evals/gen-ai.eval.ts +++ b/packages/compass-generative-ai/src/evals/gen-ai.eval.ts @@ -5,6 +5,8 @@ import { Eval } from 'braintrust'; import type { EvalScorer } from 'braintrust'; import { OpenAI } from 'openai'; import { genAiUsecases } from './use-cases'; +import { parseXmlToMmsJsonResponse } from '../utils/xml-to-mms-response'; +import { createNoopLogger } from '@mongodb-js/compass-logging/provider'; type Message = { content: string; @@ -79,11 +81,16 @@ function allText(messages: Message[]): string { return messages.map((m) => m.content).join('\n'); } +const logger = createNoopLogger(); const Factuality: ConversationEvalScorer = ({ input, output, expected }) => { return _Factuality({ input: allText(input.messages), - output: allText(output.messages), - expected: allText(expected.messages), + output: JSON.stringify( + parseXmlToMmsJsonResponse(allText(output.messages), logger) + ), + expected: JSON.stringify( + parseXmlToMmsJsonResponse(allText(expected.messages), logger) + ), model: 'gpt-4.1', temperature: undefined, }); @@ -103,7 +110,7 @@ void Eval< instructions: { content: usecase.prompt.metadata.instructions }, }, expected: { - messages: [{ content: JSON.stringify(usecase.expectedOutput) }], + messages: [{ content: usecase.expectedOutput }], }, }; }); diff --git a/packages/compass-generative-ai/src/evals/use-cases/aggregate-query.ts b/packages/compass-generative-ai/src/evals/use-cases/aggregate-query.ts index db7b0b6fbc8..3d9b8df2cd9 100644 --- a/packages/compass-generative-ai/src/evals/use-cases/aggregate-query.ts +++ b/packages/compass-generative-ai/src/evals/use-cases/aggregate-query.ts @@ -9,11 +9,9 @@ export const aggregateQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [ - { - $match: { year: 1983 }, - }, - ], + expectedOutput: ` + [{$match: {year: 1983}}] + `, name: 'basic aggregate query', }, { @@ -25,20 +23,14 @@ export const aggregateQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [ - { - $match: { title: { $regex: 'alien', $options: 'i' } }, - }, - { - $project: { _id: 1, title: 1, year: 1 }, - }, - { - $sort: { year: 1 }, - }, - { - $limit: 3, - }, - ], + expectedOutput: ` + [ + {$match: {title: {$regex: "alien", $options: "i"}}}, + {$project: {_id: 1, title: 1, year: 1}}, + {$sort: {year: 1}}, + {$limit: 3} + ] + `, name: 'aggregate with filter projection sort and limit', }, { @@ -50,12 +42,9 @@ export const aggregateQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [ - { - $match: { 'Violation Code': 21 }, - $project: { 'Plate ID': 1 }, - }, - ], + expectedOutput: ` + [{$match: {"Violation Code": 21}, $project: {"Plate ID": 1}}] + `, name: 'aggregate with filter and projection', }, { @@ -68,14 +57,12 @@ export const aggregateQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [ - { - $match: { _id: 'ObjectId("5ca652bf56618187558b4de3")' }, - }, - { - $project: { name: 1 }, - }, - ], + expectedOutput: ` + [ + {$match: {_id: ObjectId("5ca652bf56618187558b4de3")}}, + {$project: {name: 1}} + ] + `, name: 'geo-based aggregate', }, { @@ -87,16 +74,16 @@ export const aggregateQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [ - { + expectedOutput: ` + [{ $match: { $and: [ - { property_type: 'Hotel' }, - { 'review_scores.review_scores_rating': { $lte: 70 } }, - ], - }, - }, - ], + {property_type: "Hotel"}, + {"review_scores.review_scores_rating": {$lte: 70}} + ] + } + }] + `, name: 'complex aggregate with nested fields', }, { @@ -108,14 +95,14 @@ export const aggregateQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [ - { + expectedOutput: ` + [{ $group: { _id: null, - totalReviewsOverall: { $sum: '$number_of_reviews' }, - }, - }, - ], + totalReviewsOverall: {$sum: "$number_of_reviews"} + } + }] + `, name: 'aggregate with a group', }, { @@ -127,12 +114,14 @@ export const aggregateQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [ - { $group: { _id: '$beds', count: { $sum: 1 } } }, - { $sort: { count: -1 } }, - { $limit: 1 }, - { $project: { bedCount: '$_id' } }, - ], + expectedOutput: ` + [ + {$group: {_id: "$beds", count: {$sum: 1}}}, + {$sort: {count: -1}}, + {$limit: 1}, + {$project: {bedCount: "$_id"}} + ] + `, name: 'complex aggregate 1', }, { @@ -144,17 +133,14 @@ export const aggregateQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [ - { - $group: { - _id: '$host.host_id', - totalReviews: { $sum: '$number_of_reviews' }, - }, - }, - { $sort: { totalReviews: -1 } }, - { $limit: 1 }, - { $project: { hostId: '$_id' } }, - ], + expectedOutput: ` + [ + {$group: {_id: "$host.host_id", totalReviews: {$sum: "$number_of_reviews"}}}, + {$sort: {totalReviews: -1}}, + {$limit: 1}, + {$project: {hostId: "$_id"}} + ] + `, name: 'complex aggregate 2', }, { @@ -166,27 +152,23 @@ export const aggregateQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [ - { - $match: { - $and: [ - { - birthdate: { - $gte: new Date(`${new Date().getFullYear() - 30}-01-01`), - }, - }, - { - birthdate: { - $lt: new Date(`${new Date().getFullYear() - 29}-01-01`), - }, - }, - ], + expectedOutput: ` + [ + { + $match: { + $and: [ + {birthdate: {$gte: new Date("${ + new Date().getFullYear() - 30 + }-01-01")}}, + {birthdate: {$lt: new Date("${ + new Date().getFullYear() - 29 + }-01-01")}} + ] + } }, - }, - { - $project: { name: 1, birthdate: 1 }, - }, - ], + {$project: {name: 1, birthdate: 1}} + ] + `, name: 'relative date aggregate 1', }, { @@ -198,11 +180,9 @@ export const aggregateQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [ - { - $match: { year: new Date().getFullYear() - 1 }, - }, - ], + expectedOutput: ` + [{$match: {year: ${new Date().getFullYear() - 1}}}] + `, name: 'relative date aggregate 2', }, { @@ -214,10 +194,12 @@ export const aggregateQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [ - { $match: { amenities: 'Step-free access' } }, - { $project: { price: 1, amenities: { $slice: 3 } } }, - ], + expectedOutput: ` + [ + {$match: {amenities: "Step-free access"}}, + {$project: {price: 1, amenities: {$slice: 3}}} + ] + `, name: 'complex projection aggregate', }, { @@ -230,16 +212,12 @@ export const aggregateQueries = [ // withSamples: true, sampleDocuments: [], }), - expectedOutput: [ - { - $match: { - $and: [{ 'Vehicle Make': 'ACURA' }, { 'Registration State': 'NY' }], - }, - }, - { - $project: { 'Plate ID': 1 }, - }, - ], + expectedOutput: ` + [ + {$match: {$and: [{"Vehicle Make": "ACURA"}, {"Registration State": "NY"}]}}, + {$project: {"Plate ID": 1}} + ] + `, name: 'with sample documents aggregate', }, { @@ -251,13 +229,13 @@ export const aggregateQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [ - { - $project: { _id: 0, precio: '$price' }, - $sort: { price: 1 }, - $limit: 1, - }, - ], + expectedOutput: ` + [{ + $project: {_id: 0, precio: "$price"}, + $sort: {price: 1}, + $limit: 1 + }] + `, name: 'aggregate with non-english prompt', }, { @@ -269,11 +247,13 @@ export const aggregateQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [ - { $sort: { price: -1 } }, - { $project: { cancellation_policy: 1, 'host.host_url': 1 } }, - { $limit: 1 }, - ], + expectedOutput: ` + [ + {$sort: {price: -1}}, + {$project: {cancellation_policy: 1, "host.host_url": 1}}, + {$limit: 1} + ] + `, name: 'simple aggregate with sort and limit', }, { @@ -285,12 +265,14 @@ export const aggregateQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [ - { $unwind: '$items' }, - { $unwind: '$items.tags' }, - { $group: { _id: '$items.tags', avgPrice: { $avg: '$items.price' } } }, - { $project: { _id: 0, tag: '$_id', avgPrice: 1 } }, - ], + expectedOutput: ` + [ + {$unwind: "$items"}, + {$unwind: "$items.tags"}, + {$group: {_id: "$items.tags", avgPrice: {$avg: "$items.price"}}}, + {$project: {_id: 0, tag: "$_id", avgPrice: 1}} + ] + `, name: 'aggregate with unwind and group', }, { @@ -302,12 +284,14 @@ export const aggregateQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [ - { $project: { _id: 1, numAmenities: { $size: '$amenities' } } }, - { $sort: { numAmenities: -1 } }, - { $limit: 1 }, - { $project: { _id: 1 } }, - ], + expectedOutput: ` + [ + {$project: {_id: 1, numAmenities: {$size: "$amenities"}}}, + {$sort: {numAmenities: -1}}, + {$limit: 1}, + {$project: {_id: 1}} + ] + `, name: 'aggregate with size operator', }, { @@ -319,15 +303,17 @@ export const aggregateQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [ - { $match: { year: { $regex: '^(198[0-9]|199[0-9])$' } } }, - { $addFields: { titleWords: { $split: ['$title', ' '] } } }, - { $unwind: '$titleWords' }, - { $group: { _id: '$titleWords', count: { $sum: 1 } } }, - { $sort: { count: -1, _id: 1 } }, - { $limit: 5 }, - { $project: { _id: 0, count: 1, word: '$_id' } }, - ], + expectedOutput: ` + [ + {$match: {year: {$regex: "^(198[0-9]|199[0-9])$"}}}, + {$addFields: {titleWords: {$split: ["$title", " "]}}}, + {$unwind: "$titleWords"}, + {$group: {_id: "$titleWords", count: {$sum: 1}}}, + {$sort: {count: -1, _id: 1}}, + {$limit: 5}, + {$project: {_id: 0, count: 1, word: "$_id"}} + ] + `, name: 'aggregate with regex, addFields and split', }, { @@ -339,39 +325,41 @@ export const aggregateQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [ - { $match: { beds: { $gt: 2 } } }, - { - $group: { - _id: null, - totalListings: { $sum: 1 }, - withWasher: { - $sum: { - $cond: [{ $in: ['Washer', '$amenities'] }, 1, 0], - }, - }, + expectedOutput: ` + [ + {$match: {beds: {$gt: 2}}}, + { + $group: { + _id: null, + totalListings: {$sum: 1}, + withWasher: { + $sum: { + $cond: [{$in: ["Washer", "$amenities"]}, 1, 0] + } + } + } }, - }, - { - $project: { - washerPercentage: { - $concat: [ - { - $toString: { - $round: { - $multiply: [ - { $divide: ['$withWasher', '$totalListings'] }, - 100, - ], - }, + { + $project: { + washerPercentage: { + $concat: [ + { + $toString: { + $round: { + $multiply: [ + {$divide: ["$withWasher", "$totalListings"]}, + 100 + ] + } + } }, - }, - '%', - ], - }, - }, - }, - ], + "%" + ] + } + } + } + ] + `, name: 'super complex aggregate with complex project', }, { @@ -383,23 +371,21 @@ export const aggregateQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [ - { - $match: { 'Street Name': { $regex: 'ave', $options: 'i' } }, - }, - { - $sort: { 'Summons Number': 1 }, - }, - { - $project: { - 'Summons Number': 1, - 'Plate ID': 1, - 'Vehicle Make': { $toLower: '$Vehicle Make' }, - 'Vehicle Body Type': { $toLower: '$Vehicle Body Type' }, - _id: 0, - }, - }, - ], + expectedOutput: ` + [ + {$match: {"Street Name": {$regex: "ave", $options: "i"}}}, + {$sort: {"Summons Number": 1}}, + { + $project: { + "Summons Number": 1, + "Plate ID": 1, + "Vehicle Make": {$toLower: "$Vehicle Make"}, + "Vehicle Body Type": {$toLower: "$Vehicle Body Type"}, + _id: 0 + } + } + ] + `, name: 'complex aggregate with regex and string operators', }, { @@ -411,7 +397,7 @@ export const aggregateQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [ + expectedOutput: `[ { $lookup: { from: 'movies', @@ -422,7 +408,7 @@ export const aggregateQueries = [ }, { $unwind: '$movies' }, { $project: { movie_title: '$movies.title', comment_text: '$text' } }, - ], + ]`, name: 'prompt with sql join', }, { @@ -433,7 +419,9 @@ export const aggregateQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [{ $project: { customer_name: 1 } }], + expectedOutput: ` + [{$project: {customer_name: 1}}] + `, name: 'simple projection aggregate', }, { @@ -445,18 +433,20 @@ export const aggregateQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [ - { - $lookup: { - from: 'movies', - localField: 'movie_id', - foreignField: '_id', - as: 'movies', + expectedOutput: ` + [ + { + $lookup: { + from: "movies", + localField: "movie_id", + foreignField: "_id", + as: "movies" + } }, - }, - { $unwind: '$movies' }, - { $project: { movie_title: '$movies.title', comment_text: '$text' } }, - ], + {$unwind: "$movies"}, + {$project: {movie_title: "$movies.title", comment_text: "$text"}} + ] + `, name: 'prompt with sql join', }, ]; diff --git a/packages/compass-generative-ai/src/evals/use-cases/find-query.ts b/packages/compass-generative-ai/src/evals/use-cases/find-query.ts index 9b4d8f7c525..6c8dbc33214 100644 --- a/packages/compass-generative-ai/src/evals/use-cases/find-query.ts +++ b/packages/compass-generative-ai/src/evals/use-cases/find-query.ts @@ -9,9 +9,7 @@ export const findQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: { - filter: { year: 1983 }, - }, + expectedOutput: `{year: 1983}`, name: 'simple find', }, { @@ -23,12 +21,12 @@ export const findQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: { - filter: { title: { $regex: 'alien', $options: 'i' } }, - projection: { _id: 1, title: 1, year: 1 }, - sort: { year: 1 }, - limit: 3, - }, + expectedOutput: ` + {title: {$regex: "alien", $options: "i"}} + {_id: 1, title: 1, year: 1} + {year: 1} + 3 + `, name: 'find with filter projection sort and limit', }, { @@ -40,10 +38,10 @@ export const findQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: { - filter: { 'Violation Code': 21 }, - projection: { 'Plate ID': 1 }, - }, + expectedOutput: ` + {"Violation Code": 21} + {"Plate ID": 1} + `, name: 'find with filter and projection', }, { @@ -55,10 +53,10 @@ export const findQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: { - filter: { _id: 'ObjectId("5ca652bf56618187558b4de3")' }, - projection: { name: 1 }, - }, + expectedOutput: ` + {_id: 'ObjectId("5ca652bf56618187558b4de3")'} + {name: 1} + `, name: 'geo-based find', }, { @@ -70,14 +68,14 @@ export const findQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: { - filter: { + expectedOutput: ` + { $and: [ - { property_type: 'Hotel' }, - { 'review_scores.review_scores_rating': { $lte: 70 } }, - ], - }, - }, + { property_type: "Hotel" }, + { "review_scores.review_scores_rating": { $lte: 70 } } + ] + } + `, name: 'complex find with nested fields', }, { @@ -89,12 +87,14 @@ export const findQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [ - { $group: { _id: '$beds', count: { $sum: 1 } } }, - { $sort: { count: -1 } }, - { $limit: 1 }, - { $project: { bedCount: '$_id' } }, - ], + expectedOutput: ` + [ + { $group: { _id: "$beds", count: { $sum: 1 } } }, + { $sort: { count: -1 } }, + { $limit: 1 }, + { $project: { bedCount: "$_id" } } + ] + `, name: 'find query that translates to aggregation 1', }, { @@ -106,14 +106,15 @@ export const findQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [ - { - $group: { - _id: null, - totalReviewsOverall: { $sum: '$number_of_reviews' }, - }, - }, - ], + expectedOutput: `[ + { + $group: { + _id: null, + totalReviewsOverall: { $sum: "$number_of_reviews" } + } + } + ] + `, name: 'find query that translates to aggregation 2', }, { @@ -125,17 +126,17 @@ export const findQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: [ + expectedOutput: `[ { $group: { - _id: '$host.host_id', - totalReviews: { $sum: '$number_of_reviews' }, - }, + _id: "$host.host_id", + totalReviews: { $sum: "$number_of_reviews" } + } }, { $sort: { totalReviews: -1 } }, { $limit: 1 }, - { $project: { hostId: '$_id' } }, - ], + { $project: { hostId: "$_id" } } + ]`, name: 'find query that translates to aggregation 3', }, { @@ -147,9 +148,7 @@ export const findQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: { - filter: { year: new Date().getFullYear() - 1 }, - }, + expectedOutput: `{year: ${new Date().getFullYear() - 1}}`, name: 'relative date find 1', }, { @@ -161,23 +160,22 @@ export const findQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: { - filter: { + expectedOutput: `{ $and: [ { birthdate: { - $gte: new Date(`${new Date().getFullYear() - 30}-01-01`), - }, + $gte: new Date("${new Date().getFullYear() - 30}-01-01") + } }, { birthdate: { - $lt: new Date(`${new Date().getFullYear() - 29}-01-01`), - }, - }, - ], - }, - projection: { name: 1, birthdate: 1 }, - }, + $lt: new Date("${new Date().getFullYear() - 29}-01-01") + } + } + ] + } + {name: 1, birthdate: 1} + `, name: 'relative date find 2', }, { @@ -188,9 +186,7 @@ export const findQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: { - filter: { filter: true }, - }, + expectedOutput: `{filter: true}`, name: 'boolean field find', }, { @@ -202,10 +198,10 @@ export const findQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: { - filter: { amenities: 'Step-free access' }, - projection: { price: 1, amenities: { $slice: 3 } }, - }, + expectedOutput: ` + {amenities: "Step-free access"} + {price: 1, amenities: {$slice: 3}} + `, name: 'complex projection find', }, { @@ -218,12 +214,17 @@ export const findQueries = [ // withSamples: true, sampleDocuments: [], }), - expectedOutput: { - filter: { - $and: [{ 'Vehicle Make': 'ACURA' }, { 'Registration State': 'NY' }], - }, - projection: { 'Plate ID': 1 }, - }, + expectedOutput: ` + + { + $and: [ + {"Vehicle Make": "ACURA"}, + {"Registration State": "NY"} + ] + } + + {"Plate ID": 1} + `, name: 'with sample documents find', }, { @@ -235,11 +236,11 @@ export const findQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: { - projection: { _id: 0, precio: '$price' }, - sort: { precio: 1 }, - limit: 1, - }, + expectedOutput: ` + {_id: 0, precio: "$price"} + {precio: 1} + 1 + `, name: 'find with non-english prompt', }, { @@ -251,17 +252,17 @@ export const findQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: { - filter: { 'Street Name': { $regex: 'ave', $options: 'i' } }, - sort: { 'Summons Number': 1 }, - projection: { - 'Summons Number': 1, - 'Plate ID': 1, - 'Vehicle Make': { $toLower: '$Vehicle Make' }, - 'Vehicle Body Type': { $toLower: '$Vehicle Body Type' }, - _id: 0, - }, - }, + expectedOutput: ` + {"Street Name": {$regex: "ave", $options: "i"}} + {"Summons Number": 1} + { + "Summons Number": 1, + "Plate ID": 1, + "Vehicle Make": {$toLower: "$Vehicle Make"}, + "Vehicle Body Type": {$toLower: "$Vehicle Body Type"}, + _id: 0 + } + `, name: 'complex find with regex and string operators', }, { @@ -272,9 +273,7 @@ export const findQueries = [ schema: {}, sampleDocuments: [], }), - expectedOutput: { - projection: { customer_name: 1 }, - }, + expectedOutput: `{customer_name: 1}`, name: 'simple projection find', }, ]; From d1b0b513c1cdcd0048a0fd6f5677f7d9d686ba9b Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Wed, 10 Dec 2025 16:38:08 +0300 Subject: [PATCH 24/35] add fixtures and run gen ai eval tests --- .../src/evals/gen-ai.eval.ts | 120 -- .../src/evals/use-cases/aggregate-query.ts | 452 ----- .../src/evals/use-cases/find-query.ts | 279 --- .../src/evals/use-cases/index.ts | 4 - .../tests/evals/chatbot-api.ts | 51 + .../evals/fixtures/NYC.parking_2015.json | 1244 ++++++++++++++ .../fixtures/airbnb.listingsAndReviews.json | 1491 +++++++++++++++++ .../evals/fixtures/berlin.cocktailbars.json | 262 +++ .../evals/fixtures/netflix.comments.json | 940 +++++++++++ .../tests/evals/fixtures/netflix.movies.json | 346 ++++ .../tests/evals/gen-ai.eval.ts | 23 + .../tests/evals/scorers.ts | 25 + .../tests/evals/types.ts | 27 + .../tests/evals/use-cases/aggregate-query.ts | 301 ++++ .../tests/evals/use-cases/find-query.ts | 188 +++ .../tests/evals/use-cases/index.ts | 97 ++ .../tests/evals/utils.ts | 36 + 17 files changed, 5031 insertions(+), 855 deletions(-) delete mode 100644 packages/compass-generative-ai/src/evals/gen-ai.eval.ts delete mode 100644 packages/compass-generative-ai/src/evals/use-cases/aggregate-query.ts delete mode 100644 packages/compass-generative-ai/src/evals/use-cases/find-query.ts delete mode 100644 packages/compass-generative-ai/src/evals/use-cases/index.ts create mode 100644 packages/compass-generative-ai/tests/evals/chatbot-api.ts create mode 100644 packages/compass-generative-ai/tests/evals/fixtures/NYC.parking_2015.json create mode 100644 packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.json create mode 100644 packages/compass-generative-ai/tests/evals/fixtures/berlin.cocktailbars.json create mode 100644 packages/compass-generative-ai/tests/evals/fixtures/netflix.comments.json create mode 100644 packages/compass-generative-ai/tests/evals/fixtures/netflix.movies.json create mode 100644 packages/compass-generative-ai/tests/evals/gen-ai.eval.ts create mode 100644 packages/compass-generative-ai/tests/evals/scorers.ts create mode 100644 packages/compass-generative-ai/tests/evals/types.ts create mode 100644 packages/compass-generative-ai/tests/evals/use-cases/aggregate-query.ts create mode 100644 packages/compass-generative-ai/tests/evals/use-cases/find-query.ts create mode 100644 packages/compass-generative-ai/tests/evals/use-cases/index.ts create mode 100644 packages/compass-generative-ai/tests/evals/utils.ts diff --git a/packages/compass-generative-ai/src/evals/gen-ai.eval.ts b/packages/compass-generative-ai/src/evals/gen-ai.eval.ts deleted file mode 100644 index d056876e0f2..00000000000 --- a/packages/compass-generative-ai/src/evals/gen-ai.eval.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { createOpenAI } from '@ai-sdk/openai'; -import { streamText } from 'ai'; -import { init, Factuality as _Factuality } from 'autoevals'; -import { Eval } from 'braintrust'; -import type { EvalScorer } from 'braintrust'; -import { OpenAI } from 'openai'; -import { genAiUsecases } from './use-cases'; -import { parseXmlToMmsJsonResponse } from '../utils/xml-to-mms-response'; -import { createNoopLogger } from '@mongodb-js/compass-logging/provider'; - -type Message = { - content: string; -}; -type InputMessage = Message & { role: 'user' | 'assistant' | 'system' }; -type OutputMessage = Message; -type ExpectedMessage = OutputMessage; - -type ConversationEvalCaseInput = { - messages: InputMessage[]; - instructions: Message; -}; - -type ConversationEvalCaseExpected = { - messages: OutputMessage[]; -}; - -type ConversationTaskOutput = { - messages: ExpectedMessage[]; -}; - -type ConversationEvalScorer = EvalScorer< - ConversationEvalCaseInput, - ConversationTaskOutput, - ConversationEvalCaseExpected ->; - -const client = new OpenAI({ - baseURL: 'https://api.braintrust.dev/v1/proxy', - apiKey: process.env.BRAINTRUST_API_KEY, -}); - -init({ client }); - -async function makeAssistantCall( - input: ConversationEvalCaseInput -): Promise { - const openai = createOpenAI({ - baseURL: - process.env.COMPASS_ASSISTANT_BASE_URL_OVERRIDE ?? - 'https://knowledge.mongodb.com/api/v1', - apiKey: '', - headers: { - 'X-Request-Origin': 'compass-assistant-braintrust', - 'User-Agent': 'mongodb-compass/x.x.x', - }, - }); - const result = streamText({ - model: openai.responses('mongodb-chat-latest'), - temperature: undefined, - prompt: input.messages, - providerOptions: { - openai: { - instructions: input.instructions.content, - store: false, - }, - }, - }); - - const chunks: string[] = []; - for await (const chunk of result.toUIMessageStream()) { - if (chunk.type === 'text-delta') { - chunks.push(chunk.delta); - } - } - return { - messages: [{ content: chunks.join('') }], - }; -} - -function allText(messages: Message[]): string { - return messages.map((m) => m.content).join('\n'); -} - -const logger = createNoopLogger(); -const Factuality: ConversationEvalScorer = ({ input, output, expected }) => { - return _Factuality({ - input: allText(input.messages), - output: JSON.stringify( - parseXmlToMmsJsonResponse(allText(output.messages), logger) - ), - expected: JSON.stringify( - parseXmlToMmsJsonResponse(allText(expected.messages), logger) - ), - model: 'gpt-4.1', - temperature: undefined, - }); -}; - -void Eval< - ConversationEvalCaseInput, - ConversationTaskOutput, - ConversationEvalCaseExpected ->('Compass Gen AI', { - data: () => { - return genAiUsecases.map((usecase) => { - return { - name: usecase.name, - input: { - messages: [{ content: usecase.prompt.prompt, role: 'user' }], - instructions: { content: usecase.prompt.metadata.instructions }, - }, - expected: { - messages: [{ content: usecase.expectedOutput }], - }, - }; - }); - }, - task: makeAssistantCall, - scores: [Factuality], -}); diff --git a/packages/compass-generative-ai/src/evals/use-cases/aggregate-query.ts b/packages/compass-generative-ai/src/evals/use-cases/aggregate-query.ts deleted file mode 100644 index 3d9b8df2cd9..00000000000 --- a/packages/compass-generative-ai/src/evals/use-cases/aggregate-query.ts +++ /dev/null @@ -1,452 +0,0 @@ -import { buildAggregateQueryPrompt } from '../../utils/gen-ai-prompt'; - -export const aggregateQueries = [ - { - prompt: buildAggregateQueryPrompt({ - userInput: 'find all the movies released in 1983', - databaseName: 'netflix', - collectionName: 'movies', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - [{$match: {year: 1983}}] - `, - name: 'basic aggregate query', - }, - { - prompt: buildAggregateQueryPrompt({ - userInput: - 'find three movies with alien in the title, show earliest movies first, only the _id, title and year', - databaseName: 'netflix', - collectionName: 'movies', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - [ - {$match: {title: {$regex: "alien", $options: "i"}}}, - {$project: {_id: 1, title: 1, year: 1}}, - {$sort: {year: 1}}, - {$limit: 3} - ] - `, - name: 'aggregate with filter projection sort and limit', - }, - { - prompt: buildAggregateQueryPrompt({ - userInput: - 'find all the violations for the violation code 21 and only return the car plate', - databaseName: 'NYC', - collectionName: 'parking_2015', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - [{$match: {"Violation Code": 21}, $project: {"Plate ID": 1}}] - `, - name: 'aggregate with filter and projection', - }, - { - prompt: buildAggregateQueryPrompt({ - // TODO: check this - userInput: - 'find all the bars 10km from the berlin center, only return their names', - databaseName: 'berlin', - collectionName: 'cocktailbars', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - [ - {$match: {_id: ObjectId("5ca652bf56618187558b4de3")}}, - {$project: {name: 1}} - ] - `, - name: 'geo-based aggregate', - }, - { - prompt: buildAggregateQueryPrompt({ - userInput: - 'Return all the properties of type "Hotel" and with ratings lte 70', - databaseName: 'sample_airbnb', - collectionName: 'listingsAndReviews', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - [{ - $match: { - $and: [ - {property_type: "Hotel"}, - {"review_scores.review_scores_rating": {$lte: 70}} - ] - } - }] - `, - name: 'complex aggregate with nested fields', - }, - { - prompt: buildAggregateQueryPrompt({ - userInput: - 'what is the bed count that occurs the most? return it in a field called bedCount (only return the bedCount field)', - databaseName: 'sample_airbnb', - collectionName: 'listingsAndReviews', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - [{ - $group: { - _id: null, - totalReviewsOverall: {$sum: "$number_of_reviews"} - } - }] - `, - name: 'aggregate with a group', - }, - { - prompt: buildAggregateQueryPrompt({ - userInput: - 'what is the bed count that occurs the most? return it in a field called bedCount (only return the bedCount field)', - databaseName: 'sample_airbnb', - collectionName: 'listingsAndReviews', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - [ - {$group: {_id: "$beds", count: {$sum: 1}}}, - {$sort: {count: -1}}, - {$limit: 1}, - {$project: {bedCount: "$_id"}} - ] - `, - name: 'complex aggregate 1', - }, - { - prompt: buildAggregateQueryPrompt({ - userInput: - 'which host id has the most reviews across all listings? return it in a field called hostId', - databaseName: 'sample_airbnb', - collectionName: 'listingsAndReviews', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - [ - {$group: {_id: "$host.host_id", totalReviews: {$sum: "$number_of_reviews"}}}, - {$sort: {totalReviews: -1}}, - {$limit: 1}, - {$project: {hostId: "$_id"}} - ] - `, - name: 'complex aggregate 2', - }, - { - prompt: buildAggregateQueryPrompt({ - userInput: - 'Which customers will be 30 in this calendar year (jan to dec)? return name and birthdate', - databaseName: 'sample_analytics', - collectionName: 'customers', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - [ - { - $match: { - $and: [ - {birthdate: {$gte: new Date("${ - new Date().getFullYear() - 30 - }-01-01")}}, - {birthdate: {$lt: new Date("${ - new Date().getFullYear() - 29 - }-01-01")}} - ] - } - }, - {$project: {name: 1, birthdate: 1}} - ] - `, - name: 'relative date aggregate 1', - }, - { - prompt: buildAggregateQueryPrompt({ - userInput: - 'Give me all of the documents of sightings that happened last year, no _id', - databaseName: 'UFO', - collectionName: 'sightings', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - [{$match: {year: ${new Date().getFullYear() - 1}}}] - `, - name: 'relative date aggregate 2', - }, - { - prompt: buildAggregateQueryPrompt({ - userInput: - 'give me just the price and the first 3 amenities (in a field called amenities) of the listing has "Step-free access" in its amenities.', - databaseName: 'sample_airbnb', - collectionName: 'listingsAndReviews', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - [ - {$match: {amenities: "Step-free access"}}, - {$project: {price: 1, amenities: {$slice: 3}}} - ] - `, - name: 'complex projection aggregate', - }, - { - prompt: buildAggregateQueryPrompt({ - userInput: - 'Return only the Plate IDs of Acura vehicles registered in New York', - databaseName: 'NYC', - collectionName: 'parking_2015', - schema: {}, - // withSamples: true, - sampleDocuments: [], - }), - expectedOutput: ` - [ - {$match: {$and: [{"Vehicle Make": "ACURA"}, {"Registration State": "NY"}]}}, - {$project: {"Plate ID": 1}} - ] - `, - name: 'with sample documents aggregate', - }, - { - prompt: buildAggregateQueryPrompt({ - userInput: - '¿Qué alojamiento tiene el precio más bajo? devolver el número en un campo llamado "precio"', - databaseName: 'sample_airbnb', - collectionName: 'listingsAndReviews', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - [{ - $project: {_id: 0, precio: "$price"}, - $sort: {price: 1}, - $limit: 1 - }] - `, - name: 'aggregate with non-english prompt', - }, - { - prompt: buildAggregateQueryPrompt({ - userInput: - 'give only me the cancellation policy and host url of the most expensive listing', - databaseName: 'sample_airbnb', - collectionName: 'listingsAndReviews', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - [ - {$sort: {price: -1}}, - {$project: {cancellation_policy: 1, "host.host_url": 1}}, - {$limit: 1} - ] - `, - name: 'simple aggregate with sort and limit', - }, - { - prompt: buildAggregateQueryPrompt({ - userInput: - 'get the average price of all the items for each distinct tag, the resulting documents should only have 2 properties tag and avgPrice', - databaseName: 'sample_supplies', - collectionName: 'sales', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - [ - {$unwind: "$items"}, - {$unwind: "$items.tags"}, - {$group: {_id: "$items.tags", avgPrice: {$avg: "$items.price"}}}, - {$project: {_id: 0, tag: "$_id", avgPrice: 1}} - ] - `, - name: 'aggregate with unwind and group', - }, - { - prompt: buildAggregateQueryPrompt({ - userInput: - 'which listing has the most amenities? the resulting documents should only have the _id', - databaseName: 'sample_airbnb', - collectionName: 'listingsAndReviews', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - [ - {$project: {_id: 1, numAmenities: {$size: "$amenities"}}}, - {$sort: {numAmenities: -1}}, - {$limit: 1}, - {$project: {_id: 1}} - ] - `, - name: 'aggregate with size operator', - }, - { - prompt: buildAggregateQueryPrompt({ - userInput: - 'What are the 5 most frequent words (case sensitive) used in movie titles in the 1980s and 1990s combined? Sorted first by frequency count then alphabetically. output fields count and word', - databaseName: 'netflix', - collectionName: 'movies', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - [ - {$match: {year: {$regex: "^(198[0-9]|199[0-9])$"}}}, - {$addFields: {titleWords: {$split: ["$title", " "]}}}, - {$unwind: "$titleWords"}, - {$group: {_id: "$titleWords", count: {$sum: 1}}}, - {$sort: {count: -1, _id: 1}}, - {$limit: 5}, - {$project: {_id: 0, count: 1, word: "$_id"}} - ] - `, - name: 'aggregate with regex, addFields and split', - }, - { - prompt: buildAggregateQueryPrompt({ - userInput: - 'what percentage of listings have a "Washer" in their amenities? Only consider listings with more than 2 beds. Return is as a string named "washerPercentage" like "75%", rounded to the nearest whole number.', - databaseName: 'sample_airbnb', - collectionName: 'listingsAndReviews', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - [ - {$match: {beds: {$gt: 2}}}, - { - $group: { - _id: null, - totalListings: {$sum: 1}, - withWasher: { - $sum: { - $cond: [{$in: ["Washer", "$amenities"]}, 1, 0] - } - } - } - }, - { - $project: { - washerPercentage: { - $concat: [ - { - $toString: { - $round: { - $multiply: [ - {$divide: ["$withWasher", "$totalListings"]}, - 100 - ] - } - } - }, - "%" - ] - } - } - } - ] - `, - name: 'super complex aggregate with complex project', - }, - { - prompt: buildAggregateQueryPrompt({ - userInput: - 'Write a query that does the following: find all of the parking incidents that occurred on an ave (match all ways to write ave). Return all of the plate ids involved with their summons number and vehicle make and body type. Put the vehicle make and body type into lower case. No _id, sorted by the summons number lowest first.', - databaseName: 'NYC', - collectionName: 'parking_2015', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - [ - {$match: {"Street Name": {$regex: "ave", $options: "i"}}}, - {$sort: {"Summons Number": 1}}, - { - $project: { - "Summons Number": 1, - "Plate ID": 1, - "Vehicle Make": {$toLower: "$Vehicle Make"}, - "Vehicle Body Type": {$toLower: "$Vehicle Body Type"}, - _id: 0 - } - } - ] - `, - name: 'complex aggregate with regex and string operators', - }, - { - prompt: buildAggregateQueryPrompt({ - userInput: - 'join with "movies" based on a movie_id and return one document for each comment with movie_title (from movie.title) and comment_text', - databaseName: 'netflix', - collectionName: 'comments', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: `[ - { - $lookup: { - from: 'movies', - localField: 'movie_id', - foreignField: '_id', - as: 'movies', - }, - }, - { $unwind: '$movies' }, - { $project: { movie_title: '$movies.title', comment_text: '$text' } }, - ]`, - name: 'prompt with sql join', - }, - { - prompt: buildAggregateQueryPrompt({ - userInput: 'return only the customer names', - databaseName: 'security', - collectionName: 'usergenerated', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - [{$project: {customer_name: 1}}] - `, - name: 'simple projection aggregate', - }, - { - prompt: buildAggregateQueryPrompt({ - userInput: - 'find all documents where the boolean field "isActive" is true', - databaseName: 'sample_db', - collectionName: 'users', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - [ - { - $lookup: { - from: "movies", - localField: "movie_id", - foreignField: "_id", - as: "movies" - } - }, - {$unwind: "$movies"}, - {$project: {movie_title: "$movies.title", comment_text: "$text"}} - ] - `, - name: 'prompt with sql join', - }, -]; diff --git a/packages/compass-generative-ai/src/evals/use-cases/find-query.ts b/packages/compass-generative-ai/src/evals/use-cases/find-query.ts deleted file mode 100644 index 6c8dbc33214..00000000000 --- a/packages/compass-generative-ai/src/evals/use-cases/find-query.ts +++ /dev/null @@ -1,279 +0,0 @@ -import { buildFindQueryPrompt } from '../../utils/gen-ai-prompt'; - -export const findQueries = [ - { - prompt: buildFindQueryPrompt({ - userInput: 'find all the movies released in 1983', - databaseName: 'netflix', - collectionName: 'movies', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: `{year: 1983}`, - name: 'simple find', - }, - { - prompt: buildFindQueryPrompt({ - userInput: - 'find three movies with alien in the title, show earliest movies first, only the _id, title and year', - databaseName: 'netflix', - collectionName: 'movies', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - {title: {$regex: "alien", $options: "i"}} - {_id: 1, title: 1, year: 1} - {year: 1} - 3 - `, - name: 'find with filter projection sort and limit', - }, - { - prompt: buildFindQueryPrompt({ - userInput: - 'find all users older than 30 and younger than 50, only return their name and age', - databaseName: 'appdata', - collectionName: 'users', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - {"Violation Code": 21} - {"Plate ID": 1} - `, - name: 'find with filter and projection', - }, - { - prompt: buildFindQueryPrompt({ - userInput: - 'find all the bars 10km from the berlin center, only return their names', - databaseName: 'berlin', - collectionName: 'cocktailbars', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - {_id: 'ObjectId("5ca652bf56618187558b4de3")'} - {name: 1} - `, - name: 'geo-based find', - }, - { - prompt: buildFindQueryPrompt({ - userInput: - 'Return all the properties of type "Hotel" and with ratings lte 70', - databaseName: 'sample_airbnb', - collectionName: 'listingsAndReviews', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - { - $and: [ - { property_type: "Hotel" }, - { "review_scores.review_scores_rating": { $lte: 70 } } - ] - } - `, - name: 'complex find with nested fields', - }, - { - prompt: buildFindQueryPrompt({ - userInput: - 'what is the bed count that occurs the most? return it in a field called bedCount (only return the bedCount field)', - databaseName: 'sample_airbnb', - collectionName: 'listingsAndReviews', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - [ - { $group: { _id: "$beds", count: { $sum: 1 } } }, - { $sort: { count: -1 } }, - { $limit: 1 }, - { $project: { bedCount: "$_id" } } - ] - `, - name: 'find query that translates to aggregation 1', - }, - { - prompt: buildFindQueryPrompt({ - userInput: - 'whats the total number of reviews across all listings? return it in a field called totalReviewsOverall', - databaseName: 'sample_airbnb', - collectionName: 'listingsAndReviews', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: `[ - { - $group: { - _id: null, - totalReviewsOverall: { $sum: "$number_of_reviews" } - } - } - ] - `, - name: 'find query that translates to aggregation 2', - }, - { - prompt: buildFindQueryPrompt({ - userInput: - 'which host id has the most reviews across all listings? return it in a field called hostId', - databaseName: 'sample_airbnb', - collectionName: 'listingsAndReviews', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: `[ - { - $group: { - _id: "$host.host_id", - totalReviews: { $sum: "$number_of_reviews" } - } - }, - { $sort: { totalReviews: -1 } }, - { $limit: 1 }, - { $project: { hostId: "$_id" } } - ]`, - name: 'find query that translates to aggregation 3', - }, - { - prompt: buildFindQueryPrompt({ - userInput: - 'find all of the documents of sightings that happened last year, no _id', - databaseName: 'UFO', - collectionName: 'sightings', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: `{year: ${new Date().getFullYear() - 1}}`, - name: 'relative date find 1', - }, - { - prompt: buildFindQueryPrompt({ - userInput: - 'Which customers will be 30 in this calendar year (jan to dec)? return name and birthdate', - databaseName: 'sample_analytics', - collectionName: 'customers', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: `{ - $and: [ - { - birthdate: { - $gte: new Date("${new Date().getFullYear() - 30}-01-01") - } - }, - { - birthdate: { - $lt: new Date("${new Date().getFullYear() - 29}-01-01") - } - } - ] - } - {name: 1, birthdate: 1} - `, - name: 'relative date find 2', - }, - { - prompt: buildFindQueryPrompt({ - userInput: 'get all docs where filter is true', - databaseName: 'delimiters', - collectionName: 'filter', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: `{filter: true}`, - name: 'boolean field find', - }, - { - prompt: buildFindQueryPrompt({ - userInput: - 'give me just the price and the first 3 amenities (in a field called amenities) of the listing has "Step-free access" in its amenities.', - databaseName: 'sample_airbnb', - collectionName: 'listingsAndReviews', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - {amenities: "Step-free access"} - {price: 1, amenities: {$slice: 3}} - `, - name: 'complex projection find', - }, - { - prompt: buildFindQueryPrompt({ - userInput: - 'Return only the Plate IDs of Acura vehicles registered in New York', - databaseName: 'NYC', - collectionName: 'parking_2015', - schema: {}, - // withSamples: true, - sampleDocuments: [], - }), - expectedOutput: ` - - { - $and: [ - {"Vehicle Make": "ACURA"}, - {"Registration State": "NY"} - ] - } - - {"Plate ID": 1} - `, - name: 'with sample documents find', - }, - { - prompt: buildFindQueryPrompt({ - userInput: - '¿Qué alojamiento tiene el precio más bajo? devolver el número en un campo llamado "precio" en español', - databaseName: 'sample_airbnb', - collectionName: 'listingsAndReviews', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - {_id: 0, precio: "$price"} - {precio: 1} - 1 - `, - name: 'find with non-english prompt', - }, - { - prompt: buildFindQueryPrompt({ - userInput: - 'Write a query that does the following: find all of the parking incidents that occurred on an ave (match all ways to write ave). Return all of the plate ids involved with their summons number and vehicle make and body type. Put the vehicle make and body type into lower case. No _id, sorted by the summons number lowest first.', - databaseName: 'NYC', - collectionName: 'parking_2015', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: ` - {"Street Name": {$regex: "ave", $options: "i"}} - {"Summons Number": 1} - { - "Summons Number": 1, - "Plate ID": 1, - "Vehicle Make": {$toLower: "$Vehicle Make"}, - "Vehicle Body Type": {$toLower: "$Vehicle Body Type"}, - _id: 0 - } - `, - name: 'complex find with regex and string operators', - }, - { - prompt: buildFindQueryPrompt({ - userInput: 'return only the customer names', - databaseName: 'security', - collectionName: 'usergenerated', - schema: {}, - sampleDocuments: [], - }), - expectedOutput: `{customer_name: 1}`, - name: 'simple projection find', - }, -]; diff --git a/packages/compass-generative-ai/src/evals/use-cases/index.ts b/packages/compass-generative-ai/src/evals/use-cases/index.ts deleted file mode 100644 index b644492f895..00000000000 --- a/packages/compass-generative-ai/src/evals/use-cases/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { findQueries } from './find-query'; -import { aggregateQueries } from './aggregate-query'; - -export const genAiUsecases = [...findQueries, ...aggregateQueries]; diff --git a/packages/compass-generative-ai/tests/evals/chatbot-api.ts b/packages/compass-generative-ai/tests/evals/chatbot-api.ts new file mode 100644 index 00000000000..f666819b70e --- /dev/null +++ b/packages/compass-generative-ai/tests/evals/chatbot-api.ts @@ -0,0 +1,51 @@ +import { streamText } from 'ai'; +import { createOpenAI } from '@ai-sdk/openai'; +import { OpenAI } from 'openai'; +import { init } from 'autoevals'; +import type { + ConversationEvalCaseInput, + ConversationTaskOutput, +} from './types'; + +const client = new OpenAI({ + baseURL: 'https://api.braintrust.dev/v1/proxy', + apiKey: process.env.BRAINTRUST_API_KEY, +}); + +init({ client }); + +export async function makeChatbotCall( + input: ConversationEvalCaseInput +): Promise { + const openai = createOpenAI({ + baseURL: + process.env.COMPASS_ASSISTANT_BASE_URL_OVERRIDE ?? + 'https://knowledge.mongodb.com/api/v1', + apiKey: '', + headers: { + 'X-Request-Origin': 'compass-gen-ai-braintrust', + 'User-Agent': 'mongodb-compass/x.x.x', + }, + }); + const result = streamText({ + model: openai.responses('mongodb-slim-latest'), + temperature: undefined, + prompt: input.messages, + providerOptions: { + openai: { + instructions: input.instructions.content, + store: false, + }, + }, + }); + + const chunks: string[] = []; + for await (const chunk of result.toUIMessageStream()) { + if (chunk.type === 'text-delta') { + chunks.push(chunk.delta); + } + } + return { + messages: [{ content: chunks.join('') }], + }; +} diff --git a/packages/compass-generative-ai/tests/evals/fixtures/NYC.parking_2015.json b/packages/compass-generative-ai/tests/evals/fixtures/NYC.parking_2015.json new file mode 100644 index 00000000000..cacd3db054e --- /dev/null +++ b/packages/compass-generative-ai/tests/evals/fixtures/NYC.parking_2015.json @@ -0,0 +1,1244 @@ +[ + { + "_id": { + "$oid": "5735040085629ed4fa83946f" + }, + "Summons Number": { + "$numberLong": "7039084223" + }, + "Plate ID": "GSY3857", + "Registration State": "NY", + "Plate Type": "PAS", + "Issue Date": "01/31/2015", + "Violation Code": 38, + "Vehicle Body Type": "2DSD", + "Vehicle Make": "BMW", + "Issuing Agency": "T", + "Street Code1": 34030, + "Street Code2": 10910, + "Street Code3": 33390, + "Vehicle Expiration Date": "01/01/20160908 12:00:00 PM", + "Violation Location": 6, + "Violation Precinct": 6, + "Issuer Precinct": 6, + "Issuer Code": 340095, + "Issuer Command": "T800", + "Issuer Squad": "A2", + "Violation Time": "0941P", + "Time First Observed": "", + "Violation County": "NY", + "Violation In Front Of Or Opposite": "O", + "House Number": 416, + "Street Name": "W 13th St", + "Intersecting Street": "", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": "h1", + "Violation Legal Code": "", + "Days Parking In Effect": "Y", + "From Hours In Effect": "0700A", + "To Hours In Effect": "1100P", + "Vehicle Color": "BK", + "Unregistered Vehicle?": "", + "Vehicle Year": 2015, + "Meter Number": "", + "Feet From Curb": 0, + "Violation Post Code": "B 77", + "Violation Description": "38-Failure to Display Muni Rec", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa839470" + }, + "Summons Number": { + "$numberLong": "7057883730" + }, + "Plate ID": "AM485F", + "Registration State": "NJ", + "Plate Type": "PAS", + "Issue Date": "07/24/2014", + "Violation Code": 18, + "Vehicle Body Type": "DELV", + "Vehicle Make": "FRUEH", + "Issuing Agency": "T", + "Street Code1": 10110, + "Street Code2": 17490, + "Street Code3": 17510, + "Vehicle Expiration Date": "01/01/88888888 12:00:00 PM", + "Violation Location": 13, + "Violation Precinct": 13, + "Issuer Precinct": 13, + "Issuer Code": 345238, + "Issuer Command": "T102", + "Issuer Squad": "C", + "Violation Time": "0749A", + "Time First Observed": "", + "Violation County": "NY", + "Violation In Front Of Or Opposite": "O", + "House Number": 444, + "Street Name": "2nd Ave", + "Intersecting Street": "", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": "f4", + "Violation Legal Code": "", + "Days Parking In Effect": "YYYYY", + "From Hours In Effect": "0700A", + "To Hours In Effect": "1000A", + "Vehicle Color": "GREEN", + "Unregistered Vehicle?": "", + "Vehicle Year": 0, + "Meter Number": "", + "Feet From Curb": 0, + "Violation Post Code": "16 6", + "Violation Description": "18-No Stand (bus lane)", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa839471" + }, + "Summons Number": { + "$numberLong": "7972683426" + }, + "Plate ID": "40424MC", + "Registration State": "NY", + "Plate Type": "COM", + "Issue Date": "10/27/2014", + "Violation Code": 20, + "Vehicle Body Type": "SUBN", + "Vehicle Make": "ACURA", + "Issuing Agency": "T", + "Street Code1": 35570, + "Street Code2": 13610, + "Street Code3": 44990, + "Vehicle Expiration Date": "01/01/20141202 12:00:00 PM", + "Violation Location": 24, + "Violation Precinct": 24, + "Issuer Precinct": 24, + "Issuer Code": 361115, + "Issuer Command": "T103", + "Issuer Squad": "F", + "Violation Time": "1125A", + "Time First Observed": "", + "Violation County": "NY", + "Violation In Front Of Or Opposite": "O", + "House Number": 255, + "Street Name": "W 90th St", + "Intersecting Street": "", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": "d", + "Violation Legal Code": "", + "Days Parking In Effect": "Y", + "From Hours In Effect": "0800A", + "To Hours In Effect": "0600P", + "Vehicle Color": "BLACK", + "Unregistered Vehicle?": "", + "Vehicle Year": 2015, + "Meter Number": "", + "Feet From Curb": 0, + "Violation Post Code": "44 7", + "Violation Description": "20A-No Parking (Non-COM)", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa839472" + }, + "Summons Number": { + "$numberLong": "7638712493" + }, + "Plate ID": 443344, + "Registration State": "RI", + "Plate Type": "PAS", + "Issue Date": "09/16/2014", + "Violation Code": 38, + "Vehicle Body Type": "4DSD", + "Vehicle Make": "CHEVR", + "Issuing Agency": "T", + "Street Code1": 53790, + "Street Code2": 19740, + "Street Code3": 19840, + "Vehicle Expiration Date": "01/01/20140688 12:00:00 PM", + "Violation Location": 106, + "Violation Precinct": 106, + "Issuer Precinct": 106, + "Issuer Code": 331801, + "Issuer Command": "T402", + "Issuer Squad": "H", + "Violation Time": "1225P", + "Time First Observed": "", + "Violation County": "Q", + "Violation In Front Of Or Opposite": "F", + "House Number": "104-07", + "Street Name": "Liberty Ave", + "Intersecting Street": "", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": "h1", + "Violation Legal Code": "", + "Days Parking In Effect": "Y", + "From Hours In Effect": "0900A", + "To Hours In Effect": "0700P", + "Vehicle Color": "GREY", + "Unregistered Vehicle?": "", + "Vehicle Year": 0, + "Meter Number": "", + "Feet From Curb": 0, + "Violation Post Code": "24 4", + "Violation Description": "38-Failure to Display Muni Rec", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa839473" + }, + "Summons Number": { + "$numberLong": "7721537642" + }, + "Plate ID": "GMX1207", + "Registration State": "NY", + "Plate Type": "PAS", + "Issue Date": "09/18/2014", + "Violation Code": 38, + "Vehicle Body Type": "4DSD", + "Vehicle Make": "HONDA", + "Issuing Agency": "T", + "Street Code1": 8790, + "Street Code2": 17990, + "Street Code3": 18090, + "Vehicle Expiration Date": "01/01/20160202 12:00:00 PM", + "Violation Location": 115, + "Violation Precinct": 115, + "Issuer Precinct": 115, + "Issuer Code": 358644, + "Issuer Command": "T401", + "Issuer Squad": "R", + "Violation Time": "0433P", + "Time First Observed": "", + "Violation County": "Q", + "Violation In Front Of Or Opposite": "F", + "House Number": "88-22", + "Street Name": "37th Ave", + "Intersecting Street": "", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": "h1", + "Violation Legal Code": "", + "Days Parking In Effect": "Y", + "From Hours In Effect": "0830A", + "To Hours In Effect": "0700P", + "Vehicle Color": "BK", + "Unregistered Vehicle?": "", + "Vehicle Year": 2013, + "Meter Number": "", + "Feet From Curb": 0, + "Violation Post Code": "16 4", + "Violation Description": "38-Failure to Display Muni Rec", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa839474" + }, + "Summons Number": { + "$numberLong": "7899927729" + }, + "Plate ID": "63543JM", + "Registration State": "NY", + "Plate Type": "COM", + "Issue Date": "01/22/2015", + "Violation Code": 14, + "Vehicle Body Type": "VAN", + "Vehicle Make": "GMC", + "Issuing Agency": "T", + "Street Code1": 34890, + "Street Code2": 10410, + "Street Code3": 10510, + "Vehicle Expiration Date": "01/01/88888888 12:00:00 PM", + "Violation Location": 18, + "Violation Precinct": 18, + "Issuer Precinct": 18, + "Issuer Code": 353508, + "Issuer Command": "T106", + "Issuer Squad": "D", + "Violation Time": "0940A", + "Time First Observed": "", + "Violation County": "NY", + "Violation In Front Of Or Opposite": "F", + "House Number": 5, + "Street Name": "W 56th St", + "Intersecting Street": "", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": "c", + "Violation Legal Code": "", + "Days Parking In Effect": "YYYYYYY", + "From Hours In Effect": "", + "To Hours In Effect": "", + "Vehicle Color": "BROWN", + "Unregistered Vehicle?": "", + "Vehicle Year": 1990, + "Meter Number": "", + "Feet From Curb": 0, + "Violation Post Code": "18 6", + "Violation Description": "14-No Standing", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa839475" + }, + "Summons Number": { + "$numberLong": "7899927729" + }, + "Plate ID": "63543JM", + "Registration State": "NY", + "Plate Type": "COM", + "Issue Date": "01/22/2015", + "Violation Code": 14, + "Vehicle Body Type": "VAN", + "Vehicle Make": "GMC", + "Issuing Agency": "T", + "Street Code1": 34890, + "Street Code2": 10410, + "Street Code3": 10510, + "Vehicle Expiration Date": "01/01/88888888 12:00:00 PM", + "Violation Location": 18, + "Violation Precinct": 18, + "Issuer Precinct": 18, + "Issuer Code": 353508, + "Issuer Command": "T106", + "Issuer Squad": "D", + "Violation Time": "0940A", + "Time First Observed": "", + "Violation County": "NY", + "Violation In Front Of Or Opposite": "F", + "House Number": 5, + "Street Name": "W 56th St", + "Intersecting Street": "", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": "c", + "Violation Legal Code": "", + "Days Parking In Effect": "YYYYYYY", + "From Hours In Effect": "", + "To Hours In Effect": "", + "Vehicle Color": "BROWN", + "Unregistered Vehicle?": "", + "Vehicle Year": 1990, + "Meter Number": "", + "Feet From Curb": 0, + "Violation Post Code": "18 6", + "Violation Description": "14-No Standing", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa839476" + }, + "Summons Number": 1377047714, + "Plate ID": "T657080C", + "Registration State": "NY", + "Plate Type": "SRF", + "Issue Date": "02/12/2015", + "Violation Code": 46, + "Vehicle Body Type": "", + "Vehicle Make": "TOYOT", + "Issuing Agency": "P", + "Street Code1": 38643, + "Street Code2": 10440, + "Street Code3": 10490, + "Vehicle Expiration Date": "01/01/20150831 12:00:00 PM", + "Violation Location": 108, + "Violation Precinct": 108, + "Issuer Precinct": 108, + "Issuer Code": 952146, + "Issuer Command": 108, + "Issuer Squad": 0, + "Violation Time": "1035A", + "Time First Observed": "", + "Violation County": "Q", + "Violation In Front Of Or Opposite": "F", + "House Number": "47-20", + "Street Name": "CENTER BLVD", + "Intersecting Street": "", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": "F1", + "Violation Legal Code": "", + "Days Parking In Effect": "BBBBBBB", + "From Hours In Effect": "ALL", + "To Hours In Effect": "ALL", + "Vehicle Color": "BLK", + "Unregistered Vehicle?": 0, + "Vehicle Year": 2011, + "Meter Number": "-", + "Feet From Curb": 0, + "Violation Post Code": "", + "Violation Description": "", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa839477" + }, + "Summons Number": { + "$numberLong": "8028772766" + }, + "Plate ID": "84046MG", + "Registration State": "NY", + "Plate Type": "COM", + "Issue Date": "06/25/2015", + "Violation Code": 10, + "Vehicle Body Type": "DELV", + "Vehicle Make": "HINO", + "Issuing Agency": "T", + "Street Code1": 10610, + "Street Code2": 0, + "Street Code3": 0, + "Vehicle Expiration Date": "01/01/20160430 12:00:00 PM", + "Violation Location": 14, + "Violation Precinct": 14, + "Issuer Precinct": 14, + "Issuer Code": 361878, + "Issuer Command": "T102", + "Issuer Squad": "K", + "Violation Time": "0110P", + "Time First Observed": "", + "Violation County": "NY", + "Violation In Front Of Or Opposite": "I", + "House Number": "E", + "Street Name": "7th Ave", + "Intersecting Street": "35ft N/of W 42nd St", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": "b", + "Violation Legal Code": "", + "Days Parking In Effect": "YYYYYYY", + "From Hours In Effect": "", + "To Hours In Effect": "", + "Vehicle Color": "WH", + "Unregistered Vehicle?": "", + "Vehicle Year": 2015, + "Meter Number": "", + "Feet From Curb": 0, + "Violation Post Code": "MC 9", + "Violation Description": "10-No Stopping", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa839478" + }, + "Summons Number": { + "$numberLong": "7431929330" + }, + "Plate ID": "FHM2618", + "Registration State": "NY", + "Plate Type": "PAS", + "Issue Date": "03/12/2015", + "Violation Code": 38, + "Vehicle Body Type": "4DSD", + "Vehicle Make": "LEXUS", + "Issuing Agency": "T", + "Street Code1": 54580, + "Street Code2": 15290, + "Street Code3": 15190, + "Vehicle Expiration Date": "01/01/20170216 12:00:00 PM", + "Violation Location": 107, + "Violation Precinct": 107, + "Issuer Precinct": 107, + "Issuer Code": 361100, + "Issuer Command": "T402", + "Issuer Squad": "B", + "Violation Time": "0235P", + "Time First Observed": "", + "Violation County": "Q", + "Violation In Front Of Or Opposite": "O", + "House Number": "72-32", + "Street Name": "Main St", + "Intersecting Street": "", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": "h1", + "Violation Legal Code": "", + "Days Parking In Effect": "YYYYY", + "From Hours In Effect": "0800A", + "To Hours In Effect": "0700P", + "Vehicle Color": "LT/", + "Unregistered Vehicle?": "", + "Vehicle Year": 2008, + "Meter Number": "", + "Feet From Curb": 0, + "Violation Post Code": "06 4", + "Violation Description": "38-Failure to Display Muni Rec", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa839479" + }, + "Summons Number": { + "$numberLong": "7381962433" + }, + "Plate ID": "50204JT", + "Registration State": "NY", + "Plate Type": "COM", + "Issue Date": "02/20/2015", + "Violation Code": 17, + "Vehicle Body Type": "VAN", + "Vehicle Make": "CHEVR", + "Issuing Agency": "T", + "Street Code1": 93250, + "Street Code2": 52930, + "Street Code3": 54650, + "Vehicle Expiration Date": "01/01/88888888 12:00:00 PM", + "Violation Location": 84, + "Violation Precinct": 84, + "Issuer Precinct": 84, + "Issuer Code": 355301, + "Issuer Command": "T301", + "Issuer Squad": "C", + "Violation Time": "1012A", + "Time First Observed": "", + "Violation County": "K", + "Violation In Front Of Or Opposite": "F", + "House Number": 57, + "Street Name": "Willoughby St", + "Intersecting Street": "", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": "c4", + "Violation Legal Code": "", + "Days Parking In Effect": "YYYYYYY", + "From Hours In Effect": "", + "To Hours In Effect": "", + "Vehicle Color": "WHITE", + "Unregistered Vehicle?": "", + "Vehicle Year": 2005, + "Meter Number": "", + "Feet From Curb": 0, + "Violation Post Code": "03 3", + "Violation Description": "17-No Stand (exc auth veh)", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa83947a" + }, + "Summons Number": 1377361196, + "Plate ID": "GSA1316", + "Registration State": "NY", + "Plate Type": "PAS", + "Issue Date": "01/29/2015", + "Violation Code": 80, + "Vehicle Body Type": "SUBN", + "Vehicle Make": "HONDA", + "Issuing Agency": "P", + "Street Code1": 12120, + "Street Code2": 9720, + "Street Code3": 45720, + "Vehicle Expiration Date": "01/01/20160907 12:00:00 PM", + "Violation Location": 41, + "Violation Precinct": 41, + "Issuer Precinct": 41, + "Issuer Code": 936738, + "Issuer Command": 41, + "Issuer Squad": 0, + "Violation Time": "0216A", + "Time First Observed": "", + "Violation County": "BX", + "Violation In Front Of Or Opposite": "F", + "House Number": 687, + "Street Name": "BECK ST", + "Intersecting Street": "", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": 99, + "Violation Legal Code": "", + "Days Parking In Effect": "BBBBBBB", + "From Hours In Effect": "ALL", + "To Hours In Effect": "ALL", + "Vehicle Color": "GRAY", + "Unregistered Vehicle?": 0, + "Vehicle Year": 0, + "Meter Number": "-", + "Feet From Curb": 0, + "Violation Post Code": "", + "Violation Description": "", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa83947b" + }, + "Summons Number": { + "$numberLong": "7575556758" + }, + "Plate ID": "BXV8565", + "Registration State": "NY", + "Plate Type": "PAS", + "Issue Date": "10/29/2014", + "Violation Code": 37, + "Vehicle Body Type": "4DSD", + "Vehicle Make": "CHEVR", + "Issuing Agency": "T", + "Street Code1": 10210, + "Street Code2": 0, + "Street Code3": 0, + "Vehicle Expiration Date": "01/01/20160902 12:00:00 PM", + "Violation Location": 19, + "Violation Precinct": 19, + "Issuer Precinct": 19, + "Issuer Code": 356258, + "Issuer Command": "T103", + "Issuer Squad": "F", + "Violation Time": "0104P", + "Time First Observed": "1256P", + "Violation County": "NY", + "Violation In Front Of Or Opposite": "I", + "House Number": "W", + "Street Name": "3rd Ave", + "Intersecting Street": "12ft S/of E 90th St", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": "h1", + "Violation Legal Code": "", + "Days Parking In Effect": "Y", + "From Hours In Effect": "0800A", + "To Hours In Effect": "0700P", + "Vehicle Color": "GR", + "Unregistered Vehicle?": "", + "Vehicle Year": 1998, + "Meter Number": "120-8032", + "Feet From Curb": 0, + "Violation Post Code": "06 7", + "Violation Description": "37-Expired Muni Meter", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa83947c" + }, + "Summons Number": { + "$numberLong": "7462760484" + }, + "Plate ID": "EPH7313", + "Registration State": "NY", + "Plate Type": "PAS", + "Issue Date": "10/10/2014", + "Violation Code": 20, + "Vehicle Body Type": "SUBN", + "Vehicle Make": "TOYOT", + "Issuing Agency": "T", + "Street Code1": 5580, + "Street Code2": 5230, + "Street Code3": 5380, + "Vehicle Expiration Date": "01/01/20150201 12:00:00 PM", + "Violation Location": 78, + "Violation Precinct": 78, + "Issuer Precinct": 78, + "Issuer Code": 350415, + "Issuer Command": "T802", + "Issuer Squad": "B", + "Violation Time": "0824P", + "Time First Observed": "", + "Violation County": "K", + "Violation In Front Of Or Opposite": "F", + "House Number": 322, + "Street Name": "5th Ave", + "Intersecting Street": "", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": "d", + "Violation Legal Code": "", + "Days Parking In Effect": "YYYYYYY", + "From Hours In Effect": "", + "To Hours In Effect": "", + "Vehicle Color": "GY", + "Unregistered Vehicle?": "", + "Vehicle Year": 2009, + "Meter Number": "", + "Feet From Curb": 0, + "Violation Post Code": "G 31", + "Violation Description": "20A-No Parking (Non-COM)", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa83947d" + }, + "Summons Number": 1370095480, + "Plate ID": "GJZ3562", + "Registration State": "NY", + "Plate Type": "PAS", + "Issue Date": "08/07/2014", + "Violation Code": 21, + "Vehicle Body Type": "SDN", + "Vehicle Make": "HYUND", + "Issuing Agency": "S", + "Street Code1": 24830, + "Street Code2": 67030, + "Street Code3": 64830, + "Vehicle Expiration Date": "01/01/20151124 12:00:00 PM", + "Violation Location": 71, + "Violation Precinct": 71, + "Issuer Precinct": 0, + "Issuer Code": 537860, + "Issuer Command": "KN09", + "Issuer Squad": 0, + "Violation Time": "0842A", + "Time First Observed": "", + "Violation County": "K", + "Violation In Front Of Or Opposite": "F", + "House Number": 1197, + "Street Name": "CARROLL ST", + "Intersecting Street": "", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": "D1", + "Violation Legal Code": "", + "Days Parking In Effect": "YBBYBBB", + "From Hours In Effect": "0830A", + "To Hours In Effect": "1000A", + "Vehicle Color": "BLACK", + "Unregistered Vehicle?": 0, + "Vehicle Year": 2003, + "Meter Number": "-", + "Feet From Curb": 0, + "Violation Post Code": "", + "Violation Description": "", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa83947e" + }, + "Summons Number": { + "$numberLong": "7307439736" + }, + "Plate ID": "34976JS", + "Registration State": "NY", + "Plate Type": "COM", + "Issue Date": "08/15/2014", + "Violation Code": 37, + "Vehicle Body Type": "VAN", + "Vehicle Make": "CHEVR", + "Issuing Agency": "T", + "Street Code1": 10110, + "Street Code2": 18590, + "Street Code3": 18610, + "Vehicle Expiration Date": "01/01/20150131 12:00:00 PM", + "Violation Location": 19, + "Violation Precinct": 19, + "Issuer Precinct": 19, + "Issuer Code": 356214, + "Issuer Command": "T103", + "Issuer Squad": "O", + "Violation Time": "0848A", + "Time First Observed": "0842A", + "Violation County": "NY", + "Violation In Front Of Or Opposite": "F", + "House Number": 1546, + "Street Name": "2nd Ave", + "Intersecting Street": "", + "Date First Observed": "01/01/20140815 12:00:00 PM", + "Law Section": 408, + "Sub Division": "h1", + "Violation Legal Code": "", + "Days Parking In Effect": "Y", + "From Hours In Effect": "0830A", + "To Hours In Effect": "0700P", + "Vehicle Color": "WH", + "Unregistered Vehicle?": "", + "Vehicle Year": 2005, + "Meter Number": "126-4950", + "Feet From Curb": 0, + "Violation Post Code": "07 7", + "Violation Description": "37-Expired Muni Meter", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa83947f" + }, + "Summons Number": { + "$numberLong": "8003919708" + }, + "Plate ID": "62958JM", + "Registration State": "NY", + "Plate Type": "COM", + "Issue Date": "10/14/2014", + "Violation Code": 19, + "Vehicle Body Type": "DELV", + "Vehicle Make": "INTER", + "Issuing Agency": "T", + "Street Code1": 20190, + "Street Code2": 14810, + "Street Code3": 14890, + "Vehicle Expiration Date": "01/01/88888888 12:00:00 PM", + "Violation Location": 112, + "Violation Precinct": 112, + "Issuer Precinct": 112, + "Issuer Code": 356951, + "Issuer Command": "T401", + "Issuer Squad": "N", + "Violation Time": "0417P", + "Time First Observed": "", + "Violation County": "Q", + "Violation In Front Of Or Opposite": "O", + "House Number": "70-31", + "Street Name": "108th St", + "Intersecting Street": "", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": "c3", + "Violation Legal Code": "", + "Days Parking In Effect": "YYYYYYY", + "From Hours In Effect": "", + "To Hours In Effect": "", + "Vehicle Color": "BROWN", + "Unregistered Vehicle?": "", + "Vehicle Year": 1997, + "Meter Number": "", + "Feet From Curb": 0, + "Violation Post Code": "K 41", + "Violation Description": "19-No Stand (bus stop)", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa839480" + }, + "Summons Number": { + "$numberLong": "7098091911" + }, + "Plate ID": "37644JE", + "Registration State": "NY", + "Plate Type": "COM", + "Issue Date": "01/29/2015", + "Violation Code": 38, + "Vehicle Body Type": "VAN", + "Vehicle Make": "NS/OT", + "Issuing Agency": "T", + "Street Code1": 61090, + "Street Code2": 12390, + "Street Code3": 12690, + "Vehicle Expiration Date": "01/01/20150930 12:00:00 PM", + "Violation Location": 108, + "Violation Precinct": 108, + "Issuer Precinct": 108, + "Issuer Code": 358566, + "Issuer Command": "T401", + "Issuer Squad": "A", + "Violation Time": "0907A", + "Time First Observed": "", + "Violation County": "Q", + "Violation In Front Of Or Opposite": "F", + "House Number": "59-17", + "Street Name": "Roosevelt Ave", + "Intersecting Street": "", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": "h1", + "Violation Legal Code": "", + "Days Parking In Effect": "Y", + "From Hours In Effect": "0900A", + "To Hours In Effect": "0700P", + "Vehicle Color": "WHITE", + "Unregistered Vehicle?": "", + "Vehicle Year": 2001, + "Meter Number": "", + "Feet From Curb": 0, + "Violation Post Code": "42 4", + "Violation Description": "38-Failure to Display Muni Rec", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa839481" + }, + "Summons Number": { + "$numberLong": "7350729133" + }, + "Plate ID": "65776MA", + "Registration State": "NY", + "Plate Type": "COM", + "Issue Date": "03/11/2015", + "Violation Code": 47, + "Vehicle Body Type": "VAN", + "Vehicle Make": "CHEVR", + "Issuing Agency": "T", + "Street Code1": 34970, + "Street Code2": 13610, + "Street Code3": 15710, + "Vehicle Expiration Date": "01/01/20161231 12:00:00 PM", + "Violation Location": 20, + "Violation Precinct": 20, + "Issuer Precinct": 20, + "Issuer Code": 356498, + "Issuer Command": "T103", + "Issuer Squad": "F", + "Violation Time": "1045A", + "Time First Observed": "", + "Violation County": "NY", + "Violation In Front Of Or Opposite": "F", + "House Number": 30, + "Street Name": "W 60th St", + "Intersecting Street": "", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": "l2", + "Violation Legal Code": "", + "Days Parking In Effect": "Y", + "From Hours In Effect": "0706A", + "To Hours In Effect": "0700P", + "Vehicle Color": "WH", + "Unregistered Vehicle?": "", + "Vehicle Year": 2011, + "Meter Number": "", + "Feet From Curb": 0, + "Violation Post Code": "CC1", + "Violation Description": "47-Double PKG-Midtown", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa839482" + }, + "Summons Number": { + "$numberLong": "7798742244" + }, + "Plate ID": "EWD3297", + "Registration State": "NY", + "Plate Type": "PAS", + "Issue Date": "03/07/2015", + "Violation Code": 71, + "Vehicle Body Type": "SUBN", + "Vehicle Make": "NISSA", + "Issuing Agency": "T", + "Street Code1": 59220, + "Street Code2": 59720, + "Street Code3": 55720, + "Vehicle Expiration Date": "01/01/20151207 12:00:00 PM", + "Violation Location": 43, + "Violation Precinct": 43, + "Issuer Precinct": 43, + "Issuer Code": 358648, + "Issuer Command": "T202", + "Issuer Squad": "M", + "Violation Time": "0906A", + "Time First Observed": "", + "Violation County": "BX", + "Violation In Front Of Or Opposite": "F", + "House Number": 2010, + "Street Name": "Powell Ave", + "Intersecting Street": "", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": "j6", + "Violation Legal Code": "", + "Days Parking In Effect": "YYYYYYY", + "From Hours In Effect": "", + "To Hours In Effect": "", + "Vehicle Color": "WH", + "Unregistered Vehicle?": "", + "Vehicle Year": 2014, + "Meter Number": "", + "Feet From Curb": 0, + "Violation Post Code": "A 22", + "Violation Description": "71A-Insp Sticker Expired (NYS)", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa839483" + }, + "Summons Number": { + "$numberLong": "7188999776" + }, + "Plate ID": "BCS4502", + "Registration State": "NY", + "Plate Type": "PAS", + "Issue Date": "03/25/2015", + "Violation Code": 71, + "Vehicle Body Type": "4DSD", + "Vehicle Make": "NISSA", + "Issuing Agency": "T", + "Street Code1": 27270, + "Street Code2": 40220, + "Street Code3": 9520, + "Vehicle Expiration Date": "01/01/20160303 12:00:00 PM", + "Violation Location": 48, + "Violation Precinct": 48, + "Issuer Precinct": 48, + "Issuer Code": 361903, + "Issuer Command": "T201", + "Issuer Squad": "H", + "Violation Time": "1013A", + "Time First Observed": "", + "Violation County": "BX", + "Violation In Front Of Or Opposite": "F", + "House Number": 587, + "Street Name": "E 187th St", + "Intersecting Street": "", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": "j6", + "Violation Legal Code": "", + "Days Parking In Effect": "YYYYYYY", + "From Hours In Effect": "", + "To Hours In Effect": "", + "Vehicle Color": "BK", + "Unregistered Vehicle?": "", + "Vehicle Year": 2002, + "Meter Number": "", + "Feet From Curb": 0, + "Violation Post Code": "58 2", + "Violation Description": "71A-Insp Sticker Expired (NYS)", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa839484" + }, + "Summons Number": 1375410519, + "Plate ID": "GMR8682", + "Registration State": "NY", + "Plate Type": "PAS", + "Issue Date": "10/05/2014", + "Violation Code": 71, + "Vehicle Body Type": "SUBN", + "Vehicle Make": "KIA", + "Issuing Agency": "P", + "Street Code1": 35670, + "Street Code2": 22390, + "Street Code3": 35807, + "Vehicle Expiration Date": "01/01/20160601 12:00:00 PM", + "Violation Location": 113, + "Violation Precinct": 113, + "Issuer Precinct": 113, + "Issuer Code": 952110, + "Issuer Command": 113, + "Issuer Squad": 0, + "Violation Time": "0520P", + "Time First Observed": "", + "Violation County": "Q", + "Violation In Front Of Or Opposite": "F", + "House Number": "137-73", + "Street Name": "BELKNAP ST", + "Intersecting Street": "", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": "J7", + "Violation Legal Code": "", + "Days Parking In Effect": "BBBBBBB", + "From Hours In Effect": "ALL", + "To Hours In Effect": "ALL", + "Vehicle Color": "TAN", + "Unregistered Vehicle?": 0, + "Vehicle Year": 2011, + "Meter Number": "-", + "Feet From Curb": 0, + "Violation Post Code": "", + "Violation Description": "", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa839485" + }, + "Summons Number": { + "$numberLong": "7010260047" + }, + "Plate ID": "72541MA", + "Registration State": "NY", + "Plate Type": "COM", + "Issue Date": "05/18/2015", + "Violation Code": 16, + "Vehicle Body Type": "VAN", + "Vehicle Make": "FORD", + "Issuing Agency": "T", + "Street Code1": 18290, + "Street Code2": 24890, + "Street Code3": 10210, + "Vehicle Expiration Date": "01/01/20170228 12:00:00 PM", + "Violation Location": 19, + "Violation Precinct": 19, + "Issuer Precinct": 19, + "Issuer Code": 357327, + "Issuer Command": "T103", + "Issuer Squad": "E", + "Violation Time": "0930A", + "Time First Observed": "0852A", + "Violation County": "NY", + "Violation In Front Of Or Opposite": "F", + "House Number": 160, + "Street Name": "E 65th St", + "Intersecting Street": "", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": "k2", + "Violation Legal Code": "", + "Days Parking In Effect": "Y", + "From Hours In Effect": "0800A", + "To Hours In Effect": "0700P", + "Vehicle Color": "WH", + "Unregistered Vehicle?": "", + "Vehicle Year": 2011, + "Meter Number": "", + "Feet From Curb": 0, + "Violation Post Code": "26 7", + "Violation Description": "16-No Std (Com Veh) Com Plate", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa839486" + }, + "Summons Number": { + "$numberLong": "7789198993" + }, + "Plate ID": "FHM2444", + "Registration State": "NY", + "Plate Type": "PAS", + "Issue Date": "09/01/2014", + "Violation Code": 71, + "Vehicle Body Type": "SUBN", + "Vehicle Make": "GMC", + "Issuing Agency": "T", + "Street Code1": 37090, + "Street Code2": 40404, + "Street Code3": 40404, + "Vehicle Expiration Date": "01/01/20150216 12:00:00 PM", + "Violation Location": 115, + "Violation Precinct": 115, + "Issuer Precinct": 115, + "Issuer Code": 358919, + "Issuer Command": "T401", + "Issuer Squad": "J", + "Violation Time": "0144P", + "Time First Observed": "", + "Violation County": "Q", + "Violation In Front Of Or Opposite": "F", + "House Number": "87-40", + "Street Name": "Brisbin St", + "Intersecting Street": "", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": "j6", + "Violation Legal Code": "", + "Days Parking In Effect": "YYYYYYY", + "From Hours In Effect": "", + "To Hours In Effect": "", + "Vehicle Color": "GY", + "Unregistered Vehicle?": "", + "Vehicle Year": 2004, + "Meter Number": "", + "Feet From Curb": 0, + "Violation Post Code": "23 4", + "Violation Description": "71A-Insp Sticker Expired (NYS)", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + }, + { + "_id": { + "$oid": "5735040085629ed4fa839487" + }, + "Summons Number": { + "$numberLong": "7446300474" + }, + "Plate ID": 2336837, + "Registration State": "ME", + "Plate Type": "PAS", + "Issue Date": "07/17/2014", + "Violation Code": 66, + "Vehicle Body Type": "TRLR", + "Vehicle Make": "NS/OT", + "Issuing Agency": "T", + "Street Code1": 0, + "Street Code2": 0, + "Street Code3": 0, + "Vehicle Expiration Date": "01/01/88880088 12:00:00 PM", + "Violation Location": 104, + "Violation Precinct": 104, + "Issuer Precinct": 104, + "Issuer Code": 341263, + "Issuer Command": "T803", + "Issuer Squad": "A", + "Violation Time": "1156P", + "Time First Observed": "", + "Violation County": "Q", + "Violation In Front Of Or Opposite": "I", + "House Number": "N", + "Street Name": "Borden Ave", + "Intersecting Street": "544ft E/of Maurice A", + "Date First Observed": "01/05/0001 12:00:00 PM", + "Law Section": 408, + "Sub Division": "k4", + "Violation Legal Code": "", + "Days Parking In Effect": "", + "From Hours In Effect": "", + "To Hours In Effect": "", + "Vehicle Color": "WHITE", + "Unregistered Vehicle?": "", + "Vehicle Year": 0, + "Meter Number": "", + "Feet From Curb": 0, + "Violation Post Code": "E 42", + "Violation Description": "66-Detached Trailer", + "No Standing or Stopping Violation": "", + "Hydrant Violation": "", + "Double Parking Violation": "" + } +] diff --git a/packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.json b/packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.json new file mode 100644 index 00000000000..035add03b25 --- /dev/null +++ b/packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.json @@ -0,0 +1,1491 @@ +[ + { + "_id": "10006546", + "listing_url": "https://www.airbnb.com/rooms/10006546", + "name": "Ribeira Charming Duplex", + "interaction": "Cot - 10 € / night Dog - € 7,5 / night", + "house_rules": "Make the house your home...", + "property_type": "House", + "room_type": "Entire home/apt", + "bed_type": "Real Bed", + "minimum_nights": "2", + "maximum_nights": "30", + "cancellation_policy": "moderate", + "last_scraped": { + "$date": { + "$numberLong": "1550293200000" + } + }, + "calendar_last_scraped": { + "$date": { + "$numberLong": "1550293200000" + } + }, + "first_review": { + "$date": { + "$numberLong": "1451797200000" + } + }, + "last_review": { + "$date": { + "$numberLong": "1547960400000" + } + }, + "accommodates": 8, + "bedrooms": 3, + "beds": 5, + "number_of_reviews": 51, + "bathrooms": { + "$numberDecimal": "1.0" + }, + "price": { + "$numberDecimal": "80.00" + }, + "security_deposit": { + "$numberDecimal": "200.00" + }, + "cleaning_fee": { + "$numberDecimal": "35.00" + }, + "extra_people": { + "$numberDecimal": "15.00" + }, + "guests_included": { + "$numberDecimal": "6" + }, + "images": { + "thumbnail_url": "", + "medium_url": "", + "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", + "xl_picture_url": "" + }, + "address": { + "street": "Porto, Porto, Portugal", + "suburb": "", + "government_area": "Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória", + "market": "Porto", + "country": "Portugal", + "country_code": "PT", + "location": { + "type": "Point", + "coordinates": [-8.61308, 41.1413], + "is_location_exact": false + } + }, + "availability": { + "availability_30": 28, + "availability_60": 47, + "availability_90": 74, + "availability_365": 239 + }, + "host_id": "51399391" + }, + { + "_id": "10009999", + "listing_url": "https://www.airbnb.com/rooms/10009999", + "name": "Horto flat with small garden", + "interaction": "I´ll be happy to help you with any doubts, tips or any other information needed during your stay.", + "house_rules": "I just hope the guests treat the space as they´re own, with respect to it as well as to my neighbours! Espero apenas que os hóspedes tratem o lugar com carinho e respeito aos vizinhos!", + "property_type": "Apartment", + "room_type": "Entire home/apt", + "bed_type": "Real Bed", + "minimum_nights": "2", + "maximum_nights": "1125", + "cancellation_policy": "flexible", + "last_scraped": { + "$date": { + "$numberLong": "1549861200000" + } + }, + "calendar_last_scraped": { + "$date": { + "$numberLong": "1549861200000" + } + }, + "accommodates": 4, + "bedrooms": 1, + "beds": 2, + "number_of_reviews": 0, + "bathrooms": { + "$numberDecimal": "1.0" + }, + "price": { + "$numberDecimal": "317.00" + }, + "cleaning_fee": { + "$numberDecimal": "187.00" + }, + "extra_people": { + "$numberDecimal": "0.00" + }, + "guests_included": { + "$numberDecimal": "1" + }, + "images": { + "thumbnail_url": "", + "medium_url": "", + "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", + "xl_picture_url": "" + }, + "address": { + "street": "Rio de Janeiro, Rio de Janeiro, Brazil", + "suburb": "Jardim Botânico", + "government_area": "Jardim Botânico", + "market": "Rio De Janeiro", + "country": "Brazil", + "country_code": "BR", + "location": { + "type": "Point", + "coordinates": [-43.23074991429229, -22.966253551739655], + "is_location_exact": true + } + }, + "availability": { + "availability_30": 0, + "availability_60": 0, + "availability_90": 0, + "availability_365": 0 + }, + "host_id": "1282196" + }, + { + "_id": "1001265", + "listing_url": "https://www.airbnb.com/rooms/1001265", + "name": "Ocean View Waikiki Marina w/prkg", + "interaction": "We try our best at creating, simple responsive management which never bothers the guest.", + "house_rules": "The general welfare and well being of all the community.", + "property_type": "Condominium", + "room_type": "Entire home/apt", + "bed_type": "Real Bed", + "minimum_nights": "3", + "maximum_nights": "365", + "cancellation_policy": "strict_14_with_grace_period", + "last_scraped": { + "$date": { + "$numberLong": "1551848400000" + } + }, + "calendar_last_scraped": { + "$date": { + "$numberLong": "1551848400000" + } + }, + "first_review": { + "$date": { + "$numberLong": "1369368000000" + } + }, + "last_review": { + "$date": { + "$numberLong": "1549515600000" + } + }, + "accommodates": 2, + "bedrooms": 1, + "beds": 1, + "number_of_reviews": 96, + "bathrooms": { + "$numberDecimal": "1.0" + }, + "price": { + "$numberDecimal": "115.00" + }, + "cleaning_fee": { + "$numberDecimal": "100.00" + }, + "extra_people": { + "$numberDecimal": "0.00" + }, + "guests_included": { + "$numberDecimal": "1" + }, + "images": { + "thumbnail_url": "", + "medium_url": "", + "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", + "xl_picture_url": "" + }, + "address": { + "street": "Honolulu, HI, United States", + "suburb": "Oʻahu", + "government_area": "Primary Urban Center", + "market": "Oahu", + "country": "United States", + "country_code": "US", + "location": { + "type": "Point", + "coordinates": [-157.83919, 21.28634], + "is_location_exact": true + } + }, + "availability": { + "availability_30": 16, + "availability_60": 46, + "availability_90": 76, + "availability_365": 343 + }, + "host_id": "5448114" + }, + { + "_id": "10021707", + "listing_url": "https://www.airbnb.com/rooms/10021707", + "name": "Private Room in Bushwick", + "interaction": "", + "house_rules": "", + "property_type": "Apartment", + "room_type": "Private room", + "bed_type": "Real Bed", + "minimum_nights": "14", + "maximum_nights": "1125", + "cancellation_policy": "flexible", + "last_scraped": { + "$date": { + "$numberLong": "1551848400000" + } + }, + "calendar_last_scraped": { + "$date": { + "$numberLong": "1551848400000" + } + }, + "first_review": { + "$date": { + "$numberLong": "1454216400000" + } + }, + "last_review": { + "$date": { + "$numberLong": "1454216400000" + } + }, + "accommodates": 1, + "bedrooms": 1, + "beds": 1, + "number_of_reviews": 1, + "bathrooms": { + "$numberDecimal": "1.5" + }, + "price": { + "$numberDecimal": "40.00" + }, + "extra_people": { + "$numberDecimal": "0.00" + }, + "guests_included": { + "$numberDecimal": "1" + }, + "images": { + "thumbnail_url": "", + "medium_url": "", + "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", + "xl_picture_url": "" + }, + "address": { + "street": "Brooklyn, NY, United States", + "suburb": "Brooklyn", + "government_area": "Bushwick", + "market": "New York", + "country": "United States", + "country_code": "US", + "location": { + "type": "Point", + "coordinates": [-73.93615, 40.69791], + "is_location_exact": true + } + }, + "availability": { + "availability_30": 0, + "availability_60": 0, + "availability_90": 0, + "availability_365": 0 + }, + "host_id": "11275734" + }, + { + "_id": "10030955", + "listing_url": "https://www.airbnb.com/rooms/10030955", + "name": "Apt Linda Vista Lagoa - Rio", + "interaction": "", + "house_rules": "", + "property_type": "Apartment", + "room_type": "Private room", + "bed_type": "Real Bed", + "minimum_nights": "1", + "maximum_nights": "1125", + "cancellation_policy": "flexible", + "last_scraped": { + "$date": { + "$numberLong": "1549861200000" + } + }, + "calendar_last_scraped": { + "$date": { + "$numberLong": "1549861200000" + } + }, + "accommodates": 2, + "bedrooms": 1, + "beds": 1, + "number_of_reviews": 0, + "bathrooms": { + "$numberDecimal": "2.0" + }, + "price": { + "$numberDecimal": "701.00" + }, + "security_deposit": { + "$numberDecimal": "1000.00" + }, + "cleaning_fee": { + "$numberDecimal": "250.00" + }, + "extra_people": { + "$numberDecimal": "0.00" + }, + "guests_included": { + "$numberDecimal": "1" + }, + "images": { + "thumbnail_url": "", + "medium_url": "", + "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", + "xl_picture_url": "" + }, + "address": { + "street": "Rio de Janeiro, Rio de Janeiro, Brazil", + "suburb": "Lagoa", + "government_area": "Lagoa", + "market": "Rio De Janeiro", + "country": "Brazil", + "country_code": "BR", + "location": { + "type": "Point", + "coordinates": [-43.205047082633435, -22.971950988341874], + "is_location_exact": true + } + }, + "availability": { + "availability_30": 28, + "availability_60": 58, + "availability_90": 88, + "availability_365": 363 + }, + "host_id": "51496939" + }, + { + "_id": "1003530", + "listing_url": "https://www.airbnb.com/rooms/1003530", + "name": "New York City - Upper West Side Apt", + "interaction": "", + "house_rules": "No smoking is permitted in the apartment. All towels that are used should be placed in the bath tub upon departure. I have a cat, Samantha, who can stay or go, whichever is preferred. Please text me upon departure.", + "property_type": "Apartment", + "room_type": "Private room", + "bed_type": "Real Bed", + "minimum_nights": "12", + "maximum_nights": "360", + "cancellation_policy": "strict_14_with_grace_period", + "last_scraped": { + "$date": { + "$numberLong": "1551934800000" + } + }, + "calendar_last_scraped": { + "$date": { + "$numberLong": "1551934800000" + } + }, + "first_review": { + "$date": { + "$numberLong": "1367208000000" + } + }, + "last_review": { + "$date": { + "$numberLong": "1534046400000" + } + }, + "accommodates": 2, + "bedrooms": 1, + "beds": 1, + "number_of_reviews": 70, + "bathrooms": { + "$numberDecimal": "1.0" + }, + "price": { + "$numberDecimal": "135.00" + }, + "security_deposit": { + "$numberDecimal": "0.00" + }, + "cleaning_fee": { + "$numberDecimal": "135.00" + }, + "extra_people": { + "$numberDecimal": "0.00" + }, + "guests_included": { + "$numberDecimal": "1" + }, + "images": { + "thumbnail_url": "", + "medium_url": "", + "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", + "xl_picture_url": "" + }, + "address": { + "street": "New York, NY, United States", + "suburb": "Manhattan", + "government_area": "Upper West Side", + "market": "New York", + "country": "United States", + "country_code": "US", + "location": { + "type": "Point", + "coordinates": [-73.96523, 40.79962], + "is_location_exact": false + } + }, + "availability": { + "availability_30": 0, + "availability_60": 0, + "availability_90": 0, + "availability_365": 93 + }, + "host_id": "454250" + }, + { + "_id": "10038496", + "listing_url": "https://www.airbnb.com/rooms/10038496", + "name": "Copacabana Apartment Posto 6", + "interaction": "Contact telephone numbers if needed: Valeria ((PHONE NUMBER HIDDEN) (URL HIDDEN) ((PHONE NUMBER HIDDEN) cell phone (URL HIDDEN) (021) mobile/(PHONE NUMBER HIDDEN) José (URL HIDDEN)Concierge support; Fernando (caretaker boss) business hours.", + "house_rules": "Entreguem o imóvel conforme receberam e respeitem as regras do condomínio para não serem incomodados. Não danificar os utensílios e tudo que se refere as boas condições referentes ao mesmo . Não fazer barulho após às 22:00 até às 8:00. Usar entrada de serviço se estiver molhado voltando da praia.", + "property_type": "Apartment", + "room_type": "Entire home/apt", + "bed_type": "Real Bed", + "minimum_nights": "3", + "maximum_nights": "75", + "cancellation_policy": "strict_14_with_grace_period", + "last_scraped": { + "$date": { + "$numberLong": "1549861200000" + } + }, + "calendar_last_scraped": { + "$date": { + "$numberLong": "1549861200000" + } + }, + "first_review": { + "$date": { + "$numberLong": "1453093200000" + } + }, + "last_review": { + "$date": { + "$numberLong": "1548651600000" + } + }, + "accommodates": 4, + "bedrooms": 1, + "beds": 3, + "number_of_reviews": 70, + "bathrooms": { + "$numberDecimal": "2.0" + }, + "price": { + "$numberDecimal": "119.00" + }, + "security_deposit": { + "$numberDecimal": "600.00" + }, + "cleaning_fee": { + "$numberDecimal": "150.00" + }, + "extra_people": { + "$numberDecimal": "40.00" + }, + "guests_included": { + "$numberDecimal": "3" + }, + "images": { + "thumbnail_url": "", + "medium_url": "", + "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", + "xl_picture_url": "" + }, + "address": { + "street": "Rio de Janeiro, Rio de Janeiro, Brazil", + "suburb": "Copacabana", + "government_area": "Copacabana", + "market": "Rio De Janeiro", + "country": "Brazil", + "country_code": "BR", + "location": { + "type": "Point", + "coordinates": [-43.190849194463404, -22.984339360067814], + "is_location_exact": false + } + }, + "availability": { + "availability_30": 7, + "availability_60": 19, + "availability_90": 33, + "availability_365": 118 + }, + "host_id": "51530266" + }, + { + "_id": "10047964", + "listing_url": "https://www.airbnb.com/rooms/10047964", + "name": "Charming Flat in Downtown Moda", + "interaction": "", + "house_rules": "Be and feel like your own home, with total respect and love..this would be wonderful!", + "property_type": "House", + "room_type": "Entire home/apt", + "bed_type": "Real Bed", + "minimum_nights": "2", + "maximum_nights": "1125", + "cancellation_policy": "flexible", + "last_scraped": { + "$date": { + "$numberLong": "1550466000000" + } + }, + "calendar_last_scraped": { + "$date": { + "$numberLong": "1550466000000" + } + }, + "first_review": { + "$date": { + "$numberLong": "1459569600000" + } + }, + "last_review": { + "$date": { + "$numberLong": "1459569600000" + } + }, + "accommodates": 6, + "bedrooms": 2, + "beds": 6, + "number_of_reviews": 1, + "bathrooms": { + "$numberDecimal": "1.0" + }, + "price": { + "$numberDecimal": "527.00" + }, + "cleaning_fee": { + "$numberDecimal": "211.00" + }, + "extra_people": { + "$numberDecimal": "211.00" + }, + "guests_included": { + "$numberDecimal": "1" + }, + "images": { + "thumbnail_url": "", + "medium_url": "", + "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", + "xl_picture_url": "" + }, + "address": { + "street": "Kadıköy, İstanbul, Turkey", + "suburb": "Moda", + "government_area": "Kadikoy", + "market": "Istanbul", + "country": "Turkey", + "country_code": "TR", + "location": { + "type": "Point", + "coordinates": [29.03133, 40.98585], + "is_location_exact": true + } + }, + "availability": { + "availability_30": 27, + "availability_60": 57, + "availability_90": 87, + "availability_365": 362 + }, + "host_id": "1241644" + }, + { + "_id": "10051164", + "listing_url": "https://www.airbnb.com/rooms/10051164", + "name": "Catete's Colonial Big Hause Room B", + "interaction": "Sou geógrafa, gosto de arte e cultura. Moro neste endereço (porém em outro espaço, que não o casarão) com meu companheiro Carlos Henrique, que é músico, farmacêutico e acupunturista, meus filhos Pedro, estudante do ensino médio e Estevão estudante de antropologia . Somos todos os três responsáveis pelas hospedagens e manutenção do Casarão. Sejam bem vindos! Estaremos com total disponibilidade para ajudá-los.", + "house_rules": "", + "property_type": "House", + "room_type": "Private room", + "bed_type": "Real Bed", + "minimum_nights": "2", + "maximum_nights": "1125", + "cancellation_policy": "strict_14_with_grace_period", + "last_scraped": { + "$date": { + "$numberLong": "1549861200000" + } + }, + "calendar_last_scraped": { + "$date": { + "$numberLong": "1549861200000" + } + }, + "first_review": { + "$date": { + "$numberLong": "1455080400000" + } + }, + "last_review": { + "$date": { + "$numberLong": "1455080400000" + } + }, + "accommodates": 8, + "bedrooms": 1, + "beds": 8, + "number_of_reviews": 1, + "bathrooms": { + "$numberDecimal": "4.0" + }, + "price": { + "$numberDecimal": "250.00" + }, + "security_deposit": { + "$numberDecimal": "0.00" + }, + "cleaning_fee": { + "$numberDecimal": "0.00" + }, + "extra_people": { + "$numberDecimal": "40.00" + }, + "guests_included": { + "$numberDecimal": "4" + }, + "images": { + "thumbnail_url": "", + "medium_url": "", + "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", + "xl_picture_url": "" + }, + "address": { + "street": "Rio de Janeiro, Rio de Janeiro, Brazil", + "suburb": "Catete", + "government_area": "Catete", + "market": "Rio De Janeiro", + "country": "Brazil", + "country_code": "BR", + "location": { + "type": "Point", + "coordinates": [-43.18015675229857, -22.92638234778768], + "is_location_exact": true + } + }, + "availability": { + "availability_30": 10, + "availability_60": 10, + "availability_90": 21, + "availability_365": 296 + }, + "host_id": "51326285" + }, + { + "_id": "10057447", + "listing_url": "https://www.airbnb.com/rooms/10057447", + "name": "Modern Spacious 1 Bedroom Loft", + "interaction": "", + "house_rules": "", + "property_type": "Apartment", + "room_type": "Entire home/apt", + "bed_type": "Real Bed", + "minimum_nights": "1", + "maximum_nights": "1125", + "cancellation_policy": "flexible", + "last_scraped": { + "$date": { + "$numberLong": "1552276800000" + } + }, + "calendar_last_scraped": { + "$date": { + "$numberLong": "1552276800000" + } + }, + "accommodates": 4, + "bedrooms": 1, + "beds": 2, + "number_of_reviews": 0, + "bathrooms": { + "$numberDecimal": "1.0" + }, + "price": { + "$numberDecimal": "50.00" + }, + "extra_people": { + "$numberDecimal": "31.00" + }, + "guests_included": { + "$numberDecimal": "1" + }, + "images": { + "thumbnail_url": "", + "medium_url": "", + "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", + "xl_picture_url": "" + }, + "address": { + "street": "Montréal, Québec, Canada", + "suburb": "Mile End", + "government_area": "Le Plateau-Mont-Royal", + "market": "Montreal", + "country": "Canada", + "country_code": "CA", + "location": { + "type": "Point", + "coordinates": [-73.59111, 45.51889], + "is_location_exact": true + } + }, + "availability": { + "availability_30": 0, + "availability_60": 0, + "availability_90": 0, + "availability_365": 0 + }, + "host_id": "51612949" + }, + { + "_id": "10057826", + "listing_url": "https://www.airbnb.com/rooms/10057826", + "name": "Deluxe Loft Suite", + "interaction": "", + "house_rules": "Guest must leave a copy of credit card with front desk for any incidentals/ damages with a copy of valid ID. There are no additional charges than what has been paid in advance.", + "property_type": "Apartment", + "room_type": "Entire home/apt", + "bed_type": "Real Bed", + "minimum_nights": "3", + "maximum_nights": "1125", + "cancellation_policy": "strict_14_with_grace_period", + "last_scraped": { + "$date": { + "$numberLong": "1551934800000" + } + }, + "calendar_last_scraped": { + "$date": { + "$numberLong": "1551934800000" + } + }, + "first_review": { + "$date": { + "$numberLong": "1451797200000" + } + }, + "last_review": { + "$date": { + "$numberLong": "1518930000000" + } + }, + "accommodates": 4, + "bedrooms": 0, + "beds": 2, + "number_of_reviews": 5, + "bathrooms": { + "$numberDecimal": "1.0" + }, + "price": { + "$numberDecimal": "205.00" + }, + "extra_people": { + "$numberDecimal": "0.00" + }, + "guests_included": { + "$numberDecimal": "1" + }, + "images": { + "thumbnail_url": "", + "medium_url": "", + "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", + "xl_picture_url": "" + }, + "address": { + "street": "Brooklyn, NY, United States", + "suburb": "Greenpoint", + "government_area": "Greenpoint", + "market": "New York", + "country": "United States", + "country_code": "US", + "location": { + "type": "Point", + "coordinates": [-73.94472, 40.72778], + "is_location_exact": true + } + }, + "availability": { + "availability_30": 30, + "availability_60": 31, + "availability_90": 31, + "availability_365": 243 + }, + "host_id": "47554473" + }, + { + "_id": "10059244", + "listing_url": "https://www.airbnb.com/rooms/10059244", + "name": "Ligne verte - à 15 min de métro du centre ville.", + "interaction": "Une amie sera disponible en cas de besoin.", + "house_rules": "Non fumeur Respect des voisins Respect des biens Merci! :)", + "property_type": "Apartment", + "room_type": "Entire home/apt", + "bed_type": "Real Bed", + "minimum_nights": "2", + "maximum_nights": "1125", + "cancellation_policy": "moderate", + "last_scraped": { + "$date": { + "$numberLong": "1552276800000" + } + }, + "calendar_last_scraped": { + "$date": { + "$numberLong": "1552276800000" + } + }, + "accommodates": 2, + "bedrooms": 0, + "beds": 1, + "number_of_reviews": 0, + "bathrooms": { + "$numberDecimal": "1.0" + }, + "price": { + "$numberDecimal": "43.00" + }, + "extra_people": { + "$numberDecimal": "12.00" + }, + "guests_included": { + "$numberDecimal": "1" + }, + "images": { + "thumbnail_url": "", + "medium_url": "", + "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", + "xl_picture_url": "" + }, + "address": { + "street": "Montréal, Québec, Canada", + "suburb": "Hochelaga-Maisonneuve", + "government_area": "Mercier-Hochelaga-Maisonneuve", + "market": "Montreal", + "country": "Canada", + "country_code": "CA", + "location": { + "type": "Point", + "coordinates": [-73.54949, 45.54548], + "is_location_exact": false + } + }, + "availability": { + "availability_30": 0, + "availability_60": 0, + "availability_90": 0, + "availability_365": 32 + }, + "host_id": "7140229" + }, + { + "_id": "10059872", + "listing_url": "https://www.airbnb.com/rooms/10059872", + "name": "Soho Cozy, Spacious and Convenient", + "interaction": "", + "house_rules": "", + "property_type": "Apartment", + "room_type": "Entire home/apt", + "bed_type": "Real Bed", + "minimum_nights": "4", + "maximum_nights": "20", + "cancellation_policy": "flexible", + "last_scraped": { + "$date": { + "$numberLong": "1552276800000" + } + }, + "calendar_last_scraped": { + "$date": { + "$numberLong": "1552276800000" + } + }, + "first_review": { + "$date": { + "$numberLong": "1450501200000" + } + }, + "last_review": { + "$date": { + "$numberLong": "1522123200000" + } + }, + "accommodates": 3, + "bedrooms": 1, + "beds": 2, + "number_of_reviews": 3, + "bathrooms": { + "$numberDecimal": "1.0" + }, + "price": { + "$numberDecimal": "699.00" + }, + "extra_people": { + "$numberDecimal": "0.00" + }, + "guests_included": { + "$numberDecimal": "1" + }, + "images": { + "thumbnail_url": "", + "medium_url": "", + "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", + "xl_picture_url": "" + }, + "address": { + "street": "Hong Kong, Hong Kong Island, Hong Kong", + "suburb": "Central & Western District", + "government_area": "Central & Western", + "market": "Hong Kong", + "country": "Hong Kong", + "country_code": "HK", + "location": { + "type": "Point", + "coordinates": [114.15027, 22.28158], + "is_location_exact": true + } + }, + "availability": { + "availability_30": 0, + "availability_60": 0, + "availability_90": 0, + "availability_365": 0 + }, + "host_id": "51624384" + }, + { + "_id": "10066928", + "listing_url": "https://www.airbnb.com/rooms/10066928", + "name": "3 chambres au coeur du Plateau", + "interaction": "N'hésitez pas à m'écrire pour toute demande de renseignement !", + "house_rules": "Merci de respecter ce lieu de vie.", + "property_type": "Apartment", + "room_type": "Entire home/apt", + "bed_type": "Real Bed", + "minimum_nights": "1", + "maximum_nights": "1125", + "cancellation_policy": "flexible", + "last_scraped": { + "$date": { + "$numberLong": "1552276800000" + } + }, + "calendar_last_scraped": { + "$date": { + "$numberLong": "1552276800000" + } + }, + "accommodates": 6, + "bedrooms": 3, + "beds": 3, + "number_of_reviews": 0, + "bathrooms": { + "$numberDecimal": "1.0" + }, + "price": { + "$numberDecimal": "140.00" + }, + "extra_people": { + "$numberDecimal": "0.00" + }, + "guests_included": { + "$numberDecimal": "1" + }, + "images": { + "thumbnail_url": "", + "medium_url": "", + "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", + "xl_picture_url": "" + }, + "address": { + "street": "Montréal, Québec, Canada", + "suburb": "Le Plateau-Mont-Royal", + "government_area": "Le Plateau-Mont-Royal", + "market": "Montreal", + "country": "Canada", + "country_code": "CA", + "location": { + "type": "Point", + "coordinates": [-73.57383, 45.52233], + "is_location_exact": true + } + }, + "availability": { + "availability_30": 0, + "availability_60": 0, + "availability_90": 0, + "availability_365": 0 + }, + "host_id": "9036477" + }, + { + "_id": "10069642", + "listing_url": "https://www.airbnb.com/rooms/10069642", + "name": "Ótimo Apto proximo Parque Olimpico", + "interaction": "", + "house_rules": "", + "property_type": "Apartment", + "room_type": "Entire home/apt", + "bed_type": "Real Bed", + "minimum_nights": "15", + "maximum_nights": "20", + "cancellation_policy": "strict_14_with_grace_period", + "last_scraped": { + "$date": { + "$numberLong": "1549861200000" + } + }, + "calendar_last_scraped": { + "$date": { + "$numberLong": "1549861200000" + } + }, + "accommodates": 5, + "bedrooms": 2, + "beds": 2, + "number_of_reviews": 0, + "bathrooms": { + "$numberDecimal": "2.0" + }, + "price": { + "$numberDecimal": "858.00" + }, + "security_deposit": { + "$numberDecimal": "4476.00" + }, + "cleaning_fee": { + "$numberDecimal": "112.00" + }, + "extra_people": { + "$numberDecimal": "75.00" + }, + "guests_included": { + "$numberDecimal": "1" + }, + "images": { + "thumbnail_url": "", + "medium_url": "", + "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", + "xl_picture_url": "" + }, + "address": { + "street": "Rio de Janeiro, Rio de Janeiro, Brazil", + "suburb": "Recreio dos Bandeirantes", + "government_area": "Recreio dos Bandeirantes", + "market": "Rio De Janeiro", + "country": "Brazil", + "country_code": "BR", + "location": { + "type": "Point", + "coordinates": [-43.4311123147628, -23.00035792660916], + "is_location_exact": false + } + }, + "availability": { + "availability_30": 0, + "availability_60": 0, + "availability_90": 0, + "availability_365": 0 + }, + "host_id": "51670240" + }, + { + "_id": "10082307", + "listing_url": "https://www.airbnb.com/rooms/10082307", + "name": "Double Room en-suite (307)", + "interaction": "", + "house_rules": "", + "property_type": "Apartment", + "room_type": "Private room", + "bed_type": "Real Bed", + "minimum_nights": "1", + "maximum_nights": "1125", + "cancellation_policy": "strict_14_with_grace_period", + "last_scraped": { + "$date": { + "$numberLong": "1552276800000" + } + }, + "calendar_last_scraped": { + "$date": { + "$numberLong": "1552276800000" + } + }, + "accommodates": 2, + "bedrooms": 1, + "beds": 1, + "number_of_reviews": 0, + "bathrooms": { + "$numberDecimal": "1.0" + }, + "price": { + "$numberDecimal": "361.00" + }, + "extra_people": { + "$numberDecimal": "130.00" + }, + "guests_included": { + "$numberDecimal": "2" + }, + "images": { + "thumbnail_url": "", + "medium_url": "", + "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", + "xl_picture_url": "" + }, + "address": { + "street": "Hong Kong, Kowloon, Hong Kong", + "suburb": "Yau Tsim Mong", + "government_area": "Yau Tsim Mong", + "market": "Hong Kong", + "country": "Hong Kong", + "country_code": "HK", + "location": { + "type": "Point", + "coordinates": [114.17158, 22.30469], + "is_location_exact": true + } + }, + "availability": { + "availability_30": 30, + "availability_60": 60, + "availability_90": 90, + "availability_365": 365 + }, + "host_id": "51289938" + }, + { + "_id": "10082422", + "listing_url": "https://www.airbnb.com/rooms/10082422", + "name": "Nice room in Barcelona Center", + "interaction": "", + "house_rules": "", + "property_type": "Apartment", + "room_type": "Private room", + "bed_type": "Real Bed", + "minimum_nights": "1", + "maximum_nights": "9", + "cancellation_policy": "flexible", + "last_scraped": { + "$date": { + "$numberLong": "1552021200000" + } + }, + "calendar_last_scraped": { + "$date": { + "$numberLong": "1552021200000" + } + }, + "accommodates": 2, + "bedrooms": 1, + "beds": 2, + "number_of_reviews": 0, + "bathrooms": { + "$numberDecimal": "1.0" + }, + "price": { + "$numberDecimal": "50.00" + }, + "security_deposit": { + "$numberDecimal": "100.00" + }, + "cleaning_fee": { + "$numberDecimal": "10.00" + }, + "extra_people": { + "$numberDecimal": "0.00" + }, + "guests_included": { + "$numberDecimal": "1" + }, + "images": { + "thumbnail_url": "", + "medium_url": "", + "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", + "xl_picture_url": "" + }, + "address": { + "street": "Barcelona, Catalunya, Spain", + "suburb": "Eixample", + "government_area": "la Dreta de l'Eixample", + "market": "Barcelona", + "country": "Spain", + "country_code": "ES", + "location": { + "type": "Point", + "coordinates": [2.16942, 41.40082], + "is_location_exact": true + } + }, + "availability": { + "availability_30": 0, + "availability_60": 0, + "availability_90": 0, + "availability_365": 0 + }, + "host_id": "30393403" + }, + { + "_id": "10083468", + "listing_url": "https://www.airbnb.com/rooms/10083468", + "name": "Be Happy in Porto", + "interaction": "I`am always avaiable with for my guests.", + "house_rules": ". No smoking inside the apartment. . Is forbidden receive or lead strange people to the apartment. . Only people that are part of the reservation should have access to the apartment. . Do not eat on the bedroom. . Do not drink things like wine or sugary drinks on the bedroom.", + "property_type": "Loft", + "room_type": "Entire home/apt", + "bed_type": "Real Bed", + "minimum_nights": "2", + "maximum_nights": "1125", + "cancellation_policy": "moderate", + "last_scraped": { + "$date": { + "$numberLong": "1550293200000" + } + }, + "calendar_last_scraped": { + "$date": { + "$numberLong": "1550293200000" + } + }, + "first_review": { + "$date": { + "$numberLong": "1451710800000" + } + }, + "last_review": { + "$date": { + "$numberLong": "1549688400000" + } + }, + "accommodates": 2, + "bedrooms": 1, + "beds": 1, + "number_of_reviews": 178, + "bathrooms": { + "$numberDecimal": "1.0" + }, + "price": { + "$numberDecimal": "30.00" + }, + "security_deposit": { + "$numberDecimal": "0.00" + }, + "cleaning_fee": { + "$numberDecimal": "10.00" + }, + "extra_people": { + "$numberDecimal": "0.00" + }, + "guests_included": { + "$numberDecimal": "1" + }, + "images": { + "thumbnail_url": "", + "medium_url": "", + "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", + "xl_picture_url": "" + }, + "address": { + "street": "Porto, Porto, Portugal", + "suburb": "", + "government_area": "Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória", + "market": "Porto", + "country": "Portugal", + "country_code": "PT", + "location": { + "type": "Point", + "coordinates": [-8.61123, 41.15225], + "is_location_exact": false + } + }, + "availability": { + "availability_30": 16, + "availability_60": 40, + "availability_90": 67, + "availability_365": 335 + }, + "host_id": "27518920" + }, + { + "_id": "10084023", + "listing_url": "https://www.airbnb.com/rooms/10084023", + "name": "City center private room with bed", + "interaction": "A phone card of unlimited data will be provided during the stay, and phone call can also be made by the card. We have 3 bedrooms in the house and 2 are occupied by us, lots of Hong Kong traveling tips will be provided and also simple local tour if time is allowed.", + "house_rules": "1. 禁止吸煙, 只限女生入住 (除得到批准) No smoking and only female is allowed 2.熱水爐是儲水式, 不能長開, 用後請關上 The water heater cannot be turned on overnight, it will keep boiling water, thus, turn it off after use. 3. 不收清潔費,請保持房間及客廳清潔, 用過之碗筷需即日自行清洗 No cleaning fee is charged, thus, Please keep all the places including your room and living room clean and tidy, and make sure the dishes are washed after cooking on the same day. 4. 將收取港幣$1000為按金, 退房時將會歸還 (除故意破壞物品) Deposit of HKD$1000 will be charged and will return back when check out if nothing is damaged. 5. 房人將得到1條大門 1條鐵閘 及1條房鎖匙, 遺失需扣除$50 配匙費 1 main door key, 1 gate key and 1 private room key will be given at check in, $50 will be charged if lost. 6.洗髮後請必須將掉出來的頭髮拾起丟到垃圾桶或廁所,以免堵塞渠口 After washing hair, Please pick up your own hair and throw them in rubbish bin or toilet bowl, to avoid blocking the drain.", + "property_type": "Guesthouse", + "room_type": "Private room", + "bed_type": "Futon", + "minimum_nights": "1", + "maximum_nights": "500", + "cancellation_policy": "strict_14_with_grace_period", + "last_scraped": { + "$date": { + "$numberLong": "1552276800000" + } + }, + "calendar_last_scraped": { + "$date": { + "$numberLong": "1552276800000" + } + }, + "first_review": { + "$date": { + "$numberLong": "1450760400000" + } + }, + "last_review": { + "$date": { + "$numberLong": "1551416400000" + } + }, + "accommodates": 1, + "bedrooms": 1, + "beds": 1, + "number_of_reviews": 81, + "bathrooms": { + "$numberDecimal": "1.0" + }, + "price": { + "$numberDecimal": "181.00" + }, + "security_deposit": { + "$numberDecimal": "0.00" + }, + "cleaning_fee": { + "$numberDecimal": "50.00" + }, + "extra_people": { + "$numberDecimal": "100.00" + }, + "guests_included": { + "$numberDecimal": "1" + }, + "images": { + "thumbnail_url": "", + "medium_url": "", + "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", + "xl_picture_url": "" + }, + "address": { + "street": "Hong Kong , 九龍, Hong Kong", + "suburb": "Sham Shui Po District", + "government_area": "Sham Shui Po", + "market": "Hong Kong", + "country": "Hong Kong", + "country_code": "HK", + "location": { + "type": "Point", + "coordinates": [114.1669, 22.3314], + "is_location_exact": true + } + }, + "availability": { + "availability_30": 14, + "availability_60": 24, + "availability_90": 40, + "availability_365": 220 + }, + "host_id": "51744313" + }, + { + "_id": "10091713", + "listing_url": "https://www.airbnb.com/rooms/10091713", + "name": "Surry Hills Studio - Your Perfect Base in Sydney", + "interaction": "You have complete privacy during your stay.", + "house_rules": "No smoking: No smoking any substance, including e-cigarettes. Lost Keys / Locked out of Apartment: If you lose the key to the apartment building itself (i.e., the yellow security key) the cost of replacing it is $250. It will be deducted from your security deposit. If you lock yourself out of the apartment, it is solely your responsibility to contact a locksmith to open the apartment door for you. You are also solely responsible for the cost of the locksmith, including the cost of replacing the lock mechanism if necessary. If the lock mechanism needs to be replaced by the locksmith, you must provide 2 copies of the new key.", + "property_type": "Apartment", + "room_type": "Entire home/apt", + "bed_type": "Real Bed", + "minimum_nights": "10", + "maximum_nights": "21", + "cancellation_policy": "strict_14_with_grace_period", + "last_scraped": { + "$date": { + "$numberLong": "1551934800000" + } + }, + "calendar_last_scraped": { + "$date": { + "$numberLong": "1551934800000" + } + }, + "first_review": { + "$date": { + "$numberLong": "1482987600000" + } + }, + "last_review": { + "$date": { + "$numberLong": "1521345600000" + } + }, + "accommodates": 2, + "bedrooms": 0, + "beds": 1, + "number_of_reviews": 64, + "bathrooms": { + "$numberDecimal": "1.0" + }, + "price": { + "$numberDecimal": "181.00" + }, + "security_deposit": { + "$numberDecimal": "300.00" + }, + "cleaning_fee": { + "$numberDecimal": "50.00" + }, + "extra_people": { + "$numberDecimal": "0.00" + }, + "guests_included": { + "$numberDecimal": "1" + }, + "images": { + "thumbnail_url": "", + "medium_url": "", + "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", + "xl_picture_url": "" + }, + "address": { + "street": "Surry Hills, NSW, Australia", + "suburb": "Darlinghurst", + "government_area": "Sydney", + "market": "Sydney", + "country": "Australia", + "country_code": "AU", + "location": { + "type": "Point", + "coordinates": [151.21554, -33.88029], + "is_location_exact": true + } + }, + "availability": { + "availability_30": 0, + "availability_60": 0, + "availability_90": 0, + "availability_365": 0 + }, + "host_id": "13764143" + } +] diff --git a/packages/compass-generative-ai/tests/evals/fixtures/berlin.cocktailbars.json b/packages/compass-generative-ai/tests/evals/fixtures/berlin.cocktailbars.json new file mode 100644 index 00000000000..d934ef09eec --- /dev/null +++ b/packages/compass-generative-ai/tests/evals/fixtures/berlin.cocktailbars.json @@ -0,0 +1,262 @@ +[ + { + "_id": { + "$oid": "5ca652bf56618187558b4de3" + }, + "name": "Bar Zentral", + "strasse": "Lotte-Lenya-Bogen", + "hausnummer": 551, + "plz": 10623, + "webseite": "barzentralde", + "koordinaten": [13.3269283, 52.5050862] + }, + { + "_id": { + "$oid": "5ca6544a97aed3878f9b090f" + }, + "name": "Hefner Bar", + "strasse": "Kantstr.", + "hausnummer": 146, + "plz": 10623, + "koordinaten": [13.3213093, 52.5055506] + }, + { + "_id": { + "$oid": "5ca654ec97aed3878f9b0910" + }, + "name": "Bar am Steinplatz", + "strasse": "Steinplatz", + "hausnummer": 4, + "plz": 10623, + "webseite": "barsteinplatz.com", + "koordinaten": [13.3241804, 52.5081672] + }, + { + "_id": { + "$oid": "5ca6559e97aed3878f9b0911" + }, + "name": "Rum Trader", + "strasse": "Fasanenstr.", + "hausnummer": 40, + "plz": 10719, + "koordinaten": [13.3244667, 52.4984012] + }, + { + "_id": { + "$oid": "5ca655f597aed3878f9b0912" + }, + "name": "Stairs", + "strasse": "Uhlandstr.", + "hausnummer": 133, + "plz": 10717, + "webseite": "stairsbar-berlin.com", + "koordinaten": [13.3215159, 52.49256] + }, + { + "_id": { + "$oid": "5ca656a697aed3878f9b0913" + }, + "name": "Green Door", + "strasse": "Winterfeldtstr.", + "hausnummer": 50, + "plz": 10781, + "webseite": "greendoor.de", + "koordinaten": [13.3507105, 52.4970952] + }, + { + "_id": { + "$oid": "5ca6570597aed3878f9b0914" + }, + "name": "Mister Hu", + "strasse": "Goltzstr.", + "hausnummer": 39, + "plz": 10781, + "webseite": "misterhu.de", + "koordinaten": [13.3511185, 52.4927243] + }, + { + "_id": { + "$oid": "5ca6576f97aed3878f9b0915" + }, + "name": "Salut!", + "strasse": "Goltzstr.", + "hausnummer": 7, + "plz": 10781, + "webseite": "salut-berlin.de", + "koordinaten": [13.3513021, 52.4911044] + }, + { + "_id": { + "$oid": "5ca6581197aed3878f9b0916" + }, + "name": "Lebensstern", + "strasse": "Kurfürstenstr.", + "hausnummer": 58, + "plz": 10785, + "webseite": "lebens-stern.de", + "koordinaten": [13.3524999, 52.502059] + }, + { + "_id": { + "$oid": "5ca6588397aed3878f9b0917" + }, + "name": "Victoria Bar", + "strasse": "Potsdamer Str.", + "hausnummer": 102, + "plz": 10785, + "webseite": "victoriabar.de", + "koordinaten": [13.3616635, 52.5014176] + }, + { + "_id": { + "$oid": "5ca661b697aed3878f9b0918" + }, + "name": "Buck and Breck", + "strasse": "Brunnenstr.", + "hausnummer": 177, + "plz": 10119, + "webseite": "buckandbreck.com", + "koordinaten": [13.396757, 52.5321334] + }, + { + "_id": { + "$oid": "5ca662b297aed3878f9b0919" + }, + "name": "Becketts Kopf", + "strasse": "Pappelallee", + "hausnummer": 64, + "plz": 10437, + "webseite": "becketts-kopf.de", + "koordinaten": [13.4146512, 52.5456032] + }, + { + "_id": { + "$oid": "5ca6634597aed3878f9b091a" + }, + "name": "TiER", + "strasse": "Weserstr.", + "hausnummer": 42, + "plz": 12045, + "webseite": "tier.bar", + "koordinaten": [13.3924945, 52.5139491] + }, + { + "_id": { + "$oid": "5ca663c997aed3878f9b091b" + }, + "name": "Limonadier", + "strasse": "Nostitzstr.", + "hausnummer": 12, + "plz": 10961, + "webseite": "limonadier.de", + "koordinaten": [13.3805451, 52.4905438] + }, + { + "_id": { + "$oid": "5ca6654e97aed3878f9b091c" + }, + "name": "Galander-Kreuzberg", + "strasse": "Großbeerenstr.", + "hausnummer": 54, + "plz": 10965, + "webseite": "galander.berlin", + "koordinaten": [13.3805451, 52.4905438] + }, + { + "_id": { + "$oid": "5ca665b097aed3878f9b091d" + }, + "name": "Stagger Lee", + "strasse": "Nollendorfstr.", + "hausnummer": 27, + "plz": 10777, + "webseite": "staggerlee.de", + "koordinaten": [13.3494225, 52.4975759] + }, + { + "_id": { + "$oid": "5ca6666a97aed3878f9b091e" + }, + "name": "Schwarze Traube", + "strasse": "Wrangelstr.", + "hausnummer": 24, + "plz": 10997, + "webseite": "schwarzetraube.de", + "koordinaten": [13.414625, 52.5011464] + }, + { + "_id": { + "$oid": "5ca666cb97aed3878f9b091f" + }, + "name": "Kirk Bar", + "strasse": "Skalitzer Str.", + "hausnummer": 75, + "plz": 10997, + "webseite": "kirkbar-berlin.de", + "koordinaten": [13.4317823, 52.5010796] + }, + { + "_id": { + "$oid": "5ca6673797aed3878f9b0920" + }, + "name": "John Muir", + "strasse": "Skalitzer Str.", + "hausnummer": 51, + "plz": 10997, + "webseite": "johnmuirberlin.com", + "koordinaten": [13.4317823, 52.5010796] + }, + { + "_id": { + "$oid": "5ca72bc2db8ece608c5f3269" + }, + "name": "Mr. Susan", + "strasse": "Krausnickstr.", + "hausnummer": 1, + "plz": 10115, + "koordinaten": [13.3936122, 52.52443] + }, + { + "_id": { + "$oid": "5ca72eabdb8ece608c5f326c" + }, + "name": "Velvet", + "strasse": "Ganghoferstr.", + "hausnummer": 1, + "plz": 12043, + "koordinaten": [13.437435, 52.4792766] + }, + { + "_id": { + "$oid": "6054a874b5990f127b71361b" + }, + "name": "Testing" + }, + { + "_id": { + "$oid": "6054a8f6b5990f127b71361c" + }, + "name": "Testing" + }, + { + "_id": { + "$oid": "66d8655c461606b7bd7e34b7" + }, + "name": "John Muir", + "strasse": "Skalitzer Str.", + "hausnummer": 51, + "plz": 10997, + "webseite": "johnmuirberlin.com", + "koordinaten": [13.4317823, 52.5010796] + }, + { + "_id": { + "$oid": "66d86639461606b7bd7e34ba" + }, + "name": "Rum Trader", + "strasse": "Fasanenstr.", + "hausnummer": 40, + "plz": 10719, + "koordinaten": [13.3244667, 52.4984012] + } +] diff --git a/packages/compass-generative-ai/tests/evals/fixtures/netflix.comments.json b/packages/compass-generative-ai/tests/evals/fixtures/netflix.comments.json new file mode 100644 index 00000000000..977bbc1b481 --- /dev/null +++ b/packages/compass-generative-ai/tests/evals/fixtures/netflix.comments.json @@ -0,0 +1,940 @@ +[ + { + "_id": { + "$oid": "5a9427648b0beebeb69579f3" + }, + "name": "Jorah Mormont", + "email": "iain_glen@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd44d3" + }, + "text": "Minus sequi incidunt cum magnam. Quam voluptatum vitae ab voluptatum cum. Autem perferendis nisi nulla dolores aut recusandae.", + "date": { + "$date": "1994-02-18T18:52:31.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a21" + }, + "name": "Jaqen H'ghar", + "email": "tom_wlaschiha@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd516c" + }, + "text": "Minima odit officiis minima nam. Aspernatur id reprehenderit eius inventore amet laudantium. Eos unde enim recusandae fugit sint.", + "date": { + "$date": "1981-11-08T04:32:25.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a32" + }, + "name": "Megan Richards", + "email": "megan_richards@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd56c3" + }, + "text": "Mollitia ducimus consequatur excepturi corrupti expedita fugit rem aut. Nisi repellendus non velit tempora maxime. Ducimus recusandae perspiciatis hic vel voluptates.", + "date": { + "$date": "1976-02-15T11:21:57.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a78" + }, + "name": "Mercedes Tyler", + "email": "mercedes_tyler@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd6399" + }, + "text": "Voluptate odio minima pariatur recusandae. Architecto illum dicta repudiandae. Nobis aperiam exercitationem placeat repellat dolorum laborum ea. Est impedit totam facilis incidunt itaque facere.", + "date": { + "$date": "2007-10-17T06:50:56.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb69579e7" + }, + "name": "Mercedes Tyler", + "email": "mercedes_tyler@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd4323" + }, + "text": "Eius veritatis vero facilis quaerat fuga temporibus. Praesentium expedita sequi repellat id. Corporis minima enim ex. Provident fugit nisi dignissimos nulla nam ipsum aliquam.", + "date": { + "$date": "2002-08-18T04:56:07.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a13" + }, + "name": "John Bishop", + "email": "john_bishop@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd4cfd" + }, + "text": "Soluta aliquam a ullam iste dolor odit consequatur. Nostrum recusandae facilis facere provident distinctio corrupti aliquam recusandae.", + "date": { + "$date": "1992-07-08T08:01:20.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a7f" + }, + "name": "Javier Smith", + "email": "javier_smith@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd65b2" + }, + "text": "Molestiae omnis deserunt voluptatibus molestias ut assumenda. Nesciunt veniam iste ad praesentium sit saepe. Iusto voluptatum qui alias pariatur velit. Aspernatur cum eius rerum accusamus inventore.", + "date": { + "$date": "1973-03-31T14:46:20.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb69579f7" + }, + "name": "Yara Greyjoy", + "email": "gemma_whelan@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd4556" + }, + "text": "Dignissimos sunt aspernatur rerum magni debitis neque. Temporibus nisi repudiandae praesentium reprehenderit. Aliquam aliquid asperiores quasi asperiores repellat quasi rerum.", + "date": { + "$date": "2016-10-05T16:26:16.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a08" + }, + "name": "Meera Reed", + "email": "ellie_kendrick@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd4964" + }, + "text": "Harum porro ad dolorum repellendus. Nihil natus aspernatur quaerat aperiam nam neque. Beatae voluptates quas saepe enim facere. Unde sint praesentium numquam molestias nihil.", + "date": { + "$date": "1971-08-31T07:24:20.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a0b" + }, + "name": "Amy Ramirez", + "email": "amy_ramirez@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd4b1b" + }, + "text": "Incidunt possimus quasi suscipit. Rem fugit labore nisi cum. Sit facere tempora dolores quia rerum atque. Ab minima iure voluptatibus dolor quos cumque placeat quos.", + "date": { + "$date": "1999-10-27T05:03:04.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a10" + }, + "name": "Richard Schmidt", + "email": "richard_schmidt@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd4c0b" + }, + "text": "Quaerat occaecati eveniet repellat. Distinctio suscipit illo unde veniam. Expedita magni adipisci excepturi unde nihil dicta.", + "date": { + "$date": "2007-03-05T21:28:35.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a4b" + }, + "name": "Gregor Clegane", + "email": "hafthór_júlíus_björnsson@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd5b9a" + }, + "text": "Voluptatum voluptatem nam et accusamus ullam qui explicabo exercitationem. Ut sint facilis aut similique dolorum non. Necessitatibus unde molestias incidunt asperiores nesciunt molestias.", + "date": { + "$date": "2015-02-08T01:28:23.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb69579d0" + }, + "name": "Talisa Maegyr", + "email": "oona_chaplin@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd41b1" + }, + "text": "Rem itaque ad sit rem voluptatibus. Ad fugiat maxime illum optio iure alias minus. Optio ratione suscipit corporis qui dicta.", + "date": { + "$date": "1998-08-22T11:45:03.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a03" + }, + "name": "Beric Dondarrion", + "email": "richard_dormer@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd47f0" + }, + "text": "Placeat sapiente in natus nemo. Qui quibusdam praesentium doloribus aut provident. Optio nihil officia suscipit numquam at.", + "date": { + "$date": "1998-09-04T04:41:51.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a12" + }, + "name": "Brenda Martin", + "email": "brenda_martin@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd4cf1" + }, + "text": "Explicabo est officia magni quod ab quis. Tenetur consequuntur facilis recusandae incidunt eligendi.", + "date": { + "$date": "2012-01-18T09:50:15.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb69579cc" + }, + "name": "Andrea Le", + "email": "andrea_le@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd418c" + }, + "text": "Rem officiis eaque repellendus amet eos doloribus. Porro dolor voluptatum voluptates neque culpa molestias. Voluptate unde nulla temporibus ullam.", + "date": { + "$date": "2012-03-26T23:20:16.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a1a" + }, + "name": "Robb Stark", + "email": "richard_madden@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd4ec2" + }, + "text": "Illum laudantium deserunt totam. Repudiandae explicabo soluta dolores atque corrupti. Odit laudantium quam aperiam ullam.", + "date": { + "$date": "2005-06-26T12:20:51.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a38" + }, + "name": "Yara Greyjoy", + "email": "gemma_whelan@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd587d" + }, + "text": "Nobis incidunt ea tempore cupiditate sint. Itaque beatae hic ut quis.", + "date": { + "$date": "2012-11-26T11:00:57.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb69579d6" + }, + "name": "Taylor Hill", + "email": "taylor_hill@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd4137" + }, + "text": "Neque repudiandae laborum earum ipsam facilis blanditiis voluptate. Aliquam vitae porro repellendus voluptatum facere.", + "date": { + "$date": "1993-10-23T13:16:51.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a0f" + }, + "name": "Melisandre", + "email": "carice_van_houten@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd4c0b" + }, + "text": "Perspiciatis non debitis magnam. Voluptate adipisci quo et laborum. Recusandae quia officiis ad aut rem blanditiis sit.", + "date": { + "$date": "1974-06-22T07:31:47.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb69579d5" + }, + "name": "Petyr Baelish", + "email": "aidan_gillen@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd4218" + }, + "text": "Quo deserunt ipsam ipsum. Tenetur eos nemo nam sint praesentium minus exercitationem.", + "date": { + "$date": "2001-07-13T19:25:09.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a01" + }, + "name": "Sarah Lewis", + "email": "sarah_lewis@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd471c" + }, + "text": "Totam molestiae accusamus sed illum aut autem maiores quo. Necessitatibus dolorum sed ea rem. Nihil perferendis fugit tempore quam. Laboriosam aliquam nulla ratione explicabo unde consectetur.", + "date": { + "$date": "1981-03-31T06:38:59.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a5a" + }, + "name": "Janos Slynt", + "email": "dominic_carter@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd5d89" + }, + "text": "Voluptates necessitatibus cum modi repellendus perferendis. Ipsa numquam eum nulla recusandae impedit recusandae. In ex autem tempora nam excepturi earum.", + "date": { + "$date": "1975-05-12T23:28:20.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a7d" + }, + "name": "Stannis Baratheon", + "email": "stephen_dillane@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd63cb" + }, + "text": "Earum eaque pariatur tempora aut perferendis. Repellat expedita dolore unde placeat corporis. Rerum animi similique doloremque iste.", + "date": { + "$date": "1988-08-11T09:30:55.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a84" + }, + "name": "Mace Tyrell", + "email": "roger_ashton-griffiths@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd67e9" + }, + "text": "Ipsam non non dignissimos incidunt perspiciatis voluptatibus. Corporis dicta unde tempore sapiente. Voluptatem quia esse deserunt assumenda porro. Eius totam ratione sed voluptatibus culpa.", + "date": { + "$date": "1993-08-12T00:26:22.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a86" + }, + "name": "Barbara Gonzalez", + "email": "barbara_gonzalez@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd681b" + }, + "text": "Accusantium ex veritatis est aut facere commodi asperiores. Dignissimos cum rerum odit labore. Eum quos architecto perspiciatis molestiae voluptate doloribus dolorem veniam.", + "date": { + "$date": "1982-03-09T02:56:42.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a99" + }, + "name": "Connie Johnson", + "email": "connie_johnson@fakegmail.com", + "movie_id": { + "$oid": "573a1391f29313caabcd695a" + }, + "text": "Quo minima excepturi quisquam blanditiis quod velit. Minus dolor incidunt repellat eligendi ducimus quod. Minus officiis possimus iure nemo nisi ab eos magni.", + "date": { + "$date": "2005-05-17T16:52:25.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a2e" + }, + "name": "Bowen Marsh", + "email": "michael_condron@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd5570" + }, + "text": "Odit laudantium cupiditate ipsum ipsam. Officia nisi totam sequi recusandae excepturi. Impedit vitae iste nisi eius. Consequuntur iusto animi nemo libero.", + "date": { + "$date": "1987-07-03T12:54:13.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a09" + }, + "name": "Daario Naharis", + "email": "michiel_huisman@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd4aa2" + }, + "text": "Distinctio commodi autem amet molestias. Dolorem numquam vitae voluptas corporis fugit aut autem earum.", + "date": { + "$date": "1979-07-06T20:36:21.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a55" + }, + "name": "Javier Smith", + "email": "javier_smith@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd5c04" + }, + "text": "Omnis temporibus at ut saepe dolor saepe suscipit. Laborum veritatis autem cumque exercitationem aliquam. Nulla laudantium ab esse deserunt reprehenderit veniam. Ea deserunt nesciunt dicta nisi.", + "date": { + "$date": "2006-10-18T01:20:58.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a1e" + }, + "name": "Emily Ellis", + "email": "emily_ellis@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd5104" + }, + "text": "Illo optio ipsa similique quo maxime. Fugiat illum ullam aliquid. Corporis distinctio omnis fugiat facilis aliquam ea commodi labore.", + "date": { + "$date": "2002-08-25T09:37:45.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a3f" + }, + "name": "Rickon Stark", + "email": "art_parkinson@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd5954" + }, + "text": "Aliquam fuga quos nihil exercitationem maiores maxime. Ex sit velit repellendus. Vitae cupiditate laudantium facilis culpa ea nostrum labore. Cum animi vitae incidunt ipsum facilis repellendus.", + "date": { + "$date": "1991-08-12T23:00:32.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a75" + }, + "name": "Talisa Maegyr", + "email": "oona_chaplin@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd62f3" + }, + "text": "Error laudantium omnis delectus facilis illum repellat praesentium. Possimus quo doloremque occaecati a laborum sapiente dolore.", + "date": { + "$date": "1972-06-28T16:06:43.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a88" + }, + "name": "Thomas Morris", + "email": "thomas_morris@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd680a" + }, + "text": "Perspiciatis sequi nesciunt maiores. Molestiae earum odio voluptas animi ipsam. Dolorem libero temporibus omnis quaerat deleniti atque. Tempore delectus esse explicabo nemo.", + "date": { + "$date": "2004-02-26T06:33:03.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb69579d3" + }, + "name": "Cameron Duran", + "email": "cameron_duran@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd4217" + }, + "text": "Quasi dicta culpa asperiores quaerat perferendis neque. Est animi pariatur impedit itaque exercitationem.", + "date": { + "$date": "1983-04-27T20:39:15.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a42" + }, + "name": "Davos Seaworth", + "email": "liam_cunningham@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd592c" + }, + "text": "Illo amet aliquid molestias repellat modi reprehenderit. Nobis totam dicta accusamus voluptates. Eaque distinctio nostrum accusamus eos inventore iste iste sapiente.", + "date": { + "$date": "2010-06-14T05:19:24.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb69579fe" + }, + "name": "Daario Naharis", + "email": "michiel_huisman@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd47c2" + }, + "text": "Enim enim deleniti in debitis. Delectus nesciunt id tenetur.", + "date": { + "$date": "1988-11-19T05:22:18.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a25" + }, + "name": "Osha", + "email": "natalia_tena@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd5181" + }, + "text": "Dolor inventore commodi eos ipsum earum vitae quidem. Optio debitis rerum voluptas voluptatibus quos. Harum quam delectus rem sint.", + "date": { + "$date": "1992-08-26T21:07:54.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a2c" + }, + "name": "Samwell Tarly", + "email": "john_bradley-west@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd54ed" + }, + "text": "Natus enim voluptate dolore. Quo porro ipsum enim. Est totam sapiente nam vero.", + "date": { + "$date": "1988-02-25T03:56:33.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a46" + }, + "name": "Denise Davidson", + "email": "denise_davidson@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd5b2a" + }, + "text": "Numquam voluptas veniam ducimus sunt accusamus harum distinctio autem. Aliquid dicta nulla aperiam veniam placeat quam. Veritatis maiores ipsa quos accusantium molestiae eum voluptatibus.", + "date": { + "$date": "1986-11-08T13:05:21.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a52" + }, + "name": "Sarah Lewis", + "email": "sarah_lewis@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd5ca5" + }, + "text": "Incidunt molestiae quam ipsum hic incidunt harum magnam perspiciatis. Quisquam eum sunt fuga ut laborum ducimus ratione. Ut dolorum totam voluptatem excepturi.", + "date": { + "$date": "2000-12-25T08:51:17.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a77" + }, + "name": "Bran Stark", + "email": "isaac_hempstead_wright@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd62f3" + }, + "text": "Quibusdam ea excepturi quo suscipit suscipit ipsa beatae. Id optio ratione incidunt dolor. Maiores optio aspernatur velit laudantium. Repudiandae vel voluptatum laudantium sint.", + "date": { + "$date": "1979-12-25T14:48:19.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb69579eb" + }, + "name": "Emily Ellis", + "email": "emily_ellis@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd432a" + }, + "text": "Iste molestiae animi minima quod ad. Corporis maiores suscipit sapiente nam perferendis autem eos. Id adipisci natus aut facilis iste consequuntur.", + "date": { + "$date": "1988-10-16T19:08:23.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb69579ea" + }, + "name": "Cameron Duran", + "email": "cameron_duran@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd433d" + }, + "text": "Ad asperiores mollitia aperiam non incidunt. Totam fugiat cumque praesentium placeat. Debitis tenetur eligendi recusandae enim perferendis. Vero maiores eveniet reiciendis necessitatibus.", + "date": { + "$date": "1989-01-21T14:20:47.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb69579ee" + }, + "name": "Theon Greyjoy", + "email": "alfie_allen@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd437c" + }, + "text": "Dicta asperiores necessitatibus corporis. Quidem fugiat eius animi fugiat laborum. Quas maiores mollitia amet quibusdam. Ducimus sed asperiores sint recusandae accusamus veniam.", + "date": { + "$date": "2000-12-06T07:26:29.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a0e" + }, + "name": "Viserys Targaryen", + "email": "harry_lloyd@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd4b1b" + }, + "text": "Itaque minima enim mollitia rerum hic. Doloribus dolor nobis corporis fuga quod error. Consequuntur eligendi quibusdam sequi error aliquam dolore.", + "date": { + "$date": "2010-03-20T02:11:01.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a54" + }, + "name": "Loras Tyrell", + "email": "finn_jones@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd5ca5" + }, + "text": "Ratione nemo cumque provident itaque voluptatem mollitia quas. Atque possimus asperiores dicta non. Libero aliquam nihil nisi quasi.", + "date": { + "$date": "1970-06-22T12:20:24.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a72" + }, + "name": "Jaime Lannister", + "email": "nikolaj_coster-waldau@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd604c" + }, + "text": "Laborum reprehenderit repellat necessitatibus non molestias adipisci excepturi. Illum magni dolore iure. Quo itaque beatae culpa porro necessitatibus. Magnam natus quos maiores nihil.", + "date": { + "$date": "1993-06-24T03:08:50.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a73" + }, + "name": "Kathryn Sosa", + "email": "kathryn_sosa@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd62d6" + }, + "text": "Error enim architecto ipsam voluptatum. Deleniti voluptates unde cumque aperiam veritatis magni repellendus aliquid. Voluptas quibusdam sit ullam tempora omnis cumque tempora.", + "date": { + "$date": "1997-07-18T16:35:33.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb69579f5" + }, + "name": "John Bishop", + "email": "john_bishop@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd446f" + }, + "text": "Id error ab at molestias dolorum incidunt. Non deserunt praesentium dolorem nihil. Optio tempora vel ut quas.\nMinus dicta numquam quasi. Rem totam cumque at eum. Ullam hic ut ea magni.", + "date": { + "$date": "1975-01-21T00:31:22.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a22" + }, + "name": "Taylor Scott", + "email": "taylor_scott@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd4eaf" + }, + "text": "Iure laboriosam quo et necessitatibus sed. Id iure delectus soluta. Quaerat officiis maiores commodi earum. Autem odio labore debitis optio libero.", + "date": { + "$date": "1970-11-15T05:54:02.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a7c" + }, + "name": "Ronald Cox", + "email": "ronald_cox@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd6424" + }, + "text": "Reprehenderit commodi ut odit. Maxime perspiciatis eum in sapiente unde doloremque. Occaecati atque asperiores error velit. Amet assumenda tenetur veniam numquam occaecati nam.", + "date": { + "$date": "1982-03-26T09:37:11.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb69579db" + }, + "name": "Olly", + "email": "brenock_o'connor@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd413b" + }, + "text": "Perspiciatis sit pariatur quas. Perferendis officia harum ipsum deleniti vel inventore. Nobis culpa eaque in blanditiis porro esse. Nisi deserunt culpa expedita dolorum quo aperiam.", + "date": { + "$date": "2005-01-04T13:49:05.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb69579cf" + }, + "name": "Greg Powell", + "email": "greg_powell@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd41b1" + }, + "text": "Tenetur dolorum molestiae ea. Eligendi praesentium unde quod porro. Commodi nisi sit placeat rerum vero cupiditate neque. Dolorum nihil vero animi.", + "date": { + "$date": "1987-02-10T00:29:36.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb69579dd" + }, + "name": "Joshua Kent", + "email": "joshua_kent@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd42ee" + }, + "text": "Corporis pariatur rem autem accusamus debitis. Eaque aspernatur quae accusantium non ea quasi ullam. Assumenda quibusdam blanditiis inventore velit dolorem. Adipisci quaerat quae architecto sint.", + "date": { + "$date": "1993-12-06T18:45:21.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a40" + }, + "name": "Jason Smith", + "email": "jason_smith@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd5a37" + }, + "text": "Blanditiis sunt quis voluptate ex soluta id. Debitis excepturi consequuntur quis nemo amet. Fuga voluptas modi rerum aliquam optio quae a aspernatur.", + "date": { + "$date": "1978-06-30T21:42:48.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a67" + }, + "name": "Sarah Lewis", + "email": "sarah_lewis@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd5fa9" + }, + "text": "Ab consequatur numquam sed eligendi ex unde. Dolorem illum minima numquam dicta ipsa magnam nostrum. Possimus sed inventore cum non.", + "date": { + "$date": "2005-09-18T01:30:56.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a6b" + }, + "name": "Maester Luwin", + "email": "donald_sumpter@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd61b1" + }, + "text": "Excepturi vitae mollitia voluptates esse facere. Minus a distinctio error natus totam eos. Ducimus dicta maiores iusto. Facilis sequi sunt velit minus.", + "date": { + "$date": "1988-04-30T15:49:35.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a87" + }, + "name": "Anthony Cline", + "email": "anthony_cline@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd681b" + }, + "text": "Reiciendis adipisci veritatis molestias sint officiis ab cupiditate. Reiciendis laudantium nam explicabo rerum. Ea accusamus iste necessitatibus.", + "date": { + "$date": "1979-12-27T23:39:52.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a94" + }, + "name": "Victoria Sanders", + "email": "victoria_sanders@fakegmail.com", + "movie_id": { + "$oid": "573a1391f29313caabcd6864" + }, + "text": "Nulla fugiat nulla omnis atque. Architecto libero rem blanditiis ea ea ut praesentium accusamus. Possimus est quibusdam numquam optio eveniet. Magni fuga neque ad consequuntur maxime.", + "date": { + "$date": "1986-03-11T12:35:36.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a23" + }, + "name": "Shae", + "email": "sibel_kekilli@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd4b1b" + }, + "text": "Ullam excepturi animi voluptates magnam quos dolore aliquid. Praesentium illum non vitae ab debitis blanditiis. Tempore quam iste inventore minima. Ad itaque dignissimos soluta fugiat aliquid.", + "date": { + "$date": "1995-03-05T06:06:17.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a27" + }, + "name": "Jerry Cabrera", + "email": "jerry_cabrera@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd51e1" + }, + "text": "In facere explicabo inventore dolorum dignissimos neque. Voluptate amet numquam doloribus temporibus necessitatibus eius inventore. Quaerat itaque sunt voluptas dicta maxime.", + "date": { + "$date": "1993-03-19T05:34:13.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a63" + }, + "name": "Anthony Smith", + "email": "anthony_smith@fakegmail.com", + "movie_id": { + "$oid": "573a1390f29313caabcd5e52" + }, + "text": "Veniam tenetur culpa aliquam provident explicabo nesciunt. Numquam exercitationem deserunt dolore quas facere ducimus.", + "date": { + "$date": "1971-07-29T19:40:20.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a64" + }, + "name": "Beric Dondarrion", + "email": "richard_dormer@gameofthron.es", + "movie_id": { + "$oid": "573a1390f29313caabcd5fe6" + }, + "text": "Odit eligendi explicabo ab unde aut laboriosam officia. Dolorem expedita molestiae voluptates esse quaerat hic. Consequatur dolor aspernatur sequi necessitatibus maxime.", + "date": { + "$date": "1980-07-09T14:30:12.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957a9c" + }, + "name": "Jose Hall", + "email": "jose_hall@fakegmail.com", + "movie_id": { + "$oid": "573a1391f29313caabcd69c9" + }, + "text": "Asperiores delectus officia non. Consequuntur pariatur laborum dolor optio animi. Debitis deserunt maxime voluptatem asperiores. Officiis architecto sit modi doloribus autem.", + "date": { + "$date": "2016-09-01T05:25:31.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957aa3" + }, + "name": "Yolanda Owen", + "email": "yolanda_owen@fakegmail.com", + "movie_id": { + "$oid": "573a1391f29313caabcd6d40" + }, + "text": "Occaecati commodi quidem aliquid delectus dolores. Facilis fugiat soluta maxime ipsum. Facere quibusdam vitae eius in fugit voluptatum beatae.", + "date": { + "$date": "1980-07-13T06:41:13.000Z" + } + }, + { + "_id": { + "$oid": "5a9427648b0beebeb6957ad7" + }, + "name": "Mary Mitchell", + "email": "mary_mitchell@fakegmail.com", + "movie_id": { + "$oid": "573a1391f29313caabcd712f" + }, + "text": "Possimus odio laborum labore modi nihil molestiae nostrum. Placeat tempora neque ut. Sit sunt cupiditate error corrupti aperiam ducimus deserunt. Deserunt explicabo libero quo iste voluptas.", + "date": { + "$date": "1980-06-12T13:14:32.000Z" + } + } +] diff --git a/packages/compass-generative-ai/tests/evals/fixtures/netflix.movies.json b/packages/compass-generative-ai/tests/evals/fixtures/netflix.movies.json new file mode 100644 index 00000000000..05432750c79 --- /dev/null +++ b/packages/compass-generative-ai/tests/evals/fixtures/netflix.movies.json @@ -0,0 +1,346 @@ +[ + { + "_id": { + "$oid": "573b864df29313caabe354ed" + }, + "title": "Dinosaur Planet", + "year": 2003, + "id": "1" + }, + { + "_id": { + "$oid": "573b864df29313caabe354ef" + }, + "title": "Isle of Man TT 2004 Review", + "year": 2004, + "id": "2" + }, + { + "_id": { + "$oid": "573b864df29313caabe354f0" + }, + "title": "Paula Abdul's Get Up & Dance", + "year": 1994, + "id": "4" + }, + { + "_id": { + "$oid": "573b864df29313caabe354f1" + }, + "title": "The Rise and Fall of ECW", + "year": 2004, + "id": "5" + }, + { + "_id": { + "$oid": "573b864df29313caabe354f2" + }, + "title": "Sick", + "year": 1997, + "id": "6" + }, + { + "_id": { + "$oid": "573b864df29313caabe354f3" + }, + "title": "8 Man", + "year": 1992, + "id": "7" + }, + { + "_id": { + "$oid": "573b864df29313caabe354f4" + }, + "title": "What the #$*! Do We Know!?", + "year": 2004, + "id": "8" + }, + { + "_id": { + "$oid": "573b864df29313caabe354f5" + }, + "title": "Fighter", + "year": 2002, + "id": "10" + }, + { + "_id": { + "$oid": "573b864df29313caabe354f6" + }, + "title": "Class of Nuke 'Em High 2", + "year": 1991, + "id": "9" + }, + { + "_id": { + "$oid": "573b864df29313caabe354f7" + }, + "title": "My Favorite Brunette", + "year": 1947, + "id": "12" + }, + { + "_id": { + "$oid": "573b864df29313caabe354f8" + }, + "title": "Full Frame: Documentary Shorts", + "year": 1999, + "id": "11" + }, + { + "_id": { + "$oid": "573b864df29313caabe354f9" + }, + "title": "Lord of the Rings: The Return of the King: Extended Edition: Bonus Material", + "year": 2003, + "id": "13" + }, + { + "_id": { + "$oid": "573b864df29313caabe354fa" + }, + "title": "Neil Diamond: Greatest Hits Live", + "year": 1988, + "id": "15" + }, + { + "_id": { + "$oid": "573b864df29313caabe354fb" + }, + "title": "7 Seconds", + "year": 2005, + "id": "17" + }, + { + "_id": { + "$oid": "573b864df29313caabe354fc" + }, + "title": "Nature: Antarctica", + "year": 1982, + "id": "14" + }, + { + "_id": { + "$oid": "573b864df29313caabe354fe" + }, + "title": "By Dawn's Early Light", + "year": 2000, + "id": "19" + }, + { + "_id": { + "$oid": "573b864df29313caabe35500" + }, + "title": "Strange Relations", + "year": 2002, + "id": "21" + }, + { + "_id": { + "$oid": "573b864df29313caabe35501" + }, + "title": "Chump Change", + "year": 2000, + "id": "22" + }, + { + "_id": { + "$oid": "573b864df29313caabe35502" + }, + "title": "Screamers", + "year": 1996, + "id": "16" + }, + { + "_id": { + "$oid": "573b864df29313caabe35505" + }, + "title": "Inspector Morse 31: Death Is Now My Neighbour", + "year": 1997, + "id": "25" + }, + { + "_id": { + "$oid": "573b864df29313caabe35506" + }, + "title": "Never Die Alone", + "year": 2004, + "id": "26" + }, + { + "_id": { + "$oid": "573b864df29313caabe35508" + }, + "title": "Lilo and Stitch", + "year": 2002, + "id": "28" + }, + { + "_id": { + "$oid": "573b864df29313caabe3550a" + }, + "title": "Something's Gotta Give", + "year": 2003, + "id": "30" + }, + { + "_id": { + "$oid": "573b864df29313caabe3550c" + }, + "title": "ABC Primetime: Mel Gibson's The Passion of the Christ", + "year": 2004, + "id": "32" + }, + { + "_id": { + "$oid": "573b864df29313caabe3550d" + }, + "title": "Ferngully 2: The Magical Rescue", + "year": 2000, + "id": "35" + }, + { + "_id": { + "$oid": "573b864df29313caabe3550e" + }, + "title": "Ashtanga Yoga: Beginner's Practice with Nicki Doane", + "year": 2003, + "id": "34" + }, + { + "_id": { + "$oid": "573b864df29313caabe35513" + }, + "title": "Love Reinvented", + "year": 2000, + "id": "39" + }, + { + "_id": { + "$oid": "573b864df29313caabe35514" + }, + "title": "Pitcher and the Pin-Up", + "year": 2004, + "id": "40" + }, + { + "_id": { + "$oid": "573b864df29313caabe35515" + }, + "title": "Horror Vision", + "year": 2000, + "id": "41" + }, + { + "_id": { + "$oid": "573b864df29313caabe35516" + }, + "title": "Silent Service", + "year": 2000, + "id": "43" + }, + { + "_id": { + "$oid": "573b864df29313caabe35517" + }, + "title": "Searching for Paradise", + "year": 2002, + "id": "42" + }, + { + "_id": { + "$oid": "573b864df29313caabe35518" + }, + "title": "Spitfire Grill", + "year": 1996, + "id": "44" + }, + { + "_id": { + "$oid": "573b864df29313caabe3551a" + }, + "title": "Rudolph the Red-Nosed Reindeer", + "year": 1964, + "id": "46" + }, + { + "_id": { + "$oid": "573b864df29313caabe3551e" + }, + "title": "A Yank in the R.A.F.", + "year": 1941, + "id": "50" + }, + { + "_id": { + "$oid": "573b864df29313caabe35524" + }, + "title": "Carandiru", + "year": 2004, + "id": "56" + }, + { + "_id": { + "$oid": "573b864df29313caabe35526" + }, + "title": "Dragonheart", + "year": 1996, + "id": "58" + }, + { + "_id": { + "$oid": "573b864df29313caabe35528" + }, + "title": "Ricky Martin: One Night Only", + "year": 1999, + "id": "61" + }, + { + "_id": { + "$oid": "573b864df29313caabe35529" + }, + "title": "The Libertine", + "year": 1969, + "id": "60" + }, + { + "_id": { + "$oid": "573b864df29313caabe3552a" + }, + "title": "Ken Burns' America: Empire of the Air", + "year": 1991, + "id": "62" + }, + { + "_id": { + "$oid": "573b864df29313caabe3552b" + }, + "title": "Crash Dive", + "year": 1943, + "id": "63" + }, + { + "_id": { + "$oid": "573b864df29313caabe3552e" + }, + "title": "Invader Zim", + "year": 2004, + "id": "68" + }, + { + "_id": { + "$oid": "573b864df29313caabe35530" + }, + "title": "Tai Chi: The 24 Forms", + "year": 1999, + "id": "70" + }, + { + "_id": { + "$oid": "573b864df29313caabe35531" + }, + "title": "WWE: Armageddon 2003", + "year": 2003, + "id": "69" + } +] diff --git a/packages/compass-generative-ai/tests/evals/gen-ai.eval.ts b/packages/compass-generative-ai/tests/evals/gen-ai.eval.ts new file mode 100644 index 00000000000..cefc8a35ced --- /dev/null +++ b/packages/compass-generative-ai/tests/evals/gen-ai.eval.ts @@ -0,0 +1,23 @@ +import { Eval } from 'braintrust'; +import type { + ConversationEvalCaseExpected, + ConversationEvalCaseInput, + ConversationTaskOutput, +} from './types'; +import { makeChatbotCall } from './chatbot-api'; +import { Factuality } from './scorers'; +import { generateGenAiEvalCases } from './use-cases'; + +const GEN_AI_PROJECT_NAME = 'Compass Gen AI'; + +void Eval< + ConversationEvalCaseInput, + ConversationTaskOutput, + ConversationEvalCaseExpected +>(GEN_AI_PROJECT_NAME, { + data: async () => { + return await generateGenAiEvalCases(); + }, + task: makeChatbotCall, + scores: [Factuality], +}); diff --git a/packages/compass-generative-ai/tests/evals/scorers.ts b/packages/compass-generative-ai/tests/evals/scorers.ts new file mode 100644 index 00000000000..60e0acb2d45 --- /dev/null +++ b/packages/compass-generative-ai/tests/evals/scorers.ts @@ -0,0 +1,25 @@ +import type { ConversationEvalScorer } from './types'; +import { Factuality as _Factuality } from 'autoevals'; +import { allText } from './utils'; +import { createNoopLogger } from '@mongodb-js/compass-logging/provider'; +import { parseXmlToMmsJsonResponse } from '../../src/utils/xml-to-mms-response'; + +const logger = createNoopLogger(); + +export const Factuality: ConversationEvalScorer = ({ + input, + output, + expected, +}) => { + return _Factuality({ + input: allText(input.messages), + output: JSON.stringify( + parseXmlToMmsJsonResponse(allText(output.messages), logger) + ), + expected: JSON.stringify( + parseXmlToMmsJsonResponse(allText(expected.messages), logger) + ), + model: 'gpt-4.1', + temperature: undefined, + }); +}; diff --git a/packages/compass-generative-ai/tests/evals/types.ts b/packages/compass-generative-ai/tests/evals/types.ts new file mode 100644 index 00000000000..64f0f802148 --- /dev/null +++ b/packages/compass-generative-ai/tests/evals/types.ts @@ -0,0 +1,27 @@ +import type { EvalScorer } from 'braintrust'; + +export type Message = { + content: string; +}; +type InputMessage = Message & { role: 'user' }; +type OutputMessage = Message; +type ExpectedMessage = OutputMessage; + +export type ConversationEvalCaseInput = { + messages: InputMessage[]; + instructions: Message; +}; + +export type ConversationEvalCaseExpected = { + messages: OutputMessage[]; +}; + +export type ConversationTaskOutput = { + messages: ExpectedMessage[]; +}; + +export type ConversationEvalScorer = EvalScorer< + ConversationEvalCaseInput, + ConversationTaskOutput, + ConversationEvalCaseExpected +>; diff --git a/packages/compass-generative-ai/tests/evals/use-cases/aggregate-query.ts b/packages/compass-generative-ai/tests/evals/use-cases/aggregate-query.ts new file mode 100644 index 00000000000..88aedcaa312 --- /dev/null +++ b/packages/compass-generative-ai/tests/evals/use-cases/aggregate-query.ts @@ -0,0 +1,301 @@ +import type { GenAiUsecase } from '.'; + +export const aggregateQueries: GenAiUsecase[] = [ + { + namespace: 'netflix.movies', + userInput: 'find all the movies released in 1983', + expectedOutput: `[{$match: {year: 1983}}]`, + name: 'basic aggregate query', + }, + { + namespace: 'netflix.movies', + userInput: + 'find three movies with alien in the title, show earliest movies first, only the _id, title and year', + expectedOutput: ` + [ + {$match: {title: {$regex: "alien", $options: "i"}}}, + {$project: {_id: 1, title: 1, year: 1}}, + {$sort: {year: 1}}, + {$limit: 3} + ] + `, + name: 'aggregate with filter projection sort and limit', + }, + { + namespace: 'NYC.parking_2015', + userInput: + 'find all the violations for the violation code 21 and only return the car plate', + expectedOutput: ` + [{$match: {"Violation Code": 21}}, {$project: {"Plate ID": 1, _id: 0}}] + `, + name: 'aggregate with filter and projection', + }, + { + namespace: 'berlin.cocktailbars', + userInput: + 'find all the bars 10km from the berlin center, only return their names. Berlin center is at longitude 13.4050 and latitude 52.5200', + // [ { $geoNear: { near: { type: "Point", coordinates: [13.4050, 52.5200] }, distanceField: "dist", maxDistance: 10000, spherical: true, key: "koordinaten" } }, { $project: { name: 1, _id: 0 } } ] + expectedOutput: ` + [ + {$match: {location: {$geoWithin: {$centerSphere: [[13.4050, 52.5200], 10 / 3963.2]}}}}, + {$project: {name: 1, _id: 0}} + ] + `, + name: 'geo-based aggregate', + }, + { + namespace: 'airbnb.listingsAndReviews', + userInput: + 'Return all the properties of type "Hotel" and with ratings lte 70', + // [ { $match: { property_type: "Hotel", "review_scores.review_scores_rating": { $lte: 70 } } } ] + expectedOutput: ` + [{ + $match: { + $and: [ + {property_type: "Hotel"}, + {number_of_reviews: {$lte: 70}} + ] + } + }] + `, + name: 'aggregate with nested fields in $match', + }, + { + namespace: 'airbnb.listingsAndReviews', + userInput: + 'what is the bed count that occurs the most? return it in a field called bedCount (only return the bedCount field)', + expectedOutput: ` + [ + {$group: {_id: "$beds", count: {$sum: 1}}}, + {$sort: {count: -1}}, + {$limit: 1}, + {$project: {bedCount: "$_id"}} + ] + `, + name: 'aggregate with group sort limit and project', + }, + { + namespace: 'airbnb.listingsAndReviews', + userInput: + 'which host id has the most reviews across all listings? return it in only a field called hostId', + expectedOutput: ` + [ + {$group: {_id: "$host.host_id", totalReviews: {$sum: "$number_of_reviews"}}}, + {$sort: {totalReviews: -1}}, + {$limit: 1}, + {$project: {hostId: "$_id"}} + ] + `, + name: 'aggregate with group sort limit and project 2', + }, + { + namespace: 'netflix.movies', + userInput: + 'Which movies were released in last 30 years. return title and year', + expectedOutput: ` + [ + { + $match: { + $and: [ + {year: {$gte: ${new Date().getFullYear() - 30}}}, + {year: {$lt: ${new Date().getFullYear() - 29}}}, + ] + } + }, + {$project: {title: 1, year: 1}} + ] + `, + name: 'relative date aggregate 1', + }, + { + namespace: 'netflix.movies', + userInput: 'find all of the movies from last year', + expectedOutput: ` + [{$match: {year: ${new Date().getFullYear() - 1}}}] + `, + name: 'relative date aggregate 2', + }, + { + namespace: 'airbnb.listingsAndReviews', + userInput: + 'give me just the price and the first 3 amenities (in a field called amenities) of the listing that has "Step-free access" in its amenities.', + expectedOutput: ` + [ + {$match: {amenities: "Step-free access"}}, + {$project: {price: 1, amenities: {$slice: ["$amenities", 3]}}} + ] + `, + name: 'aggregate with array slice', + }, + { + namespace: 'NYC.parking_2015', + userInput: + 'Return only the Plate IDs of Acura vehicles registered in New York', + expectedOutput: ` + [ + {$match: {$and: [{"Vehicle Make": "ACURA"}, {"Registration State": "NY"}]}}, + {$project: {"Plate ID": 1}} + ] + `, + name: 'aggregate with multiple conditions in match', + }, + { + namespace: 'airbnb.listingsAndReviews', + userInput: + '¿Qué alojamiento tiene el precio más bajo? devolver el número en un campo llamado "precio"', + expectedOutput: ` + [{ + $project: {_id: 0, precio: "$price"}, + $sort: {price: 1}, + $limit: 1 + }] + `, + name: 'aggregate with non-english prompt', + }, + { + namespace: 'airbnb.listingsAndReviews', + userInput: + 'give me only cancellation policy and listing url of the most expensive listing', + expectedOutput: ` + [ + {$sort: {price: -1}}, + {$project: {cancellation_policy: 1, "listing_url": 1}}, + {$limit: 1} + ] + `, + name: 'simple aggregate with sort and limit', + }, + // { + // namespace: 'berlin.cocktailbars', + // userInput: + // '', + // expectedOutput: ` + // [ + // {$unwind: "$items"}, + // {$unwind: "$items.tags"}, + // {$group: {_id: "$items.tags", avgPrice: {$avg: "$items.price"}}}, + // {$project: {_id: 0, tag: "$_id", avgPrice: 1}} + // ] + // `, + // name: 'aggregate with unwind and group', + // }, + { + namespace: 'airbnb.listingsAndReviews', + userInput: + 'which listing has the most amenities? the resulting documents should only have the _id', + expectedOutput: ` + [ + {$project: {_id: 1, numAmenities: {$size: "$amenities"}}}, + {$sort: {numAmenities: -1}}, + {$limit: 1}, + {$project: {_id: 1}} + ] + `, + name: 'aggregate with size operator', + }, + { + namespace: 'netflix.movies', + userInput: + 'What are the 5 most frequent words (case sensitive) used in movie titles in the 1980s and 1990s combined? Sorted first by frequency count then alphabetically. output fields count and word', + expectedOutput: ` + [ + {$match: {year: {$regex: "^(198[0-9]|199[0-9])$"}}}, + {$addFields: {titleWords: {$split: ["$title", " "]}}}, + {$unwind: "$titleWords"}, + {$group: {_id: "$titleWords", count: {$sum: 1}}}, + {$sort: {count: -1, _id: 1}}, + {$limit: 5}, + {$project: {_id: 0, count: 1, word: "$_id"}} + ] + `, + name: 'aggregate with regex, addFields and split', + }, + { + namespace: 'airbnb.listingsAndReviews', + userInput: + 'what percentage of listings have a "Washer" in their amenities? Only consider listings with more than 2 beds. Return is as a string named "washerPercentage" like "75%", rounded to the nearest whole number.', + expectedOutput: ` + [ + {$match: {beds: {$gt: 2}}}, + { + $group: { + _id: null, + totalListings: {$sum: 1}, + withWasher: { + $sum: { + $cond: [{$in: ["Washer", "$amenities"]}, 1, 0] + } + } + } + }, + { + $project: { + washerPercentage: { + $concat: [ + { + $toString: { + $round: { + $multiply: [ + {$divide: ["$withWasher", "$totalListings"]}, + 100 + ] + } + } + }, + "%" + ] + } + } + } + ] + `, + name: 'super complex aggregate with complex project', + }, + { + namespace: 'NYC.parking_2015', + userInput: + 'Write a query that does the following: find all of the parking incidents that occurred on an ave (match all ways to write ave). Return all of the plate ids involved with their summons number and vehicle make and body type. Put the vehicle make and body type into lower case. No _id, sorted by the summons number lowest first.', + expectedOutput: ` + [ + {$match: {"Street Name": {$regex: "ave", $options: "i"}}}, + {$sort: {"Summons Number": 1}}, + { + $project: { + "Summons Number": 1, + "Plate ID": 1, + "Vehicle Make": {$toLower: "$Vehicle Make"}, + "Vehicle Body Type": {$toLower: "$Vehicle Body Type"}, + _id: 0 + } + } + ] + `, + name: 'complex aggregate with regex and string operators', + }, + { + namespace: 'netflix.comments', + userInput: + 'join with "movies" based on a movie_id and return one document for each comment with movie_title (from movie.title) and comment_text', + expectedOutput: `[ + { + $lookup: { + from: 'movies', + localField: 'movie_id', + foreignField: '_id', + as: 'movies', + }, + }, + { $unwind: '$movies' }, + { $project: { movie_title: '$movies.title', comment_text: '$text', _id: 0 } }, + ]`, + name: 'aggregate prompt with sql join', + }, + { + namespace: 'netflix.comments', + userInput: 'return only the customer email', + expectedOutput: ` + [{$project: {email: 1, _id: 0}}] + `, + name: 'simple projection aggregate', + }, +]; diff --git a/packages/compass-generative-ai/tests/evals/use-cases/find-query.ts b/packages/compass-generative-ai/tests/evals/use-cases/find-query.ts new file mode 100644 index 00000000000..0d21ad4c10a --- /dev/null +++ b/packages/compass-generative-ai/tests/evals/use-cases/find-query.ts @@ -0,0 +1,188 @@ +import type { GenAiUsecase } from '.'; + +export const findQueries: GenAiUsecase[] = [ + { + namespace: 'netflix.movies', + userInput: 'find all the movies released in 1983', + expectedOutput: `{year: 1983}`, + name: 'simple find', + }, + { + namespace: 'netflix.movies', + userInput: + 'find three movies with alien in the title, show earliest movies first, only the _id, title and year', + expectedOutput: ` + {title: {$regex: "alien", $options: "i"}} + {_id: 1, title: 1, year: 1} + {year: 1} + 3 + `, + name: 'find with filter projection sort and limit', + }, + // TODO: Geo query + // { + // namespace: 'berlin.cocktailbars', + // userInput: + // 'find all the bars 10km from the berlin center, only return their names', + // expectedOutput: ` + // {_id: 'ObjectId("5ca652bf56618187558b4de3")'} + // {name: 1} + // `, + // name: 'geo-based find', + // }, + { + namespace: 'airbnb.listingsAndReviews', + userInput: + 'Return all the properties of type "Hotel" and with ratings lte 70', + expectedOutput: ` + { + $and: [ + { property_type: "Hotel" }, + { "review_scores.review_scores_rating": { $lte: 70 } } + ] + } + `, + name: 'find with nested match fields', + }, + { + namespace: 'airbnb.listingsAndReviews', + userInput: + 'what is the bed count that occurs the most? return it in a field called bedCount (only return the bedCount field)', + expectedOutput: ` + [ + { $group: { _id: "$beds", count: { $sum: 1 } } }, + { $sort: { count: -1 } }, + { $limit: 1 }, + { $project: { bedCount: "$_id" } } + ] + `, + name: 'find query that translates to aggregation 1', + }, + { + namespace: 'airbnb.listingsAndReviews', + userInput: + 'whats the total number of reviews across all listings? return it in a field called totalReviewsOverall', + expectedOutput: `[ + { + $group: { + _id: null, + totalReviewsOverall: { $sum: "$number_of_reviews" } + } + } + ] + `, + name: 'find query that translates to aggregation 2', + }, + { + namespace: 'airbnb.listingsAndReviews', + userInput: + 'which host id has the most reviews across all listings? return it in a field called hostId', + expectedOutput: `[ + { + $group: { + _id: "$host_id", + totalReviews: { $sum: "$number_of_reviews" } + } + }, + { $sort: { totalReviews: -1 } }, + { $limit: 1 }, + { $project: { hostId: "$_id" } } + ]`, + name: 'find query that translates to aggregation 3', + }, + { + namespace: 'netflix.movies', + userInput: 'find all of the movies from last year', + expectedOutput: `{year: ${new Date().getFullYear() - 1}}`, + name: 'relative date find 1', + }, + { + namespace: 'netflix.comments', + userInput: + 'Which comments were posted in last 30 years. return name and date', + expectedOutput: `{ + $and: [ + { + date: { + $gte: ${new Date().getFullYear() - 30} + } + }, + { + date: { + $lt: ${new Date().getFullYear() - 29} + } + } + ] + } + {name: 1, date: 1} + `, + name: 'relative date find 2', + }, + { + namespace: 'airbnb.listingsAndReviews', + userInput: 'get all docs where accommodates is 6', + expectedOutput: `{accommodates: 6}`, + name: 'number field find', + }, + { + namespace: 'airbnb.listingsAndReviews', + userInput: + 'give me just the price and the first 3 amenities (in a field called amenities) of the listing has "Step-free access" in its amenities.', + expectedOutput: ` + {amenities: "Step-free access"} + {price: 1, amenities: {$slice: 3}} + `, + name: 'find with complex projection', + }, + { + namespace: 'NYC.parking_2015', + userInput: + 'Return only the Plate IDs of Acura vehicles registered in New York', + expectedOutput: ` + + { + $and: [ + {"Vehicle Make": "ACURA"}, + {"Registration State": "NY"} + ] + } + + {"Plate ID": 1} + `, + name: 'find with $and operator', + }, + { + namespace: 'airbnb.listingsAndReviews', + userInput: + '¿Qué alojamiento tiene el precio más bajo? devolver el número en un campo llamado "precio" en español', + expectedOutput: ` + {_id: 0, precio: "$price"} + {price: 1} + 1 + `, + name: 'find with non-english prompt', + }, + { + namespace: 'NYC.parking_2015', + userInput: + 'Write a query that does the following: find all of the parking incidents that occurred on an ave (match all ways to write ave). Return all of the plate ids involved with their summons number and vehicle make and body type. Put the vehicle make and body type into lower case. No _id, sorted by the summons number lowest first.', + expectedOutput: ` + {"Street Name": {$regex: "ave", $options: "i"}} + {"Summons Number": 1} + { + "Summons Number": 1, + "Plate ID": 1, + "Vehicle Make": {$toLower: "$Vehicle Make"}, + "Vehicle Body Type": {$toLower: "$Vehicle Body Type"}, + _id: 0 + } + `, + name: 'find with regex and string operators', + }, + { + namespace: 'netflix.comments', + userInput: 'return only the customer email', + expectedOutput: `{email: 1, _id: 0}`, + name: 'find with simple projection', + }, +]; diff --git a/packages/compass-generative-ai/tests/evals/use-cases/index.ts b/packages/compass-generative-ai/tests/evals/use-cases/index.ts new file mode 100644 index 00000000000..dc67513d148 --- /dev/null +++ b/packages/compass-generative-ai/tests/evals/use-cases/index.ts @@ -0,0 +1,97 @@ +import { findQueries } from './find-query'; +import { aggregateQueries } from './aggregate-query'; +import toNS from 'mongodb-ns'; + +export type GenAiUsecase = { + namespace: string; + userInput: string; + // TODO: multiple expected outputs? + expectedOutput: string; + name: string; +}; + +import airbnbListings from '../fixtures/airbnb.listingsAndReviews.json'; +import berlinBars from '../fixtures/berlin.cocktailbars.json'; +import netflixMovies from '../fixtures/netflix.movies.json'; +import netflixComments from '../fixtures/netflix.comments.json'; +import nycParking from '../fixtures/NYC.parking_2015.json'; + +import { getSampleAndSchemaFromDataset } from '../utils'; +import { + buildAggregateQueryPrompt, + buildFindQueryPrompt, +} from '../../../src/utils/gen-ai-prompt'; + +type DatasetSamples = { + [key: string]: { + sampleDocuments: unknown[]; + schema: Record; + }; +}; + +async function getDatasets(): Promise { + return { + 'airbnb.listingsAndReviews': await getSampleAndSchemaFromDataset( + airbnbListings + ), + 'berlin.cocktailbars': await getSampleAndSchemaFromDataset(berlinBars), + 'netflix.movies': await getSampleAndSchemaFromDataset(netflixMovies), + 'netflix.comments': await getSampleAndSchemaFromDataset(netflixComments), + 'NYC.parking_2015': await getSampleAndSchemaFromDataset(nycParking), + }; +} + +export async function generateGenAiEvalCases() { + const datasetSamples = await getDatasets(); + const usecases = [ + ...findQueries.map((x) => ({ ...x, type: 'find' as const })), + ...aggregateQueries.map((x) => ({ ...x, type: 'aggregate' as const })), + ]; + + return usecases.map( + ({ namespace, expectedOutput, userInput, name, type }) => { + const { database: databaseName, collection: collectionName } = + toNS(namespace); + const { sampleDocuments, schema } = datasetSamples[namespace] ?? { + sampleDocuments: [], + schema: {}, + }; + const buildPromptData = { + userInput, + sampleDocuments, + schema, + collectionName, + databaseName, + }; + const { + metadata: { instructions }, + prompt, + } = + type === 'find' + ? buildFindQueryPrompt(buildPromptData) + : buildAggregateQueryPrompt(buildPromptData); + return { + name, + tags: [name, databaseName, collectionName, type], + input: { + messages: [ + { + role: 'user' as const, + content: prompt, + }, + ], + instructions: { + content: instructions, + }, + }, + expected: { + messages: [ + { + content: expectedOutput, + }, + ], + }, + }; + } + ); +} diff --git a/packages/compass-generative-ai/tests/evals/utils.ts b/packages/compass-generative-ai/tests/evals/utils.ts new file mode 100644 index 00000000000..2ace1cdf5ed --- /dev/null +++ b/packages/compass-generative-ai/tests/evals/utils.ts @@ -0,0 +1,36 @@ +import { getSimplifiedSchema } from 'mongodb-schema'; +import type { Message } from './types'; +import { EJSON } from 'bson'; + +export function allText(messages: Message[]): string { + return messages.map((m) => m.content).join('\n'); +} + +export function sampleItems(arr: T[], k: number): T[] { + if (k > arr.length) { + throw new Error('Sample size cannot be greater than array length'); + } + + const result: T[] = []; + const indices = new Set(); + + while (result.length < k) { + const randomIndex = Math.floor(Math.random() * arr.length); + if (!indices.has(randomIndex)) { + indices.add(randomIndex); + result.push(arr[randomIndex]); + } + } + return result; +} + +export async function getSampleAndSchemaFromDataset( + dataset: unknown[], + sampleSize = 2 +): Promise<{ sampleDocuments: any[]; schema: any }> { + const documents = sampleItems(dataset, Math.min(sampleSize, dataset.length)); + // BSON list + const sampleDocuments = EJSON.parse(JSON.stringify(documents)); + const schema = await getSimplifiedSchema(sampleDocuments); + return { sampleDocuments, schema }; +} From 1b7343f78d592ee1d3bb16dfdf09fc27c61f70b0 Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Wed, 10 Dec 2025 21:18:19 +0300 Subject: [PATCH 25/35] ts fixes --- package-lock.json | 1479 +++++++++++++++++ packages/compass-generative-ai/package.json | 9 +- .../tests/evals/chatbot-api.ts | 9 - ...iews.json => airbnb.listingsAndReviews.ts} | 2 +- ...cktailbars.json => berlin.cocktailbars.ts} | 2 +- ...flix.comments.json => netflix.comments.ts} | 2 +- ...{netflix.movies.json => netflix.movies.ts} | 2 +- .../{NYC.parking_2015.json => nyc.parking.ts} | 2 +- .../tests/evals/use-cases/aggregate-query.ts | 6 +- .../tests/evals/use-cases/find-query.ts | 4 +- .../tests/evals/use-cases/index.ts | 12 +- 11 files changed, 1501 insertions(+), 28 deletions(-) rename packages/compass-generative-ai/tests/evals/fixtures/{airbnb.listingsAndReviews.json => airbnb.listingsAndReviews.ts} (99%) rename packages/compass-generative-ai/tests/evals/fixtures/{berlin.cocktailbars.json => berlin.cocktailbars.ts} (99%) rename packages/compass-generative-ai/tests/evals/fixtures/{netflix.comments.json => netflix.comments.ts} (99%) rename packages/compass-generative-ai/tests/evals/fixtures/{netflix.movies.json => netflix.movies.ts} (99%) rename packages/compass-generative-ai/tests/evals/fixtures/{NYC.parking_2015.json => nyc.parking.ts} (99%) diff --git a/package-lock.json b/package-lock.json index 8a999c4c449..682115f3f67 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4556,6 +4556,17 @@ "w3c-keyname": "^2.2.4" } }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -17797,6 +17808,16 @@ "xtend": ">=4.0.0 <4.1.0-0" } }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -19559,6 +19580,153 @@ "optional": true, "peer": true }, + "node_modules/boxen": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", + "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^8.0.0", + "chalk": "^5.3.0", + "cli-boxes": "^3.0.0", + "string-width": "^7.2.0", + "type-fest": "^4.21.0", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/boxen/node_modules/camelcase": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/boxen/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/bplist-creator": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", @@ -20534,6 +20702,19 @@ "node": ">=6" } }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-color": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-0.3.2.tgz", @@ -20590,6 +20771,22 @@ "node": ">= 0.2.0" } }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, "node_modules/cli-width": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", @@ -26880,6 +27077,19 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-folder-size": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz", @@ -43654,6 +43864,16 @@ "rimraf": "bin.js" } }, + "node_modules/termi-link": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/termi-link/-/termi-link-1.1.0.tgz", + "integrity": "sha512-2qSN6TnomHgVLtk+htSWbaYs4Rd2MH/RU7VpHTy6MBstyNyWbM4yKd1DCYpE3fDg8dmGWojXCngNi/MHCzGuAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/terser": { "version": "5.32.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.32.0.tgz", @@ -46570,6 +46790,76 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, + "node_modules/widest-line": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/widest-line/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", @@ -49711,10 +50001,13 @@ "@types/mocha": "^9.0.0", "@types/react": "^17.0.5", "@types/sinon-chai": "^3.2.5", + "autoevals": "^0.0.130", + "braintrust": "^0.2.4", "chai": "^4.3.6", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", + "mongodb-ns": "^3.1.0", "nyc": "^15.1.0", "p-queue": "^7.4.1", "sinon": "^9.2.3", @@ -49772,6 +50065,448 @@ "zod": "^3.25.76 || ^4.1.8" } }, + "packages/compass-generative-ai/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.1.tgz", + "integrity": "sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/android-arm": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.1.tgz", + "integrity": "sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/android-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.1.tgz", + "integrity": "sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/android-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.1.tgz", + "integrity": "sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.1.tgz", + "integrity": "sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/darwin-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.1.tgz", + "integrity": "sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.1.tgz", + "integrity": "sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.1.tgz", + "integrity": "sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/linux-arm": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.1.tgz", + "integrity": "sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/linux-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.1.tgz", + "integrity": "sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/linux-ia32": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.1.tgz", + "integrity": "sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/linux-loong64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.1.tgz", + "integrity": "sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.1.tgz", + "integrity": "sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.1.tgz", + "integrity": "sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.1.tgz", + "integrity": "sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/linux-s390x": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.1.tgz", + "integrity": "sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/linux-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.1.tgz", + "integrity": "sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.1.tgz", + "integrity": "sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.1.tgz", + "integrity": "sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.1.tgz", + "integrity": "sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.1.tgz", + "integrity": "sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.1.tgz", + "integrity": "sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/sunos-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.1.tgz", + "integrity": "sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/win32-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.1.tgz", + "integrity": "sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/win32-ia32": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.1.tgz", + "integrity": "sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/@esbuild/win32-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.1.tgz", + "integrity": "sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "packages/compass-generative-ai/node_modules/ai": { "version": "5.0.104", "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.104.tgz", @@ -49790,6 +50525,114 @@ "zod": "^3.25.76 || ^4.1.8" } }, + "packages/compass-generative-ai/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "packages/compass-generative-ai/node_modules/autoevals": { + "version": "0.0.131", + "resolved": "https://registry.npmjs.org/autoevals/-/autoevals-0.0.131.tgz", + "integrity": "sha512-F+3lraja+Ms7n1M2cpWl65N7AYx4sPocRW454H5HlSGabYMfuFOUxw8IXmEYDkQ38BxtZ0Wd5ZAQj9RF59YJWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.17.1", + "compute-cosine-similarity": "^1.1.0", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "linear-sum-assignment": "^1.0.7", + "mustache": "^4.2.0", + "openai": "^4.104.0", + "zod": "^3.25.76", + "zod-to-json-schema": "^3.24.6" + } + }, + "packages/compass-generative-ai/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "packages/compass-generative-ai/node_modules/braintrust": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/braintrust/-/braintrust-1.0.1.tgz", + "integrity": "sha512-3qsNs7LTErLL1rlB8IOPQaQsc2mmhaWtyoJ9/x7rdznkemAP68XxTseKbXqpqGaVpzX7pnv0uRT/De0QRRYbhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ai-sdk/provider": "^1.1.3", + "@next/env": "^14.2.3", + "@vercel/functions": "^1.0.2", + "argparse": "^2.0.1", + "boxen": "^8.0.1", + "chalk": "^4.1.2", + "cli-progress": "^3.12.0", + "cli-table3": "^0.6.5", + "cors": "^2.8.5", + "dotenv": "^16.4.5", + "esbuild": "^0.27.0", + "eventsource-parser": "^1.1.2", + "express": "^4.21.2", + "graceful-fs": "^4.2.11", + "http-errors": "^2.0.0", + "minimatch": "^9.0.3", + "mustache": "^4.2.0", + "pluralize": "^8.0.0", + "simple-git": "^3.21.0", + "slugify": "^1.6.6", + "source-map": "^0.7.4", + "termi-link": "^1.0.1", + "uuid": "^9.0.1", + "zod": "^3.25.34", + "zod-to-json-schema": "^3.22.5" + }, + "bin": { + "braintrust": "dist/cli.js" + }, + "peerDependencies": { + "zod": "^3.25.34" + } + }, + "packages/compass-generative-ai/node_modules/braintrust/node_modules/@ai-sdk/provider": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz", + "integrity": "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "packages/compass-generative-ai/node_modules/braintrust/node_modules/eventsource-parser": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-1.1.2.tgz", + "integrity": "sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.18" + } + }, "packages/compass-generative-ai/node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -49799,12 +50642,91 @@ "node": ">=0.3.1" } }, + "packages/compass-generative-ai/node_modules/esbuild": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.1.tgz", + "integrity": "sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.1", + "@esbuild/android-arm": "0.27.1", + "@esbuild/android-arm64": "0.27.1", + "@esbuild/android-x64": "0.27.1", + "@esbuild/darwin-arm64": "0.27.1", + "@esbuild/darwin-x64": "0.27.1", + "@esbuild/freebsd-arm64": "0.27.1", + "@esbuild/freebsd-x64": "0.27.1", + "@esbuild/linux-arm": "0.27.1", + "@esbuild/linux-arm64": "0.27.1", + "@esbuild/linux-ia32": "0.27.1", + "@esbuild/linux-loong64": "0.27.1", + "@esbuild/linux-mips64el": "0.27.1", + "@esbuild/linux-ppc64": "0.27.1", + "@esbuild/linux-riscv64": "0.27.1", + "@esbuild/linux-s390x": "0.27.1", + "@esbuild/linux-x64": "0.27.1", + "@esbuild/netbsd-arm64": "0.27.1", + "@esbuild/netbsd-x64": "0.27.1", + "@esbuild/openbsd-arm64": "0.27.1", + "@esbuild/openbsd-x64": "0.27.1", + "@esbuild/openharmony-arm64": "0.27.1", + "@esbuild/sunos-x64": "0.27.1", + "@esbuild/win32-arm64": "0.27.1", + "@esbuild/win32-ia32": "0.27.1", + "@esbuild/win32-x64": "0.27.1" + } + }, "packages/compass-generative-ai/node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true }, + "packages/compass-generative-ai/node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "packages/compass-generative-ai/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "packages/compass-generative-ai/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/compass-generative-ai/node_modules/mongodb-ns": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mongodb-ns/-/mongodb-ns-3.1.0.tgz", + "integrity": "sha512-oe5gL723bQ+C4purCXIQTeDlAfendC2hs4KqlPPat8DozQZU6vtg3TgIJOJKVpcMgmAVyt39FRolOJh4htnsTg==", + "dev": true, + "license": "Apache-2.0" + }, "packages/compass-generative-ai/node_modules/p-queue": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz", @@ -49851,6 +50773,30 @@ "url": "https://opencollective.com/sinon" } }, + "packages/compass-generative-ai/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "packages/compass-generative-ai/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "packages/compass-generative-ai/node_modules/zod": { "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", @@ -49860,6 +50806,16 @@ "url": "https://github.com/sponsors/colinhacks" } }, + "packages/compass-generative-ai/node_modules/zod-to-json-schema": { + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.0.tgz", + "integrity": "sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.25 || ^4" + } + }, "packages/compass-global-writes": { "name": "@mongodb-js/compass-global-writes", "version": "1.50.0", @@ -56989,6 +57945,13 @@ "w3c-keyname": "^2.2.4" } }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true + }, "@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -62483,6 +63446,8 @@ "@types/react": "^17.0.5", "@types/sinon-chai": "^3.2.5", "ai": "^5.0.26", + "autoevals": "^0.0.130", + "braintrust": "^0.2.4", "bson": "^6.10.4", "chai": "^4.3.6", "compass-preferences-model": "^2.66.3", @@ -62490,6 +63455,7 @@ "electron-mocha": "^12.2.0", "mocha": "^10.2.0", "mongodb": "^6.19.0", + "mongodb-ns": "^3.1.0", "mongodb-query-parser": "^4.5.0", "mongodb-schema": "^12.6.3", "nyc": "^15.1.0", @@ -62533,6 +63499,188 @@ "eventsource-parser": "^3.0.6" } }, + "@esbuild/aix-ppc64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.1.tgz", + "integrity": "sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.1.tgz", + "integrity": "sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.1.tgz", + "integrity": "sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.1.tgz", + "integrity": "sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.1.tgz", + "integrity": "sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.1.tgz", + "integrity": "sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.1.tgz", + "integrity": "sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.1.tgz", + "integrity": "sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.1.tgz", + "integrity": "sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.1.tgz", + "integrity": "sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.1.tgz", + "integrity": "sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.1.tgz", + "integrity": "sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.1.tgz", + "integrity": "sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.1.tgz", + "integrity": "sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.1.tgz", + "integrity": "sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.1.tgz", + "integrity": "sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.1.tgz", + "integrity": "sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.1.tgz", + "integrity": "sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.1.tgz", + "integrity": "sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.1.tgz", + "integrity": "sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.1.tgz", + "integrity": "sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==", + "dev": true, + "optional": true + }, + "@esbuild/openharmony-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.1.tgz", + "integrity": "sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.1.tgz", + "integrity": "sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.1.tgz", + "integrity": "sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.1.tgz", + "integrity": "sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.1.tgz", + "integrity": "sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==", + "dev": true, + "optional": true + }, "ai": { "version": "5.0.104", "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.104.tgz", @@ -62544,18 +63692,165 @@ "@opentelemetry/api": "1.9.0" } }, + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "autoevals": { + "version": "https://registry.npmjs.org/autoevals/-/autoevals-0.0.131.tgz", + "integrity": "sha512-F+3lraja+Ms7n1M2cpWl65N7AYx4sPocRW454H5HlSGabYMfuFOUxw8IXmEYDkQ38BxtZ0Wd5ZAQj9RF59YJWw==", + "dev": true, + "requires": { + "ajv": "^8.17.1", + "compute-cosine-similarity": "^1.1.0", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "linear-sum-assignment": "^1.0.7", + "mustache": "^4.2.0", + "openai": "^4.104.0", + "zod": "^3.25.76", + "zod-to-json-schema": "^3.24.6" + } + }, + "brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "braintrust": { + "version": "https://registry.npmjs.org/braintrust/-/braintrust-1.0.1.tgz", + "integrity": "sha512-3qsNs7LTErLL1rlB8IOPQaQsc2mmhaWtyoJ9/x7rdznkemAP68XxTseKbXqpqGaVpzX7pnv0uRT/De0QRRYbhQ==", + "dev": true, + "requires": { + "@ai-sdk/provider": "^1.1.3", + "@next/env": "^14.2.3", + "@vercel/functions": "^1.0.2", + "argparse": "^2.0.1", + "boxen": "^8.0.1", + "chalk": "^4.1.2", + "cli-progress": "^3.12.0", + "cli-table3": "^0.6.5", + "cors": "^2.8.5", + "dotenv": "^16.4.5", + "esbuild": "^0.27.0", + "eventsource-parser": "^1.1.2", + "express": "^4.21.2", + "graceful-fs": "^4.2.11", + "http-errors": "^2.0.0", + "minimatch": "^9.0.3", + "mustache": "^4.2.0", + "pluralize": "^8.0.0", + "simple-git": "^3.21.0", + "slugify": "^1.6.6", + "source-map": "^0.7.4", + "termi-link": "^1.0.1", + "uuid": "^9.0.1", + "zod": "^3.25.34", + "zod-to-json-schema": "^3.22.5" + }, + "dependencies": { + "@ai-sdk/provider": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz", + "integrity": "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==", + "dev": true, + "requires": { + "json-schema": "^0.4.0" + } + }, + "eventsource-parser": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-1.1.2.tgz", + "integrity": "sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==", + "dev": true + } + } + }, "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, + "esbuild": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.1.tgz", + "integrity": "sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.27.1", + "@esbuild/android-arm": "0.27.1", + "@esbuild/android-arm64": "0.27.1", + "@esbuild/android-x64": "0.27.1", + "@esbuild/darwin-arm64": "0.27.1", + "@esbuild/darwin-x64": "0.27.1", + "@esbuild/freebsd-arm64": "0.27.1", + "@esbuild/freebsd-x64": "0.27.1", + "@esbuild/linux-arm": "0.27.1", + "@esbuild/linux-arm64": "0.27.1", + "@esbuild/linux-ia32": "0.27.1", + "@esbuild/linux-loong64": "0.27.1", + "@esbuild/linux-mips64el": "0.27.1", + "@esbuild/linux-ppc64": "0.27.1", + "@esbuild/linux-riscv64": "0.27.1", + "@esbuild/linux-s390x": "0.27.1", + "@esbuild/linux-x64": "0.27.1", + "@esbuild/netbsd-arm64": "0.27.1", + "@esbuild/netbsd-x64": "0.27.1", + "@esbuild/openbsd-arm64": "0.27.1", + "@esbuild/openbsd-x64": "0.27.1", + "@esbuild/openharmony-arm64": "0.27.1", + "@esbuild/sunos-x64": "0.27.1", + "@esbuild/win32-arm64": "0.27.1", + "@esbuild/win32-ia32": "0.27.1", + "@esbuild/win32-x64": "0.27.1" + } + }, "eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "mongodb-ns": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mongodb-ns/-/mongodb-ns-3.1.0.tgz", + "integrity": "sha512-oe5gL723bQ+C4purCXIQTeDlAfendC2hs4KqlPPat8DozQZU6vtg3TgIJOJKVpcMgmAVyt39FRolOJh4htnsTg==", + "dev": true + }, "p-queue": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz", @@ -62586,10 +63881,29 @@ "supports-color": "^7.1.0" } }, + "source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true + }, + "uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true + }, "zod": { "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==" + }, + "zod-to-json-schema": { + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.0.tgz", + "integrity": "sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==", + "dev": true, + "requires": {} } } }, @@ -71921,6 +73235,15 @@ } } }, + "ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "requires": { + "string-width": "^4.1.0" + } + }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -73242,6 +74565,91 @@ "optional": true, "peer": true }, + "boxen": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", + "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", + "dev": true, + "requires": { + "ansi-align": "^3.0.1", + "camelcase": "^8.0.0", + "chalk": "^5.3.0", + "cli-boxes": "^3.0.0", + "string-width": "^7.2.0", + "type-fest": "^4.21.0", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true + }, + "camelcase": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", + "dev": true + }, + "chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true + }, + "emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true + }, + "string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "requires": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + } + }, + "strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true + }, + "wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "requires": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + } + } + } + }, "bplist-creator": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", @@ -73987,6 +75395,12 @@ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" }, + "cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "dev": true + }, "cli-color": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-0.3.2.tgz", @@ -74027,6 +75441,16 @@ "colors": "1.0.3" } }, + "cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "dev": true, + "requires": { + "@colors/colors": "1.5.0", + "string-width": "^4.2.0" + } + }, "cli-width": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", @@ -79215,6 +80639,12 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, + "get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "dev": true + }, "get-folder-size": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz", @@ -92957,6 +94387,12 @@ "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", "dev": true }, + "termi-link": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/termi-link/-/termi-link-1.1.0.tgz", + "integrity": "sha512-2qSN6TnomHgVLtk+htSWbaYs4Rd2MH/RU7VpHTy6MBstyNyWbM4yKd1DCYpE3fDg8dmGWojXCngNi/MHCzGuAA==", + "dev": true + }, "terser": { "version": "5.32.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.32.0.tgz", @@ -95032,6 +96468,49 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, + "widest-line": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", + "dev": true, + "requires": { + "string-width": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true + }, + "emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true + }, + "string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "requires": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + } + }, + "strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, "wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", diff --git a/packages/compass-generative-ai/package.json b/packages/compass-generative-ai/package.json index 1ba664073fb..d16ce5a9583 100644 --- a/packages/compass-generative-ai/package.json +++ b/packages/compass-generative-ai/package.json @@ -52,6 +52,7 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { + "@ai-sdk/openai": "^2.0.4", "@mongodb-js/atlas-service": "^0.73.0", "@mongodb-js/compass-app-registry": "^9.4.29", "@mongodb-js/compass-components": "^1.59.2", @@ -60,6 +61,7 @@ "@mongodb-js/compass-telemetry": "^1.19.5", "@mongodb-js/compass-utils": "^0.9.23", "@mongodb-js/connection-info": "^0.24.0", + "ai": "^5.0.26", "bson": "^6.10.4", "compass-preferences-model": "^2.66.3", "mongodb": "^6.19.0", @@ -69,9 +71,7 @@ "react-redux": "^8.1.3", "redux": "^4.2.1", "redux-thunk": "^2.4.2", - "zod": "^3.25.76", - "@ai-sdk/openai": "^2.0.4", - "ai": "^5.0.26" + "zod": "^3.25.76" }, "devDependencies": { "@mongodb-js/eslint-config-compass": "^1.4.12", @@ -84,10 +84,13 @@ "@types/mocha": "^9.0.0", "@types/react": "^17.0.5", "@types/sinon-chai": "^3.2.5", + "autoevals": "^0.0.130", + "braintrust": "^0.2.4", "chai": "^4.3.6", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", + "mongodb-ns": "^3.1.0", "nyc": "^15.1.0", "p-queue": "^7.4.1", "sinon": "^9.2.3", diff --git a/packages/compass-generative-ai/tests/evals/chatbot-api.ts b/packages/compass-generative-ai/tests/evals/chatbot-api.ts index f666819b70e..a1a96577089 100644 --- a/packages/compass-generative-ai/tests/evals/chatbot-api.ts +++ b/packages/compass-generative-ai/tests/evals/chatbot-api.ts @@ -1,19 +1,10 @@ import { streamText } from 'ai'; import { createOpenAI } from '@ai-sdk/openai'; -import { OpenAI } from 'openai'; -import { init } from 'autoevals'; import type { ConversationEvalCaseInput, ConversationTaskOutput, } from './types'; -const client = new OpenAI({ - baseURL: 'https://api.braintrust.dev/v1/proxy', - apiKey: process.env.BRAINTRUST_API_KEY, -}); - -init({ client }); - export async function makeChatbotCall( input: ConversationEvalCaseInput ): Promise { diff --git a/packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.json b/packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.ts similarity index 99% rename from packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.json rename to packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.ts index 035add03b25..7eeaeb32fef 100644 --- a/packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.json +++ b/packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.ts @@ -1,4 +1,4 @@ -[ +export default [ { "_id": "10006546", "listing_url": "https://www.airbnb.com/rooms/10006546", diff --git a/packages/compass-generative-ai/tests/evals/fixtures/berlin.cocktailbars.json b/packages/compass-generative-ai/tests/evals/fixtures/berlin.cocktailbars.ts similarity index 99% rename from packages/compass-generative-ai/tests/evals/fixtures/berlin.cocktailbars.json rename to packages/compass-generative-ai/tests/evals/fixtures/berlin.cocktailbars.ts index d934ef09eec..927c4bdd35f 100644 --- a/packages/compass-generative-ai/tests/evals/fixtures/berlin.cocktailbars.json +++ b/packages/compass-generative-ai/tests/evals/fixtures/berlin.cocktailbars.ts @@ -1,4 +1,4 @@ -[ +export default [ { "_id": { "$oid": "5ca652bf56618187558b4de3" diff --git a/packages/compass-generative-ai/tests/evals/fixtures/netflix.comments.json b/packages/compass-generative-ai/tests/evals/fixtures/netflix.comments.ts similarity index 99% rename from packages/compass-generative-ai/tests/evals/fixtures/netflix.comments.json rename to packages/compass-generative-ai/tests/evals/fixtures/netflix.comments.ts index 977bbc1b481..2cc9b8719bb 100644 --- a/packages/compass-generative-ai/tests/evals/fixtures/netflix.comments.json +++ b/packages/compass-generative-ai/tests/evals/fixtures/netflix.comments.ts @@ -1,4 +1,4 @@ -[ +export default [ { "_id": { "$oid": "5a9427648b0beebeb69579f3" diff --git a/packages/compass-generative-ai/tests/evals/fixtures/netflix.movies.json b/packages/compass-generative-ai/tests/evals/fixtures/netflix.movies.ts similarity index 99% rename from packages/compass-generative-ai/tests/evals/fixtures/netflix.movies.json rename to packages/compass-generative-ai/tests/evals/fixtures/netflix.movies.ts index 05432750c79..2bc699289f7 100644 --- a/packages/compass-generative-ai/tests/evals/fixtures/netflix.movies.json +++ b/packages/compass-generative-ai/tests/evals/fixtures/netflix.movies.ts @@ -1,4 +1,4 @@ -[ +export default [ { "_id": { "$oid": "573b864df29313caabe354ed" diff --git a/packages/compass-generative-ai/tests/evals/fixtures/NYC.parking_2015.json b/packages/compass-generative-ai/tests/evals/fixtures/nyc.parking.ts similarity index 99% rename from packages/compass-generative-ai/tests/evals/fixtures/NYC.parking_2015.json rename to packages/compass-generative-ai/tests/evals/fixtures/nyc.parking.ts index cacd3db054e..9a3efb23dce 100644 --- a/packages/compass-generative-ai/tests/evals/fixtures/NYC.parking_2015.json +++ b/packages/compass-generative-ai/tests/evals/fixtures/nyc.parking.ts @@ -1,4 +1,4 @@ -[ +export default [ { "_id": { "$oid": "5735040085629ed4fa83946f" diff --git a/packages/compass-generative-ai/tests/evals/use-cases/aggregate-query.ts b/packages/compass-generative-ai/tests/evals/use-cases/aggregate-query.ts index 88aedcaa312..a6bc72738b0 100644 --- a/packages/compass-generative-ai/tests/evals/use-cases/aggregate-query.ts +++ b/packages/compass-generative-ai/tests/evals/use-cases/aggregate-query.ts @@ -22,7 +22,7 @@ export const aggregateQueries: GenAiUsecase[] = [ name: 'aggregate with filter projection sort and limit', }, { - namespace: 'NYC.parking_2015', + namespace: 'nyc.parking', userInput: 'find all the violations for the violation code 21 and only return the car plate', expectedOutput: ` @@ -128,7 +128,7 @@ export const aggregateQueries: GenAiUsecase[] = [ name: 'aggregate with array slice', }, { - namespace: 'NYC.parking_2015', + namespace: 'nyc.parking', userInput: 'Return only the Plate IDs of Acura vehicles registered in New York', expectedOutput: ` @@ -252,7 +252,7 @@ export const aggregateQueries: GenAiUsecase[] = [ name: 'super complex aggregate with complex project', }, { - namespace: 'NYC.parking_2015', + namespace: 'nyc.parking', userInput: 'Write a query that does the following: find all of the parking incidents that occurred on an ave (match all ways to write ave). Return all of the plate ids involved with their summons number and vehicle make and body type. Put the vehicle make and body type into lower case. No _id, sorted by the summons number lowest first.', expectedOutput: ` diff --git a/packages/compass-generative-ai/tests/evals/use-cases/find-query.ts b/packages/compass-generative-ai/tests/evals/use-cases/find-query.ts index 0d21ad4c10a..a2093bf79a8 100644 --- a/packages/compass-generative-ai/tests/evals/use-cases/find-query.ts +++ b/packages/compass-generative-ai/tests/evals/use-cases/find-query.ts @@ -135,7 +135,7 @@ export const findQueries: GenAiUsecase[] = [ name: 'find with complex projection', }, { - namespace: 'NYC.parking_2015', + namespace: 'nyc.parking', userInput: 'Return only the Plate IDs of Acura vehicles registered in New York', expectedOutput: ` @@ -163,7 +163,7 @@ export const findQueries: GenAiUsecase[] = [ name: 'find with non-english prompt', }, { - namespace: 'NYC.parking_2015', + namespace: 'nyc.parking', userInput: 'Write a query that does the following: find all of the parking incidents that occurred on an ave (match all ways to write ave). Return all of the plate ids involved with their summons number and vehicle make and body type. Put the vehicle make and body type into lower case. No _id, sorted by the summons number lowest first.', expectedOutput: ` diff --git a/packages/compass-generative-ai/tests/evals/use-cases/index.ts b/packages/compass-generative-ai/tests/evals/use-cases/index.ts index dc67513d148..04f971d9587 100644 --- a/packages/compass-generative-ai/tests/evals/use-cases/index.ts +++ b/packages/compass-generative-ai/tests/evals/use-cases/index.ts @@ -1,6 +1,6 @@ import { findQueries } from './find-query'; import { aggregateQueries } from './aggregate-query'; -import toNS from 'mongodb-ns'; +import * as toNS from 'mongodb-ns'; export type GenAiUsecase = { namespace: string; @@ -10,11 +10,11 @@ export type GenAiUsecase = { name: string; }; -import airbnbListings from '../fixtures/airbnb.listingsAndReviews.json'; -import berlinBars from '../fixtures/berlin.cocktailbars.json'; -import netflixMovies from '../fixtures/netflix.movies.json'; -import netflixComments from '../fixtures/netflix.comments.json'; -import nycParking from '../fixtures/NYC.parking_2015.json'; +import airbnbListings from '../fixtures/airbnb.listingsAndReviews'; +import berlinBars from '../fixtures/berlin.cocktailbars'; +import netflixMovies from '../fixtures/netflix.movies'; +import netflixComments from '../fixtures/netflix.comments'; +import nycParking from '../fixtures/nyc.parking'; import { getSampleAndSchemaFromDataset } from '../utils'; import { From a1b38c528e3be08469b3779f5cef44094310b2f3 Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Thu, 11 Dec 2025 00:30:08 +0300 Subject: [PATCH 26/35] reformat --- packages/compass-generative-ai/package.json | 3 +- .../fixtures/airbnb.listingsAndReviews.ts | 2936 +++++++++-------- .../evals/fixtures/berlin.cocktailbars.ts | 374 +-- .../tests/evals/fixtures/netflix.comments.ts | 1344 ++++---- .../tests/evals/fixtures/netflix.movies.ts | 435 +-- .../tests/evals/fixtures/nyc.parking.ts | 2296 ++++++------- .../tests/evals/use-cases/index.ts | 2 +- 7 files changed, 3713 insertions(+), 3677 deletions(-) diff --git a/packages/compass-generative-ai/package.json b/packages/compass-generative-ai/package.json index d16ce5a9583..0576512652b 100644 --- a/packages/compass-generative-ai/package.json +++ b/packages/compass-generative-ai/package.json @@ -49,7 +49,8 @@ "test-watch": "npm run test -- --watch", "test-ci": "npm run test-cov", "test-ci-electron": "npm run test-electron", - "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." + "reformat": "npm run eslint . -- --fix && npm run prettier -- --write .", + "eval": "braintrust eval tests/evals" }, "dependencies": { "@ai-sdk/openai": "^2.0.4", diff --git a/packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.ts b/packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.ts index 7eeaeb32fef..efc4a64eabc 100644 --- a/packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.ts +++ b/packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.ts @@ -1,1491 +1,1525 @@ export default [ { - "_id": "10006546", - "listing_url": "https://www.airbnb.com/rooms/10006546", - "name": "Ribeira Charming Duplex", - "interaction": "Cot - 10 € / night Dog - € 7,5 / night", - "house_rules": "Make the house your home...", - "property_type": "House", - "room_type": "Entire home/apt", - "bed_type": "Real Bed", - "minimum_nights": "2", - "maximum_nights": "30", - "cancellation_policy": "moderate", - "last_scraped": { - "$date": { - "$numberLong": "1550293200000" - } - }, - "calendar_last_scraped": { - "$date": { - "$numberLong": "1550293200000" - } - }, - "first_review": { - "$date": { - "$numberLong": "1451797200000" - } - }, - "last_review": { - "$date": { - "$numberLong": "1547960400000" - } - }, - "accommodates": 8, - "bedrooms": 3, - "beds": 5, - "number_of_reviews": 51, - "bathrooms": { - "$numberDecimal": "1.0" - }, - "price": { - "$numberDecimal": "80.00" - }, - "security_deposit": { - "$numberDecimal": "200.00" - }, - "cleaning_fee": { - "$numberDecimal": "35.00" - }, - "extra_people": { - "$numberDecimal": "15.00" - }, - "guests_included": { - "$numberDecimal": "6" - }, - "images": { - "thumbnail_url": "", - "medium_url": "", - "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", - "xl_picture_url": "" - }, - "address": { - "street": "Porto, Porto, Portugal", - "suburb": "", - "government_area": "Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória", - "market": "Porto", - "country": "Portugal", - "country_code": "PT", - "location": { - "type": "Point", - "coordinates": [-8.61308, 41.1413], - "is_location_exact": false - } - }, - "availability": { - "availability_30": 28, - "availability_60": 47, - "availability_90": 74, - "availability_365": 239 - }, - "host_id": "51399391" + _id: '10006546', + listing_url: 'https://www.airbnb.com/rooms/10006546', + name: 'Ribeira Charming Duplex', + interaction: 'Cot - 10 € / night Dog - € 7,5 / night', + house_rules: 'Make the house your home...', + property_type: 'House', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '30', + cancellation_policy: 'moderate', + last_scraped: { + $date: { + $numberLong: '1550293200000', + }, + }, + calendar_last_scraped: { + $date: { + $numberLong: '1550293200000', + }, + }, + first_review: { + $date: { + $numberLong: '1451797200000', + }, + }, + last_review: { + $date: { + $numberLong: '1547960400000', + }, + }, + accommodates: 8, + bedrooms: 3, + beds: 5, + number_of_reviews: 51, + bathrooms: { + $numberDecimal: '1.0', + }, + price: { + $numberDecimal: '80.00', + }, + security_deposit: { + $numberDecimal: '200.00', + }, + cleaning_fee: { + $numberDecimal: '35.00', + }, + extra_people: { + $numberDecimal: '15.00', + }, + guests_included: { + $numberDecimal: '6', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + xl_picture_url: '', + }, + address: { + street: 'Porto, Porto, Portugal', + suburb: '', + government_area: 'Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória', + market: 'Porto', + country: 'Portugal', + country_code: 'PT', + location: { + type: 'Point', + coordinates: [-8.61308, 41.1413], + is_location_exact: false, + }, + }, + availability: { + availability_30: 28, + availability_60: 47, + availability_90: 74, + availability_365: 239, + }, + host_id: '51399391', }, { - "_id": "10009999", - "listing_url": "https://www.airbnb.com/rooms/10009999", - "name": "Horto flat with small garden", - "interaction": "I´ll be happy to help you with any doubts, tips or any other information needed during your stay.", - "house_rules": "I just hope the guests treat the space as they´re own, with respect to it as well as to my neighbours! Espero apenas que os hóspedes tratem o lugar com carinho e respeito aos vizinhos!", - "property_type": "Apartment", - "room_type": "Entire home/apt", - "bed_type": "Real Bed", - "minimum_nights": "2", - "maximum_nights": "1125", - "cancellation_policy": "flexible", - "last_scraped": { - "$date": { - "$numberLong": "1549861200000" - } - }, - "calendar_last_scraped": { - "$date": { - "$numberLong": "1549861200000" - } - }, - "accommodates": 4, - "bedrooms": 1, - "beds": 2, - "number_of_reviews": 0, - "bathrooms": { - "$numberDecimal": "1.0" - }, - "price": { - "$numberDecimal": "317.00" - }, - "cleaning_fee": { - "$numberDecimal": "187.00" - }, - "extra_people": { - "$numberDecimal": "0.00" - }, - "guests_included": { - "$numberDecimal": "1" - }, - "images": { - "thumbnail_url": "", - "medium_url": "", - "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", - "xl_picture_url": "" - }, - "address": { - "street": "Rio de Janeiro, Rio de Janeiro, Brazil", - "suburb": "Jardim Botânico", - "government_area": "Jardim Botânico", - "market": "Rio De Janeiro", - "country": "Brazil", - "country_code": "BR", - "location": { - "type": "Point", - "coordinates": [-43.23074991429229, -22.966253551739655], - "is_location_exact": true - } - }, - "availability": { - "availability_30": 0, - "availability_60": 0, - "availability_90": 0, - "availability_365": 0 - }, - "host_id": "1282196" + _id: '10009999', + listing_url: 'https://www.airbnb.com/rooms/10009999', + name: 'Horto flat with small garden', + interaction: + 'I´ll be happy to help you with any doubts, tips or any other information needed during your stay.', + house_rules: + 'I just hope the guests treat the space as they´re own, with respect to it as well as to my neighbours! Espero apenas que os hóspedes tratem o lugar com carinho e respeito aos vizinhos!', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: { + $numberLong: '1549861200000', + }, + }, + calendar_last_scraped: { + $date: { + $numberLong: '1549861200000', + }, + }, + accommodates: 4, + bedrooms: 1, + beds: 2, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '1.0', + }, + price: { + $numberDecimal: '317.00', + }, + cleaning_fee: { + $numberDecimal: '187.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + xl_picture_url: '', + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Jardim Botânico', + government_area: 'Jardim Botânico', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.23074991429229, -22.966253551739655], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + host_id: '1282196', }, { - "_id": "1001265", - "listing_url": "https://www.airbnb.com/rooms/1001265", - "name": "Ocean View Waikiki Marina w/prkg", - "interaction": "We try our best at creating, simple responsive management which never bothers the guest.", - "house_rules": "The general welfare and well being of all the community.", - "property_type": "Condominium", - "room_type": "Entire home/apt", - "bed_type": "Real Bed", - "minimum_nights": "3", - "maximum_nights": "365", - "cancellation_policy": "strict_14_with_grace_period", - "last_scraped": { - "$date": { - "$numberLong": "1551848400000" - } - }, - "calendar_last_scraped": { - "$date": { - "$numberLong": "1551848400000" - } - }, - "first_review": { - "$date": { - "$numberLong": "1369368000000" - } - }, - "last_review": { - "$date": { - "$numberLong": "1549515600000" - } - }, - "accommodates": 2, - "bedrooms": 1, - "beds": 1, - "number_of_reviews": 96, - "bathrooms": { - "$numberDecimal": "1.0" - }, - "price": { - "$numberDecimal": "115.00" - }, - "cleaning_fee": { - "$numberDecimal": "100.00" - }, - "extra_people": { - "$numberDecimal": "0.00" - }, - "guests_included": { - "$numberDecimal": "1" - }, - "images": { - "thumbnail_url": "", - "medium_url": "", - "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", - "xl_picture_url": "" - }, - "address": { - "street": "Honolulu, HI, United States", - "suburb": "Oʻahu", - "government_area": "Primary Urban Center", - "market": "Oahu", - "country": "United States", - "country_code": "US", - "location": { - "type": "Point", - "coordinates": [-157.83919, 21.28634], - "is_location_exact": true - } - }, - "availability": { - "availability_30": 16, - "availability_60": 46, - "availability_90": 76, - "availability_365": 343 - }, - "host_id": "5448114" + _id: '1001265', + listing_url: 'https://www.airbnb.com/rooms/1001265', + name: 'Ocean View Waikiki Marina w/prkg', + interaction: + 'We try our best at creating, simple responsive management which never bothers the guest.', + house_rules: 'The general welfare and well being of all the community.', + property_type: 'Condominium', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '3', + maximum_nights: '365', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: { + $numberLong: '1551848400000', + }, + }, + calendar_last_scraped: { + $date: { + $numberLong: '1551848400000', + }, + }, + first_review: { + $date: { + $numberLong: '1369368000000', + }, + }, + last_review: { + $date: { + $numberLong: '1549515600000', + }, + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 96, + bathrooms: { + $numberDecimal: '1.0', + }, + price: { + $numberDecimal: '115.00', + }, + cleaning_fee: { + $numberDecimal: '100.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + xl_picture_url: '', + }, + address: { + street: 'Honolulu, HI, United States', + suburb: 'Oʻahu', + government_area: 'Primary Urban Center', + market: 'Oahu', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-157.83919, 21.28634], + is_location_exact: true, + }, + }, + availability: { + availability_30: 16, + availability_60: 46, + availability_90: 76, + availability_365: 343, + }, + host_id: '5448114', }, { - "_id": "10021707", - "listing_url": "https://www.airbnb.com/rooms/10021707", - "name": "Private Room in Bushwick", - "interaction": "", - "house_rules": "", - "property_type": "Apartment", - "room_type": "Private room", - "bed_type": "Real Bed", - "minimum_nights": "14", - "maximum_nights": "1125", - "cancellation_policy": "flexible", - "last_scraped": { - "$date": { - "$numberLong": "1551848400000" - } - }, - "calendar_last_scraped": { - "$date": { - "$numberLong": "1551848400000" - } - }, - "first_review": { - "$date": { - "$numberLong": "1454216400000" - } - }, - "last_review": { - "$date": { - "$numberLong": "1454216400000" - } - }, - "accommodates": 1, - "bedrooms": 1, - "beds": 1, - "number_of_reviews": 1, - "bathrooms": { - "$numberDecimal": "1.5" - }, - "price": { - "$numberDecimal": "40.00" - }, - "extra_people": { - "$numberDecimal": "0.00" - }, - "guests_included": { - "$numberDecimal": "1" - }, - "images": { - "thumbnail_url": "", - "medium_url": "", - "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", - "xl_picture_url": "" - }, - "address": { - "street": "Brooklyn, NY, United States", - "suburb": "Brooklyn", - "government_area": "Bushwick", - "market": "New York", - "country": "United States", - "country_code": "US", - "location": { - "type": "Point", - "coordinates": [-73.93615, 40.69791], - "is_location_exact": true - } - }, - "availability": { - "availability_30": 0, - "availability_60": 0, - "availability_90": 0, - "availability_365": 0 - }, - "host_id": "11275734" + _id: '10021707', + listing_url: 'https://www.airbnb.com/rooms/10021707', + name: 'Private Room in Bushwick', + interaction: '', + house_rules: '', + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '14', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: { + $numberLong: '1551848400000', + }, + }, + calendar_last_scraped: { + $date: { + $numberLong: '1551848400000', + }, + }, + first_review: { + $date: { + $numberLong: '1454216400000', + }, + }, + last_review: { + $date: { + $numberLong: '1454216400000', + }, + }, + accommodates: 1, + bedrooms: 1, + beds: 1, + number_of_reviews: 1, + bathrooms: { + $numberDecimal: '1.5', + }, + price: { + $numberDecimal: '40.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + xl_picture_url: '', + }, + address: { + street: 'Brooklyn, NY, United States', + suburb: 'Brooklyn', + government_area: 'Bushwick', + market: 'New York', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-73.93615, 40.69791], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + host_id: '11275734', }, { - "_id": "10030955", - "listing_url": "https://www.airbnb.com/rooms/10030955", - "name": "Apt Linda Vista Lagoa - Rio", - "interaction": "", - "house_rules": "", - "property_type": "Apartment", - "room_type": "Private room", - "bed_type": "Real Bed", - "minimum_nights": "1", - "maximum_nights": "1125", - "cancellation_policy": "flexible", - "last_scraped": { - "$date": { - "$numberLong": "1549861200000" - } - }, - "calendar_last_scraped": { - "$date": { - "$numberLong": "1549861200000" - } - }, - "accommodates": 2, - "bedrooms": 1, - "beds": 1, - "number_of_reviews": 0, - "bathrooms": { - "$numberDecimal": "2.0" - }, - "price": { - "$numberDecimal": "701.00" - }, - "security_deposit": { - "$numberDecimal": "1000.00" - }, - "cleaning_fee": { - "$numberDecimal": "250.00" - }, - "extra_people": { - "$numberDecimal": "0.00" - }, - "guests_included": { - "$numberDecimal": "1" - }, - "images": { - "thumbnail_url": "", - "medium_url": "", - "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", - "xl_picture_url": "" - }, - "address": { - "street": "Rio de Janeiro, Rio de Janeiro, Brazil", - "suburb": "Lagoa", - "government_area": "Lagoa", - "market": "Rio De Janeiro", - "country": "Brazil", - "country_code": "BR", - "location": { - "type": "Point", - "coordinates": [-43.205047082633435, -22.971950988341874], - "is_location_exact": true - } - }, - "availability": { - "availability_30": 28, - "availability_60": 58, - "availability_90": 88, - "availability_365": 363 - }, - "host_id": "51496939" + _id: '10030955', + listing_url: 'https://www.airbnb.com/rooms/10030955', + name: 'Apt Linda Vista Lagoa - Rio', + interaction: '', + house_rules: '', + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: { + $numberLong: '1549861200000', + }, + }, + calendar_last_scraped: { + $date: { + $numberLong: '1549861200000', + }, + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '2.0', + }, + price: { + $numberDecimal: '701.00', + }, + security_deposit: { + $numberDecimal: '1000.00', + }, + cleaning_fee: { + $numberDecimal: '250.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + xl_picture_url: '', + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Lagoa', + government_area: 'Lagoa', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.205047082633435, -22.971950988341874], + is_location_exact: true, + }, + }, + availability: { + availability_30: 28, + availability_60: 58, + availability_90: 88, + availability_365: 363, + }, + host_id: '51496939', }, { - "_id": "1003530", - "listing_url": "https://www.airbnb.com/rooms/1003530", - "name": "New York City - Upper West Side Apt", - "interaction": "", - "house_rules": "No smoking is permitted in the apartment. All towels that are used should be placed in the bath tub upon departure. I have a cat, Samantha, who can stay or go, whichever is preferred. Please text me upon departure.", - "property_type": "Apartment", - "room_type": "Private room", - "bed_type": "Real Bed", - "minimum_nights": "12", - "maximum_nights": "360", - "cancellation_policy": "strict_14_with_grace_period", - "last_scraped": { - "$date": { - "$numberLong": "1551934800000" - } - }, - "calendar_last_scraped": { - "$date": { - "$numberLong": "1551934800000" - } - }, - "first_review": { - "$date": { - "$numberLong": "1367208000000" - } - }, - "last_review": { - "$date": { - "$numberLong": "1534046400000" - } - }, - "accommodates": 2, - "bedrooms": 1, - "beds": 1, - "number_of_reviews": 70, - "bathrooms": { - "$numberDecimal": "1.0" - }, - "price": { - "$numberDecimal": "135.00" - }, - "security_deposit": { - "$numberDecimal": "0.00" - }, - "cleaning_fee": { - "$numberDecimal": "135.00" - }, - "extra_people": { - "$numberDecimal": "0.00" - }, - "guests_included": { - "$numberDecimal": "1" - }, - "images": { - "thumbnail_url": "", - "medium_url": "", - "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", - "xl_picture_url": "" - }, - "address": { - "street": "New York, NY, United States", - "suburb": "Manhattan", - "government_area": "Upper West Side", - "market": "New York", - "country": "United States", - "country_code": "US", - "location": { - "type": "Point", - "coordinates": [-73.96523, 40.79962], - "is_location_exact": false - } - }, - "availability": { - "availability_30": 0, - "availability_60": 0, - "availability_90": 0, - "availability_365": 93 - }, - "host_id": "454250" + _id: '1003530', + listing_url: 'https://www.airbnb.com/rooms/1003530', + name: 'New York City - Upper West Side Apt', + interaction: '', + house_rules: + 'No smoking is permitted in the apartment. All towels that are used should be placed in the bath tub upon departure. I have a cat, Samantha, who can stay or go, whichever is preferred. Please text me upon departure.', + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '12', + maximum_nights: '360', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: { + $numberLong: '1551934800000', + }, + }, + calendar_last_scraped: { + $date: { + $numberLong: '1551934800000', + }, + }, + first_review: { + $date: { + $numberLong: '1367208000000', + }, + }, + last_review: { + $date: { + $numberLong: '1534046400000', + }, + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 70, + bathrooms: { + $numberDecimal: '1.0', + }, + price: { + $numberDecimal: '135.00', + }, + security_deposit: { + $numberDecimal: '0.00', + }, + cleaning_fee: { + $numberDecimal: '135.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + xl_picture_url: '', + }, + address: { + street: 'New York, NY, United States', + suburb: 'Manhattan', + government_area: 'Upper West Side', + market: 'New York', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-73.96523, 40.79962], + is_location_exact: false, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 93, + }, + host_id: '454250', }, { - "_id": "10038496", - "listing_url": "https://www.airbnb.com/rooms/10038496", - "name": "Copacabana Apartment Posto 6", - "interaction": "Contact telephone numbers if needed: Valeria ((PHONE NUMBER HIDDEN) (URL HIDDEN) ((PHONE NUMBER HIDDEN) cell phone (URL HIDDEN) (021) mobile/(PHONE NUMBER HIDDEN) José (URL HIDDEN)Concierge support; Fernando (caretaker boss) business hours.", - "house_rules": "Entreguem o imóvel conforme receberam e respeitem as regras do condomínio para não serem incomodados. Não danificar os utensílios e tudo que se refere as boas condições referentes ao mesmo . Não fazer barulho após às 22:00 até às 8:00. Usar entrada de serviço se estiver molhado voltando da praia.", - "property_type": "Apartment", - "room_type": "Entire home/apt", - "bed_type": "Real Bed", - "minimum_nights": "3", - "maximum_nights": "75", - "cancellation_policy": "strict_14_with_grace_period", - "last_scraped": { - "$date": { - "$numberLong": "1549861200000" - } - }, - "calendar_last_scraped": { - "$date": { - "$numberLong": "1549861200000" - } - }, - "first_review": { - "$date": { - "$numberLong": "1453093200000" - } - }, - "last_review": { - "$date": { - "$numberLong": "1548651600000" - } - }, - "accommodates": 4, - "bedrooms": 1, - "beds": 3, - "number_of_reviews": 70, - "bathrooms": { - "$numberDecimal": "2.0" - }, - "price": { - "$numberDecimal": "119.00" - }, - "security_deposit": { - "$numberDecimal": "600.00" - }, - "cleaning_fee": { - "$numberDecimal": "150.00" - }, - "extra_people": { - "$numberDecimal": "40.00" - }, - "guests_included": { - "$numberDecimal": "3" - }, - "images": { - "thumbnail_url": "", - "medium_url": "", - "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", - "xl_picture_url": "" - }, - "address": { - "street": "Rio de Janeiro, Rio de Janeiro, Brazil", - "suburb": "Copacabana", - "government_area": "Copacabana", - "market": "Rio De Janeiro", - "country": "Brazil", - "country_code": "BR", - "location": { - "type": "Point", - "coordinates": [-43.190849194463404, -22.984339360067814], - "is_location_exact": false - } - }, - "availability": { - "availability_30": 7, - "availability_60": 19, - "availability_90": 33, - "availability_365": 118 - }, - "host_id": "51530266" + _id: '10038496', + listing_url: 'https://www.airbnb.com/rooms/10038496', + name: 'Copacabana Apartment Posto 6', + interaction: + 'Contact telephone numbers if needed: Valeria ((PHONE NUMBER HIDDEN) (URL HIDDEN) ((PHONE NUMBER HIDDEN) cell phone (URL HIDDEN) (021) mobile/(PHONE NUMBER HIDDEN) José (URL HIDDEN)Concierge support; Fernando (caretaker boss) business hours.', + house_rules: + 'Entreguem o imóvel conforme receberam e respeitem as regras do condomínio para não serem incomodados. Não danificar os utensílios e tudo que se refere as boas condições referentes ao mesmo . Não fazer barulho após às 22:00 até às 8:00. Usar entrada de serviço se estiver molhado voltando da praia.', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '3', + maximum_nights: '75', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: { + $numberLong: '1549861200000', + }, + }, + calendar_last_scraped: { + $date: { + $numberLong: '1549861200000', + }, + }, + first_review: { + $date: { + $numberLong: '1453093200000', + }, + }, + last_review: { + $date: { + $numberLong: '1548651600000', + }, + }, + accommodates: 4, + bedrooms: 1, + beds: 3, + number_of_reviews: 70, + bathrooms: { + $numberDecimal: '2.0', + }, + price: { + $numberDecimal: '119.00', + }, + security_deposit: { + $numberDecimal: '600.00', + }, + cleaning_fee: { + $numberDecimal: '150.00', + }, + extra_people: { + $numberDecimal: '40.00', + }, + guests_included: { + $numberDecimal: '3', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + xl_picture_url: '', + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Copacabana', + government_area: 'Copacabana', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.190849194463404, -22.984339360067814], + is_location_exact: false, + }, + }, + availability: { + availability_30: 7, + availability_60: 19, + availability_90: 33, + availability_365: 118, + }, + host_id: '51530266', }, { - "_id": "10047964", - "listing_url": "https://www.airbnb.com/rooms/10047964", - "name": "Charming Flat in Downtown Moda", - "interaction": "", - "house_rules": "Be and feel like your own home, with total respect and love..this would be wonderful!", - "property_type": "House", - "room_type": "Entire home/apt", - "bed_type": "Real Bed", - "minimum_nights": "2", - "maximum_nights": "1125", - "cancellation_policy": "flexible", - "last_scraped": { - "$date": { - "$numberLong": "1550466000000" - } - }, - "calendar_last_scraped": { - "$date": { - "$numberLong": "1550466000000" - } - }, - "first_review": { - "$date": { - "$numberLong": "1459569600000" - } - }, - "last_review": { - "$date": { - "$numberLong": "1459569600000" - } - }, - "accommodates": 6, - "bedrooms": 2, - "beds": 6, - "number_of_reviews": 1, - "bathrooms": { - "$numberDecimal": "1.0" - }, - "price": { - "$numberDecimal": "527.00" - }, - "cleaning_fee": { - "$numberDecimal": "211.00" - }, - "extra_people": { - "$numberDecimal": "211.00" - }, - "guests_included": { - "$numberDecimal": "1" - }, - "images": { - "thumbnail_url": "", - "medium_url": "", - "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", - "xl_picture_url": "" - }, - "address": { - "street": "Kadıköy, İstanbul, Turkey", - "suburb": "Moda", - "government_area": "Kadikoy", - "market": "Istanbul", - "country": "Turkey", - "country_code": "TR", - "location": { - "type": "Point", - "coordinates": [29.03133, 40.98585], - "is_location_exact": true - } - }, - "availability": { - "availability_30": 27, - "availability_60": 57, - "availability_90": 87, - "availability_365": 362 - }, - "host_id": "1241644" + _id: '10047964', + listing_url: 'https://www.airbnb.com/rooms/10047964', + name: 'Charming Flat in Downtown Moda', + interaction: '', + house_rules: + 'Be and feel like your own home, with total respect and love..this would be wonderful!', + property_type: 'House', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: { + $numberLong: '1550466000000', + }, + }, + calendar_last_scraped: { + $date: { + $numberLong: '1550466000000', + }, + }, + first_review: { + $date: { + $numberLong: '1459569600000', + }, + }, + last_review: { + $date: { + $numberLong: '1459569600000', + }, + }, + accommodates: 6, + bedrooms: 2, + beds: 6, + number_of_reviews: 1, + bathrooms: { + $numberDecimal: '1.0', + }, + price: { + $numberDecimal: '527.00', + }, + cleaning_fee: { + $numberDecimal: '211.00', + }, + extra_people: { + $numberDecimal: '211.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + xl_picture_url: '', + }, + address: { + street: 'Kadıköy, İstanbul, Turkey', + suburb: 'Moda', + government_area: 'Kadikoy', + market: 'Istanbul', + country: 'Turkey', + country_code: 'TR', + location: { + type: 'Point', + coordinates: [29.03133, 40.98585], + is_location_exact: true, + }, + }, + availability: { + availability_30: 27, + availability_60: 57, + availability_90: 87, + availability_365: 362, + }, + host_id: '1241644', }, { - "_id": "10051164", - "listing_url": "https://www.airbnb.com/rooms/10051164", - "name": "Catete's Colonial Big Hause Room B", - "interaction": "Sou geógrafa, gosto de arte e cultura. Moro neste endereço (porém em outro espaço, que não o casarão) com meu companheiro Carlos Henrique, que é músico, farmacêutico e acupunturista, meus filhos Pedro, estudante do ensino médio e Estevão estudante de antropologia . Somos todos os três responsáveis pelas hospedagens e manutenção do Casarão. Sejam bem vindos! Estaremos com total disponibilidade para ajudá-los.", - "house_rules": "", - "property_type": "House", - "room_type": "Private room", - "bed_type": "Real Bed", - "minimum_nights": "2", - "maximum_nights": "1125", - "cancellation_policy": "strict_14_with_grace_period", - "last_scraped": { - "$date": { - "$numberLong": "1549861200000" - } - }, - "calendar_last_scraped": { - "$date": { - "$numberLong": "1549861200000" - } - }, - "first_review": { - "$date": { - "$numberLong": "1455080400000" - } - }, - "last_review": { - "$date": { - "$numberLong": "1455080400000" - } - }, - "accommodates": 8, - "bedrooms": 1, - "beds": 8, - "number_of_reviews": 1, - "bathrooms": { - "$numberDecimal": "4.0" - }, - "price": { - "$numberDecimal": "250.00" - }, - "security_deposit": { - "$numberDecimal": "0.00" - }, - "cleaning_fee": { - "$numberDecimal": "0.00" - }, - "extra_people": { - "$numberDecimal": "40.00" - }, - "guests_included": { - "$numberDecimal": "4" - }, - "images": { - "thumbnail_url": "", - "medium_url": "", - "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", - "xl_picture_url": "" - }, - "address": { - "street": "Rio de Janeiro, Rio de Janeiro, Brazil", - "suburb": "Catete", - "government_area": "Catete", - "market": "Rio De Janeiro", - "country": "Brazil", - "country_code": "BR", - "location": { - "type": "Point", - "coordinates": [-43.18015675229857, -22.92638234778768], - "is_location_exact": true - } - }, - "availability": { - "availability_30": 10, - "availability_60": 10, - "availability_90": 21, - "availability_365": 296 - }, - "host_id": "51326285" + _id: '10051164', + listing_url: 'https://www.airbnb.com/rooms/10051164', + name: "Catete's Colonial Big Hause Room B", + interaction: + 'Sou geógrafa, gosto de arte e cultura. Moro neste endereço (porém em outro espaço, que não o casarão) com meu companheiro Carlos Henrique, que é músico, farmacêutico e acupunturista, meus filhos Pedro, estudante do ensino médio e Estevão estudante de antropologia . Somos todos os três responsáveis pelas hospedagens e manutenção do Casarão. Sejam bem vindos! Estaremos com total disponibilidade para ajudá-los.', + house_rules: '', + property_type: 'House', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '1125', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: { + $numberLong: '1549861200000', + }, + }, + calendar_last_scraped: { + $date: { + $numberLong: '1549861200000', + }, + }, + first_review: { + $date: { + $numberLong: '1455080400000', + }, + }, + last_review: { + $date: { + $numberLong: '1455080400000', + }, + }, + accommodates: 8, + bedrooms: 1, + beds: 8, + number_of_reviews: 1, + bathrooms: { + $numberDecimal: '4.0', + }, + price: { + $numberDecimal: '250.00', + }, + security_deposit: { + $numberDecimal: '0.00', + }, + cleaning_fee: { + $numberDecimal: '0.00', + }, + extra_people: { + $numberDecimal: '40.00', + }, + guests_included: { + $numberDecimal: '4', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + xl_picture_url: '', + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Catete', + government_area: 'Catete', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.18015675229857, -22.92638234778768], + is_location_exact: true, + }, + }, + availability: { + availability_30: 10, + availability_60: 10, + availability_90: 21, + availability_365: 296, + }, + host_id: '51326285', }, { - "_id": "10057447", - "listing_url": "https://www.airbnb.com/rooms/10057447", - "name": "Modern Spacious 1 Bedroom Loft", - "interaction": "", - "house_rules": "", - "property_type": "Apartment", - "room_type": "Entire home/apt", - "bed_type": "Real Bed", - "minimum_nights": "1", - "maximum_nights": "1125", - "cancellation_policy": "flexible", - "last_scraped": { - "$date": { - "$numberLong": "1552276800000" - } - }, - "calendar_last_scraped": { - "$date": { - "$numberLong": "1552276800000" - } - }, - "accommodates": 4, - "bedrooms": 1, - "beds": 2, - "number_of_reviews": 0, - "bathrooms": { - "$numberDecimal": "1.0" - }, - "price": { - "$numberDecimal": "50.00" - }, - "extra_people": { - "$numberDecimal": "31.00" - }, - "guests_included": { - "$numberDecimal": "1" - }, - "images": { - "thumbnail_url": "", - "medium_url": "", - "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", - "xl_picture_url": "" - }, - "address": { - "street": "Montréal, Québec, Canada", - "suburb": "Mile End", - "government_area": "Le Plateau-Mont-Royal", - "market": "Montreal", - "country": "Canada", - "country_code": "CA", - "location": { - "type": "Point", - "coordinates": [-73.59111, 45.51889], - "is_location_exact": true - } - }, - "availability": { - "availability_30": 0, - "availability_60": 0, - "availability_90": 0, - "availability_365": 0 - }, - "host_id": "51612949" + _id: '10057447', + listing_url: 'https://www.airbnb.com/rooms/10057447', + name: 'Modern Spacious 1 Bedroom Loft', + interaction: '', + house_rules: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: { + $numberLong: '1552276800000', + }, + }, + calendar_last_scraped: { + $date: { + $numberLong: '1552276800000', + }, + }, + accommodates: 4, + bedrooms: 1, + beds: 2, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '1.0', + }, + price: { + $numberDecimal: '50.00', + }, + extra_people: { + $numberDecimal: '31.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + xl_picture_url: '', + }, + address: { + street: 'Montréal, Québec, Canada', + suburb: 'Mile End', + government_area: 'Le Plateau-Mont-Royal', + market: 'Montreal', + country: 'Canada', + country_code: 'CA', + location: { + type: 'Point', + coordinates: [-73.59111, 45.51889], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + host_id: '51612949', }, { - "_id": "10057826", - "listing_url": "https://www.airbnb.com/rooms/10057826", - "name": "Deluxe Loft Suite", - "interaction": "", - "house_rules": "Guest must leave a copy of credit card with front desk for any incidentals/ damages with a copy of valid ID. There are no additional charges than what has been paid in advance.", - "property_type": "Apartment", - "room_type": "Entire home/apt", - "bed_type": "Real Bed", - "minimum_nights": "3", - "maximum_nights": "1125", - "cancellation_policy": "strict_14_with_grace_period", - "last_scraped": { - "$date": { - "$numberLong": "1551934800000" - } - }, - "calendar_last_scraped": { - "$date": { - "$numberLong": "1551934800000" - } - }, - "first_review": { - "$date": { - "$numberLong": "1451797200000" - } - }, - "last_review": { - "$date": { - "$numberLong": "1518930000000" - } - }, - "accommodates": 4, - "bedrooms": 0, - "beds": 2, - "number_of_reviews": 5, - "bathrooms": { - "$numberDecimal": "1.0" - }, - "price": { - "$numberDecimal": "205.00" - }, - "extra_people": { - "$numberDecimal": "0.00" - }, - "guests_included": { - "$numberDecimal": "1" - }, - "images": { - "thumbnail_url": "", - "medium_url": "", - "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", - "xl_picture_url": "" - }, - "address": { - "street": "Brooklyn, NY, United States", - "suburb": "Greenpoint", - "government_area": "Greenpoint", - "market": "New York", - "country": "United States", - "country_code": "US", - "location": { - "type": "Point", - "coordinates": [-73.94472, 40.72778], - "is_location_exact": true - } - }, - "availability": { - "availability_30": 30, - "availability_60": 31, - "availability_90": 31, - "availability_365": 243 - }, - "host_id": "47554473" + _id: '10057826', + listing_url: 'https://www.airbnb.com/rooms/10057826', + name: 'Deluxe Loft Suite', + interaction: '', + house_rules: + 'Guest must leave a copy of credit card with front desk for any incidentals/ damages with a copy of valid ID. There are no additional charges than what has been paid in advance.', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '3', + maximum_nights: '1125', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: { + $numberLong: '1551934800000', + }, + }, + calendar_last_scraped: { + $date: { + $numberLong: '1551934800000', + }, + }, + first_review: { + $date: { + $numberLong: '1451797200000', + }, + }, + last_review: { + $date: { + $numberLong: '1518930000000', + }, + }, + accommodates: 4, + bedrooms: 0, + beds: 2, + number_of_reviews: 5, + bathrooms: { + $numberDecimal: '1.0', + }, + price: { + $numberDecimal: '205.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + xl_picture_url: '', + }, + address: { + street: 'Brooklyn, NY, United States', + suburb: 'Greenpoint', + government_area: 'Greenpoint', + market: 'New York', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-73.94472, 40.72778], + is_location_exact: true, + }, + }, + availability: { + availability_30: 30, + availability_60: 31, + availability_90: 31, + availability_365: 243, + }, + host_id: '47554473', }, { - "_id": "10059244", - "listing_url": "https://www.airbnb.com/rooms/10059244", - "name": "Ligne verte - à 15 min de métro du centre ville.", - "interaction": "Une amie sera disponible en cas de besoin.", - "house_rules": "Non fumeur Respect des voisins Respect des biens Merci! :)", - "property_type": "Apartment", - "room_type": "Entire home/apt", - "bed_type": "Real Bed", - "minimum_nights": "2", - "maximum_nights": "1125", - "cancellation_policy": "moderate", - "last_scraped": { - "$date": { - "$numberLong": "1552276800000" - } - }, - "calendar_last_scraped": { - "$date": { - "$numberLong": "1552276800000" - } - }, - "accommodates": 2, - "bedrooms": 0, - "beds": 1, - "number_of_reviews": 0, - "bathrooms": { - "$numberDecimal": "1.0" - }, - "price": { - "$numberDecimal": "43.00" - }, - "extra_people": { - "$numberDecimal": "12.00" - }, - "guests_included": { - "$numberDecimal": "1" - }, - "images": { - "thumbnail_url": "", - "medium_url": "", - "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", - "xl_picture_url": "" - }, - "address": { - "street": "Montréal, Québec, Canada", - "suburb": "Hochelaga-Maisonneuve", - "government_area": "Mercier-Hochelaga-Maisonneuve", - "market": "Montreal", - "country": "Canada", - "country_code": "CA", - "location": { - "type": "Point", - "coordinates": [-73.54949, 45.54548], - "is_location_exact": false - } - }, - "availability": { - "availability_30": 0, - "availability_60": 0, - "availability_90": 0, - "availability_365": 32 - }, - "host_id": "7140229" + _id: '10059244', + listing_url: 'https://www.airbnb.com/rooms/10059244', + name: 'Ligne verte - à 15 min de métro du centre ville.', + interaction: 'Une amie sera disponible en cas de besoin.', + house_rules: 'Non fumeur Respect des voisins Respect des biens Merci! :)', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '1125', + cancellation_policy: 'moderate', + last_scraped: { + $date: { + $numberLong: '1552276800000', + }, + }, + calendar_last_scraped: { + $date: { + $numberLong: '1552276800000', + }, + }, + accommodates: 2, + bedrooms: 0, + beds: 1, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '1.0', + }, + price: { + $numberDecimal: '43.00', + }, + extra_people: { + $numberDecimal: '12.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + xl_picture_url: '', + }, + address: { + street: 'Montréal, Québec, Canada', + suburb: 'Hochelaga-Maisonneuve', + government_area: 'Mercier-Hochelaga-Maisonneuve', + market: 'Montreal', + country: 'Canada', + country_code: 'CA', + location: { + type: 'Point', + coordinates: [-73.54949, 45.54548], + is_location_exact: false, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 32, + }, + host_id: '7140229', }, { - "_id": "10059872", - "listing_url": "https://www.airbnb.com/rooms/10059872", - "name": "Soho Cozy, Spacious and Convenient", - "interaction": "", - "house_rules": "", - "property_type": "Apartment", - "room_type": "Entire home/apt", - "bed_type": "Real Bed", - "minimum_nights": "4", - "maximum_nights": "20", - "cancellation_policy": "flexible", - "last_scraped": { - "$date": { - "$numberLong": "1552276800000" - } - }, - "calendar_last_scraped": { - "$date": { - "$numberLong": "1552276800000" - } - }, - "first_review": { - "$date": { - "$numberLong": "1450501200000" - } - }, - "last_review": { - "$date": { - "$numberLong": "1522123200000" - } - }, - "accommodates": 3, - "bedrooms": 1, - "beds": 2, - "number_of_reviews": 3, - "bathrooms": { - "$numberDecimal": "1.0" - }, - "price": { - "$numberDecimal": "699.00" - }, - "extra_people": { - "$numberDecimal": "0.00" - }, - "guests_included": { - "$numberDecimal": "1" - }, - "images": { - "thumbnail_url": "", - "medium_url": "", - "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", - "xl_picture_url": "" - }, - "address": { - "street": "Hong Kong, Hong Kong Island, Hong Kong", - "suburb": "Central & Western District", - "government_area": "Central & Western", - "market": "Hong Kong", - "country": "Hong Kong", - "country_code": "HK", - "location": { - "type": "Point", - "coordinates": [114.15027, 22.28158], - "is_location_exact": true - } - }, - "availability": { - "availability_30": 0, - "availability_60": 0, - "availability_90": 0, - "availability_365": 0 - }, - "host_id": "51624384" + _id: '10059872', + listing_url: 'https://www.airbnb.com/rooms/10059872', + name: 'Soho Cozy, Spacious and Convenient', + interaction: '', + house_rules: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '4', + maximum_nights: '20', + cancellation_policy: 'flexible', + last_scraped: { + $date: { + $numberLong: '1552276800000', + }, + }, + calendar_last_scraped: { + $date: { + $numberLong: '1552276800000', + }, + }, + first_review: { + $date: { + $numberLong: '1450501200000', + }, + }, + last_review: { + $date: { + $numberLong: '1522123200000', + }, + }, + accommodates: 3, + bedrooms: 1, + beds: 2, + number_of_reviews: 3, + bathrooms: { + $numberDecimal: '1.0', + }, + price: { + $numberDecimal: '699.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + xl_picture_url: '', + }, + address: { + street: 'Hong Kong, Hong Kong Island, Hong Kong', + suburb: 'Central & Western District', + government_area: 'Central & Western', + market: 'Hong Kong', + country: 'Hong Kong', + country_code: 'HK', + location: { + type: 'Point', + coordinates: [114.15027, 22.28158], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + host_id: '51624384', }, { - "_id": "10066928", - "listing_url": "https://www.airbnb.com/rooms/10066928", - "name": "3 chambres au coeur du Plateau", - "interaction": "N'hésitez pas à m'écrire pour toute demande de renseignement !", - "house_rules": "Merci de respecter ce lieu de vie.", - "property_type": "Apartment", - "room_type": "Entire home/apt", - "bed_type": "Real Bed", - "minimum_nights": "1", - "maximum_nights": "1125", - "cancellation_policy": "flexible", - "last_scraped": { - "$date": { - "$numberLong": "1552276800000" - } - }, - "calendar_last_scraped": { - "$date": { - "$numberLong": "1552276800000" - } - }, - "accommodates": 6, - "bedrooms": 3, - "beds": 3, - "number_of_reviews": 0, - "bathrooms": { - "$numberDecimal": "1.0" - }, - "price": { - "$numberDecimal": "140.00" - }, - "extra_people": { - "$numberDecimal": "0.00" - }, - "guests_included": { - "$numberDecimal": "1" - }, - "images": { - "thumbnail_url": "", - "medium_url": "", - "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", - "xl_picture_url": "" - }, - "address": { - "street": "Montréal, Québec, Canada", - "suburb": "Le Plateau-Mont-Royal", - "government_area": "Le Plateau-Mont-Royal", - "market": "Montreal", - "country": "Canada", - "country_code": "CA", - "location": { - "type": "Point", - "coordinates": [-73.57383, 45.52233], - "is_location_exact": true - } - }, - "availability": { - "availability_30": 0, - "availability_60": 0, - "availability_90": 0, - "availability_365": 0 - }, - "host_id": "9036477" + _id: '10066928', + listing_url: 'https://www.airbnb.com/rooms/10066928', + name: '3 chambres au coeur du Plateau', + interaction: + "N'hésitez pas à m'écrire pour toute demande de renseignement !", + house_rules: 'Merci de respecter ce lieu de vie.', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: { + $numberLong: '1552276800000', + }, + }, + calendar_last_scraped: { + $date: { + $numberLong: '1552276800000', + }, + }, + accommodates: 6, + bedrooms: 3, + beds: 3, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '1.0', + }, + price: { + $numberDecimal: '140.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + xl_picture_url: '', + }, + address: { + street: 'Montréal, Québec, Canada', + suburb: 'Le Plateau-Mont-Royal', + government_area: 'Le Plateau-Mont-Royal', + market: 'Montreal', + country: 'Canada', + country_code: 'CA', + location: { + type: 'Point', + coordinates: [-73.57383, 45.52233], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + host_id: '9036477', }, { - "_id": "10069642", - "listing_url": "https://www.airbnb.com/rooms/10069642", - "name": "Ótimo Apto proximo Parque Olimpico", - "interaction": "", - "house_rules": "", - "property_type": "Apartment", - "room_type": "Entire home/apt", - "bed_type": "Real Bed", - "minimum_nights": "15", - "maximum_nights": "20", - "cancellation_policy": "strict_14_with_grace_period", - "last_scraped": { - "$date": { - "$numberLong": "1549861200000" - } - }, - "calendar_last_scraped": { - "$date": { - "$numberLong": "1549861200000" - } - }, - "accommodates": 5, - "bedrooms": 2, - "beds": 2, - "number_of_reviews": 0, - "bathrooms": { - "$numberDecimal": "2.0" - }, - "price": { - "$numberDecimal": "858.00" - }, - "security_deposit": { - "$numberDecimal": "4476.00" - }, - "cleaning_fee": { - "$numberDecimal": "112.00" - }, - "extra_people": { - "$numberDecimal": "75.00" - }, - "guests_included": { - "$numberDecimal": "1" - }, - "images": { - "thumbnail_url": "", - "medium_url": "", - "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", - "xl_picture_url": "" - }, - "address": { - "street": "Rio de Janeiro, Rio de Janeiro, Brazil", - "suburb": "Recreio dos Bandeirantes", - "government_area": "Recreio dos Bandeirantes", - "market": "Rio De Janeiro", - "country": "Brazil", - "country_code": "BR", - "location": { - "type": "Point", - "coordinates": [-43.4311123147628, -23.00035792660916], - "is_location_exact": false - } - }, - "availability": { - "availability_30": 0, - "availability_60": 0, - "availability_90": 0, - "availability_365": 0 - }, - "host_id": "51670240" + _id: '10069642', + listing_url: 'https://www.airbnb.com/rooms/10069642', + name: 'Ótimo Apto proximo Parque Olimpico', + interaction: '', + house_rules: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '15', + maximum_nights: '20', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: { + $numberLong: '1549861200000', + }, + }, + calendar_last_scraped: { + $date: { + $numberLong: '1549861200000', + }, + }, + accommodates: 5, + bedrooms: 2, + beds: 2, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '2.0', + }, + price: { + $numberDecimal: '858.00', + }, + security_deposit: { + $numberDecimal: '4476.00', + }, + cleaning_fee: { + $numberDecimal: '112.00', + }, + extra_people: { + $numberDecimal: '75.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + xl_picture_url: '', + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Recreio dos Bandeirantes', + government_area: 'Recreio dos Bandeirantes', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.4311123147628, -23.00035792660916], + is_location_exact: false, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + host_id: '51670240', }, { - "_id": "10082307", - "listing_url": "https://www.airbnb.com/rooms/10082307", - "name": "Double Room en-suite (307)", - "interaction": "", - "house_rules": "", - "property_type": "Apartment", - "room_type": "Private room", - "bed_type": "Real Bed", - "minimum_nights": "1", - "maximum_nights": "1125", - "cancellation_policy": "strict_14_with_grace_period", - "last_scraped": { - "$date": { - "$numberLong": "1552276800000" - } - }, - "calendar_last_scraped": { - "$date": { - "$numberLong": "1552276800000" - } - }, - "accommodates": 2, - "bedrooms": 1, - "beds": 1, - "number_of_reviews": 0, - "bathrooms": { - "$numberDecimal": "1.0" - }, - "price": { - "$numberDecimal": "361.00" - }, - "extra_people": { - "$numberDecimal": "130.00" - }, - "guests_included": { - "$numberDecimal": "2" - }, - "images": { - "thumbnail_url": "", - "medium_url": "", - "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", - "xl_picture_url": "" - }, - "address": { - "street": "Hong Kong, Kowloon, Hong Kong", - "suburb": "Yau Tsim Mong", - "government_area": "Yau Tsim Mong", - "market": "Hong Kong", - "country": "Hong Kong", - "country_code": "HK", - "location": { - "type": "Point", - "coordinates": [114.17158, 22.30469], - "is_location_exact": true - } - }, - "availability": { - "availability_30": 30, - "availability_60": 60, - "availability_90": 90, - "availability_365": 365 - }, - "host_id": "51289938" + _id: '10082307', + listing_url: 'https://www.airbnb.com/rooms/10082307', + name: 'Double Room en-suite (307)', + interaction: '', + house_rules: '', + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: { + $numberLong: '1552276800000', + }, + }, + calendar_last_scraped: { + $date: { + $numberLong: '1552276800000', + }, + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '1.0', + }, + price: { + $numberDecimal: '361.00', + }, + extra_people: { + $numberDecimal: '130.00', + }, + guests_included: { + $numberDecimal: '2', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + xl_picture_url: '', + }, + address: { + street: 'Hong Kong, Kowloon, Hong Kong', + suburb: 'Yau Tsim Mong', + government_area: 'Yau Tsim Mong', + market: 'Hong Kong', + country: 'Hong Kong', + country_code: 'HK', + location: { + type: 'Point', + coordinates: [114.17158, 22.30469], + is_location_exact: true, + }, + }, + availability: { + availability_30: 30, + availability_60: 60, + availability_90: 90, + availability_365: 365, + }, + host_id: '51289938', }, { - "_id": "10082422", - "listing_url": "https://www.airbnb.com/rooms/10082422", - "name": "Nice room in Barcelona Center", - "interaction": "", - "house_rules": "", - "property_type": "Apartment", - "room_type": "Private room", - "bed_type": "Real Bed", - "minimum_nights": "1", - "maximum_nights": "9", - "cancellation_policy": "flexible", - "last_scraped": { - "$date": { - "$numberLong": "1552021200000" - } - }, - "calendar_last_scraped": { - "$date": { - "$numberLong": "1552021200000" - } - }, - "accommodates": 2, - "bedrooms": 1, - "beds": 2, - "number_of_reviews": 0, - "bathrooms": { - "$numberDecimal": "1.0" - }, - "price": { - "$numberDecimal": "50.00" - }, - "security_deposit": { - "$numberDecimal": "100.00" - }, - "cleaning_fee": { - "$numberDecimal": "10.00" - }, - "extra_people": { - "$numberDecimal": "0.00" - }, - "guests_included": { - "$numberDecimal": "1" - }, - "images": { - "thumbnail_url": "", - "medium_url": "", - "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", - "xl_picture_url": "" - }, - "address": { - "street": "Barcelona, Catalunya, Spain", - "suburb": "Eixample", - "government_area": "la Dreta de l'Eixample", - "market": "Barcelona", - "country": "Spain", - "country_code": "ES", - "location": { - "type": "Point", - "coordinates": [2.16942, 41.40082], - "is_location_exact": true - } - }, - "availability": { - "availability_30": 0, - "availability_60": 0, - "availability_90": 0, - "availability_365": 0 - }, - "host_id": "30393403" + _id: '10082422', + listing_url: 'https://www.airbnb.com/rooms/10082422', + name: 'Nice room in Barcelona Center', + interaction: '', + house_rules: '', + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '9', + cancellation_policy: 'flexible', + last_scraped: { + $date: { + $numberLong: '1552021200000', + }, + }, + calendar_last_scraped: { + $date: { + $numberLong: '1552021200000', + }, + }, + accommodates: 2, + bedrooms: 1, + beds: 2, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '1.0', + }, + price: { + $numberDecimal: '50.00', + }, + security_deposit: { + $numberDecimal: '100.00', + }, + cleaning_fee: { + $numberDecimal: '10.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + xl_picture_url: '', + }, + address: { + street: 'Barcelona, Catalunya, Spain', + suburb: 'Eixample', + government_area: "la Dreta de l'Eixample", + market: 'Barcelona', + country: 'Spain', + country_code: 'ES', + location: { + type: 'Point', + coordinates: [2.16942, 41.40082], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + host_id: '30393403', }, { - "_id": "10083468", - "listing_url": "https://www.airbnb.com/rooms/10083468", - "name": "Be Happy in Porto", - "interaction": "I`am always avaiable with for my guests.", - "house_rules": ". No smoking inside the apartment. . Is forbidden receive or lead strange people to the apartment. . Only people that are part of the reservation should have access to the apartment. . Do not eat on the bedroom. . Do not drink things like wine or sugary drinks on the bedroom.", - "property_type": "Loft", - "room_type": "Entire home/apt", - "bed_type": "Real Bed", - "minimum_nights": "2", - "maximum_nights": "1125", - "cancellation_policy": "moderate", - "last_scraped": { - "$date": { - "$numberLong": "1550293200000" - } - }, - "calendar_last_scraped": { - "$date": { - "$numberLong": "1550293200000" - } - }, - "first_review": { - "$date": { - "$numberLong": "1451710800000" - } - }, - "last_review": { - "$date": { - "$numberLong": "1549688400000" - } - }, - "accommodates": 2, - "bedrooms": 1, - "beds": 1, - "number_of_reviews": 178, - "bathrooms": { - "$numberDecimal": "1.0" - }, - "price": { - "$numberDecimal": "30.00" - }, - "security_deposit": { - "$numberDecimal": "0.00" - }, - "cleaning_fee": { - "$numberDecimal": "10.00" - }, - "extra_people": { - "$numberDecimal": "0.00" - }, - "guests_included": { - "$numberDecimal": "1" - }, - "images": { - "thumbnail_url": "", - "medium_url": "", - "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", - "xl_picture_url": "" - }, - "address": { - "street": "Porto, Porto, Portugal", - "suburb": "", - "government_area": "Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória", - "market": "Porto", - "country": "Portugal", - "country_code": "PT", - "location": { - "type": "Point", - "coordinates": [-8.61123, 41.15225], - "is_location_exact": false - } - }, - "availability": { - "availability_30": 16, - "availability_60": 40, - "availability_90": 67, - "availability_365": 335 - }, - "host_id": "27518920" + _id: '10083468', + listing_url: 'https://www.airbnb.com/rooms/10083468', + name: 'Be Happy in Porto', + interaction: 'I`am always avaiable with for my guests.', + house_rules: + '. No smoking inside the apartment. . Is forbidden receive or lead strange people to the apartment. . Only people that are part of the reservation should have access to the apartment. . Do not eat on the bedroom. . Do not drink things like wine or sugary drinks on the bedroom.', + property_type: 'Loft', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '1125', + cancellation_policy: 'moderate', + last_scraped: { + $date: { + $numberLong: '1550293200000', + }, + }, + calendar_last_scraped: { + $date: { + $numberLong: '1550293200000', + }, + }, + first_review: { + $date: { + $numberLong: '1451710800000', + }, + }, + last_review: { + $date: { + $numberLong: '1549688400000', + }, + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 178, + bathrooms: { + $numberDecimal: '1.0', + }, + price: { + $numberDecimal: '30.00', + }, + security_deposit: { + $numberDecimal: '0.00', + }, + cleaning_fee: { + $numberDecimal: '10.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + xl_picture_url: '', + }, + address: { + street: 'Porto, Porto, Portugal', + suburb: '', + government_area: 'Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória', + market: 'Porto', + country: 'Portugal', + country_code: 'PT', + location: { + type: 'Point', + coordinates: [-8.61123, 41.15225], + is_location_exact: false, + }, + }, + availability: { + availability_30: 16, + availability_60: 40, + availability_90: 67, + availability_365: 335, + }, + host_id: '27518920', }, { - "_id": "10084023", - "listing_url": "https://www.airbnb.com/rooms/10084023", - "name": "City center private room with bed", - "interaction": "A phone card of unlimited data will be provided during the stay, and phone call can also be made by the card. We have 3 bedrooms in the house and 2 are occupied by us, lots of Hong Kong traveling tips will be provided and also simple local tour if time is allowed.", - "house_rules": "1. 禁止吸煙, 只限女生入住 (除得到批准) No smoking and only female is allowed 2.熱水爐是儲水式, 不能長開, 用後請關上 The water heater cannot be turned on overnight, it will keep boiling water, thus, turn it off after use. 3. 不收清潔費,請保持房間及客廳清潔, 用過之碗筷需即日自行清洗 No cleaning fee is charged, thus, Please keep all the places including your room and living room clean and tidy, and make sure the dishes are washed after cooking on the same day. 4. 將收取港幣$1000為按金, 退房時將會歸還 (除故意破壞物品) Deposit of HKD$1000 will be charged and will return back when check out if nothing is damaged. 5. 房人將得到1條大門 1條鐵閘 及1條房鎖匙, 遺失需扣除$50 配匙費 1 main door key, 1 gate key and 1 private room key will be given at check in, $50 will be charged if lost. 6.洗髮後請必須將掉出來的頭髮拾起丟到垃圾桶或廁所,以免堵塞渠口 After washing hair, Please pick up your own hair and throw them in rubbish bin or toilet bowl, to avoid blocking the drain.", - "property_type": "Guesthouse", - "room_type": "Private room", - "bed_type": "Futon", - "minimum_nights": "1", - "maximum_nights": "500", - "cancellation_policy": "strict_14_with_grace_period", - "last_scraped": { - "$date": { - "$numberLong": "1552276800000" - } - }, - "calendar_last_scraped": { - "$date": { - "$numberLong": "1552276800000" - } - }, - "first_review": { - "$date": { - "$numberLong": "1450760400000" - } - }, - "last_review": { - "$date": { - "$numberLong": "1551416400000" - } - }, - "accommodates": 1, - "bedrooms": 1, - "beds": 1, - "number_of_reviews": 81, - "bathrooms": { - "$numberDecimal": "1.0" - }, - "price": { - "$numberDecimal": "181.00" - }, - "security_deposit": { - "$numberDecimal": "0.00" - }, - "cleaning_fee": { - "$numberDecimal": "50.00" - }, - "extra_people": { - "$numberDecimal": "100.00" - }, - "guests_included": { - "$numberDecimal": "1" - }, - "images": { - "thumbnail_url": "", - "medium_url": "", - "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", - "xl_picture_url": "" - }, - "address": { - "street": "Hong Kong , 九龍, Hong Kong", - "suburb": "Sham Shui Po District", - "government_area": "Sham Shui Po", - "market": "Hong Kong", - "country": "Hong Kong", - "country_code": "HK", - "location": { - "type": "Point", - "coordinates": [114.1669, 22.3314], - "is_location_exact": true - } - }, - "availability": { - "availability_30": 14, - "availability_60": 24, - "availability_90": 40, - "availability_365": 220 - }, - "host_id": "51744313" + _id: '10084023', + listing_url: 'https://www.airbnb.com/rooms/10084023', + name: 'City center private room with bed', + interaction: + 'A phone card of unlimited data will be provided during the stay, and phone call can also be made by the card. We have 3 bedrooms in the house and 2 are occupied by us, lots of Hong Kong traveling tips will be provided and also simple local tour if time is allowed.', + house_rules: + '1. 禁止吸煙, 只限女生入住 (除得到批准) No smoking and only female is allowed 2.熱水爐是儲水式, 不能長開, 用後請關上 The water heater cannot be turned on overnight, it will keep boiling water, thus, turn it off after use. 3. 不收清潔費,請保持房間及客廳清潔, 用過之碗筷需即日自行清洗 No cleaning fee is charged, thus, Please keep all the places including your room and living room clean and tidy, and make sure the dishes are washed after cooking on the same day. 4. 將收取港幣$1000為按金, 退房時將會歸還 (除故意破壞物品) Deposit of HKD$1000 will be charged and will return back when check out if nothing is damaged. 5. 房人將得到1條大門 1條鐵閘 及1條房鎖匙, 遺失需扣除$50 配匙費 1 main door key, 1 gate key and 1 private room key will be given at check in, $50 will be charged if lost. 6.洗髮後請必須將掉出來的頭髮拾起丟到垃圾桶或廁所,以免堵塞渠口 After washing hair, Please pick up your own hair and throw them in rubbish bin or toilet bowl, to avoid blocking the drain.', + property_type: 'Guesthouse', + room_type: 'Private room', + bed_type: 'Futon', + minimum_nights: '1', + maximum_nights: '500', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: { + $numberLong: '1552276800000', + }, + }, + calendar_last_scraped: { + $date: { + $numberLong: '1552276800000', + }, + }, + first_review: { + $date: { + $numberLong: '1450760400000', + }, + }, + last_review: { + $date: { + $numberLong: '1551416400000', + }, + }, + accommodates: 1, + bedrooms: 1, + beds: 1, + number_of_reviews: 81, + bathrooms: { + $numberDecimal: '1.0', + }, + price: { + $numberDecimal: '181.00', + }, + security_deposit: { + $numberDecimal: '0.00', + }, + cleaning_fee: { + $numberDecimal: '50.00', + }, + extra_people: { + $numberDecimal: '100.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + xl_picture_url: '', + }, + address: { + street: 'Hong Kong , 九龍, Hong Kong', + suburb: 'Sham Shui Po District', + government_area: 'Sham Shui Po', + market: 'Hong Kong', + country: 'Hong Kong', + country_code: 'HK', + location: { + type: 'Point', + coordinates: [114.1669, 22.3314], + is_location_exact: true, + }, + }, + availability: { + availability_30: 14, + availability_60: 24, + availability_90: 40, + availability_365: 220, + }, + host_id: '51744313', }, { - "_id": "10091713", - "listing_url": "https://www.airbnb.com/rooms/10091713", - "name": "Surry Hills Studio - Your Perfect Base in Sydney", - "interaction": "You have complete privacy during your stay.", - "house_rules": "No smoking: No smoking any substance, including e-cigarettes. Lost Keys / Locked out of Apartment: If you lose the key to the apartment building itself (i.e., the yellow security key) the cost of replacing it is $250. It will be deducted from your security deposit. If you lock yourself out of the apartment, it is solely your responsibility to contact a locksmith to open the apartment door for you. You are also solely responsible for the cost of the locksmith, including the cost of replacing the lock mechanism if necessary. If the lock mechanism needs to be replaced by the locksmith, you must provide 2 copies of the new key.", - "property_type": "Apartment", - "room_type": "Entire home/apt", - "bed_type": "Real Bed", - "minimum_nights": "10", - "maximum_nights": "21", - "cancellation_policy": "strict_14_with_grace_period", - "last_scraped": { - "$date": { - "$numberLong": "1551934800000" - } - }, - "calendar_last_scraped": { - "$date": { - "$numberLong": "1551934800000" - } - }, - "first_review": { - "$date": { - "$numberLong": "1482987600000" - } - }, - "last_review": { - "$date": { - "$numberLong": "1521345600000" - } - }, - "accommodates": 2, - "bedrooms": 0, - "beds": 1, - "number_of_reviews": 64, - "bathrooms": { - "$numberDecimal": "1.0" - }, - "price": { - "$numberDecimal": "181.00" - }, - "security_deposit": { - "$numberDecimal": "300.00" - }, - "cleaning_fee": { - "$numberDecimal": "50.00" - }, - "extra_people": { - "$numberDecimal": "0.00" - }, - "guests_included": { - "$numberDecimal": "1" - }, - "images": { - "thumbnail_url": "", - "medium_url": "", - "picture_url": "https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large", - "xl_picture_url": "" - }, - "address": { - "street": "Surry Hills, NSW, Australia", - "suburb": "Darlinghurst", - "government_area": "Sydney", - "market": "Sydney", - "country": "Australia", - "country_code": "AU", - "location": { - "type": "Point", - "coordinates": [151.21554, -33.88029], - "is_location_exact": true - } - }, - "availability": { - "availability_30": 0, - "availability_60": 0, - "availability_90": 0, - "availability_365": 0 - }, - "host_id": "13764143" - } -] + _id: '10091713', + listing_url: 'https://www.airbnb.com/rooms/10091713', + name: 'Surry Hills Studio - Your Perfect Base in Sydney', + interaction: 'You have complete privacy during your stay.', + house_rules: + 'No smoking: No smoking any substance, including e-cigarettes. Lost Keys / Locked out of Apartment: If you lose the key to the apartment building itself (i.e., the yellow security key) the cost of replacing it is $250. It will be deducted from your security deposit. If you lock yourself out of the apartment, it is solely your responsibility to contact a locksmith to open the apartment door for you. You are also solely responsible for the cost of the locksmith, including the cost of replacing the lock mechanism if necessary. If the lock mechanism needs to be replaced by the locksmith, you must provide 2 copies of the new key.', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '10', + maximum_nights: '21', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: { + $numberLong: '1551934800000', + }, + }, + calendar_last_scraped: { + $date: { + $numberLong: '1551934800000', + }, + }, + first_review: { + $date: { + $numberLong: '1482987600000', + }, + }, + last_review: { + $date: { + $numberLong: '1521345600000', + }, + }, + accommodates: 2, + bedrooms: 0, + beds: 1, + number_of_reviews: 64, + bathrooms: { + $numberDecimal: '1.0', + }, + price: { + $numberDecimal: '181.00', + }, + security_deposit: { + $numberDecimal: '300.00', + }, + cleaning_fee: { + $numberDecimal: '50.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + xl_picture_url: '', + }, + address: { + street: 'Surry Hills, NSW, Australia', + suburb: 'Darlinghurst', + government_area: 'Sydney', + market: 'Sydney', + country: 'Australia', + country_code: 'AU', + location: { + type: 'Point', + coordinates: [151.21554, -33.88029], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + host_id: '13764143', + }, +]; diff --git a/packages/compass-generative-ai/tests/evals/fixtures/berlin.cocktailbars.ts b/packages/compass-generative-ai/tests/evals/fixtures/berlin.cocktailbars.ts index 927c4bdd35f..79263a04156 100644 --- a/packages/compass-generative-ai/tests/evals/fixtures/berlin.cocktailbars.ts +++ b/packages/compass-generative-ai/tests/evals/fixtures/berlin.cocktailbars.ts @@ -1,262 +1,262 @@ export default [ { - "_id": { - "$oid": "5ca652bf56618187558b4de3" + _id: { + $oid: '5ca652bf56618187558b4de3', }, - "name": "Bar Zentral", - "strasse": "Lotte-Lenya-Bogen", - "hausnummer": 551, - "plz": 10623, - "webseite": "barzentralde", - "koordinaten": [13.3269283, 52.5050862] + name: 'Bar Zentral', + strasse: 'Lotte-Lenya-Bogen', + hausnummer: 551, + plz: 10623, + webseite: 'barzentralde', + koordinaten: [13.3269283, 52.5050862], }, { - "_id": { - "$oid": "5ca6544a97aed3878f9b090f" + _id: { + $oid: '5ca6544a97aed3878f9b090f', }, - "name": "Hefner Bar", - "strasse": "Kantstr.", - "hausnummer": 146, - "plz": 10623, - "koordinaten": [13.3213093, 52.5055506] + name: 'Hefner Bar', + strasse: 'Kantstr.', + hausnummer: 146, + plz: 10623, + koordinaten: [13.3213093, 52.5055506], }, { - "_id": { - "$oid": "5ca654ec97aed3878f9b0910" + _id: { + $oid: '5ca654ec97aed3878f9b0910', }, - "name": "Bar am Steinplatz", - "strasse": "Steinplatz", - "hausnummer": 4, - "plz": 10623, - "webseite": "barsteinplatz.com", - "koordinaten": [13.3241804, 52.5081672] + name: 'Bar am Steinplatz', + strasse: 'Steinplatz', + hausnummer: 4, + plz: 10623, + webseite: 'barsteinplatz.com', + koordinaten: [13.3241804, 52.5081672], }, { - "_id": { - "$oid": "5ca6559e97aed3878f9b0911" + _id: { + $oid: '5ca6559e97aed3878f9b0911', }, - "name": "Rum Trader", - "strasse": "Fasanenstr.", - "hausnummer": 40, - "plz": 10719, - "koordinaten": [13.3244667, 52.4984012] + name: 'Rum Trader', + strasse: 'Fasanenstr.', + hausnummer: 40, + plz: 10719, + koordinaten: [13.3244667, 52.4984012], }, { - "_id": { - "$oid": "5ca655f597aed3878f9b0912" + _id: { + $oid: '5ca655f597aed3878f9b0912', }, - "name": "Stairs", - "strasse": "Uhlandstr.", - "hausnummer": 133, - "plz": 10717, - "webseite": "stairsbar-berlin.com", - "koordinaten": [13.3215159, 52.49256] + name: 'Stairs', + strasse: 'Uhlandstr.', + hausnummer: 133, + plz: 10717, + webseite: 'stairsbar-berlin.com', + koordinaten: [13.3215159, 52.49256], }, { - "_id": { - "$oid": "5ca656a697aed3878f9b0913" + _id: { + $oid: '5ca656a697aed3878f9b0913', }, - "name": "Green Door", - "strasse": "Winterfeldtstr.", - "hausnummer": 50, - "plz": 10781, - "webseite": "greendoor.de", - "koordinaten": [13.3507105, 52.4970952] + name: 'Green Door', + strasse: 'Winterfeldtstr.', + hausnummer: 50, + plz: 10781, + webseite: 'greendoor.de', + koordinaten: [13.3507105, 52.4970952], }, { - "_id": { - "$oid": "5ca6570597aed3878f9b0914" + _id: { + $oid: '5ca6570597aed3878f9b0914', }, - "name": "Mister Hu", - "strasse": "Goltzstr.", - "hausnummer": 39, - "plz": 10781, - "webseite": "misterhu.de", - "koordinaten": [13.3511185, 52.4927243] + name: 'Mister Hu', + strasse: 'Goltzstr.', + hausnummer: 39, + plz: 10781, + webseite: 'misterhu.de', + koordinaten: [13.3511185, 52.4927243], }, { - "_id": { - "$oid": "5ca6576f97aed3878f9b0915" + _id: { + $oid: '5ca6576f97aed3878f9b0915', }, - "name": "Salut!", - "strasse": "Goltzstr.", - "hausnummer": 7, - "plz": 10781, - "webseite": "salut-berlin.de", - "koordinaten": [13.3513021, 52.4911044] + name: 'Salut!', + strasse: 'Goltzstr.', + hausnummer: 7, + plz: 10781, + webseite: 'salut-berlin.de', + koordinaten: [13.3513021, 52.4911044], }, { - "_id": { - "$oid": "5ca6581197aed3878f9b0916" + _id: { + $oid: '5ca6581197aed3878f9b0916', }, - "name": "Lebensstern", - "strasse": "Kurfürstenstr.", - "hausnummer": 58, - "plz": 10785, - "webseite": "lebens-stern.de", - "koordinaten": [13.3524999, 52.502059] + name: 'Lebensstern', + strasse: 'Kurfürstenstr.', + hausnummer: 58, + plz: 10785, + webseite: 'lebens-stern.de', + koordinaten: [13.3524999, 52.502059], }, { - "_id": { - "$oid": "5ca6588397aed3878f9b0917" + _id: { + $oid: '5ca6588397aed3878f9b0917', }, - "name": "Victoria Bar", - "strasse": "Potsdamer Str.", - "hausnummer": 102, - "plz": 10785, - "webseite": "victoriabar.de", - "koordinaten": [13.3616635, 52.5014176] + name: 'Victoria Bar', + strasse: 'Potsdamer Str.', + hausnummer: 102, + plz: 10785, + webseite: 'victoriabar.de', + koordinaten: [13.3616635, 52.5014176], }, { - "_id": { - "$oid": "5ca661b697aed3878f9b0918" + _id: { + $oid: '5ca661b697aed3878f9b0918', }, - "name": "Buck and Breck", - "strasse": "Brunnenstr.", - "hausnummer": 177, - "plz": 10119, - "webseite": "buckandbreck.com", - "koordinaten": [13.396757, 52.5321334] + name: 'Buck and Breck', + strasse: 'Brunnenstr.', + hausnummer: 177, + plz: 10119, + webseite: 'buckandbreck.com', + koordinaten: [13.396757, 52.5321334], }, { - "_id": { - "$oid": "5ca662b297aed3878f9b0919" + _id: { + $oid: '5ca662b297aed3878f9b0919', }, - "name": "Becketts Kopf", - "strasse": "Pappelallee", - "hausnummer": 64, - "plz": 10437, - "webseite": "becketts-kopf.de", - "koordinaten": [13.4146512, 52.5456032] + name: 'Becketts Kopf', + strasse: 'Pappelallee', + hausnummer: 64, + plz: 10437, + webseite: 'becketts-kopf.de', + koordinaten: [13.4146512, 52.5456032], }, { - "_id": { - "$oid": "5ca6634597aed3878f9b091a" + _id: { + $oid: '5ca6634597aed3878f9b091a', }, - "name": "TiER", - "strasse": "Weserstr.", - "hausnummer": 42, - "plz": 12045, - "webseite": "tier.bar", - "koordinaten": [13.3924945, 52.5139491] + name: 'TiER', + strasse: 'Weserstr.', + hausnummer: 42, + plz: 12045, + webseite: 'tier.bar', + koordinaten: [13.3924945, 52.5139491], }, { - "_id": { - "$oid": "5ca663c997aed3878f9b091b" + _id: { + $oid: '5ca663c997aed3878f9b091b', }, - "name": "Limonadier", - "strasse": "Nostitzstr.", - "hausnummer": 12, - "plz": 10961, - "webseite": "limonadier.de", - "koordinaten": [13.3805451, 52.4905438] + name: 'Limonadier', + strasse: 'Nostitzstr.', + hausnummer: 12, + plz: 10961, + webseite: 'limonadier.de', + koordinaten: [13.3805451, 52.4905438], }, { - "_id": { - "$oid": "5ca6654e97aed3878f9b091c" + _id: { + $oid: '5ca6654e97aed3878f9b091c', }, - "name": "Galander-Kreuzberg", - "strasse": "Großbeerenstr.", - "hausnummer": 54, - "plz": 10965, - "webseite": "galander.berlin", - "koordinaten": [13.3805451, 52.4905438] + name: 'Galander-Kreuzberg', + strasse: 'Großbeerenstr.', + hausnummer: 54, + plz: 10965, + webseite: 'galander.berlin', + koordinaten: [13.3805451, 52.4905438], }, { - "_id": { - "$oid": "5ca665b097aed3878f9b091d" + _id: { + $oid: '5ca665b097aed3878f9b091d', }, - "name": "Stagger Lee", - "strasse": "Nollendorfstr.", - "hausnummer": 27, - "plz": 10777, - "webseite": "staggerlee.de", - "koordinaten": [13.3494225, 52.4975759] + name: 'Stagger Lee', + strasse: 'Nollendorfstr.', + hausnummer: 27, + plz: 10777, + webseite: 'staggerlee.de', + koordinaten: [13.3494225, 52.4975759], }, { - "_id": { - "$oid": "5ca6666a97aed3878f9b091e" + _id: { + $oid: '5ca6666a97aed3878f9b091e', }, - "name": "Schwarze Traube", - "strasse": "Wrangelstr.", - "hausnummer": 24, - "plz": 10997, - "webseite": "schwarzetraube.de", - "koordinaten": [13.414625, 52.5011464] + name: 'Schwarze Traube', + strasse: 'Wrangelstr.', + hausnummer: 24, + plz: 10997, + webseite: 'schwarzetraube.de', + koordinaten: [13.414625, 52.5011464], }, { - "_id": { - "$oid": "5ca666cb97aed3878f9b091f" + _id: { + $oid: '5ca666cb97aed3878f9b091f', }, - "name": "Kirk Bar", - "strasse": "Skalitzer Str.", - "hausnummer": 75, - "plz": 10997, - "webseite": "kirkbar-berlin.de", - "koordinaten": [13.4317823, 52.5010796] + name: 'Kirk Bar', + strasse: 'Skalitzer Str.', + hausnummer: 75, + plz: 10997, + webseite: 'kirkbar-berlin.de', + koordinaten: [13.4317823, 52.5010796], }, { - "_id": { - "$oid": "5ca6673797aed3878f9b0920" + _id: { + $oid: '5ca6673797aed3878f9b0920', }, - "name": "John Muir", - "strasse": "Skalitzer Str.", - "hausnummer": 51, - "plz": 10997, - "webseite": "johnmuirberlin.com", - "koordinaten": [13.4317823, 52.5010796] + name: 'John Muir', + strasse: 'Skalitzer Str.', + hausnummer: 51, + plz: 10997, + webseite: 'johnmuirberlin.com', + koordinaten: [13.4317823, 52.5010796], }, { - "_id": { - "$oid": "5ca72bc2db8ece608c5f3269" + _id: { + $oid: '5ca72bc2db8ece608c5f3269', }, - "name": "Mr. Susan", - "strasse": "Krausnickstr.", - "hausnummer": 1, - "plz": 10115, - "koordinaten": [13.3936122, 52.52443] + name: 'Mr. Susan', + strasse: 'Krausnickstr.', + hausnummer: 1, + plz: 10115, + koordinaten: [13.3936122, 52.52443], }, { - "_id": { - "$oid": "5ca72eabdb8ece608c5f326c" + _id: { + $oid: '5ca72eabdb8ece608c5f326c', }, - "name": "Velvet", - "strasse": "Ganghoferstr.", - "hausnummer": 1, - "plz": 12043, - "koordinaten": [13.437435, 52.4792766] + name: 'Velvet', + strasse: 'Ganghoferstr.', + hausnummer: 1, + plz: 12043, + koordinaten: [13.437435, 52.4792766], }, { - "_id": { - "$oid": "6054a874b5990f127b71361b" + _id: { + $oid: '6054a874b5990f127b71361b', }, - "name": "Testing" + name: 'Testing', }, { - "_id": { - "$oid": "6054a8f6b5990f127b71361c" + _id: { + $oid: '6054a8f6b5990f127b71361c', }, - "name": "Testing" + name: 'Testing', }, { - "_id": { - "$oid": "66d8655c461606b7bd7e34b7" + _id: { + $oid: '66d8655c461606b7bd7e34b7', }, - "name": "John Muir", - "strasse": "Skalitzer Str.", - "hausnummer": 51, - "plz": 10997, - "webseite": "johnmuirberlin.com", - "koordinaten": [13.4317823, 52.5010796] + name: 'John Muir', + strasse: 'Skalitzer Str.', + hausnummer: 51, + plz: 10997, + webseite: 'johnmuirberlin.com', + koordinaten: [13.4317823, 52.5010796], }, { - "_id": { - "$oid": "66d86639461606b7bd7e34ba" + _id: { + $oid: '66d86639461606b7bd7e34ba', }, - "name": "Rum Trader", - "strasse": "Fasanenstr.", - "hausnummer": 40, - "plz": 10719, - "koordinaten": [13.3244667, 52.4984012] - } -] + name: 'Rum Trader', + strasse: 'Fasanenstr.', + hausnummer: 40, + plz: 10719, + koordinaten: [13.3244667, 52.4984012], + }, +]; diff --git a/packages/compass-generative-ai/tests/evals/fixtures/netflix.comments.ts b/packages/compass-generative-ai/tests/evals/fixtures/netflix.comments.ts index 2cc9b8719bb..e93ed3efb88 100644 --- a/packages/compass-generative-ai/tests/evals/fixtures/netflix.comments.ts +++ b/packages/compass-generative-ai/tests/evals/fixtures/netflix.comments.ts @@ -1,940 +1,940 @@ export default [ { - "_id": { - "$oid": "5a9427648b0beebeb69579f3" + _id: { + $oid: '5a9427648b0beebeb69579f3', }, - "name": "Jorah Mormont", - "email": "iain_glen@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd44d3" + name: 'Jorah Mormont', + email: 'iain_glen@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd44d3', + }, + text: 'Minus sequi incidunt cum magnam. Quam voluptatum vitae ab voluptatum cum. Autem perferendis nisi nulla dolores aut recusandae.', + date: { + $date: '1994-02-18T18:52:31.000Z', }, - "text": "Minus sequi incidunt cum magnam. Quam voluptatum vitae ab voluptatum cum. Autem perferendis nisi nulla dolores aut recusandae.", - "date": { - "$date": "1994-02-18T18:52:31.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a21" + _id: { + $oid: '5a9427648b0beebeb6957a21', + }, + name: "Jaqen H'ghar", + email: 'tom_wlaschiha@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd516c', }, - "name": "Jaqen H'ghar", - "email": "tom_wlaschiha@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd516c" + text: 'Minima odit officiis minima nam. Aspernatur id reprehenderit eius inventore amet laudantium. Eos unde enim recusandae fugit sint.', + date: { + $date: '1981-11-08T04:32:25.000Z', }, - "text": "Minima odit officiis minima nam. Aspernatur id reprehenderit eius inventore amet laudantium. Eos unde enim recusandae fugit sint.", - "date": { - "$date": "1981-11-08T04:32:25.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a32" + _id: { + $oid: '5a9427648b0beebeb6957a32', + }, + name: 'Megan Richards', + email: 'megan_richards@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd56c3', }, - "name": "Megan Richards", - "email": "megan_richards@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd56c3" + text: 'Mollitia ducimus consequatur excepturi corrupti expedita fugit rem aut. Nisi repellendus non velit tempora maxime. Ducimus recusandae perspiciatis hic vel voluptates.', + date: { + $date: '1976-02-15T11:21:57.000Z', }, - "text": "Mollitia ducimus consequatur excepturi corrupti expedita fugit rem aut. Nisi repellendus non velit tempora maxime. Ducimus recusandae perspiciatis hic vel voluptates.", - "date": { - "$date": "1976-02-15T11:21:57.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a78" + _id: { + $oid: '5a9427648b0beebeb6957a78', }, - "name": "Mercedes Tyler", - "email": "mercedes_tyler@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd6399" + name: 'Mercedes Tyler', + email: 'mercedes_tyler@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd6399', + }, + text: 'Voluptate odio minima pariatur recusandae. Architecto illum dicta repudiandae. Nobis aperiam exercitationem placeat repellat dolorum laborum ea. Est impedit totam facilis incidunt itaque facere.', + date: { + $date: '2007-10-17T06:50:56.000Z', }, - "text": "Voluptate odio minima pariatur recusandae. Architecto illum dicta repudiandae. Nobis aperiam exercitationem placeat repellat dolorum laborum ea. Est impedit totam facilis incidunt itaque facere.", - "date": { - "$date": "2007-10-17T06:50:56.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb69579e7" + _id: { + $oid: '5a9427648b0beebeb69579e7', + }, + name: 'Mercedes Tyler', + email: 'mercedes_tyler@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd4323', }, - "name": "Mercedes Tyler", - "email": "mercedes_tyler@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd4323" + text: 'Eius veritatis vero facilis quaerat fuga temporibus. Praesentium expedita sequi repellat id. Corporis minima enim ex. Provident fugit nisi dignissimos nulla nam ipsum aliquam.', + date: { + $date: '2002-08-18T04:56:07.000Z', }, - "text": "Eius veritatis vero facilis quaerat fuga temporibus. Praesentium expedita sequi repellat id. Corporis minima enim ex. Provident fugit nisi dignissimos nulla nam ipsum aliquam.", - "date": { - "$date": "2002-08-18T04:56:07.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a13" + _id: { + $oid: '5a9427648b0beebeb6957a13', }, - "name": "John Bishop", - "email": "john_bishop@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd4cfd" + name: 'John Bishop', + email: 'john_bishop@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd4cfd', + }, + text: 'Soluta aliquam a ullam iste dolor odit consequatur. Nostrum recusandae facilis facere provident distinctio corrupti aliquam recusandae.', + date: { + $date: '1992-07-08T08:01:20.000Z', }, - "text": "Soluta aliquam a ullam iste dolor odit consequatur. Nostrum recusandae facilis facere provident distinctio corrupti aliquam recusandae.", - "date": { - "$date": "1992-07-08T08:01:20.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a7f" + _id: { + $oid: '5a9427648b0beebeb6957a7f', + }, + name: 'Javier Smith', + email: 'javier_smith@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd65b2', }, - "name": "Javier Smith", - "email": "javier_smith@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd65b2" + text: 'Molestiae omnis deserunt voluptatibus molestias ut assumenda. Nesciunt veniam iste ad praesentium sit saepe. Iusto voluptatum qui alias pariatur velit. Aspernatur cum eius rerum accusamus inventore.', + date: { + $date: '1973-03-31T14:46:20.000Z', }, - "text": "Molestiae omnis deserunt voluptatibus molestias ut assumenda. Nesciunt veniam iste ad praesentium sit saepe. Iusto voluptatum qui alias pariatur velit. Aspernatur cum eius rerum accusamus inventore.", - "date": { - "$date": "1973-03-31T14:46:20.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb69579f7" + _id: { + $oid: '5a9427648b0beebeb69579f7', }, - "name": "Yara Greyjoy", - "email": "gemma_whelan@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd4556" + name: 'Yara Greyjoy', + email: 'gemma_whelan@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd4556', + }, + text: 'Dignissimos sunt aspernatur rerum magni debitis neque. Temporibus nisi repudiandae praesentium reprehenderit. Aliquam aliquid asperiores quasi asperiores repellat quasi rerum.', + date: { + $date: '2016-10-05T16:26:16.000Z', }, - "text": "Dignissimos sunt aspernatur rerum magni debitis neque. Temporibus nisi repudiandae praesentium reprehenderit. Aliquam aliquid asperiores quasi asperiores repellat quasi rerum.", - "date": { - "$date": "2016-10-05T16:26:16.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a08" + _id: { + $oid: '5a9427648b0beebeb6957a08', + }, + name: 'Meera Reed', + email: 'ellie_kendrick@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd4964', }, - "name": "Meera Reed", - "email": "ellie_kendrick@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd4964" + text: 'Harum porro ad dolorum repellendus. Nihil natus aspernatur quaerat aperiam nam neque. Beatae voluptates quas saepe enim facere. Unde sint praesentium numquam molestias nihil.', + date: { + $date: '1971-08-31T07:24:20.000Z', }, - "text": "Harum porro ad dolorum repellendus. Nihil natus aspernatur quaerat aperiam nam neque. Beatae voluptates quas saepe enim facere. Unde sint praesentium numquam molestias nihil.", - "date": { - "$date": "1971-08-31T07:24:20.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a0b" + _id: { + $oid: '5a9427648b0beebeb6957a0b', }, - "name": "Amy Ramirez", - "email": "amy_ramirez@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd4b1b" + name: 'Amy Ramirez', + email: 'amy_ramirez@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd4b1b', + }, + text: 'Incidunt possimus quasi suscipit. Rem fugit labore nisi cum. Sit facere tempora dolores quia rerum atque. Ab minima iure voluptatibus dolor quos cumque placeat quos.', + date: { + $date: '1999-10-27T05:03:04.000Z', }, - "text": "Incidunt possimus quasi suscipit. Rem fugit labore nisi cum. Sit facere tempora dolores quia rerum atque. Ab minima iure voluptatibus dolor quos cumque placeat quos.", - "date": { - "$date": "1999-10-27T05:03:04.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a10" + _id: { + $oid: '5a9427648b0beebeb6957a10', + }, + name: 'Richard Schmidt', + email: 'richard_schmidt@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd4c0b', }, - "name": "Richard Schmidt", - "email": "richard_schmidt@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd4c0b" + text: 'Quaerat occaecati eveniet repellat. Distinctio suscipit illo unde veniam. Expedita magni adipisci excepturi unde nihil dicta.', + date: { + $date: '2007-03-05T21:28:35.000Z', }, - "text": "Quaerat occaecati eveniet repellat. Distinctio suscipit illo unde veniam. Expedita magni adipisci excepturi unde nihil dicta.", - "date": { - "$date": "2007-03-05T21:28:35.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a4b" + _id: { + $oid: '5a9427648b0beebeb6957a4b', }, - "name": "Gregor Clegane", - "email": "hafthór_júlíus_björnsson@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd5b9a" + name: 'Gregor Clegane', + email: 'hafthór_júlíus_björnsson@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd5b9a', + }, + text: 'Voluptatum voluptatem nam et accusamus ullam qui explicabo exercitationem. Ut sint facilis aut similique dolorum non. Necessitatibus unde molestias incidunt asperiores nesciunt molestias.', + date: { + $date: '2015-02-08T01:28:23.000Z', }, - "text": "Voluptatum voluptatem nam et accusamus ullam qui explicabo exercitationem. Ut sint facilis aut similique dolorum non. Necessitatibus unde molestias incidunt asperiores nesciunt molestias.", - "date": { - "$date": "2015-02-08T01:28:23.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb69579d0" + _id: { + $oid: '5a9427648b0beebeb69579d0', + }, + name: 'Talisa Maegyr', + email: 'oona_chaplin@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd41b1', }, - "name": "Talisa Maegyr", - "email": "oona_chaplin@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd41b1" + text: 'Rem itaque ad sit rem voluptatibus. Ad fugiat maxime illum optio iure alias minus. Optio ratione suscipit corporis qui dicta.', + date: { + $date: '1998-08-22T11:45:03.000Z', }, - "text": "Rem itaque ad sit rem voluptatibus. Ad fugiat maxime illum optio iure alias minus. Optio ratione suscipit corporis qui dicta.", - "date": { - "$date": "1998-08-22T11:45:03.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a03" + _id: { + $oid: '5a9427648b0beebeb6957a03', }, - "name": "Beric Dondarrion", - "email": "richard_dormer@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd47f0" + name: 'Beric Dondarrion', + email: 'richard_dormer@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd47f0', + }, + text: 'Placeat sapiente in natus nemo. Qui quibusdam praesentium doloribus aut provident. Optio nihil officia suscipit numquam at.', + date: { + $date: '1998-09-04T04:41:51.000Z', }, - "text": "Placeat sapiente in natus nemo. Qui quibusdam praesentium doloribus aut provident. Optio nihil officia suscipit numquam at.", - "date": { - "$date": "1998-09-04T04:41:51.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a12" + _id: { + $oid: '5a9427648b0beebeb6957a12', + }, + name: 'Brenda Martin', + email: 'brenda_martin@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd4cf1', }, - "name": "Brenda Martin", - "email": "brenda_martin@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd4cf1" + text: 'Explicabo est officia magni quod ab quis. Tenetur consequuntur facilis recusandae incidunt eligendi.', + date: { + $date: '2012-01-18T09:50:15.000Z', }, - "text": "Explicabo est officia magni quod ab quis. Tenetur consequuntur facilis recusandae incidunt eligendi.", - "date": { - "$date": "2012-01-18T09:50:15.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb69579cc" + _id: { + $oid: '5a9427648b0beebeb69579cc', }, - "name": "Andrea Le", - "email": "andrea_le@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd418c" + name: 'Andrea Le', + email: 'andrea_le@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd418c', + }, + text: 'Rem officiis eaque repellendus amet eos doloribus. Porro dolor voluptatum voluptates neque culpa molestias. Voluptate unde nulla temporibus ullam.', + date: { + $date: '2012-03-26T23:20:16.000Z', }, - "text": "Rem officiis eaque repellendus amet eos doloribus. Porro dolor voluptatum voluptates neque culpa molestias. Voluptate unde nulla temporibus ullam.", - "date": { - "$date": "2012-03-26T23:20:16.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a1a" + _id: { + $oid: '5a9427648b0beebeb6957a1a', + }, + name: 'Robb Stark', + email: 'richard_madden@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd4ec2', }, - "name": "Robb Stark", - "email": "richard_madden@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd4ec2" + text: 'Illum laudantium deserunt totam. Repudiandae explicabo soluta dolores atque corrupti. Odit laudantium quam aperiam ullam.', + date: { + $date: '2005-06-26T12:20:51.000Z', }, - "text": "Illum laudantium deserunt totam. Repudiandae explicabo soluta dolores atque corrupti. Odit laudantium quam aperiam ullam.", - "date": { - "$date": "2005-06-26T12:20:51.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a38" + _id: { + $oid: '5a9427648b0beebeb6957a38', }, - "name": "Yara Greyjoy", - "email": "gemma_whelan@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd587d" + name: 'Yara Greyjoy', + email: 'gemma_whelan@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd587d', + }, + text: 'Nobis incidunt ea tempore cupiditate sint. Itaque beatae hic ut quis.', + date: { + $date: '2012-11-26T11:00:57.000Z', }, - "text": "Nobis incidunt ea tempore cupiditate sint. Itaque beatae hic ut quis.", - "date": { - "$date": "2012-11-26T11:00:57.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb69579d6" + _id: { + $oid: '5a9427648b0beebeb69579d6', + }, + name: 'Taylor Hill', + email: 'taylor_hill@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd4137', }, - "name": "Taylor Hill", - "email": "taylor_hill@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd4137" + text: 'Neque repudiandae laborum earum ipsam facilis blanditiis voluptate. Aliquam vitae porro repellendus voluptatum facere.', + date: { + $date: '1993-10-23T13:16:51.000Z', }, - "text": "Neque repudiandae laborum earum ipsam facilis blanditiis voluptate. Aliquam vitae porro repellendus voluptatum facere.", - "date": { - "$date": "1993-10-23T13:16:51.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a0f" + _id: { + $oid: '5a9427648b0beebeb6957a0f', + }, + name: 'Melisandre', + email: 'carice_van_houten@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd4c0b', }, - "name": "Melisandre", - "email": "carice_van_houten@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd4c0b" + text: 'Perspiciatis non debitis magnam. Voluptate adipisci quo et laborum. Recusandae quia officiis ad aut rem blanditiis sit.', + date: { + $date: '1974-06-22T07:31:47.000Z', }, - "text": "Perspiciatis non debitis magnam. Voluptate adipisci quo et laborum. Recusandae quia officiis ad aut rem blanditiis sit.", - "date": { - "$date": "1974-06-22T07:31:47.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb69579d5" + _id: { + $oid: '5a9427648b0beebeb69579d5', }, - "name": "Petyr Baelish", - "email": "aidan_gillen@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd4218" + name: 'Petyr Baelish', + email: 'aidan_gillen@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd4218', + }, + text: 'Quo deserunt ipsam ipsum. Tenetur eos nemo nam sint praesentium minus exercitationem.', + date: { + $date: '2001-07-13T19:25:09.000Z', }, - "text": "Quo deserunt ipsam ipsum. Tenetur eos nemo nam sint praesentium minus exercitationem.", - "date": { - "$date": "2001-07-13T19:25:09.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a01" + _id: { + $oid: '5a9427648b0beebeb6957a01', + }, + name: 'Sarah Lewis', + email: 'sarah_lewis@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd471c', }, - "name": "Sarah Lewis", - "email": "sarah_lewis@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd471c" + text: 'Totam molestiae accusamus sed illum aut autem maiores quo. Necessitatibus dolorum sed ea rem. Nihil perferendis fugit tempore quam. Laboriosam aliquam nulla ratione explicabo unde consectetur.', + date: { + $date: '1981-03-31T06:38:59.000Z', }, - "text": "Totam molestiae accusamus sed illum aut autem maiores quo. Necessitatibus dolorum sed ea rem. Nihil perferendis fugit tempore quam. Laboriosam aliquam nulla ratione explicabo unde consectetur.", - "date": { - "$date": "1981-03-31T06:38:59.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a5a" + _id: { + $oid: '5a9427648b0beebeb6957a5a', }, - "name": "Janos Slynt", - "email": "dominic_carter@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd5d89" + name: 'Janos Slynt', + email: 'dominic_carter@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd5d89', + }, + text: 'Voluptates necessitatibus cum modi repellendus perferendis. Ipsa numquam eum nulla recusandae impedit recusandae. In ex autem tempora nam excepturi earum.', + date: { + $date: '1975-05-12T23:28:20.000Z', }, - "text": "Voluptates necessitatibus cum modi repellendus perferendis. Ipsa numquam eum nulla recusandae impedit recusandae. In ex autem tempora nam excepturi earum.", - "date": { - "$date": "1975-05-12T23:28:20.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a7d" + _id: { + $oid: '5a9427648b0beebeb6957a7d', + }, + name: 'Stannis Baratheon', + email: 'stephen_dillane@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd63cb', }, - "name": "Stannis Baratheon", - "email": "stephen_dillane@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd63cb" + text: 'Earum eaque pariatur tempora aut perferendis. Repellat expedita dolore unde placeat corporis. Rerum animi similique doloremque iste.', + date: { + $date: '1988-08-11T09:30:55.000Z', }, - "text": "Earum eaque pariatur tempora aut perferendis. Repellat expedita dolore unde placeat corporis. Rerum animi similique doloremque iste.", - "date": { - "$date": "1988-08-11T09:30:55.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a84" + _id: { + $oid: '5a9427648b0beebeb6957a84', }, - "name": "Mace Tyrell", - "email": "roger_ashton-griffiths@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd67e9" + name: 'Mace Tyrell', + email: 'roger_ashton-griffiths@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd67e9', + }, + text: 'Ipsam non non dignissimos incidunt perspiciatis voluptatibus. Corporis dicta unde tempore sapiente. Voluptatem quia esse deserunt assumenda porro. Eius totam ratione sed voluptatibus culpa.', + date: { + $date: '1993-08-12T00:26:22.000Z', }, - "text": "Ipsam non non dignissimos incidunt perspiciatis voluptatibus. Corporis dicta unde tempore sapiente. Voluptatem quia esse deserunt assumenda porro. Eius totam ratione sed voluptatibus culpa.", - "date": { - "$date": "1993-08-12T00:26:22.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a86" + _id: { + $oid: '5a9427648b0beebeb6957a86', + }, + name: 'Barbara Gonzalez', + email: 'barbara_gonzalez@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd681b', }, - "name": "Barbara Gonzalez", - "email": "barbara_gonzalez@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd681b" + text: 'Accusantium ex veritatis est aut facere commodi asperiores. Dignissimos cum rerum odit labore. Eum quos architecto perspiciatis molestiae voluptate doloribus dolorem veniam.', + date: { + $date: '1982-03-09T02:56:42.000Z', }, - "text": "Accusantium ex veritatis est aut facere commodi asperiores. Dignissimos cum rerum odit labore. Eum quos architecto perspiciatis molestiae voluptate doloribus dolorem veniam.", - "date": { - "$date": "1982-03-09T02:56:42.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a99" + _id: { + $oid: '5a9427648b0beebeb6957a99', }, - "name": "Connie Johnson", - "email": "connie_johnson@fakegmail.com", - "movie_id": { - "$oid": "573a1391f29313caabcd695a" + name: 'Connie Johnson', + email: 'connie_johnson@fakegmail.com', + movie_id: { + $oid: '573a1391f29313caabcd695a', + }, + text: 'Quo minima excepturi quisquam blanditiis quod velit. Minus dolor incidunt repellat eligendi ducimus quod. Minus officiis possimus iure nemo nisi ab eos magni.', + date: { + $date: '2005-05-17T16:52:25.000Z', }, - "text": "Quo minima excepturi quisquam blanditiis quod velit. Minus dolor incidunt repellat eligendi ducimus quod. Minus officiis possimus iure nemo nisi ab eos magni.", - "date": { - "$date": "2005-05-17T16:52:25.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a2e" + _id: { + $oid: '5a9427648b0beebeb6957a2e', + }, + name: 'Bowen Marsh', + email: 'michael_condron@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd5570', }, - "name": "Bowen Marsh", - "email": "michael_condron@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd5570" + text: 'Odit laudantium cupiditate ipsum ipsam. Officia nisi totam sequi recusandae excepturi. Impedit vitae iste nisi eius. Consequuntur iusto animi nemo libero.', + date: { + $date: '1987-07-03T12:54:13.000Z', }, - "text": "Odit laudantium cupiditate ipsum ipsam. Officia nisi totam sequi recusandae excepturi. Impedit vitae iste nisi eius. Consequuntur iusto animi nemo libero.", - "date": { - "$date": "1987-07-03T12:54:13.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a09" + _id: { + $oid: '5a9427648b0beebeb6957a09', }, - "name": "Daario Naharis", - "email": "michiel_huisman@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd4aa2" + name: 'Daario Naharis', + email: 'michiel_huisman@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd4aa2', + }, + text: 'Distinctio commodi autem amet molestias. Dolorem numquam vitae voluptas corporis fugit aut autem earum.', + date: { + $date: '1979-07-06T20:36:21.000Z', }, - "text": "Distinctio commodi autem amet molestias. Dolorem numquam vitae voluptas corporis fugit aut autem earum.", - "date": { - "$date": "1979-07-06T20:36:21.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a55" + _id: { + $oid: '5a9427648b0beebeb6957a55', + }, + name: 'Javier Smith', + email: 'javier_smith@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd5c04', }, - "name": "Javier Smith", - "email": "javier_smith@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd5c04" + text: 'Omnis temporibus at ut saepe dolor saepe suscipit. Laborum veritatis autem cumque exercitationem aliquam. Nulla laudantium ab esse deserunt reprehenderit veniam. Ea deserunt nesciunt dicta nisi.', + date: { + $date: '2006-10-18T01:20:58.000Z', }, - "text": "Omnis temporibus at ut saepe dolor saepe suscipit. Laborum veritatis autem cumque exercitationem aliquam. Nulla laudantium ab esse deserunt reprehenderit veniam. Ea deserunt nesciunt dicta nisi.", - "date": { - "$date": "2006-10-18T01:20:58.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a1e" + _id: { + $oid: '5a9427648b0beebeb6957a1e', }, - "name": "Emily Ellis", - "email": "emily_ellis@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd5104" + name: 'Emily Ellis', + email: 'emily_ellis@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd5104', + }, + text: 'Illo optio ipsa similique quo maxime. Fugiat illum ullam aliquid. Corporis distinctio omnis fugiat facilis aliquam ea commodi labore.', + date: { + $date: '2002-08-25T09:37:45.000Z', }, - "text": "Illo optio ipsa similique quo maxime. Fugiat illum ullam aliquid. Corporis distinctio omnis fugiat facilis aliquam ea commodi labore.", - "date": { - "$date": "2002-08-25T09:37:45.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a3f" + _id: { + $oid: '5a9427648b0beebeb6957a3f', + }, + name: 'Rickon Stark', + email: 'art_parkinson@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd5954', }, - "name": "Rickon Stark", - "email": "art_parkinson@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd5954" + text: 'Aliquam fuga quos nihil exercitationem maiores maxime. Ex sit velit repellendus. Vitae cupiditate laudantium facilis culpa ea nostrum labore. Cum animi vitae incidunt ipsum facilis repellendus.', + date: { + $date: '1991-08-12T23:00:32.000Z', }, - "text": "Aliquam fuga quos nihil exercitationem maiores maxime. Ex sit velit repellendus. Vitae cupiditate laudantium facilis culpa ea nostrum labore. Cum animi vitae incidunt ipsum facilis repellendus.", - "date": { - "$date": "1991-08-12T23:00:32.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a75" + _id: { + $oid: '5a9427648b0beebeb6957a75', }, - "name": "Talisa Maegyr", - "email": "oona_chaplin@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd62f3" + name: 'Talisa Maegyr', + email: 'oona_chaplin@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd62f3', + }, + text: 'Error laudantium omnis delectus facilis illum repellat praesentium. Possimus quo doloremque occaecati a laborum sapiente dolore.', + date: { + $date: '1972-06-28T16:06:43.000Z', }, - "text": "Error laudantium omnis delectus facilis illum repellat praesentium. Possimus quo doloremque occaecati a laborum sapiente dolore.", - "date": { - "$date": "1972-06-28T16:06:43.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a88" + _id: { + $oid: '5a9427648b0beebeb6957a88', + }, + name: 'Thomas Morris', + email: 'thomas_morris@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd680a', }, - "name": "Thomas Morris", - "email": "thomas_morris@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd680a" + text: 'Perspiciatis sequi nesciunt maiores. Molestiae earum odio voluptas animi ipsam. Dolorem libero temporibus omnis quaerat deleniti atque. Tempore delectus esse explicabo nemo.', + date: { + $date: '2004-02-26T06:33:03.000Z', }, - "text": "Perspiciatis sequi nesciunt maiores. Molestiae earum odio voluptas animi ipsam. Dolorem libero temporibus omnis quaerat deleniti atque. Tempore delectus esse explicabo nemo.", - "date": { - "$date": "2004-02-26T06:33:03.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb69579d3" + _id: { + $oid: '5a9427648b0beebeb69579d3', }, - "name": "Cameron Duran", - "email": "cameron_duran@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd4217" + name: 'Cameron Duran', + email: 'cameron_duran@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd4217', + }, + text: 'Quasi dicta culpa asperiores quaerat perferendis neque. Est animi pariatur impedit itaque exercitationem.', + date: { + $date: '1983-04-27T20:39:15.000Z', }, - "text": "Quasi dicta culpa asperiores quaerat perferendis neque. Est animi pariatur impedit itaque exercitationem.", - "date": { - "$date": "1983-04-27T20:39:15.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a42" + _id: { + $oid: '5a9427648b0beebeb6957a42', + }, + name: 'Davos Seaworth', + email: 'liam_cunningham@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd592c', }, - "name": "Davos Seaworth", - "email": "liam_cunningham@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd592c" + text: 'Illo amet aliquid molestias repellat modi reprehenderit. Nobis totam dicta accusamus voluptates. Eaque distinctio nostrum accusamus eos inventore iste iste sapiente.', + date: { + $date: '2010-06-14T05:19:24.000Z', }, - "text": "Illo amet aliquid molestias repellat modi reprehenderit. Nobis totam dicta accusamus voluptates. Eaque distinctio nostrum accusamus eos inventore iste iste sapiente.", - "date": { - "$date": "2010-06-14T05:19:24.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb69579fe" + _id: { + $oid: '5a9427648b0beebeb69579fe', + }, + name: 'Daario Naharis', + email: 'michiel_huisman@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd47c2', }, - "name": "Daario Naharis", - "email": "michiel_huisman@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd47c2" + text: 'Enim enim deleniti in debitis. Delectus nesciunt id tenetur.', + date: { + $date: '1988-11-19T05:22:18.000Z', }, - "text": "Enim enim deleniti in debitis. Delectus nesciunt id tenetur.", - "date": { - "$date": "1988-11-19T05:22:18.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a25" + _id: { + $oid: '5a9427648b0beebeb6957a25', }, - "name": "Osha", - "email": "natalia_tena@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd5181" + name: 'Osha', + email: 'natalia_tena@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd5181', + }, + text: 'Dolor inventore commodi eos ipsum earum vitae quidem. Optio debitis rerum voluptas voluptatibus quos. Harum quam delectus rem sint.', + date: { + $date: '1992-08-26T21:07:54.000Z', }, - "text": "Dolor inventore commodi eos ipsum earum vitae quidem. Optio debitis rerum voluptas voluptatibus quos. Harum quam delectus rem sint.", - "date": { - "$date": "1992-08-26T21:07:54.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a2c" + _id: { + $oid: '5a9427648b0beebeb6957a2c', + }, + name: 'Samwell Tarly', + email: 'john_bradley-west@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd54ed', }, - "name": "Samwell Tarly", - "email": "john_bradley-west@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd54ed" + text: 'Natus enim voluptate dolore. Quo porro ipsum enim. Est totam sapiente nam vero.', + date: { + $date: '1988-02-25T03:56:33.000Z', }, - "text": "Natus enim voluptate dolore. Quo porro ipsum enim. Est totam sapiente nam vero.", - "date": { - "$date": "1988-02-25T03:56:33.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a46" + _id: { + $oid: '5a9427648b0beebeb6957a46', }, - "name": "Denise Davidson", - "email": "denise_davidson@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd5b2a" + name: 'Denise Davidson', + email: 'denise_davidson@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd5b2a', + }, + text: 'Numquam voluptas veniam ducimus sunt accusamus harum distinctio autem. Aliquid dicta nulla aperiam veniam placeat quam. Veritatis maiores ipsa quos accusantium molestiae eum voluptatibus.', + date: { + $date: '1986-11-08T13:05:21.000Z', }, - "text": "Numquam voluptas veniam ducimus sunt accusamus harum distinctio autem. Aliquid dicta nulla aperiam veniam placeat quam. Veritatis maiores ipsa quos accusantium molestiae eum voluptatibus.", - "date": { - "$date": "1986-11-08T13:05:21.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a52" + _id: { + $oid: '5a9427648b0beebeb6957a52', + }, + name: 'Sarah Lewis', + email: 'sarah_lewis@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd5ca5', }, - "name": "Sarah Lewis", - "email": "sarah_lewis@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd5ca5" + text: 'Incidunt molestiae quam ipsum hic incidunt harum magnam perspiciatis. Quisquam eum sunt fuga ut laborum ducimus ratione. Ut dolorum totam voluptatem excepturi.', + date: { + $date: '2000-12-25T08:51:17.000Z', }, - "text": "Incidunt molestiae quam ipsum hic incidunt harum magnam perspiciatis. Quisquam eum sunt fuga ut laborum ducimus ratione. Ut dolorum totam voluptatem excepturi.", - "date": { - "$date": "2000-12-25T08:51:17.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a77" + _id: { + $oid: '5a9427648b0beebeb6957a77', }, - "name": "Bran Stark", - "email": "isaac_hempstead_wright@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd62f3" + name: 'Bran Stark', + email: 'isaac_hempstead_wright@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd62f3', + }, + text: 'Quibusdam ea excepturi quo suscipit suscipit ipsa beatae. Id optio ratione incidunt dolor. Maiores optio aspernatur velit laudantium. Repudiandae vel voluptatum laudantium sint.', + date: { + $date: '1979-12-25T14:48:19.000Z', }, - "text": "Quibusdam ea excepturi quo suscipit suscipit ipsa beatae. Id optio ratione incidunt dolor. Maiores optio aspernatur velit laudantium. Repudiandae vel voluptatum laudantium sint.", - "date": { - "$date": "1979-12-25T14:48:19.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb69579eb" + _id: { + $oid: '5a9427648b0beebeb69579eb', + }, + name: 'Emily Ellis', + email: 'emily_ellis@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd432a', }, - "name": "Emily Ellis", - "email": "emily_ellis@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd432a" + text: 'Iste molestiae animi minima quod ad. Corporis maiores suscipit sapiente nam perferendis autem eos. Id adipisci natus aut facilis iste consequuntur.', + date: { + $date: '1988-10-16T19:08:23.000Z', }, - "text": "Iste molestiae animi minima quod ad. Corporis maiores suscipit sapiente nam perferendis autem eos. Id adipisci natus aut facilis iste consequuntur.", - "date": { - "$date": "1988-10-16T19:08:23.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb69579ea" + _id: { + $oid: '5a9427648b0beebeb69579ea', }, - "name": "Cameron Duran", - "email": "cameron_duran@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd433d" + name: 'Cameron Duran', + email: 'cameron_duran@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd433d', + }, + text: 'Ad asperiores mollitia aperiam non incidunt. Totam fugiat cumque praesentium placeat. Debitis tenetur eligendi recusandae enim perferendis. Vero maiores eveniet reiciendis necessitatibus.', + date: { + $date: '1989-01-21T14:20:47.000Z', }, - "text": "Ad asperiores mollitia aperiam non incidunt. Totam fugiat cumque praesentium placeat. Debitis tenetur eligendi recusandae enim perferendis. Vero maiores eveniet reiciendis necessitatibus.", - "date": { - "$date": "1989-01-21T14:20:47.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb69579ee" + _id: { + $oid: '5a9427648b0beebeb69579ee', + }, + name: 'Theon Greyjoy', + email: 'alfie_allen@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd437c', }, - "name": "Theon Greyjoy", - "email": "alfie_allen@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd437c" + text: 'Dicta asperiores necessitatibus corporis. Quidem fugiat eius animi fugiat laborum. Quas maiores mollitia amet quibusdam. Ducimus sed asperiores sint recusandae accusamus veniam.', + date: { + $date: '2000-12-06T07:26:29.000Z', }, - "text": "Dicta asperiores necessitatibus corporis. Quidem fugiat eius animi fugiat laborum. Quas maiores mollitia amet quibusdam. Ducimus sed asperiores sint recusandae accusamus veniam.", - "date": { - "$date": "2000-12-06T07:26:29.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a0e" + _id: { + $oid: '5a9427648b0beebeb6957a0e', }, - "name": "Viserys Targaryen", - "email": "harry_lloyd@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd4b1b" + name: 'Viserys Targaryen', + email: 'harry_lloyd@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd4b1b', + }, + text: 'Itaque minima enim mollitia rerum hic. Doloribus dolor nobis corporis fuga quod error. Consequuntur eligendi quibusdam sequi error aliquam dolore.', + date: { + $date: '2010-03-20T02:11:01.000Z', }, - "text": "Itaque minima enim mollitia rerum hic. Doloribus dolor nobis corporis fuga quod error. Consequuntur eligendi quibusdam sequi error aliquam dolore.", - "date": { - "$date": "2010-03-20T02:11:01.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a54" + _id: { + $oid: '5a9427648b0beebeb6957a54', + }, + name: 'Loras Tyrell', + email: 'finn_jones@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd5ca5', }, - "name": "Loras Tyrell", - "email": "finn_jones@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd5ca5" + text: 'Ratione nemo cumque provident itaque voluptatem mollitia quas. Atque possimus asperiores dicta non. Libero aliquam nihil nisi quasi.', + date: { + $date: '1970-06-22T12:20:24.000Z', }, - "text": "Ratione nemo cumque provident itaque voluptatem mollitia quas. Atque possimus asperiores dicta non. Libero aliquam nihil nisi quasi.", - "date": { - "$date": "1970-06-22T12:20:24.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a72" + _id: { + $oid: '5a9427648b0beebeb6957a72', }, - "name": "Jaime Lannister", - "email": "nikolaj_coster-waldau@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd604c" + name: 'Jaime Lannister', + email: 'nikolaj_coster-waldau@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd604c', + }, + text: 'Laborum reprehenderit repellat necessitatibus non molestias adipisci excepturi. Illum magni dolore iure. Quo itaque beatae culpa porro necessitatibus. Magnam natus quos maiores nihil.', + date: { + $date: '1993-06-24T03:08:50.000Z', }, - "text": "Laborum reprehenderit repellat necessitatibus non molestias adipisci excepturi. Illum magni dolore iure. Quo itaque beatae culpa porro necessitatibus. Magnam natus quos maiores nihil.", - "date": { - "$date": "1993-06-24T03:08:50.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a73" + _id: { + $oid: '5a9427648b0beebeb6957a73', + }, + name: 'Kathryn Sosa', + email: 'kathryn_sosa@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd62d6', }, - "name": "Kathryn Sosa", - "email": "kathryn_sosa@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd62d6" + text: 'Error enim architecto ipsam voluptatum. Deleniti voluptates unde cumque aperiam veritatis magni repellendus aliquid. Voluptas quibusdam sit ullam tempora omnis cumque tempora.', + date: { + $date: '1997-07-18T16:35:33.000Z', }, - "text": "Error enim architecto ipsam voluptatum. Deleniti voluptates unde cumque aperiam veritatis magni repellendus aliquid. Voluptas quibusdam sit ullam tempora omnis cumque tempora.", - "date": { - "$date": "1997-07-18T16:35:33.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb69579f5" + _id: { + $oid: '5a9427648b0beebeb69579f5', }, - "name": "John Bishop", - "email": "john_bishop@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd446f" + name: 'John Bishop', + email: 'john_bishop@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd446f', + }, + text: 'Id error ab at molestias dolorum incidunt. Non deserunt praesentium dolorem nihil. Optio tempora vel ut quas.\nMinus dicta numquam quasi. Rem totam cumque at eum. Ullam hic ut ea magni.', + date: { + $date: '1975-01-21T00:31:22.000Z', }, - "text": "Id error ab at molestias dolorum incidunt. Non deserunt praesentium dolorem nihil. Optio tempora vel ut quas.\nMinus dicta numquam quasi. Rem totam cumque at eum. Ullam hic ut ea magni.", - "date": { - "$date": "1975-01-21T00:31:22.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a22" + _id: { + $oid: '5a9427648b0beebeb6957a22', + }, + name: 'Taylor Scott', + email: 'taylor_scott@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd4eaf', }, - "name": "Taylor Scott", - "email": "taylor_scott@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd4eaf" + text: 'Iure laboriosam quo et necessitatibus sed. Id iure delectus soluta. Quaerat officiis maiores commodi earum. Autem odio labore debitis optio libero.', + date: { + $date: '1970-11-15T05:54:02.000Z', }, - "text": "Iure laboriosam quo et necessitatibus sed. Id iure delectus soluta. Quaerat officiis maiores commodi earum. Autem odio labore debitis optio libero.", - "date": { - "$date": "1970-11-15T05:54:02.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a7c" + _id: { + $oid: '5a9427648b0beebeb6957a7c', }, - "name": "Ronald Cox", - "email": "ronald_cox@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd6424" + name: 'Ronald Cox', + email: 'ronald_cox@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd6424', + }, + text: 'Reprehenderit commodi ut odit. Maxime perspiciatis eum in sapiente unde doloremque. Occaecati atque asperiores error velit. Amet assumenda tenetur veniam numquam occaecati nam.', + date: { + $date: '1982-03-26T09:37:11.000Z', }, - "text": "Reprehenderit commodi ut odit. Maxime perspiciatis eum in sapiente unde doloremque. Occaecati atque asperiores error velit. Amet assumenda tenetur veniam numquam occaecati nam.", - "date": { - "$date": "1982-03-26T09:37:11.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb69579db" + _id: { + $oid: '5a9427648b0beebeb69579db', + }, + name: 'Olly', + email: "brenock_o'connor@gameofthron.es", + movie_id: { + $oid: '573a1390f29313caabcd413b', }, - "name": "Olly", - "email": "brenock_o'connor@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd413b" + text: 'Perspiciatis sit pariatur quas. Perferendis officia harum ipsum deleniti vel inventore. Nobis culpa eaque in blanditiis porro esse. Nisi deserunt culpa expedita dolorum quo aperiam.', + date: { + $date: '2005-01-04T13:49:05.000Z', }, - "text": "Perspiciatis sit pariatur quas. Perferendis officia harum ipsum deleniti vel inventore. Nobis culpa eaque in blanditiis porro esse. Nisi deserunt culpa expedita dolorum quo aperiam.", - "date": { - "$date": "2005-01-04T13:49:05.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb69579cf" + _id: { + $oid: '5a9427648b0beebeb69579cf', + }, + name: 'Greg Powell', + email: 'greg_powell@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd41b1', }, - "name": "Greg Powell", - "email": "greg_powell@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd41b1" + text: 'Tenetur dolorum molestiae ea. Eligendi praesentium unde quod porro. Commodi nisi sit placeat rerum vero cupiditate neque. Dolorum nihil vero animi.', + date: { + $date: '1987-02-10T00:29:36.000Z', }, - "text": "Tenetur dolorum molestiae ea. Eligendi praesentium unde quod porro. Commodi nisi sit placeat rerum vero cupiditate neque. Dolorum nihil vero animi.", - "date": { - "$date": "1987-02-10T00:29:36.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb69579dd" + _id: { + $oid: '5a9427648b0beebeb69579dd', }, - "name": "Joshua Kent", - "email": "joshua_kent@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd42ee" + name: 'Joshua Kent', + email: 'joshua_kent@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd42ee', + }, + text: 'Corporis pariatur rem autem accusamus debitis. Eaque aspernatur quae accusantium non ea quasi ullam. Assumenda quibusdam blanditiis inventore velit dolorem. Adipisci quaerat quae architecto sint.', + date: { + $date: '1993-12-06T18:45:21.000Z', }, - "text": "Corporis pariatur rem autem accusamus debitis. Eaque aspernatur quae accusantium non ea quasi ullam. Assumenda quibusdam blanditiis inventore velit dolorem. Adipisci quaerat quae architecto sint.", - "date": { - "$date": "1993-12-06T18:45:21.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a40" + _id: { + $oid: '5a9427648b0beebeb6957a40', + }, + name: 'Jason Smith', + email: 'jason_smith@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd5a37', }, - "name": "Jason Smith", - "email": "jason_smith@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd5a37" + text: 'Blanditiis sunt quis voluptate ex soluta id. Debitis excepturi consequuntur quis nemo amet. Fuga voluptas modi rerum aliquam optio quae a aspernatur.', + date: { + $date: '1978-06-30T21:42:48.000Z', }, - "text": "Blanditiis sunt quis voluptate ex soluta id. Debitis excepturi consequuntur quis nemo amet. Fuga voluptas modi rerum aliquam optio quae a aspernatur.", - "date": { - "$date": "1978-06-30T21:42:48.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a67" + _id: { + $oid: '5a9427648b0beebeb6957a67', }, - "name": "Sarah Lewis", - "email": "sarah_lewis@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd5fa9" + name: 'Sarah Lewis', + email: 'sarah_lewis@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd5fa9', + }, + text: 'Ab consequatur numquam sed eligendi ex unde. Dolorem illum minima numquam dicta ipsa magnam nostrum. Possimus sed inventore cum non.', + date: { + $date: '2005-09-18T01:30:56.000Z', }, - "text": "Ab consequatur numquam sed eligendi ex unde. Dolorem illum minima numquam dicta ipsa magnam nostrum. Possimus sed inventore cum non.", - "date": { - "$date": "2005-09-18T01:30:56.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a6b" + _id: { + $oid: '5a9427648b0beebeb6957a6b', + }, + name: 'Maester Luwin', + email: 'donald_sumpter@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd61b1', }, - "name": "Maester Luwin", - "email": "donald_sumpter@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd61b1" + text: 'Excepturi vitae mollitia voluptates esse facere. Minus a distinctio error natus totam eos. Ducimus dicta maiores iusto. Facilis sequi sunt velit minus.', + date: { + $date: '1988-04-30T15:49:35.000Z', }, - "text": "Excepturi vitae mollitia voluptates esse facere. Minus a distinctio error natus totam eos. Ducimus dicta maiores iusto. Facilis sequi sunt velit minus.", - "date": { - "$date": "1988-04-30T15:49:35.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a87" + _id: { + $oid: '5a9427648b0beebeb6957a87', }, - "name": "Anthony Cline", - "email": "anthony_cline@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd681b" + name: 'Anthony Cline', + email: 'anthony_cline@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd681b', + }, + text: 'Reiciendis adipisci veritatis molestias sint officiis ab cupiditate. Reiciendis laudantium nam explicabo rerum. Ea accusamus iste necessitatibus.', + date: { + $date: '1979-12-27T23:39:52.000Z', }, - "text": "Reiciendis adipisci veritatis molestias sint officiis ab cupiditate. Reiciendis laudantium nam explicabo rerum. Ea accusamus iste necessitatibus.", - "date": { - "$date": "1979-12-27T23:39:52.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a94" + _id: { + $oid: '5a9427648b0beebeb6957a94', + }, + name: 'Victoria Sanders', + email: 'victoria_sanders@fakegmail.com', + movie_id: { + $oid: '573a1391f29313caabcd6864', }, - "name": "Victoria Sanders", - "email": "victoria_sanders@fakegmail.com", - "movie_id": { - "$oid": "573a1391f29313caabcd6864" + text: 'Nulla fugiat nulla omnis atque. Architecto libero rem blanditiis ea ea ut praesentium accusamus. Possimus est quibusdam numquam optio eveniet. Magni fuga neque ad consequuntur maxime.', + date: { + $date: '1986-03-11T12:35:36.000Z', }, - "text": "Nulla fugiat nulla omnis atque. Architecto libero rem blanditiis ea ea ut praesentium accusamus. Possimus est quibusdam numquam optio eveniet. Magni fuga neque ad consequuntur maxime.", - "date": { - "$date": "1986-03-11T12:35:36.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a23" + _id: { + $oid: '5a9427648b0beebeb6957a23', }, - "name": "Shae", - "email": "sibel_kekilli@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd4b1b" + name: 'Shae', + email: 'sibel_kekilli@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd4b1b', + }, + text: 'Ullam excepturi animi voluptates magnam quos dolore aliquid. Praesentium illum non vitae ab debitis blanditiis. Tempore quam iste inventore minima. Ad itaque dignissimos soluta fugiat aliquid.', + date: { + $date: '1995-03-05T06:06:17.000Z', }, - "text": "Ullam excepturi animi voluptates magnam quos dolore aliquid. Praesentium illum non vitae ab debitis blanditiis. Tempore quam iste inventore minima. Ad itaque dignissimos soluta fugiat aliquid.", - "date": { - "$date": "1995-03-05T06:06:17.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a27" + _id: { + $oid: '5a9427648b0beebeb6957a27', + }, + name: 'Jerry Cabrera', + email: 'jerry_cabrera@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd51e1', }, - "name": "Jerry Cabrera", - "email": "jerry_cabrera@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd51e1" + text: 'In facere explicabo inventore dolorum dignissimos neque. Voluptate amet numquam doloribus temporibus necessitatibus eius inventore. Quaerat itaque sunt voluptas dicta maxime.', + date: { + $date: '1993-03-19T05:34:13.000Z', }, - "text": "In facere explicabo inventore dolorum dignissimos neque. Voluptate amet numquam doloribus temporibus necessitatibus eius inventore. Quaerat itaque sunt voluptas dicta maxime.", - "date": { - "$date": "1993-03-19T05:34:13.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a63" + _id: { + $oid: '5a9427648b0beebeb6957a63', }, - "name": "Anthony Smith", - "email": "anthony_smith@fakegmail.com", - "movie_id": { - "$oid": "573a1390f29313caabcd5e52" + name: 'Anthony Smith', + email: 'anthony_smith@fakegmail.com', + movie_id: { + $oid: '573a1390f29313caabcd5e52', + }, + text: 'Veniam tenetur culpa aliquam provident explicabo nesciunt. Numquam exercitationem deserunt dolore quas facere ducimus.', + date: { + $date: '1971-07-29T19:40:20.000Z', }, - "text": "Veniam tenetur culpa aliquam provident explicabo nesciunt. Numquam exercitationem deserunt dolore quas facere ducimus.", - "date": { - "$date": "1971-07-29T19:40:20.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a64" + _id: { + $oid: '5a9427648b0beebeb6957a64', + }, + name: 'Beric Dondarrion', + email: 'richard_dormer@gameofthron.es', + movie_id: { + $oid: '573a1390f29313caabcd5fe6', }, - "name": "Beric Dondarrion", - "email": "richard_dormer@gameofthron.es", - "movie_id": { - "$oid": "573a1390f29313caabcd5fe6" + text: 'Odit eligendi explicabo ab unde aut laboriosam officia. Dolorem expedita molestiae voluptates esse quaerat hic. Consequatur dolor aspernatur sequi necessitatibus maxime.', + date: { + $date: '1980-07-09T14:30:12.000Z', }, - "text": "Odit eligendi explicabo ab unde aut laboriosam officia. Dolorem expedita molestiae voluptates esse quaerat hic. Consequatur dolor aspernatur sequi necessitatibus maxime.", - "date": { - "$date": "1980-07-09T14:30:12.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957a9c" + _id: { + $oid: '5a9427648b0beebeb6957a9c', }, - "name": "Jose Hall", - "email": "jose_hall@fakegmail.com", - "movie_id": { - "$oid": "573a1391f29313caabcd69c9" + name: 'Jose Hall', + email: 'jose_hall@fakegmail.com', + movie_id: { + $oid: '573a1391f29313caabcd69c9', + }, + text: 'Asperiores delectus officia non. Consequuntur pariatur laborum dolor optio animi. Debitis deserunt maxime voluptatem asperiores. Officiis architecto sit modi doloribus autem.', + date: { + $date: '2016-09-01T05:25:31.000Z', }, - "text": "Asperiores delectus officia non. Consequuntur pariatur laborum dolor optio animi. Debitis deserunt maxime voluptatem asperiores. Officiis architecto sit modi doloribus autem.", - "date": { - "$date": "2016-09-01T05:25:31.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957aa3" + _id: { + $oid: '5a9427648b0beebeb6957aa3', + }, + name: 'Yolanda Owen', + email: 'yolanda_owen@fakegmail.com', + movie_id: { + $oid: '573a1391f29313caabcd6d40', }, - "name": "Yolanda Owen", - "email": "yolanda_owen@fakegmail.com", - "movie_id": { - "$oid": "573a1391f29313caabcd6d40" + text: 'Occaecati commodi quidem aliquid delectus dolores. Facilis fugiat soluta maxime ipsum. Facere quibusdam vitae eius in fugit voluptatum beatae.', + date: { + $date: '1980-07-13T06:41:13.000Z', }, - "text": "Occaecati commodi quidem aliquid delectus dolores. Facilis fugiat soluta maxime ipsum. Facere quibusdam vitae eius in fugit voluptatum beatae.", - "date": { - "$date": "1980-07-13T06:41:13.000Z" - } }, { - "_id": { - "$oid": "5a9427648b0beebeb6957ad7" + _id: { + $oid: '5a9427648b0beebeb6957ad7', }, - "name": "Mary Mitchell", - "email": "mary_mitchell@fakegmail.com", - "movie_id": { - "$oid": "573a1391f29313caabcd712f" + name: 'Mary Mitchell', + email: 'mary_mitchell@fakegmail.com', + movie_id: { + $oid: '573a1391f29313caabcd712f', }, - "text": "Possimus odio laborum labore modi nihil molestiae nostrum. Placeat tempora neque ut. Sit sunt cupiditate error corrupti aperiam ducimus deserunt. Deserunt explicabo libero quo iste voluptas.", - "date": { - "$date": "1980-06-12T13:14:32.000Z" - } - } -] + text: 'Possimus odio laborum labore modi nihil molestiae nostrum. Placeat tempora neque ut. Sit sunt cupiditate error corrupti aperiam ducimus deserunt. Deserunt explicabo libero quo iste voluptas.', + date: { + $date: '1980-06-12T13:14:32.000Z', + }, + }, +]; diff --git a/packages/compass-generative-ai/tests/evals/fixtures/netflix.movies.ts b/packages/compass-generative-ai/tests/evals/fixtures/netflix.movies.ts index 2bc699289f7..9f85aa6b813 100644 --- a/packages/compass-generative-ai/tests/evals/fixtures/netflix.movies.ts +++ b/packages/compass-generative-ai/tests/evals/fixtures/netflix.movies.ts @@ -1,346 +1,347 @@ export default [ { - "_id": { - "$oid": "573b864df29313caabe354ed" + _id: { + $oid: '573b864df29313caabe354ed', }, - "title": "Dinosaur Planet", - "year": 2003, - "id": "1" + title: 'Dinosaur Planet', + year: 2003, + id: '1', }, { - "_id": { - "$oid": "573b864df29313caabe354ef" + _id: { + $oid: '573b864df29313caabe354ef', }, - "title": "Isle of Man TT 2004 Review", - "year": 2004, - "id": "2" + title: 'Isle of Man TT 2004 Review', + year: 2004, + id: '2', }, { - "_id": { - "$oid": "573b864df29313caabe354f0" + _id: { + $oid: '573b864df29313caabe354f0', }, - "title": "Paula Abdul's Get Up & Dance", - "year": 1994, - "id": "4" + title: "Paula Abdul's Get Up & Dance", + year: 1994, + id: '4', }, { - "_id": { - "$oid": "573b864df29313caabe354f1" + _id: { + $oid: '573b864df29313caabe354f1', }, - "title": "The Rise and Fall of ECW", - "year": 2004, - "id": "5" + title: 'The Rise and Fall of ECW', + year: 2004, + id: '5', }, { - "_id": { - "$oid": "573b864df29313caabe354f2" + _id: { + $oid: '573b864df29313caabe354f2', }, - "title": "Sick", - "year": 1997, - "id": "6" + title: 'Sick', + year: 1997, + id: '6', }, { - "_id": { - "$oid": "573b864df29313caabe354f3" + _id: { + $oid: '573b864df29313caabe354f3', }, - "title": "8 Man", - "year": 1992, - "id": "7" + title: '8 Man', + year: 1992, + id: '7', }, { - "_id": { - "$oid": "573b864df29313caabe354f4" + _id: { + $oid: '573b864df29313caabe354f4', }, - "title": "What the #$*! Do We Know!?", - "year": 2004, - "id": "8" + title: 'What the #$*! Do We Know!?', + year: 2004, + id: '8', }, { - "_id": { - "$oid": "573b864df29313caabe354f5" + _id: { + $oid: '573b864df29313caabe354f5', }, - "title": "Fighter", - "year": 2002, - "id": "10" + title: 'Fighter', + year: 2002, + id: '10', }, { - "_id": { - "$oid": "573b864df29313caabe354f6" + _id: { + $oid: '573b864df29313caabe354f6', }, - "title": "Class of Nuke 'Em High 2", - "year": 1991, - "id": "9" + title: "Class of Nuke 'Em High 2", + year: 1991, + id: '9', }, { - "_id": { - "$oid": "573b864df29313caabe354f7" + _id: { + $oid: '573b864df29313caabe354f7', }, - "title": "My Favorite Brunette", - "year": 1947, - "id": "12" + title: 'My Favorite Brunette', + year: 1947, + id: '12', }, { - "_id": { - "$oid": "573b864df29313caabe354f8" + _id: { + $oid: '573b864df29313caabe354f8', }, - "title": "Full Frame: Documentary Shorts", - "year": 1999, - "id": "11" + title: 'Full Frame: Documentary Shorts', + year: 1999, + id: '11', }, { - "_id": { - "$oid": "573b864df29313caabe354f9" + _id: { + $oid: '573b864df29313caabe354f9', }, - "title": "Lord of the Rings: The Return of the King: Extended Edition: Bonus Material", - "year": 2003, - "id": "13" + title: + 'Lord of the Rings: The Return of the King: Extended Edition: Bonus Material', + year: 2003, + id: '13', }, { - "_id": { - "$oid": "573b864df29313caabe354fa" + _id: { + $oid: '573b864df29313caabe354fa', }, - "title": "Neil Diamond: Greatest Hits Live", - "year": 1988, - "id": "15" + title: 'Neil Diamond: Greatest Hits Live', + year: 1988, + id: '15', }, { - "_id": { - "$oid": "573b864df29313caabe354fb" + _id: { + $oid: '573b864df29313caabe354fb', }, - "title": "7 Seconds", - "year": 2005, - "id": "17" + title: '7 Seconds', + year: 2005, + id: '17', }, { - "_id": { - "$oid": "573b864df29313caabe354fc" + _id: { + $oid: '573b864df29313caabe354fc', }, - "title": "Nature: Antarctica", - "year": 1982, - "id": "14" + title: 'Nature: Antarctica', + year: 1982, + id: '14', }, { - "_id": { - "$oid": "573b864df29313caabe354fe" + _id: { + $oid: '573b864df29313caabe354fe', }, - "title": "By Dawn's Early Light", - "year": 2000, - "id": "19" + title: "By Dawn's Early Light", + year: 2000, + id: '19', }, { - "_id": { - "$oid": "573b864df29313caabe35500" + _id: { + $oid: '573b864df29313caabe35500', }, - "title": "Strange Relations", - "year": 2002, - "id": "21" + title: 'Strange Relations', + year: 2002, + id: '21', }, { - "_id": { - "$oid": "573b864df29313caabe35501" + _id: { + $oid: '573b864df29313caabe35501', }, - "title": "Chump Change", - "year": 2000, - "id": "22" + title: 'Chump Change', + year: 2000, + id: '22', }, { - "_id": { - "$oid": "573b864df29313caabe35502" + _id: { + $oid: '573b864df29313caabe35502', }, - "title": "Screamers", - "year": 1996, - "id": "16" + title: 'Screamers', + year: 1996, + id: '16', }, { - "_id": { - "$oid": "573b864df29313caabe35505" + _id: { + $oid: '573b864df29313caabe35505', }, - "title": "Inspector Morse 31: Death Is Now My Neighbour", - "year": 1997, - "id": "25" + title: 'Inspector Morse 31: Death Is Now My Neighbour', + year: 1997, + id: '25', }, { - "_id": { - "$oid": "573b864df29313caabe35506" + _id: { + $oid: '573b864df29313caabe35506', }, - "title": "Never Die Alone", - "year": 2004, - "id": "26" + title: 'Never Die Alone', + year: 2004, + id: '26', }, { - "_id": { - "$oid": "573b864df29313caabe35508" + _id: { + $oid: '573b864df29313caabe35508', }, - "title": "Lilo and Stitch", - "year": 2002, - "id": "28" + title: 'Lilo and Stitch', + year: 2002, + id: '28', }, { - "_id": { - "$oid": "573b864df29313caabe3550a" + _id: { + $oid: '573b864df29313caabe3550a', }, - "title": "Something's Gotta Give", - "year": 2003, - "id": "30" + title: "Something's Gotta Give", + year: 2003, + id: '30', }, { - "_id": { - "$oid": "573b864df29313caabe3550c" + _id: { + $oid: '573b864df29313caabe3550c', }, - "title": "ABC Primetime: Mel Gibson's The Passion of the Christ", - "year": 2004, - "id": "32" + title: "ABC Primetime: Mel Gibson's The Passion of the Christ", + year: 2004, + id: '32', }, { - "_id": { - "$oid": "573b864df29313caabe3550d" + _id: { + $oid: '573b864df29313caabe3550d', }, - "title": "Ferngully 2: The Magical Rescue", - "year": 2000, - "id": "35" + title: 'Ferngully 2: The Magical Rescue', + year: 2000, + id: '35', }, { - "_id": { - "$oid": "573b864df29313caabe3550e" + _id: { + $oid: '573b864df29313caabe3550e', }, - "title": "Ashtanga Yoga: Beginner's Practice with Nicki Doane", - "year": 2003, - "id": "34" + title: "Ashtanga Yoga: Beginner's Practice with Nicki Doane", + year: 2003, + id: '34', }, { - "_id": { - "$oid": "573b864df29313caabe35513" + _id: { + $oid: '573b864df29313caabe35513', }, - "title": "Love Reinvented", - "year": 2000, - "id": "39" + title: 'Love Reinvented', + year: 2000, + id: '39', }, { - "_id": { - "$oid": "573b864df29313caabe35514" + _id: { + $oid: '573b864df29313caabe35514', }, - "title": "Pitcher and the Pin-Up", - "year": 2004, - "id": "40" + title: 'Pitcher and the Pin-Up', + year: 2004, + id: '40', }, { - "_id": { - "$oid": "573b864df29313caabe35515" + _id: { + $oid: '573b864df29313caabe35515', }, - "title": "Horror Vision", - "year": 2000, - "id": "41" + title: 'Horror Vision', + year: 2000, + id: '41', }, { - "_id": { - "$oid": "573b864df29313caabe35516" + _id: { + $oid: '573b864df29313caabe35516', }, - "title": "Silent Service", - "year": 2000, - "id": "43" + title: 'Silent Service', + year: 2000, + id: '43', }, { - "_id": { - "$oid": "573b864df29313caabe35517" + _id: { + $oid: '573b864df29313caabe35517', }, - "title": "Searching for Paradise", - "year": 2002, - "id": "42" + title: 'Searching for Paradise', + year: 2002, + id: '42', }, { - "_id": { - "$oid": "573b864df29313caabe35518" + _id: { + $oid: '573b864df29313caabe35518', }, - "title": "Spitfire Grill", - "year": 1996, - "id": "44" + title: 'Spitfire Grill', + year: 1996, + id: '44', }, { - "_id": { - "$oid": "573b864df29313caabe3551a" + _id: { + $oid: '573b864df29313caabe3551a', }, - "title": "Rudolph the Red-Nosed Reindeer", - "year": 1964, - "id": "46" + title: 'Rudolph the Red-Nosed Reindeer', + year: 1964, + id: '46', }, { - "_id": { - "$oid": "573b864df29313caabe3551e" + _id: { + $oid: '573b864df29313caabe3551e', }, - "title": "A Yank in the R.A.F.", - "year": 1941, - "id": "50" + title: 'A Yank in the R.A.F.', + year: 1941, + id: '50', }, { - "_id": { - "$oid": "573b864df29313caabe35524" + _id: { + $oid: '573b864df29313caabe35524', }, - "title": "Carandiru", - "year": 2004, - "id": "56" + title: 'Carandiru', + year: 2004, + id: '56', }, { - "_id": { - "$oid": "573b864df29313caabe35526" + _id: { + $oid: '573b864df29313caabe35526', }, - "title": "Dragonheart", - "year": 1996, - "id": "58" + title: 'Dragonheart', + year: 1996, + id: '58', }, { - "_id": { - "$oid": "573b864df29313caabe35528" + _id: { + $oid: '573b864df29313caabe35528', }, - "title": "Ricky Martin: One Night Only", - "year": 1999, - "id": "61" + title: 'Ricky Martin: One Night Only', + year: 1999, + id: '61', }, { - "_id": { - "$oid": "573b864df29313caabe35529" + _id: { + $oid: '573b864df29313caabe35529', }, - "title": "The Libertine", - "year": 1969, - "id": "60" + title: 'The Libertine', + year: 1969, + id: '60', }, { - "_id": { - "$oid": "573b864df29313caabe3552a" + _id: { + $oid: '573b864df29313caabe3552a', }, - "title": "Ken Burns' America: Empire of the Air", - "year": 1991, - "id": "62" + title: "Ken Burns' America: Empire of the Air", + year: 1991, + id: '62', }, { - "_id": { - "$oid": "573b864df29313caabe3552b" + _id: { + $oid: '573b864df29313caabe3552b', }, - "title": "Crash Dive", - "year": 1943, - "id": "63" + title: 'Crash Dive', + year: 1943, + id: '63', }, { - "_id": { - "$oid": "573b864df29313caabe3552e" + _id: { + $oid: '573b864df29313caabe3552e', }, - "title": "Invader Zim", - "year": 2004, - "id": "68" + title: 'Invader Zim', + year: 2004, + id: '68', }, { - "_id": { - "$oid": "573b864df29313caabe35530" + _id: { + $oid: '573b864df29313caabe35530', }, - "title": "Tai Chi: The 24 Forms", - "year": 1999, - "id": "70" + title: 'Tai Chi: The 24 Forms', + year: 1999, + id: '70', }, { - "_id": { - "$oid": "573b864df29313caabe35531" + _id: { + $oid: '573b864df29313caabe35531', }, - "title": "WWE: Armageddon 2003", - "year": 2003, - "id": "69" - } -] + title: 'WWE: Armageddon 2003', + year: 2003, + id: '69', + }, +]; diff --git a/packages/compass-generative-ai/tests/evals/fixtures/nyc.parking.ts b/packages/compass-generative-ai/tests/evals/fixtures/nyc.parking.ts index 9a3efb23dce..9558bcec991 100644 --- a/packages/compass-generative-ai/tests/evals/fixtures/nyc.parking.ts +++ b/packages/compass-generative-ai/tests/evals/fixtures/nyc.parking.ts @@ -1,1244 +1,1244 @@ export default [ { - "_id": { - "$oid": "5735040085629ed4fa83946f" + _id: { + $oid: '5735040085629ed4fa83946f', }, - "Summons Number": { - "$numberLong": "7039084223" + 'Summons Number': { + $numberLong: '7039084223', }, - "Plate ID": "GSY3857", - "Registration State": "NY", - "Plate Type": "PAS", - "Issue Date": "01/31/2015", - "Violation Code": 38, - "Vehicle Body Type": "2DSD", - "Vehicle Make": "BMW", - "Issuing Agency": "T", - "Street Code1": 34030, - "Street Code2": 10910, - "Street Code3": 33390, - "Vehicle Expiration Date": "01/01/20160908 12:00:00 PM", - "Violation Location": 6, - "Violation Precinct": 6, - "Issuer Precinct": 6, - "Issuer Code": 340095, - "Issuer Command": "T800", - "Issuer Squad": "A2", - "Violation Time": "0941P", - "Time First Observed": "", - "Violation County": "NY", - "Violation In Front Of Or Opposite": "O", - "House Number": 416, - "Street Name": "W 13th St", - "Intersecting Street": "", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": "h1", - "Violation Legal Code": "", - "Days Parking In Effect": "Y", - "From Hours In Effect": "0700A", - "To Hours In Effect": "1100P", - "Vehicle Color": "BK", - "Unregistered Vehicle?": "", - "Vehicle Year": 2015, - "Meter Number": "", - "Feet From Curb": 0, - "Violation Post Code": "B 77", - "Violation Description": "38-Failure to Display Muni Rec", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Plate ID': 'GSY3857', + 'Registration State': 'NY', + 'Plate Type': 'PAS', + 'Issue Date': '01/31/2015', + 'Violation Code': 38, + 'Vehicle Body Type': '2DSD', + 'Vehicle Make': 'BMW', + 'Issuing Agency': 'T', + 'Street Code1': 34030, + 'Street Code2': 10910, + 'Street Code3': 33390, + 'Vehicle Expiration Date': '01/01/20160908 12:00:00 PM', + 'Violation Location': 6, + 'Violation Precinct': 6, + 'Issuer Precinct': 6, + 'Issuer Code': 340095, + 'Issuer Command': 'T800', + 'Issuer Squad': 'A2', + 'Violation Time': '0941P', + 'Time First Observed': '', + 'Violation County': 'NY', + 'Violation In Front Of Or Opposite': 'O', + 'House Number': 416, + 'Street Name': 'W 13th St', + 'Intersecting Street': '', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'h1', + 'Violation Legal Code': '', + 'Days Parking In Effect': 'Y', + 'From Hours In Effect': '0700A', + 'To Hours In Effect': '1100P', + 'Vehicle Color': 'BK', + 'Unregistered Vehicle?': '', + 'Vehicle Year': 2015, + 'Meter Number': '', + 'Feet From Curb': 0, + 'Violation Post Code': 'B 77', + 'Violation Description': '38-Failure to Display Muni Rec', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa839470" + _id: { + $oid: '5735040085629ed4fa839470', }, - "Summons Number": { - "$numberLong": "7057883730" + 'Summons Number': { + $numberLong: '7057883730', }, - "Plate ID": "AM485F", - "Registration State": "NJ", - "Plate Type": "PAS", - "Issue Date": "07/24/2014", - "Violation Code": 18, - "Vehicle Body Type": "DELV", - "Vehicle Make": "FRUEH", - "Issuing Agency": "T", - "Street Code1": 10110, - "Street Code2": 17490, - "Street Code3": 17510, - "Vehicle Expiration Date": "01/01/88888888 12:00:00 PM", - "Violation Location": 13, - "Violation Precinct": 13, - "Issuer Precinct": 13, - "Issuer Code": 345238, - "Issuer Command": "T102", - "Issuer Squad": "C", - "Violation Time": "0749A", - "Time First Observed": "", - "Violation County": "NY", - "Violation In Front Of Or Opposite": "O", - "House Number": 444, - "Street Name": "2nd Ave", - "Intersecting Street": "", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": "f4", - "Violation Legal Code": "", - "Days Parking In Effect": "YYYYY", - "From Hours In Effect": "0700A", - "To Hours In Effect": "1000A", - "Vehicle Color": "GREEN", - "Unregistered Vehicle?": "", - "Vehicle Year": 0, - "Meter Number": "", - "Feet From Curb": 0, - "Violation Post Code": "16 6", - "Violation Description": "18-No Stand (bus lane)", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Plate ID': 'AM485F', + 'Registration State': 'NJ', + 'Plate Type': 'PAS', + 'Issue Date': '07/24/2014', + 'Violation Code': 18, + 'Vehicle Body Type': 'DELV', + 'Vehicle Make': 'FRUEH', + 'Issuing Agency': 'T', + 'Street Code1': 10110, + 'Street Code2': 17490, + 'Street Code3': 17510, + 'Vehicle Expiration Date': '01/01/88888888 12:00:00 PM', + 'Violation Location': 13, + 'Violation Precinct': 13, + 'Issuer Precinct': 13, + 'Issuer Code': 345238, + 'Issuer Command': 'T102', + 'Issuer Squad': 'C', + 'Violation Time': '0749A', + 'Time First Observed': '', + 'Violation County': 'NY', + 'Violation In Front Of Or Opposite': 'O', + 'House Number': 444, + 'Street Name': '2nd Ave', + 'Intersecting Street': '', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'f4', + 'Violation Legal Code': '', + 'Days Parking In Effect': 'YYYYY', + 'From Hours In Effect': '0700A', + 'To Hours In Effect': '1000A', + 'Vehicle Color': 'GREEN', + 'Unregistered Vehicle?': '', + 'Vehicle Year': 0, + 'Meter Number': '', + 'Feet From Curb': 0, + 'Violation Post Code': '16 6', + 'Violation Description': '18-No Stand (bus lane)', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa839471" + _id: { + $oid: '5735040085629ed4fa839471', }, - "Summons Number": { - "$numberLong": "7972683426" + 'Summons Number': { + $numberLong: '7972683426', }, - "Plate ID": "40424MC", - "Registration State": "NY", - "Plate Type": "COM", - "Issue Date": "10/27/2014", - "Violation Code": 20, - "Vehicle Body Type": "SUBN", - "Vehicle Make": "ACURA", - "Issuing Agency": "T", - "Street Code1": 35570, - "Street Code2": 13610, - "Street Code3": 44990, - "Vehicle Expiration Date": "01/01/20141202 12:00:00 PM", - "Violation Location": 24, - "Violation Precinct": 24, - "Issuer Precinct": 24, - "Issuer Code": 361115, - "Issuer Command": "T103", - "Issuer Squad": "F", - "Violation Time": "1125A", - "Time First Observed": "", - "Violation County": "NY", - "Violation In Front Of Or Opposite": "O", - "House Number": 255, - "Street Name": "W 90th St", - "Intersecting Street": "", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": "d", - "Violation Legal Code": "", - "Days Parking In Effect": "Y", - "From Hours In Effect": "0800A", - "To Hours In Effect": "0600P", - "Vehicle Color": "BLACK", - "Unregistered Vehicle?": "", - "Vehicle Year": 2015, - "Meter Number": "", - "Feet From Curb": 0, - "Violation Post Code": "44 7", - "Violation Description": "20A-No Parking (Non-COM)", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Plate ID': '40424MC', + 'Registration State': 'NY', + 'Plate Type': 'COM', + 'Issue Date': '10/27/2014', + 'Violation Code': 20, + 'Vehicle Body Type': 'SUBN', + 'Vehicle Make': 'ACURA', + 'Issuing Agency': 'T', + 'Street Code1': 35570, + 'Street Code2': 13610, + 'Street Code3': 44990, + 'Vehicle Expiration Date': '01/01/20141202 12:00:00 PM', + 'Violation Location': 24, + 'Violation Precinct': 24, + 'Issuer Precinct': 24, + 'Issuer Code': 361115, + 'Issuer Command': 'T103', + 'Issuer Squad': 'F', + 'Violation Time': '1125A', + 'Time First Observed': '', + 'Violation County': 'NY', + 'Violation In Front Of Or Opposite': 'O', + 'House Number': 255, + 'Street Name': 'W 90th St', + 'Intersecting Street': '', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'd', + 'Violation Legal Code': '', + 'Days Parking In Effect': 'Y', + 'From Hours In Effect': '0800A', + 'To Hours In Effect': '0600P', + 'Vehicle Color': 'BLACK', + 'Unregistered Vehicle?': '', + 'Vehicle Year': 2015, + 'Meter Number': '', + 'Feet From Curb': 0, + 'Violation Post Code': '44 7', + 'Violation Description': '20A-No Parking (Non-COM)', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa839472" + _id: { + $oid: '5735040085629ed4fa839472', }, - "Summons Number": { - "$numberLong": "7638712493" + 'Summons Number': { + $numberLong: '7638712493', }, - "Plate ID": 443344, - "Registration State": "RI", - "Plate Type": "PAS", - "Issue Date": "09/16/2014", - "Violation Code": 38, - "Vehicle Body Type": "4DSD", - "Vehicle Make": "CHEVR", - "Issuing Agency": "T", - "Street Code1": 53790, - "Street Code2": 19740, - "Street Code3": 19840, - "Vehicle Expiration Date": "01/01/20140688 12:00:00 PM", - "Violation Location": 106, - "Violation Precinct": 106, - "Issuer Precinct": 106, - "Issuer Code": 331801, - "Issuer Command": "T402", - "Issuer Squad": "H", - "Violation Time": "1225P", - "Time First Observed": "", - "Violation County": "Q", - "Violation In Front Of Or Opposite": "F", - "House Number": "104-07", - "Street Name": "Liberty Ave", - "Intersecting Street": "", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": "h1", - "Violation Legal Code": "", - "Days Parking In Effect": "Y", - "From Hours In Effect": "0900A", - "To Hours In Effect": "0700P", - "Vehicle Color": "GREY", - "Unregistered Vehicle?": "", - "Vehicle Year": 0, - "Meter Number": "", - "Feet From Curb": 0, - "Violation Post Code": "24 4", - "Violation Description": "38-Failure to Display Muni Rec", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Plate ID': 443344, + 'Registration State': 'RI', + 'Plate Type': 'PAS', + 'Issue Date': '09/16/2014', + 'Violation Code': 38, + 'Vehicle Body Type': '4DSD', + 'Vehicle Make': 'CHEVR', + 'Issuing Agency': 'T', + 'Street Code1': 53790, + 'Street Code2': 19740, + 'Street Code3': 19840, + 'Vehicle Expiration Date': '01/01/20140688 12:00:00 PM', + 'Violation Location': 106, + 'Violation Precinct': 106, + 'Issuer Precinct': 106, + 'Issuer Code': 331801, + 'Issuer Command': 'T402', + 'Issuer Squad': 'H', + 'Violation Time': '1225P', + 'Time First Observed': '', + 'Violation County': 'Q', + 'Violation In Front Of Or Opposite': 'F', + 'House Number': '104-07', + 'Street Name': 'Liberty Ave', + 'Intersecting Street': '', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'h1', + 'Violation Legal Code': '', + 'Days Parking In Effect': 'Y', + 'From Hours In Effect': '0900A', + 'To Hours In Effect': '0700P', + 'Vehicle Color': 'GREY', + 'Unregistered Vehicle?': '', + 'Vehicle Year': 0, + 'Meter Number': '', + 'Feet From Curb': 0, + 'Violation Post Code': '24 4', + 'Violation Description': '38-Failure to Display Muni Rec', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa839473" + _id: { + $oid: '5735040085629ed4fa839473', }, - "Summons Number": { - "$numberLong": "7721537642" + 'Summons Number': { + $numberLong: '7721537642', }, - "Plate ID": "GMX1207", - "Registration State": "NY", - "Plate Type": "PAS", - "Issue Date": "09/18/2014", - "Violation Code": 38, - "Vehicle Body Type": "4DSD", - "Vehicle Make": "HONDA", - "Issuing Agency": "T", - "Street Code1": 8790, - "Street Code2": 17990, - "Street Code3": 18090, - "Vehicle Expiration Date": "01/01/20160202 12:00:00 PM", - "Violation Location": 115, - "Violation Precinct": 115, - "Issuer Precinct": 115, - "Issuer Code": 358644, - "Issuer Command": "T401", - "Issuer Squad": "R", - "Violation Time": "0433P", - "Time First Observed": "", - "Violation County": "Q", - "Violation In Front Of Or Opposite": "F", - "House Number": "88-22", - "Street Name": "37th Ave", - "Intersecting Street": "", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": "h1", - "Violation Legal Code": "", - "Days Parking In Effect": "Y", - "From Hours In Effect": "0830A", - "To Hours In Effect": "0700P", - "Vehicle Color": "BK", - "Unregistered Vehicle?": "", - "Vehicle Year": 2013, - "Meter Number": "", - "Feet From Curb": 0, - "Violation Post Code": "16 4", - "Violation Description": "38-Failure to Display Muni Rec", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Plate ID': 'GMX1207', + 'Registration State': 'NY', + 'Plate Type': 'PAS', + 'Issue Date': '09/18/2014', + 'Violation Code': 38, + 'Vehicle Body Type': '4DSD', + 'Vehicle Make': 'HONDA', + 'Issuing Agency': 'T', + 'Street Code1': 8790, + 'Street Code2': 17990, + 'Street Code3': 18090, + 'Vehicle Expiration Date': '01/01/20160202 12:00:00 PM', + 'Violation Location': 115, + 'Violation Precinct': 115, + 'Issuer Precinct': 115, + 'Issuer Code': 358644, + 'Issuer Command': 'T401', + 'Issuer Squad': 'R', + 'Violation Time': '0433P', + 'Time First Observed': '', + 'Violation County': 'Q', + 'Violation In Front Of Or Opposite': 'F', + 'House Number': '88-22', + 'Street Name': '37th Ave', + 'Intersecting Street': '', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'h1', + 'Violation Legal Code': '', + 'Days Parking In Effect': 'Y', + 'From Hours In Effect': '0830A', + 'To Hours In Effect': '0700P', + 'Vehicle Color': 'BK', + 'Unregistered Vehicle?': '', + 'Vehicle Year': 2013, + 'Meter Number': '', + 'Feet From Curb': 0, + 'Violation Post Code': '16 4', + 'Violation Description': '38-Failure to Display Muni Rec', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa839474" + _id: { + $oid: '5735040085629ed4fa839474', }, - "Summons Number": { - "$numberLong": "7899927729" + 'Summons Number': { + $numberLong: '7899927729', }, - "Plate ID": "63543JM", - "Registration State": "NY", - "Plate Type": "COM", - "Issue Date": "01/22/2015", - "Violation Code": 14, - "Vehicle Body Type": "VAN", - "Vehicle Make": "GMC", - "Issuing Agency": "T", - "Street Code1": 34890, - "Street Code2": 10410, - "Street Code3": 10510, - "Vehicle Expiration Date": "01/01/88888888 12:00:00 PM", - "Violation Location": 18, - "Violation Precinct": 18, - "Issuer Precinct": 18, - "Issuer Code": 353508, - "Issuer Command": "T106", - "Issuer Squad": "D", - "Violation Time": "0940A", - "Time First Observed": "", - "Violation County": "NY", - "Violation In Front Of Or Opposite": "F", - "House Number": 5, - "Street Name": "W 56th St", - "Intersecting Street": "", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": "c", - "Violation Legal Code": "", - "Days Parking In Effect": "YYYYYYY", - "From Hours In Effect": "", - "To Hours In Effect": "", - "Vehicle Color": "BROWN", - "Unregistered Vehicle?": "", - "Vehicle Year": 1990, - "Meter Number": "", - "Feet From Curb": 0, - "Violation Post Code": "18 6", - "Violation Description": "14-No Standing", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Plate ID': '63543JM', + 'Registration State': 'NY', + 'Plate Type': 'COM', + 'Issue Date': '01/22/2015', + 'Violation Code': 14, + 'Vehicle Body Type': 'VAN', + 'Vehicle Make': 'GMC', + 'Issuing Agency': 'T', + 'Street Code1': 34890, + 'Street Code2': 10410, + 'Street Code3': 10510, + 'Vehicle Expiration Date': '01/01/88888888 12:00:00 PM', + 'Violation Location': 18, + 'Violation Precinct': 18, + 'Issuer Precinct': 18, + 'Issuer Code': 353508, + 'Issuer Command': 'T106', + 'Issuer Squad': 'D', + 'Violation Time': '0940A', + 'Time First Observed': '', + 'Violation County': 'NY', + 'Violation In Front Of Or Opposite': 'F', + 'House Number': 5, + 'Street Name': 'W 56th St', + 'Intersecting Street': '', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'c', + 'Violation Legal Code': '', + 'Days Parking In Effect': 'YYYYYYY', + 'From Hours In Effect': '', + 'To Hours In Effect': '', + 'Vehicle Color': 'BROWN', + 'Unregistered Vehicle?': '', + 'Vehicle Year': 1990, + 'Meter Number': '', + 'Feet From Curb': 0, + 'Violation Post Code': '18 6', + 'Violation Description': '14-No Standing', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa839475" + _id: { + $oid: '5735040085629ed4fa839475', }, - "Summons Number": { - "$numberLong": "7899927729" + 'Summons Number': { + $numberLong: '7899927729', }, - "Plate ID": "63543JM", - "Registration State": "NY", - "Plate Type": "COM", - "Issue Date": "01/22/2015", - "Violation Code": 14, - "Vehicle Body Type": "VAN", - "Vehicle Make": "GMC", - "Issuing Agency": "T", - "Street Code1": 34890, - "Street Code2": 10410, - "Street Code3": 10510, - "Vehicle Expiration Date": "01/01/88888888 12:00:00 PM", - "Violation Location": 18, - "Violation Precinct": 18, - "Issuer Precinct": 18, - "Issuer Code": 353508, - "Issuer Command": "T106", - "Issuer Squad": "D", - "Violation Time": "0940A", - "Time First Observed": "", - "Violation County": "NY", - "Violation In Front Of Or Opposite": "F", - "House Number": 5, - "Street Name": "W 56th St", - "Intersecting Street": "", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": "c", - "Violation Legal Code": "", - "Days Parking In Effect": "YYYYYYY", - "From Hours In Effect": "", - "To Hours In Effect": "", - "Vehicle Color": "BROWN", - "Unregistered Vehicle?": "", - "Vehicle Year": 1990, - "Meter Number": "", - "Feet From Curb": 0, - "Violation Post Code": "18 6", - "Violation Description": "14-No Standing", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Plate ID': '63543JM', + 'Registration State': 'NY', + 'Plate Type': 'COM', + 'Issue Date': '01/22/2015', + 'Violation Code': 14, + 'Vehicle Body Type': 'VAN', + 'Vehicle Make': 'GMC', + 'Issuing Agency': 'T', + 'Street Code1': 34890, + 'Street Code2': 10410, + 'Street Code3': 10510, + 'Vehicle Expiration Date': '01/01/88888888 12:00:00 PM', + 'Violation Location': 18, + 'Violation Precinct': 18, + 'Issuer Precinct': 18, + 'Issuer Code': 353508, + 'Issuer Command': 'T106', + 'Issuer Squad': 'D', + 'Violation Time': '0940A', + 'Time First Observed': '', + 'Violation County': 'NY', + 'Violation In Front Of Or Opposite': 'F', + 'House Number': 5, + 'Street Name': 'W 56th St', + 'Intersecting Street': '', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'c', + 'Violation Legal Code': '', + 'Days Parking In Effect': 'YYYYYYY', + 'From Hours In Effect': '', + 'To Hours In Effect': '', + 'Vehicle Color': 'BROWN', + 'Unregistered Vehicle?': '', + 'Vehicle Year': 1990, + 'Meter Number': '', + 'Feet From Curb': 0, + 'Violation Post Code': '18 6', + 'Violation Description': '14-No Standing', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa839476" + _id: { + $oid: '5735040085629ed4fa839476', }, - "Summons Number": 1377047714, - "Plate ID": "T657080C", - "Registration State": "NY", - "Plate Type": "SRF", - "Issue Date": "02/12/2015", - "Violation Code": 46, - "Vehicle Body Type": "", - "Vehicle Make": "TOYOT", - "Issuing Agency": "P", - "Street Code1": 38643, - "Street Code2": 10440, - "Street Code3": 10490, - "Vehicle Expiration Date": "01/01/20150831 12:00:00 PM", - "Violation Location": 108, - "Violation Precinct": 108, - "Issuer Precinct": 108, - "Issuer Code": 952146, - "Issuer Command": 108, - "Issuer Squad": 0, - "Violation Time": "1035A", - "Time First Observed": "", - "Violation County": "Q", - "Violation In Front Of Or Opposite": "F", - "House Number": "47-20", - "Street Name": "CENTER BLVD", - "Intersecting Street": "", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": "F1", - "Violation Legal Code": "", - "Days Parking In Effect": "BBBBBBB", - "From Hours In Effect": "ALL", - "To Hours In Effect": "ALL", - "Vehicle Color": "BLK", - "Unregistered Vehicle?": 0, - "Vehicle Year": 2011, - "Meter Number": "-", - "Feet From Curb": 0, - "Violation Post Code": "", - "Violation Description": "", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Summons Number': 1377047714, + 'Plate ID': 'T657080C', + 'Registration State': 'NY', + 'Plate Type': 'SRF', + 'Issue Date': '02/12/2015', + 'Violation Code': 46, + 'Vehicle Body Type': '', + 'Vehicle Make': 'TOYOT', + 'Issuing Agency': 'P', + 'Street Code1': 38643, + 'Street Code2': 10440, + 'Street Code3': 10490, + 'Vehicle Expiration Date': '01/01/20150831 12:00:00 PM', + 'Violation Location': 108, + 'Violation Precinct': 108, + 'Issuer Precinct': 108, + 'Issuer Code': 952146, + 'Issuer Command': 108, + 'Issuer Squad': 0, + 'Violation Time': '1035A', + 'Time First Observed': '', + 'Violation County': 'Q', + 'Violation In Front Of Or Opposite': 'F', + 'House Number': '47-20', + 'Street Name': 'CENTER BLVD', + 'Intersecting Street': '', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'F1', + 'Violation Legal Code': '', + 'Days Parking In Effect': 'BBBBBBB', + 'From Hours In Effect': 'ALL', + 'To Hours In Effect': 'ALL', + 'Vehicle Color': 'BLK', + 'Unregistered Vehicle?': 0, + 'Vehicle Year': 2011, + 'Meter Number': '-', + 'Feet From Curb': 0, + 'Violation Post Code': '', + 'Violation Description': '', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa839477" + _id: { + $oid: '5735040085629ed4fa839477', }, - "Summons Number": { - "$numberLong": "8028772766" + 'Summons Number': { + $numberLong: '8028772766', }, - "Plate ID": "84046MG", - "Registration State": "NY", - "Plate Type": "COM", - "Issue Date": "06/25/2015", - "Violation Code": 10, - "Vehicle Body Type": "DELV", - "Vehicle Make": "HINO", - "Issuing Agency": "T", - "Street Code1": 10610, - "Street Code2": 0, - "Street Code3": 0, - "Vehicle Expiration Date": "01/01/20160430 12:00:00 PM", - "Violation Location": 14, - "Violation Precinct": 14, - "Issuer Precinct": 14, - "Issuer Code": 361878, - "Issuer Command": "T102", - "Issuer Squad": "K", - "Violation Time": "0110P", - "Time First Observed": "", - "Violation County": "NY", - "Violation In Front Of Or Opposite": "I", - "House Number": "E", - "Street Name": "7th Ave", - "Intersecting Street": "35ft N/of W 42nd St", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": "b", - "Violation Legal Code": "", - "Days Parking In Effect": "YYYYYYY", - "From Hours In Effect": "", - "To Hours In Effect": "", - "Vehicle Color": "WH", - "Unregistered Vehicle?": "", - "Vehicle Year": 2015, - "Meter Number": "", - "Feet From Curb": 0, - "Violation Post Code": "MC 9", - "Violation Description": "10-No Stopping", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Plate ID': '84046MG', + 'Registration State': 'NY', + 'Plate Type': 'COM', + 'Issue Date': '06/25/2015', + 'Violation Code': 10, + 'Vehicle Body Type': 'DELV', + 'Vehicle Make': 'HINO', + 'Issuing Agency': 'T', + 'Street Code1': 10610, + 'Street Code2': 0, + 'Street Code3': 0, + 'Vehicle Expiration Date': '01/01/20160430 12:00:00 PM', + 'Violation Location': 14, + 'Violation Precinct': 14, + 'Issuer Precinct': 14, + 'Issuer Code': 361878, + 'Issuer Command': 'T102', + 'Issuer Squad': 'K', + 'Violation Time': '0110P', + 'Time First Observed': '', + 'Violation County': 'NY', + 'Violation In Front Of Or Opposite': 'I', + 'House Number': 'E', + 'Street Name': '7th Ave', + 'Intersecting Street': '35ft N/of W 42nd St', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'b', + 'Violation Legal Code': '', + 'Days Parking In Effect': 'YYYYYYY', + 'From Hours In Effect': '', + 'To Hours In Effect': '', + 'Vehicle Color': 'WH', + 'Unregistered Vehicle?': '', + 'Vehicle Year': 2015, + 'Meter Number': '', + 'Feet From Curb': 0, + 'Violation Post Code': 'MC 9', + 'Violation Description': '10-No Stopping', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa839478" + _id: { + $oid: '5735040085629ed4fa839478', }, - "Summons Number": { - "$numberLong": "7431929330" + 'Summons Number': { + $numberLong: '7431929330', }, - "Plate ID": "FHM2618", - "Registration State": "NY", - "Plate Type": "PAS", - "Issue Date": "03/12/2015", - "Violation Code": 38, - "Vehicle Body Type": "4DSD", - "Vehicle Make": "LEXUS", - "Issuing Agency": "T", - "Street Code1": 54580, - "Street Code2": 15290, - "Street Code3": 15190, - "Vehicle Expiration Date": "01/01/20170216 12:00:00 PM", - "Violation Location": 107, - "Violation Precinct": 107, - "Issuer Precinct": 107, - "Issuer Code": 361100, - "Issuer Command": "T402", - "Issuer Squad": "B", - "Violation Time": "0235P", - "Time First Observed": "", - "Violation County": "Q", - "Violation In Front Of Or Opposite": "O", - "House Number": "72-32", - "Street Name": "Main St", - "Intersecting Street": "", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": "h1", - "Violation Legal Code": "", - "Days Parking In Effect": "YYYYY", - "From Hours In Effect": "0800A", - "To Hours In Effect": "0700P", - "Vehicle Color": "LT/", - "Unregistered Vehicle?": "", - "Vehicle Year": 2008, - "Meter Number": "", - "Feet From Curb": 0, - "Violation Post Code": "06 4", - "Violation Description": "38-Failure to Display Muni Rec", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Plate ID': 'FHM2618', + 'Registration State': 'NY', + 'Plate Type': 'PAS', + 'Issue Date': '03/12/2015', + 'Violation Code': 38, + 'Vehicle Body Type': '4DSD', + 'Vehicle Make': 'LEXUS', + 'Issuing Agency': 'T', + 'Street Code1': 54580, + 'Street Code2': 15290, + 'Street Code3': 15190, + 'Vehicle Expiration Date': '01/01/20170216 12:00:00 PM', + 'Violation Location': 107, + 'Violation Precinct': 107, + 'Issuer Precinct': 107, + 'Issuer Code': 361100, + 'Issuer Command': 'T402', + 'Issuer Squad': 'B', + 'Violation Time': '0235P', + 'Time First Observed': '', + 'Violation County': 'Q', + 'Violation In Front Of Or Opposite': 'O', + 'House Number': '72-32', + 'Street Name': 'Main St', + 'Intersecting Street': '', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'h1', + 'Violation Legal Code': '', + 'Days Parking In Effect': 'YYYYY', + 'From Hours In Effect': '0800A', + 'To Hours In Effect': '0700P', + 'Vehicle Color': 'LT/', + 'Unregistered Vehicle?': '', + 'Vehicle Year': 2008, + 'Meter Number': '', + 'Feet From Curb': 0, + 'Violation Post Code': '06 4', + 'Violation Description': '38-Failure to Display Muni Rec', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa839479" + _id: { + $oid: '5735040085629ed4fa839479', }, - "Summons Number": { - "$numberLong": "7381962433" + 'Summons Number': { + $numberLong: '7381962433', }, - "Plate ID": "50204JT", - "Registration State": "NY", - "Plate Type": "COM", - "Issue Date": "02/20/2015", - "Violation Code": 17, - "Vehicle Body Type": "VAN", - "Vehicle Make": "CHEVR", - "Issuing Agency": "T", - "Street Code1": 93250, - "Street Code2": 52930, - "Street Code3": 54650, - "Vehicle Expiration Date": "01/01/88888888 12:00:00 PM", - "Violation Location": 84, - "Violation Precinct": 84, - "Issuer Precinct": 84, - "Issuer Code": 355301, - "Issuer Command": "T301", - "Issuer Squad": "C", - "Violation Time": "1012A", - "Time First Observed": "", - "Violation County": "K", - "Violation In Front Of Or Opposite": "F", - "House Number": 57, - "Street Name": "Willoughby St", - "Intersecting Street": "", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": "c4", - "Violation Legal Code": "", - "Days Parking In Effect": "YYYYYYY", - "From Hours In Effect": "", - "To Hours In Effect": "", - "Vehicle Color": "WHITE", - "Unregistered Vehicle?": "", - "Vehicle Year": 2005, - "Meter Number": "", - "Feet From Curb": 0, - "Violation Post Code": "03 3", - "Violation Description": "17-No Stand (exc auth veh)", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Plate ID': '50204JT', + 'Registration State': 'NY', + 'Plate Type': 'COM', + 'Issue Date': '02/20/2015', + 'Violation Code': 17, + 'Vehicle Body Type': 'VAN', + 'Vehicle Make': 'CHEVR', + 'Issuing Agency': 'T', + 'Street Code1': 93250, + 'Street Code2': 52930, + 'Street Code3': 54650, + 'Vehicle Expiration Date': '01/01/88888888 12:00:00 PM', + 'Violation Location': 84, + 'Violation Precinct': 84, + 'Issuer Precinct': 84, + 'Issuer Code': 355301, + 'Issuer Command': 'T301', + 'Issuer Squad': 'C', + 'Violation Time': '1012A', + 'Time First Observed': '', + 'Violation County': 'K', + 'Violation In Front Of Or Opposite': 'F', + 'House Number': 57, + 'Street Name': 'Willoughby St', + 'Intersecting Street': '', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'c4', + 'Violation Legal Code': '', + 'Days Parking In Effect': 'YYYYYYY', + 'From Hours In Effect': '', + 'To Hours In Effect': '', + 'Vehicle Color': 'WHITE', + 'Unregistered Vehicle?': '', + 'Vehicle Year': 2005, + 'Meter Number': '', + 'Feet From Curb': 0, + 'Violation Post Code': '03 3', + 'Violation Description': '17-No Stand (exc auth veh)', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa83947a" + _id: { + $oid: '5735040085629ed4fa83947a', }, - "Summons Number": 1377361196, - "Plate ID": "GSA1316", - "Registration State": "NY", - "Plate Type": "PAS", - "Issue Date": "01/29/2015", - "Violation Code": 80, - "Vehicle Body Type": "SUBN", - "Vehicle Make": "HONDA", - "Issuing Agency": "P", - "Street Code1": 12120, - "Street Code2": 9720, - "Street Code3": 45720, - "Vehicle Expiration Date": "01/01/20160907 12:00:00 PM", - "Violation Location": 41, - "Violation Precinct": 41, - "Issuer Precinct": 41, - "Issuer Code": 936738, - "Issuer Command": 41, - "Issuer Squad": 0, - "Violation Time": "0216A", - "Time First Observed": "", - "Violation County": "BX", - "Violation In Front Of Or Opposite": "F", - "House Number": 687, - "Street Name": "BECK ST", - "Intersecting Street": "", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": 99, - "Violation Legal Code": "", - "Days Parking In Effect": "BBBBBBB", - "From Hours In Effect": "ALL", - "To Hours In Effect": "ALL", - "Vehicle Color": "GRAY", - "Unregistered Vehicle?": 0, - "Vehicle Year": 0, - "Meter Number": "-", - "Feet From Curb": 0, - "Violation Post Code": "", - "Violation Description": "", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Summons Number': 1377361196, + 'Plate ID': 'GSA1316', + 'Registration State': 'NY', + 'Plate Type': 'PAS', + 'Issue Date': '01/29/2015', + 'Violation Code': 80, + 'Vehicle Body Type': 'SUBN', + 'Vehicle Make': 'HONDA', + 'Issuing Agency': 'P', + 'Street Code1': 12120, + 'Street Code2': 9720, + 'Street Code3': 45720, + 'Vehicle Expiration Date': '01/01/20160907 12:00:00 PM', + 'Violation Location': 41, + 'Violation Precinct': 41, + 'Issuer Precinct': 41, + 'Issuer Code': 936738, + 'Issuer Command': 41, + 'Issuer Squad': 0, + 'Violation Time': '0216A', + 'Time First Observed': '', + 'Violation County': 'BX', + 'Violation In Front Of Or Opposite': 'F', + 'House Number': 687, + 'Street Name': 'BECK ST', + 'Intersecting Street': '', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 99, + 'Violation Legal Code': '', + 'Days Parking In Effect': 'BBBBBBB', + 'From Hours In Effect': 'ALL', + 'To Hours In Effect': 'ALL', + 'Vehicle Color': 'GRAY', + 'Unregistered Vehicle?': 0, + 'Vehicle Year': 0, + 'Meter Number': '-', + 'Feet From Curb': 0, + 'Violation Post Code': '', + 'Violation Description': '', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa83947b" + _id: { + $oid: '5735040085629ed4fa83947b', }, - "Summons Number": { - "$numberLong": "7575556758" + 'Summons Number': { + $numberLong: '7575556758', }, - "Plate ID": "BXV8565", - "Registration State": "NY", - "Plate Type": "PAS", - "Issue Date": "10/29/2014", - "Violation Code": 37, - "Vehicle Body Type": "4DSD", - "Vehicle Make": "CHEVR", - "Issuing Agency": "T", - "Street Code1": 10210, - "Street Code2": 0, - "Street Code3": 0, - "Vehicle Expiration Date": "01/01/20160902 12:00:00 PM", - "Violation Location": 19, - "Violation Precinct": 19, - "Issuer Precinct": 19, - "Issuer Code": 356258, - "Issuer Command": "T103", - "Issuer Squad": "F", - "Violation Time": "0104P", - "Time First Observed": "1256P", - "Violation County": "NY", - "Violation In Front Of Or Opposite": "I", - "House Number": "W", - "Street Name": "3rd Ave", - "Intersecting Street": "12ft S/of E 90th St", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": "h1", - "Violation Legal Code": "", - "Days Parking In Effect": "Y", - "From Hours In Effect": "0800A", - "To Hours In Effect": "0700P", - "Vehicle Color": "GR", - "Unregistered Vehicle?": "", - "Vehicle Year": 1998, - "Meter Number": "120-8032", - "Feet From Curb": 0, - "Violation Post Code": "06 7", - "Violation Description": "37-Expired Muni Meter", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Plate ID': 'BXV8565', + 'Registration State': 'NY', + 'Plate Type': 'PAS', + 'Issue Date': '10/29/2014', + 'Violation Code': 37, + 'Vehicle Body Type': '4DSD', + 'Vehicle Make': 'CHEVR', + 'Issuing Agency': 'T', + 'Street Code1': 10210, + 'Street Code2': 0, + 'Street Code3': 0, + 'Vehicle Expiration Date': '01/01/20160902 12:00:00 PM', + 'Violation Location': 19, + 'Violation Precinct': 19, + 'Issuer Precinct': 19, + 'Issuer Code': 356258, + 'Issuer Command': 'T103', + 'Issuer Squad': 'F', + 'Violation Time': '0104P', + 'Time First Observed': '1256P', + 'Violation County': 'NY', + 'Violation In Front Of Or Opposite': 'I', + 'House Number': 'W', + 'Street Name': '3rd Ave', + 'Intersecting Street': '12ft S/of E 90th St', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'h1', + 'Violation Legal Code': '', + 'Days Parking In Effect': 'Y', + 'From Hours In Effect': '0800A', + 'To Hours In Effect': '0700P', + 'Vehicle Color': 'GR', + 'Unregistered Vehicle?': '', + 'Vehicle Year': 1998, + 'Meter Number': '120-8032', + 'Feet From Curb': 0, + 'Violation Post Code': '06 7', + 'Violation Description': '37-Expired Muni Meter', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa83947c" + _id: { + $oid: '5735040085629ed4fa83947c', }, - "Summons Number": { - "$numberLong": "7462760484" + 'Summons Number': { + $numberLong: '7462760484', }, - "Plate ID": "EPH7313", - "Registration State": "NY", - "Plate Type": "PAS", - "Issue Date": "10/10/2014", - "Violation Code": 20, - "Vehicle Body Type": "SUBN", - "Vehicle Make": "TOYOT", - "Issuing Agency": "T", - "Street Code1": 5580, - "Street Code2": 5230, - "Street Code3": 5380, - "Vehicle Expiration Date": "01/01/20150201 12:00:00 PM", - "Violation Location": 78, - "Violation Precinct": 78, - "Issuer Precinct": 78, - "Issuer Code": 350415, - "Issuer Command": "T802", - "Issuer Squad": "B", - "Violation Time": "0824P", - "Time First Observed": "", - "Violation County": "K", - "Violation In Front Of Or Opposite": "F", - "House Number": 322, - "Street Name": "5th Ave", - "Intersecting Street": "", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": "d", - "Violation Legal Code": "", - "Days Parking In Effect": "YYYYYYY", - "From Hours In Effect": "", - "To Hours In Effect": "", - "Vehicle Color": "GY", - "Unregistered Vehicle?": "", - "Vehicle Year": 2009, - "Meter Number": "", - "Feet From Curb": 0, - "Violation Post Code": "G 31", - "Violation Description": "20A-No Parking (Non-COM)", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Plate ID': 'EPH7313', + 'Registration State': 'NY', + 'Plate Type': 'PAS', + 'Issue Date': '10/10/2014', + 'Violation Code': 20, + 'Vehicle Body Type': 'SUBN', + 'Vehicle Make': 'TOYOT', + 'Issuing Agency': 'T', + 'Street Code1': 5580, + 'Street Code2': 5230, + 'Street Code3': 5380, + 'Vehicle Expiration Date': '01/01/20150201 12:00:00 PM', + 'Violation Location': 78, + 'Violation Precinct': 78, + 'Issuer Precinct': 78, + 'Issuer Code': 350415, + 'Issuer Command': 'T802', + 'Issuer Squad': 'B', + 'Violation Time': '0824P', + 'Time First Observed': '', + 'Violation County': 'K', + 'Violation In Front Of Or Opposite': 'F', + 'House Number': 322, + 'Street Name': '5th Ave', + 'Intersecting Street': '', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'd', + 'Violation Legal Code': '', + 'Days Parking In Effect': 'YYYYYYY', + 'From Hours In Effect': '', + 'To Hours In Effect': '', + 'Vehicle Color': 'GY', + 'Unregistered Vehicle?': '', + 'Vehicle Year': 2009, + 'Meter Number': '', + 'Feet From Curb': 0, + 'Violation Post Code': 'G 31', + 'Violation Description': '20A-No Parking (Non-COM)', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa83947d" + _id: { + $oid: '5735040085629ed4fa83947d', }, - "Summons Number": 1370095480, - "Plate ID": "GJZ3562", - "Registration State": "NY", - "Plate Type": "PAS", - "Issue Date": "08/07/2014", - "Violation Code": 21, - "Vehicle Body Type": "SDN", - "Vehicle Make": "HYUND", - "Issuing Agency": "S", - "Street Code1": 24830, - "Street Code2": 67030, - "Street Code3": 64830, - "Vehicle Expiration Date": "01/01/20151124 12:00:00 PM", - "Violation Location": 71, - "Violation Precinct": 71, - "Issuer Precinct": 0, - "Issuer Code": 537860, - "Issuer Command": "KN09", - "Issuer Squad": 0, - "Violation Time": "0842A", - "Time First Observed": "", - "Violation County": "K", - "Violation In Front Of Or Opposite": "F", - "House Number": 1197, - "Street Name": "CARROLL ST", - "Intersecting Street": "", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": "D1", - "Violation Legal Code": "", - "Days Parking In Effect": "YBBYBBB", - "From Hours In Effect": "0830A", - "To Hours In Effect": "1000A", - "Vehicle Color": "BLACK", - "Unregistered Vehicle?": 0, - "Vehicle Year": 2003, - "Meter Number": "-", - "Feet From Curb": 0, - "Violation Post Code": "", - "Violation Description": "", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Summons Number': 1370095480, + 'Plate ID': 'GJZ3562', + 'Registration State': 'NY', + 'Plate Type': 'PAS', + 'Issue Date': '08/07/2014', + 'Violation Code': 21, + 'Vehicle Body Type': 'SDN', + 'Vehicle Make': 'HYUND', + 'Issuing Agency': 'S', + 'Street Code1': 24830, + 'Street Code2': 67030, + 'Street Code3': 64830, + 'Vehicle Expiration Date': '01/01/20151124 12:00:00 PM', + 'Violation Location': 71, + 'Violation Precinct': 71, + 'Issuer Precinct': 0, + 'Issuer Code': 537860, + 'Issuer Command': 'KN09', + 'Issuer Squad': 0, + 'Violation Time': '0842A', + 'Time First Observed': '', + 'Violation County': 'K', + 'Violation In Front Of Or Opposite': 'F', + 'House Number': 1197, + 'Street Name': 'CARROLL ST', + 'Intersecting Street': '', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'D1', + 'Violation Legal Code': '', + 'Days Parking In Effect': 'YBBYBBB', + 'From Hours In Effect': '0830A', + 'To Hours In Effect': '1000A', + 'Vehicle Color': 'BLACK', + 'Unregistered Vehicle?': 0, + 'Vehicle Year': 2003, + 'Meter Number': '-', + 'Feet From Curb': 0, + 'Violation Post Code': '', + 'Violation Description': '', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa83947e" + _id: { + $oid: '5735040085629ed4fa83947e', }, - "Summons Number": { - "$numberLong": "7307439736" + 'Summons Number': { + $numberLong: '7307439736', }, - "Plate ID": "34976JS", - "Registration State": "NY", - "Plate Type": "COM", - "Issue Date": "08/15/2014", - "Violation Code": 37, - "Vehicle Body Type": "VAN", - "Vehicle Make": "CHEVR", - "Issuing Agency": "T", - "Street Code1": 10110, - "Street Code2": 18590, - "Street Code3": 18610, - "Vehicle Expiration Date": "01/01/20150131 12:00:00 PM", - "Violation Location": 19, - "Violation Precinct": 19, - "Issuer Precinct": 19, - "Issuer Code": 356214, - "Issuer Command": "T103", - "Issuer Squad": "O", - "Violation Time": "0848A", - "Time First Observed": "0842A", - "Violation County": "NY", - "Violation In Front Of Or Opposite": "F", - "House Number": 1546, - "Street Name": "2nd Ave", - "Intersecting Street": "", - "Date First Observed": "01/01/20140815 12:00:00 PM", - "Law Section": 408, - "Sub Division": "h1", - "Violation Legal Code": "", - "Days Parking In Effect": "Y", - "From Hours In Effect": "0830A", - "To Hours In Effect": "0700P", - "Vehicle Color": "WH", - "Unregistered Vehicle?": "", - "Vehicle Year": 2005, - "Meter Number": "126-4950", - "Feet From Curb": 0, - "Violation Post Code": "07 7", - "Violation Description": "37-Expired Muni Meter", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Plate ID': '34976JS', + 'Registration State': 'NY', + 'Plate Type': 'COM', + 'Issue Date': '08/15/2014', + 'Violation Code': 37, + 'Vehicle Body Type': 'VAN', + 'Vehicle Make': 'CHEVR', + 'Issuing Agency': 'T', + 'Street Code1': 10110, + 'Street Code2': 18590, + 'Street Code3': 18610, + 'Vehicle Expiration Date': '01/01/20150131 12:00:00 PM', + 'Violation Location': 19, + 'Violation Precinct': 19, + 'Issuer Precinct': 19, + 'Issuer Code': 356214, + 'Issuer Command': 'T103', + 'Issuer Squad': 'O', + 'Violation Time': '0848A', + 'Time First Observed': '0842A', + 'Violation County': 'NY', + 'Violation In Front Of Or Opposite': 'F', + 'House Number': 1546, + 'Street Name': '2nd Ave', + 'Intersecting Street': '', + 'Date First Observed': '01/01/20140815 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'h1', + 'Violation Legal Code': '', + 'Days Parking In Effect': 'Y', + 'From Hours In Effect': '0830A', + 'To Hours In Effect': '0700P', + 'Vehicle Color': 'WH', + 'Unregistered Vehicle?': '', + 'Vehicle Year': 2005, + 'Meter Number': '126-4950', + 'Feet From Curb': 0, + 'Violation Post Code': '07 7', + 'Violation Description': '37-Expired Muni Meter', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa83947f" + _id: { + $oid: '5735040085629ed4fa83947f', }, - "Summons Number": { - "$numberLong": "8003919708" + 'Summons Number': { + $numberLong: '8003919708', }, - "Plate ID": "62958JM", - "Registration State": "NY", - "Plate Type": "COM", - "Issue Date": "10/14/2014", - "Violation Code": 19, - "Vehicle Body Type": "DELV", - "Vehicle Make": "INTER", - "Issuing Agency": "T", - "Street Code1": 20190, - "Street Code2": 14810, - "Street Code3": 14890, - "Vehicle Expiration Date": "01/01/88888888 12:00:00 PM", - "Violation Location": 112, - "Violation Precinct": 112, - "Issuer Precinct": 112, - "Issuer Code": 356951, - "Issuer Command": "T401", - "Issuer Squad": "N", - "Violation Time": "0417P", - "Time First Observed": "", - "Violation County": "Q", - "Violation In Front Of Or Opposite": "O", - "House Number": "70-31", - "Street Name": "108th St", - "Intersecting Street": "", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": "c3", - "Violation Legal Code": "", - "Days Parking In Effect": "YYYYYYY", - "From Hours In Effect": "", - "To Hours In Effect": "", - "Vehicle Color": "BROWN", - "Unregistered Vehicle?": "", - "Vehicle Year": 1997, - "Meter Number": "", - "Feet From Curb": 0, - "Violation Post Code": "K 41", - "Violation Description": "19-No Stand (bus stop)", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Plate ID': '62958JM', + 'Registration State': 'NY', + 'Plate Type': 'COM', + 'Issue Date': '10/14/2014', + 'Violation Code': 19, + 'Vehicle Body Type': 'DELV', + 'Vehicle Make': 'INTER', + 'Issuing Agency': 'T', + 'Street Code1': 20190, + 'Street Code2': 14810, + 'Street Code3': 14890, + 'Vehicle Expiration Date': '01/01/88888888 12:00:00 PM', + 'Violation Location': 112, + 'Violation Precinct': 112, + 'Issuer Precinct': 112, + 'Issuer Code': 356951, + 'Issuer Command': 'T401', + 'Issuer Squad': 'N', + 'Violation Time': '0417P', + 'Time First Observed': '', + 'Violation County': 'Q', + 'Violation In Front Of Or Opposite': 'O', + 'House Number': '70-31', + 'Street Name': '108th St', + 'Intersecting Street': '', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'c3', + 'Violation Legal Code': '', + 'Days Parking In Effect': 'YYYYYYY', + 'From Hours In Effect': '', + 'To Hours In Effect': '', + 'Vehicle Color': 'BROWN', + 'Unregistered Vehicle?': '', + 'Vehicle Year': 1997, + 'Meter Number': '', + 'Feet From Curb': 0, + 'Violation Post Code': 'K 41', + 'Violation Description': '19-No Stand (bus stop)', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa839480" + _id: { + $oid: '5735040085629ed4fa839480', }, - "Summons Number": { - "$numberLong": "7098091911" + 'Summons Number': { + $numberLong: '7098091911', }, - "Plate ID": "37644JE", - "Registration State": "NY", - "Plate Type": "COM", - "Issue Date": "01/29/2015", - "Violation Code": 38, - "Vehicle Body Type": "VAN", - "Vehicle Make": "NS/OT", - "Issuing Agency": "T", - "Street Code1": 61090, - "Street Code2": 12390, - "Street Code3": 12690, - "Vehicle Expiration Date": "01/01/20150930 12:00:00 PM", - "Violation Location": 108, - "Violation Precinct": 108, - "Issuer Precinct": 108, - "Issuer Code": 358566, - "Issuer Command": "T401", - "Issuer Squad": "A", - "Violation Time": "0907A", - "Time First Observed": "", - "Violation County": "Q", - "Violation In Front Of Or Opposite": "F", - "House Number": "59-17", - "Street Name": "Roosevelt Ave", - "Intersecting Street": "", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": "h1", - "Violation Legal Code": "", - "Days Parking In Effect": "Y", - "From Hours In Effect": "0900A", - "To Hours In Effect": "0700P", - "Vehicle Color": "WHITE", - "Unregistered Vehicle?": "", - "Vehicle Year": 2001, - "Meter Number": "", - "Feet From Curb": 0, - "Violation Post Code": "42 4", - "Violation Description": "38-Failure to Display Muni Rec", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Plate ID': '37644JE', + 'Registration State': 'NY', + 'Plate Type': 'COM', + 'Issue Date': '01/29/2015', + 'Violation Code': 38, + 'Vehicle Body Type': 'VAN', + 'Vehicle Make': 'NS/OT', + 'Issuing Agency': 'T', + 'Street Code1': 61090, + 'Street Code2': 12390, + 'Street Code3': 12690, + 'Vehicle Expiration Date': '01/01/20150930 12:00:00 PM', + 'Violation Location': 108, + 'Violation Precinct': 108, + 'Issuer Precinct': 108, + 'Issuer Code': 358566, + 'Issuer Command': 'T401', + 'Issuer Squad': 'A', + 'Violation Time': '0907A', + 'Time First Observed': '', + 'Violation County': 'Q', + 'Violation In Front Of Or Opposite': 'F', + 'House Number': '59-17', + 'Street Name': 'Roosevelt Ave', + 'Intersecting Street': '', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'h1', + 'Violation Legal Code': '', + 'Days Parking In Effect': 'Y', + 'From Hours In Effect': '0900A', + 'To Hours In Effect': '0700P', + 'Vehicle Color': 'WHITE', + 'Unregistered Vehicle?': '', + 'Vehicle Year': 2001, + 'Meter Number': '', + 'Feet From Curb': 0, + 'Violation Post Code': '42 4', + 'Violation Description': '38-Failure to Display Muni Rec', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa839481" + _id: { + $oid: '5735040085629ed4fa839481', }, - "Summons Number": { - "$numberLong": "7350729133" + 'Summons Number': { + $numberLong: '7350729133', }, - "Plate ID": "65776MA", - "Registration State": "NY", - "Plate Type": "COM", - "Issue Date": "03/11/2015", - "Violation Code": 47, - "Vehicle Body Type": "VAN", - "Vehicle Make": "CHEVR", - "Issuing Agency": "T", - "Street Code1": 34970, - "Street Code2": 13610, - "Street Code3": 15710, - "Vehicle Expiration Date": "01/01/20161231 12:00:00 PM", - "Violation Location": 20, - "Violation Precinct": 20, - "Issuer Precinct": 20, - "Issuer Code": 356498, - "Issuer Command": "T103", - "Issuer Squad": "F", - "Violation Time": "1045A", - "Time First Observed": "", - "Violation County": "NY", - "Violation In Front Of Or Opposite": "F", - "House Number": 30, - "Street Name": "W 60th St", - "Intersecting Street": "", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": "l2", - "Violation Legal Code": "", - "Days Parking In Effect": "Y", - "From Hours In Effect": "0706A", - "To Hours In Effect": "0700P", - "Vehicle Color": "WH", - "Unregistered Vehicle?": "", - "Vehicle Year": 2011, - "Meter Number": "", - "Feet From Curb": 0, - "Violation Post Code": "CC1", - "Violation Description": "47-Double PKG-Midtown", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Plate ID': '65776MA', + 'Registration State': 'NY', + 'Plate Type': 'COM', + 'Issue Date': '03/11/2015', + 'Violation Code': 47, + 'Vehicle Body Type': 'VAN', + 'Vehicle Make': 'CHEVR', + 'Issuing Agency': 'T', + 'Street Code1': 34970, + 'Street Code2': 13610, + 'Street Code3': 15710, + 'Vehicle Expiration Date': '01/01/20161231 12:00:00 PM', + 'Violation Location': 20, + 'Violation Precinct': 20, + 'Issuer Precinct': 20, + 'Issuer Code': 356498, + 'Issuer Command': 'T103', + 'Issuer Squad': 'F', + 'Violation Time': '1045A', + 'Time First Observed': '', + 'Violation County': 'NY', + 'Violation In Front Of Or Opposite': 'F', + 'House Number': 30, + 'Street Name': 'W 60th St', + 'Intersecting Street': '', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'l2', + 'Violation Legal Code': '', + 'Days Parking In Effect': 'Y', + 'From Hours In Effect': '0706A', + 'To Hours In Effect': '0700P', + 'Vehicle Color': 'WH', + 'Unregistered Vehicle?': '', + 'Vehicle Year': 2011, + 'Meter Number': '', + 'Feet From Curb': 0, + 'Violation Post Code': 'CC1', + 'Violation Description': '47-Double PKG-Midtown', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa839482" + _id: { + $oid: '5735040085629ed4fa839482', }, - "Summons Number": { - "$numberLong": "7798742244" + 'Summons Number': { + $numberLong: '7798742244', }, - "Plate ID": "EWD3297", - "Registration State": "NY", - "Plate Type": "PAS", - "Issue Date": "03/07/2015", - "Violation Code": 71, - "Vehicle Body Type": "SUBN", - "Vehicle Make": "NISSA", - "Issuing Agency": "T", - "Street Code1": 59220, - "Street Code2": 59720, - "Street Code3": 55720, - "Vehicle Expiration Date": "01/01/20151207 12:00:00 PM", - "Violation Location": 43, - "Violation Precinct": 43, - "Issuer Precinct": 43, - "Issuer Code": 358648, - "Issuer Command": "T202", - "Issuer Squad": "M", - "Violation Time": "0906A", - "Time First Observed": "", - "Violation County": "BX", - "Violation In Front Of Or Opposite": "F", - "House Number": 2010, - "Street Name": "Powell Ave", - "Intersecting Street": "", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": "j6", - "Violation Legal Code": "", - "Days Parking In Effect": "YYYYYYY", - "From Hours In Effect": "", - "To Hours In Effect": "", - "Vehicle Color": "WH", - "Unregistered Vehicle?": "", - "Vehicle Year": 2014, - "Meter Number": "", - "Feet From Curb": 0, - "Violation Post Code": "A 22", - "Violation Description": "71A-Insp Sticker Expired (NYS)", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Plate ID': 'EWD3297', + 'Registration State': 'NY', + 'Plate Type': 'PAS', + 'Issue Date': '03/07/2015', + 'Violation Code': 71, + 'Vehicle Body Type': 'SUBN', + 'Vehicle Make': 'NISSA', + 'Issuing Agency': 'T', + 'Street Code1': 59220, + 'Street Code2': 59720, + 'Street Code3': 55720, + 'Vehicle Expiration Date': '01/01/20151207 12:00:00 PM', + 'Violation Location': 43, + 'Violation Precinct': 43, + 'Issuer Precinct': 43, + 'Issuer Code': 358648, + 'Issuer Command': 'T202', + 'Issuer Squad': 'M', + 'Violation Time': '0906A', + 'Time First Observed': '', + 'Violation County': 'BX', + 'Violation In Front Of Or Opposite': 'F', + 'House Number': 2010, + 'Street Name': 'Powell Ave', + 'Intersecting Street': '', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'j6', + 'Violation Legal Code': '', + 'Days Parking In Effect': 'YYYYYYY', + 'From Hours In Effect': '', + 'To Hours In Effect': '', + 'Vehicle Color': 'WH', + 'Unregistered Vehicle?': '', + 'Vehicle Year': 2014, + 'Meter Number': '', + 'Feet From Curb': 0, + 'Violation Post Code': 'A 22', + 'Violation Description': '71A-Insp Sticker Expired (NYS)', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa839483" + _id: { + $oid: '5735040085629ed4fa839483', }, - "Summons Number": { - "$numberLong": "7188999776" + 'Summons Number': { + $numberLong: '7188999776', }, - "Plate ID": "BCS4502", - "Registration State": "NY", - "Plate Type": "PAS", - "Issue Date": "03/25/2015", - "Violation Code": 71, - "Vehicle Body Type": "4DSD", - "Vehicle Make": "NISSA", - "Issuing Agency": "T", - "Street Code1": 27270, - "Street Code2": 40220, - "Street Code3": 9520, - "Vehicle Expiration Date": "01/01/20160303 12:00:00 PM", - "Violation Location": 48, - "Violation Precinct": 48, - "Issuer Precinct": 48, - "Issuer Code": 361903, - "Issuer Command": "T201", - "Issuer Squad": "H", - "Violation Time": "1013A", - "Time First Observed": "", - "Violation County": "BX", - "Violation In Front Of Or Opposite": "F", - "House Number": 587, - "Street Name": "E 187th St", - "Intersecting Street": "", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": "j6", - "Violation Legal Code": "", - "Days Parking In Effect": "YYYYYYY", - "From Hours In Effect": "", - "To Hours In Effect": "", - "Vehicle Color": "BK", - "Unregistered Vehicle?": "", - "Vehicle Year": 2002, - "Meter Number": "", - "Feet From Curb": 0, - "Violation Post Code": "58 2", - "Violation Description": "71A-Insp Sticker Expired (NYS)", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Plate ID': 'BCS4502', + 'Registration State': 'NY', + 'Plate Type': 'PAS', + 'Issue Date': '03/25/2015', + 'Violation Code': 71, + 'Vehicle Body Type': '4DSD', + 'Vehicle Make': 'NISSA', + 'Issuing Agency': 'T', + 'Street Code1': 27270, + 'Street Code2': 40220, + 'Street Code3': 9520, + 'Vehicle Expiration Date': '01/01/20160303 12:00:00 PM', + 'Violation Location': 48, + 'Violation Precinct': 48, + 'Issuer Precinct': 48, + 'Issuer Code': 361903, + 'Issuer Command': 'T201', + 'Issuer Squad': 'H', + 'Violation Time': '1013A', + 'Time First Observed': '', + 'Violation County': 'BX', + 'Violation In Front Of Or Opposite': 'F', + 'House Number': 587, + 'Street Name': 'E 187th St', + 'Intersecting Street': '', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'j6', + 'Violation Legal Code': '', + 'Days Parking In Effect': 'YYYYYYY', + 'From Hours In Effect': '', + 'To Hours In Effect': '', + 'Vehicle Color': 'BK', + 'Unregistered Vehicle?': '', + 'Vehicle Year': 2002, + 'Meter Number': '', + 'Feet From Curb': 0, + 'Violation Post Code': '58 2', + 'Violation Description': '71A-Insp Sticker Expired (NYS)', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa839484" + _id: { + $oid: '5735040085629ed4fa839484', }, - "Summons Number": 1375410519, - "Plate ID": "GMR8682", - "Registration State": "NY", - "Plate Type": "PAS", - "Issue Date": "10/05/2014", - "Violation Code": 71, - "Vehicle Body Type": "SUBN", - "Vehicle Make": "KIA", - "Issuing Agency": "P", - "Street Code1": 35670, - "Street Code2": 22390, - "Street Code3": 35807, - "Vehicle Expiration Date": "01/01/20160601 12:00:00 PM", - "Violation Location": 113, - "Violation Precinct": 113, - "Issuer Precinct": 113, - "Issuer Code": 952110, - "Issuer Command": 113, - "Issuer Squad": 0, - "Violation Time": "0520P", - "Time First Observed": "", - "Violation County": "Q", - "Violation In Front Of Or Opposite": "F", - "House Number": "137-73", - "Street Name": "BELKNAP ST", - "Intersecting Street": "", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": "J7", - "Violation Legal Code": "", - "Days Parking In Effect": "BBBBBBB", - "From Hours In Effect": "ALL", - "To Hours In Effect": "ALL", - "Vehicle Color": "TAN", - "Unregistered Vehicle?": 0, - "Vehicle Year": 2011, - "Meter Number": "-", - "Feet From Curb": 0, - "Violation Post Code": "", - "Violation Description": "", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Summons Number': 1375410519, + 'Plate ID': 'GMR8682', + 'Registration State': 'NY', + 'Plate Type': 'PAS', + 'Issue Date': '10/05/2014', + 'Violation Code': 71, + 'Vehicle Body Type': 'SUBN', + 'Vehicle Make': 'KIA', + 'Issuing Agency': 'P', + 'Street Code1': 35670, + 'Street Code2': 22390, + 'Street Code3': 35807, + 'Vehicle Expiration Date': '01/01/20160601 12:00:00 PM', + 'Violation Location': 113, + 'Violation Precinct': 113, + 'Issuer Precinct': 113, + 'Issuer Code': 952110, + 'Issuer Command': 113, + 'Issuer Squad': 0, + 'Violation Time': '0520P', + 'Time First Observed': '', + 'Violation County': 'Q', + 'Violation In Front Of Or Opposite': 'F', + 'House Number': '137-73', + 'Street Name': 'BELKNAP ST', + 'Intersecting Street': '', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'J7', + 'Violation Legal Code': '', + 'Days Parking In Effect': 'BBBBBBB', + 'From Hours In Effect': 'ALL', + 'To Hours In Effect': 'ALL', + 'Vehicle Color': 'TAN', + 'Unregistered Vehicle?': 0, + 'Vehicle Year': 2011, + 'Meter Number': '-', + 'Feet From Curb': 0, + 'Violation Post Code': '', + 'Violation Description': '', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa839485" + _id: { + $oid: '5735040085629ed4fa839485', }, - "Summons Number": { - "$numberLong": "7010260047" + 'Summons Number': { + $numberLong: '7010260047', }, - "Plate ID": "72541MA", - "Registration State": "NY", - "Plate Type": "COM", - "Issue Date": "05/18/2015", - "Violation Code": 16, - "Vehicle Body Type": "VAN", - "Vehicle Make": "FORD", - "Issuing Agency": "T", - "Street Code1": 18290, - "Street Code2": 24890, - "Street Code3": 10210, - "Vehicle Expiration Date": "01/01/20170228 12:00:00 PM", - "Violation Location": 19, - "Violation Precinct": 19, - "Issuer Precinct": 19, - "Issuer Code": 357327, - "Issuer Command": "T103", - "Issuer Squad": "E", - "Violation Time": "0930A", - "Time First Observed": "0852A", - "Violation County": "NY", - "Violation In Front Of Or Opposite": "F", - "House Number": 160, - "Street Name": "E 65th St", - "Intersecting Street": "", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": "k2", - "Violation Legal Code": "", - "Days Parking In Effect": "Y", - "From Hours In Effect": "0800A", - "To Hours In Effect": "0700P", - "Vehicle Color": "WH", - "Unregistered Vehicle?": "", - "Vehicle Year": 2011, - "Meter Number": "", - "Feet From Curb": 0, - "Violation Post Code": "26 7", - "Violation Description": "16-No Std (Com Veh) Com Plate", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Plate ID': '72541MA', + 'Registration State': 'NY', + 'Plate Type': 'COM', + 'Issue Date': '05/18/2015', + 'Violation Code': 16, + 'Vehicle Body Type': 'VAN', + 'Vehicle Make': 'FORD', + 'Issuing Agency': 'T', + 'Street Code1': 18290, + 'Street Code2': 24890, + 'Street Code3': 10210, + 'Vehicle Expiration Date': '01/01/20170228 12:00:00 PM', + 'Violation Location': 19, + 'Violation Precinct': 19, + 'Issuer Precinct': 19, + 'Issuer Code': 357327, + 'Issuer Command': 'T103', + 'Issuer Squad': 'E', + 'Violation Time': '0930A', + 'Time First Observed': '0852A', + 'Violation County': 'NY', + 'Violation In Front Of Or Opposite': 'F', + 'House Number': 160, + 'Street Name': 'E 65th St', + 'Intersecting Street': '', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'k2', + 'Violation Legal Code': '', + 'Days Parking In Effect': 'Y', + 'From Hours In Effect': '0800A', + 'To Hours In Effect': '0700P', + 'Vehicle Color': 'WH', + 'Unregistered Vehicle?': '', + 'Vehicle Year': 2011, + 'Meter Number': '', + 'Feet From Curb': 0, + 'Violation Post Code': '26 7', + 'Violation Description': '16-No Std (Com Veh) Com Plate', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa839486" + _id: { + $oid: '5735040085629ed4fa839486', }, - "Summons Number": { - "$numberLong": "7789198993" + 'Summons Number': { + $numberLong: '7789198993', }, - "Plate ID": "FHM2444", - "Registration State": "NY", - "Plate Type": "PAS", - "Issue Date": "09/01/2014", - "Violation Code": 71, - "Vehicle Body Type": "SUBN", - "Vehicle Make": "GMC", - "Issuing Agency": "T", - "Street Code1": 37090, - "Street Code2": 40404, - "Street Code3": 40404, - "Vehicle Expiration Date": "01/01/20150216 12:00:00 PM", - "Violation Location": 115, - "Violation Precinct": 115, - "Issuer Precinct": 115, - "Issuer Code": 358919, - "Issuer Command": "T401", - "Issuer Squad": "J", - "Violation Time": "0144P", - "Time First Observed": "", - "Violation County": "Q", - "Violation In Front Of Or Opposite": "F", - "House Number": "87-40", - "Street Name": "Brisbin St", - "Intersecting Street": "", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": "j6", - "Violation Legal Code": "", - "Days Parking In Effect": "YYYYYYY", - "From Hours In Effect": "", - "To Hours In Effect": "", - "Vehicle Color": "GY", - "Unregistered Vehicle?": "", - "Vehicle Year": 2004, - "Meter Number": "", - "Feet From Curb": 0, - "Violation Post Code": "23 4", - "Violation Description": "71A-Insp Sticker Expired (NYS)", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" + 'Plate ID': 'FHM2444', + 'Registration State': 'NY', + 'Plate Type': 'PAS', + 'Issue Date': '09/01/2014', + 'Violation Code': 71, + 'Vehicle Body Type': 'SUBN', + 'Vehicle Make': 'GMC', + 'Issuing Agency': 'T', + 'Street Code1': 37090, + 'Street Code2': 40404, + 'Street Code3': 40404, + 'Vehicle Expiration Date': '01/01/20150216 12:00:00 PM', + 'Violation Location': 115, + 'Violation Precinct': 115, + 'Issuer Precinct': 115, + 'Issuer Code': 358919, + 'Issuer Command': 'T401', + 'Issuer Squad': 'J', + 'Violation Time': '0144P', + 'Time First Observed': '', + 'Violation County': 'Q', + 'Violation In Front Of Or Opposite': 'F', + 'House Number': '87-40', + 'Street Name': 'Brisbin St', + 'Intersecting Street': '', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'j6', + 'Violation Legal Code': '', + 'Days Parking In Effect': 'YYYYYYY', + 'From Hours In Effect': '', + 'To Hours In Effect': '', + 'Vehicle Color': 'GY', + 'Unregistered Vehicle?': '', + 'Vehicle Year': 2004, + 'Meter Number': '', + 'Feet From Curb': 0, + 'Violation Post Code': '23 4', + 'Violation Description': '71A-Insp Sticker Expired (NYS)', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', }, { - "_id": { - "$oid": "5735040085629ed4fa839487" + _id: { + $oid: '5735040085629ed4fa839487', }, - "Summons Number": { - "$numberLong": "7446300474" + 'Summons Number': { + $numberLong: '7446300474', }, - "Plate ID": 2336837, - "Registration State": "ME", - "Plate Type": "PAS", - "Issue Date": "07/17/2014", - "Violation Code": 66, - "Vehicle Body Type": "TRLR", - "Vehicle Make": "NS/OT", - "Issuing Agency": "T", - "Street Code1": 0, - "Street Code2": 0, - "Street Code3": 0, - "Vehicle Expiration Date": "01/01/88880088 12:00:00 PM", - "Violation Location": 104, - "Violation Precinct": 104, - "Issuer Precinct": 104, - "Issuer Code": 341263, - "Issuer Command": "T803", - "Issuer Squad": "A", - "Violation Time": "1156P", - "Time First Observed": "", - "Violation County": "Q", - "Violation In Front Of Or Opposite": "I", - "House Number": "N", - "Street Name": "Borden Ave", - "Intersecting Street": "544ft E/of Maurice A", - "Date First Observed": "01/05/0001 12:00:00 PM", - "Law Section": 408, - "Sub Division": "k4", - "Violation Legal Code": "", - "Days Parking In Effect": "", - "From Hours In Effect": "", - "To Hours In Effect": "", - "Vehicle Color": "WHITE", - "Unregistered Vehicle?": "", - "Vehicle Year": 0, - "Meter Number": "", - "Feet From Curb": 0, - "Violation Post Code": "E 42", - "Violation Description": "66-Detached Trailer", - "No Standing or Stopping Violation": "", - "Hydrant Violation": "", - "Double Parking Violation": "" - } -] + 'Plate ID': 2336837, + 'Registration State': 'ME', + 'Plate Type': 'PAS', + 'Issue Date': '07/17/2014', + 'Violation Code': 66, + 'Vehicle Body Type': 'TRLR', + 'Vehicle Make': 'NS/OT', + 'Issuing Agency': 'T', + 'Street Code1': 0, + 'Street Code2': 0, + 'Street Code3': 0, + 'Vehicle Expiration Date': '01/01/88880088 12:00:00 PM', + 'Violation Location': 104, + 'Violation Precinct': 104, + 'Issuer Precinct': 104, + 'Issuer Code': 341263, + 'Issuer Command': 'T803', + 'Issuer Squad': 'A', + 'Violation Time': '1156P', + 'Time First Observed': '', + 'Violation County': 'Q', + 'Violation In Front Of Or Opposite': 'I', + 'House Number': 'N', + 'Street Name': 'Borden Ave', + 'Intersecting Street': '544ft E/of Maurice A', + 'Date First Observed': '01/05/0001 12:00:00 PM', + 'Law Section': 408, + 'Sub Division': 'k4', + 'Violation Legal Code': '', + 'Days Parking In Effect': '', + 'From Hours In Effect': '', + 'To Hours In Effect': '', + 'Vehicle Color': 'WHITE', + 'Unregistered Vehicle?': '', + 'Vehicle Year': 0, + 'Meter Number': '', + 'Feet From Curb': 0, + 'Violation Post Code': 'E 42', + 'Violation Description': '66-Detached Trailer', + 'No Standing or Stopping Violation': '', + 'Hydrant Violation': '', + 'Double Parking Violation': '', + }, +]; diff --git a/packages/compass-generative-ai/tests/evals/use-cases/index.ts b/packages/compass-generative-ai/tests/evals/use-cases/index.ts index 04f971d9587..44091d5fad5 100644 --- a/packages/compass-generative-ai/tests/evals/use-cases/index.ts +++ b/packages/compass-generative-ai/tests/evals/use-cases/index.ts @@ -1,6 +1,6 @@ import { findQueries } from './find-query'; import { aggregateQueries } from './aggregate-query'; -import * as toNS from 'mongodb-ns'; +import toNS from 'mongodb-ns'; export type GenAiUsecase = { namespace: string; From 79e99107cce460ec77144a3782cabed3af08fe9a Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Thu, 11 Dec 2025 00:33:16 +0300 Subject: [PATCH 27/35] clean up scorer --- .../compass-generative-ai/tests/evals/scorers.ts | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/packages/compass-generative-ai/tests/evals/scorers.ts b/packages/compass-generative-ai/tests/evals/scorers.ts index 60e0acb2d45..6483b81ba87 100644 --- a/packages/compass-generative-ai/tests/evals/scorers.ts +++ b/packages/compass-generative-ai/tests/evals/scorers.ts @@ -1,10 +1,6 @@ import type { ConversationEvalScorer } from './types'; import { Factuality as _Factuality } from 'autoevals'; import { allText } from './utils'; -import { createNoopLogger } from '@mongodb-js/compass-logging/provider'; -import { parseXmlToMmsJsonResponse } from '../../src/utils/xml-to-mms-response'; - -const logger = createNoopLogger(); export const Factuality: ConversationEvalScorer = ({ input, @@ -13,12 +9,8 @@ export const Factuality: ConversationEvalScorer = ({ }) => { return _Factuality({ input: allText(input.messages), - output: JSON.stringify( - parseXmlToMmsJsonResponse(allText(output.messages), logger) - ), - expected: JSON.stringify( - parseXmlToMmsJsonResponse(allText(expected.messages), logger) - ), + output: allText(output.messages), + expected: allText(expected.messages), model: 'gpt-4.1', temperature: undefined, }); From 3bc72953b4e6f189d542414b849b56e3ccda4115 Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Thu, 11 Dec 2025 09:07:09 +0300 Subject: [PATCH 28/35] bootstrap --- package-lock.json | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/package-lock.json b/package-lock.json index 7dfa7ec7353..07bc43caa9b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49655,10 +49655,13 @@ "@types/mocha": "^9.0.0", "@types/react": "^17.0.5", "@types/sinon-chai": "^3.2.5", + "autoevals": "^0.0.130", + "braintrust": "^0.2.4", "chai": "^4.3.6", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", + "mongodb-ns": "^3.1.0", "nyc": "^15.1.0", "p-queue": "^7.4.1", "sinon": "^9.2.3", @@ -49749,6 +49752,13 @@ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true }, + "packages/compass-generative-ai/node_modules/mongodb-ns": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mongodb-ns/-/mongodb-ns-3.1.0.tgz", + "integrity": "sha512-oe5gL723bQ+C4purCXIQTeDlAfendC2hs4KqlPPat8DozQZU6vtg3TgIJOJKVpcMgmAVyt39FRolOJh4htnsTg==", + "dev": true, + "license": "Apache-2.0" + }, "packages/compass-generative-ai/node_modules/p-queue": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz", @@ -62533,6 +62543,8 @@ "@types/react": "^17.0.5", "@types/sinon-chai": "^3.2.5", "ai": "^5.0.26", + "autoevals": "^0.0.130", + "braintrust": "^0.2.4", "bson": "^6.10.4", "chai": "^4.3.6", "compass-preferences-model": "^2.66.3", @@ -62540,6 +62552,7 @@ "electron-mocha": "^12.2.0", "mocha": "^10.2.0", "mongodb": "^6.19.0", + "mongodb-ns": "^3.1.0", "mongodb-query-parser": "^4.5.0", "mongodb-schema": "^12.6.3", "nyc": "^15.1.0", @@ -62606,6 +62619,12 @@ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true }, + "mongodb-ns": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mongodb-ns/-/mongodb-ns-3.1.0.tgz", + "integrity": "sha512-oe5gL723bQ+C4purCXIQTeDlAfendC2hs4KqlPPat8DozQZU6vtg3TgIJOJKVpcMgmAVyt39FRolOJh4htnsTg==", + "dev": true + }, "p-queue": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz", From eb494939c120ec8575a3273f153feba623b7190b Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Thu, 11 Dec 2025 09:11:42 +0300 Subject: [PATCH 29/35] remove extra files --- .../src/utils/xml-to-mms-response.spec.ts | 125 ------------------ .../src/utils/xml-to-mms-response.ts | 101 -------------- 2 files changed, 226 deletions(-) delete mode 100644 packages/compass-generative-ai/src/utils/xml-to-mms-response.spec.ts delete mode 100644 packages/compass-generative-ai/src/utils/xml-to-mms-response.ts diff --git a/packages/compass-generative-ai/src/utils/xml-to-mms-response.spec.ts b/packages/compass-generative-ai/src/utils/xml-to-mms-response.spec.ts deleted file mode 100644 index 863d42ad502..00000000000 --- a/packages/compass-generative-ai/src/utils/xml-to-mms-response.spec.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { expect } from 'chai'; -import { parseXmlToMmsJsonResponse } from './xml-to-mms-response'; -import type { Logger } from '@mongodb-js/compass-logging'; - -const loggerMock = { - log: { - warn: () => { - /* noop */ - }, - }, - mongoLogId: (id: number) => id, -} as unknown as Logger; -describe('parseXmlToMmsJsonResponse', function () { - it('should return prioritize aggregation over query when available and valid', function () { - const xmlString = ` - { age: { $gt: 25 } } - [{ $match: { status: "A" } }] - `; - - const result = parseXmlToMmsJsonResponse(xmlString, loggerMock); - - expect(result).to.deep.equal({ - content: { - aggregation: { - pipeline: "[{$match:{status:'A'}}]", - }, - query: { - filter: null, - project: null, - sort: null, - skip: null, - limit: null, - }, - }, - }); - }); - - it('should not return aggregation if its not available in the response', function () { - const xmlString = ` - { age: { $gt: 25 } } - `; - - const result = parseXmlToMmsJsonResponse(xmlString, loggerMock); - expect(result).to.deep.equal({ - content: { - query: { - filter: '{age:{$gt:25}}', - project: null, - sort: null, - skip: null, - limit: null, - }, - }, - }); - }); - - it('should not return query if its not available in the response', function () { - const xmlString = ` - [{ $match: { status: "A" } }] - `; - - const result = parseXmlToMmsJsonResponse(xmlString, loggerMock); - - expect(result).to.deep.equal({ - content: { - aggregation: { - pipeline: "[{$match:{status:'A'}}]", - }, - }, - }); - }); - - it('should return all the query fields if provided', function () { - const xmlString = ` - { age: { $gt: 25 } } - { name: 1, age: 1 } - { age: -1 } - 5 - 10 - - `; - - const result = parseXmlToMmsJsonResponse(xmlString, loggerMock); - - expect(result).to.deep.equal({ - content: { - query: { - filter: '{age:{$gt:25}}', - project: '{name:1,age:1}', - sort: '{age:-1}', - skip: '5', - limit: '10', - }, - }, - }); - }); - - context('it should handle invalid data', function () { - it('invalid json', function () { - const result = parseXmlToMmsJsonResponse( - `{ age: { $gt: 25 `, - loggerMock - ); - expect(result.content).to.not.have.property('query'); - }); - it('empty object', function () { - const result = parseXmlToMmsJsonResponse( - `{}`, - loggerMock - ); - expect(result.content).to.not.have.property('query'); - }); - it('empty array', function () { - const result = parseXmlToMmsJsonResponse( - `[]`, - loggerMock - ); - expect(result.content).to.not.have.property('aggregation'); - }); - it('zero value', function () { - const result = parseXmlToMmsJsonResponse(`0`, loggerMock); - expect(result.content).to.not.have.property('query'); - }); - }); -}); diff --git a/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts b/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts deleted file mode 100644 index 9287d35f6e2..00000000000 --- a/packages/compass-generative-ai/src/utils/xml-to-mms-response.ts +++ /dev/null @@ -1,101 +0,0 @@ -import type { Logger } from '@mongodb-js/compass-logging'; -import parse, { toJSString } from 'mongodb-query-parser'; - -type MmsJsonResponse = { - content: { - query?: { - filter: string | null; - project: string | null; - sort: string | null; - skip: string | null; - limit: string | null; - }; - aggregation?: { - pipeline: string; - }; - }; -}; - -export function parseXmlToMmsJsonResponse( - xmlString: string, - logger: Logger -): MmsJsonResponse { - const expectedTags = [ - 'filter', - 'project', - 'sort', - 'skip', - 'limit', - 'aggregation', - ] as const; - - // Currently the prompt forces LLM to return xml-styled data - const result: Record<(typeof expectedTags)[number], string | null> = { - filter: null, - project: null, - sort: null, - skip: null, - limit: null, - aggregation: null, - }; - for (const tag of expectedTags) { - const regex = new RegExp(`<${tag}>([\\s\\S]*?)<\\/${tag}>`, 'i'); - const match = xmlString.match(regex); - if (match && match[1]) { - const value = match[1].trim(); - try { - const tagValue = parse(value); - if ( - !tagValue || - (typeof tagValue === 'object' && Object.keys(tagValue).length === 0) - ) { - result[tag] = null; - } else { - // No indentation - result[tag] = toJSString(tagValue, 0) ?? null; - } - } catch (e) { - logger.log.warn( - logger.mongoLogId(1_001_000_384), - 'AtlasAiService', - `Failed to parse value for tag <${tag}>: ${value}`, - { error: e } - ); - result[tag] = null; - } - } - } - - const { aggregation, ...query } = result; - const isQueryEmpty = Object.values(query).every((v) => v === null); - - // It prioritizes aggregation over query if both are present - if (aggregation && !isQueryEmpty) { - return { - content: { - aggregation: { - pipeline: aggregation, - }, - query: { - filter: null, - project: null, - sort: null, - skip: null, - limit: null, - }, - }, - }; - } - return { - content: { - ...(aggregation - ? { - aggregation: { - pipeline: aggregation, - }, - } - : {}), - ...(isQueryEmpty ? {} : { query }), - }, - }; -} From edc5e73d91d3a108ba615ca71cba376c8282b1fc Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Mon, 15 Dec 2025 10:18:54 +0300 Subject: [PATCH 30/35] bootstrap --- package-lock.json | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/package-lock.json b/package-lock.json index 56a1699c5c0..62d136bf1eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47572,6 +47572,7 @@ "@mongodb-js/workspace-info": "^1.0.0", "ai": "^5.0.26", "compass-preferences-model": "^2.66.3", + "mongodb-collection-model": "^5.37.0", "mongodb-connection-string-url": "^3.0.1", "react": "^17.0.2", "throttleit": "^2.1.0", @@ -47829,6 +47830,7 @@ "@mongodb-js/atlas-service": "^0.73.0", "@mongodb-js/compass-app-registry": "^9.4.29", "@mongodb-js/compass-app-stores": "^7.75.0", + "@mongodb-js/compass-assistant": "^1.20.0", "@mongodb-js/compass-components": "^1.59.2", "@mongodb-js/compass-connections": "^1.89.0", "@mongodb-js/compass-editor": "^0.61.2", @@ -49713,10 +49715,13 @@ "@types/mocha": "^9.0.0", "@types/react": "^17.0.5", "@types/sinon-chai": "^3.2.5", + "autoevals": "^0.0.130", + "braintrust": "^0.2.4", "chai": "^4.3.6", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", + "mongodb-ns": "^3.1.0", "nyc": "^15.1.0", "p-queue": "^7.4.1", "sinon": "^9.2.3", @@ -49807,6 +49812,13 @@ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true }, + "packages/compass-generative-ai/node_modules/mongodb-ns": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mongodb-ns/-/mongodb-ns-3.1.0.tgz", + "integrity": "sha512-oe5gL723bQ+C4purCXIQTeDlAfendC2hs4KqlPPat8DozQZU6vtg3TgIJOJKVpcMgmAVyt39FRolOJh4htnsTg==", + "dev": true, + "license": "Apache-2.0" + }, "packages/compass-generative-ai/node_modules/p-queue": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz", @@ -61219,6 +61231,7 @@ "compass-preferences-model": "^2.66.3", "depcheck": "^1.4.1", "mocha": "^10.2.0", + "mongodb-collection-model": "^5.37.0", "mongodb-connection-string-url": "^3.0.1", "nyc": "^15.1.0", "openai": "^4.104.0", @@ -61395,6 +61408,7 @@ "@mongodb-js/atlas-service": "^0.73.0", "@mongodb-js/compass-app-registry": "^9.4.29", "@mongodb-js/compass-app-stores": "^7.75.0", + "@mongodb-js/compass-assistant": "^1.20.0", "@mongodb-js/compass-components": "^1.59.2", "@mongodb-js/compass-connections": "^1.89.0", "@mongodb-js/compass-editor": "^0.61.2", @@ -62668,6 +62682,8 @@ "@types/react": "^17.0.5", "@types/sinon-chai": "^3.2.5", "ai": "^5.0.26", + "autoevals": "^0.0.130", + "braintrust": "^0.2.4", "bson": "^6.10.4", "chai": "^4.3.6", "compass-preferences-model": "^2.66.3", @@ -62675,6 +62691,7 @@ "electron-mocha": "^12.2.0", "mocha": "^10.2.0", "mongodb": "^6.19.0", + "mongodb-ns": "^3.1.0", "mongodb-query-parser": "^4.6.0", "mongodb-schema": "^12.6.3", "nyc": "^15.1.0", @@ -62741,6 +62758,12 @@ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true }, + "mongodb-ns": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mongodb-ns/-/mongodb-ns-3.1.0.tgz", + "integrity": "sha512-oe5gL723bQ+C4purCXIQTeDlAfendC2hs4KqlPPat8DozQZU6vtg3TgIJOJKVpcMgmAVyt39FRolOJh4htnsTg==", + "dev": true + }, "p-queue": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz", From 718e8b7b0e3c0ba4274e2417797eb067d55ead97 Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Mon, 15 Dec 2025 11:39:05 +0300 Subject: [PATCH 31/35] fix prompts and data --- .../tests/evals/chatbot-api.ts | 2 +- .../fixtures/airbnb.listingsAndReviews.ts | 12296 +++++++++++++++- .../tests/evals/use-cases/aggregate-query.ts | 51 +- .../tests/evals/use-cases/find-query.ts | 33 +- .../tests/evals/use-cases/index.ts | 3 +- 5 files changed, 11578 insertions(+), 807 deletions(-) diff --git a/packages/compass-generative-ai/tests/evals/chatbot-api.ts b/packages/compass-generative-ai/tests/evals/chatbot-api.ts index a1a96577089..0dc4e271191 100644 --- a/packages/compass-generative-ai/tests/evals/chatbot-api.ts +++ b/packages/compass-generative-ai/tests/evals/chatbot-api.ts @@ -11,7 +11,7 @@ export async function makeChatbotCall( const openai = createOpenAI({ baseURL: process.env.COMPASS_ASSISTANT_BASE_URL_OVERRIDE ?? - 'https://knowledge.mongodb.com/api/v1', + 'https://eval.knowledge-dev.mongodb.com/api/v1', apiKey: '', headers: { 'X-Request-Origin': 'compass-gen-ai-braintrust', diff --git a/packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.ts b/packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.ts index efc4a64eabc..5812d7b669d 100644 --- a/packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.ts +++ b/packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.ts @@ -1,122 +1,215 @@ export default [ { - _id: '10006546', - listing_url: 'https://www.airbnb.com/rooms/10006546', - name: 'Ribeira Charming Duplex', - interaction: 'Cot - 10 € / night Dog - € 7,5 / night', - house_rules: 'Make the house your home...', - property_type: 'House', + _id: '10117617', + listing_url: 'https://www.airbnb.com/rooms/10117617', + name: 'A Casa Alegre é um apartamento T1.', + notes: '', + property_type: 'Apartment', room_type: 'Entire home/apt', bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '30', + minimum_nights: '7', + maximum_nights: '180', cancellation_policy: 'moderate', last_scraped: { - $date: { - $numberLong: '1550293200000', - }, + $date: '2019-02-16T05:00:00.000Z', }, calendar_last_scraped: { - $date: { - $numberLong: '1550293200000', - }, + $date: '2019-02-16T05:00:00.000Z', }, first_review: { - $date: { - $numberLong: '1451797200000', - }, + $date: '2016-04-19T04:00:00.000Z', }, last_review: { - $date: { - $numberLong: '1547960400000', - }, + $date: '2017-08-27T04:00:00.000Z', }, - accommodates: 8, - bedrooms: 3, - beds: 5, - number_of_reviews: 51, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 12, bathrooms: { $numberDecimal: '1.0', }, + amenities: [ + 'TV', + 'Kitchen', + 'Elevator', + 'Buzzer/wireless intercom', + 'Heating', + 'Family/kid friendly', + 'Washer', + 'First aid kit', + 'Safety card', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + 'Hangers', + 'Iron', + 'Laptop friendly workspace', + 'translation missing: en.hosting_amenity_49', + 'Bathtub', + 'Beachfront', + ], price: { - $numberDecimal: '80.00', + $numberDecimal: '40.00', }, security_deposit: { - $numberDecimal: '200.00', + $numberDecimal: '250.00', }, cleaning_fee: { - $numberDecimal: '35.00', + $numberDecimal: '15.00', }, extra_people: { - $numberDecimal: '15.00', + $numberDecimal: '0.00', }, guests_included: { - $numberDecimal: '6', + $numberDecimal: '2', }, images: { thumbnail_url: '', medium_url: '', picture_url: - 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + 'https://a0.muscache.com/im/pictures/8845f3f6-9775-4c14-9486-fe0997611bda.jpg?aki_policy=large', xl_picture_url: '', }, + host: { + host_id: '51920973', + host_url: 'https://www.airbnb.com/users/show/51920973', + host_name: 'Manuela', + host_location: 'Porto, Porto District, Portugal', + host_about: + 'Sou uma pessoa que gosta de viajar, conhecer museus, visitar exposições e cinema.\r\nTambém gosto de passear pelas zonas históricas das cidades e contemplar as suas edificações.', + host_response_time: 'within a day', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/bb526001-78b2-472d-9663-c3d02a27f4ce.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/bb526001-78b2-472d-9663-c3d02a27f4ce.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'government_id', + ], + }, address: { - street: 'Porto, Porto, Portugal', + street: 'Vila do Conde, Porto, Portugal', suburb: '', - government_area: 'Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória', + government_area: 'Vila do Conde', market: 'Porto', country: 'Portugal', country_code: 'PT', location: { type: 'Point', - coordinates: [-8.61308, 41.1413], + coordinates: [-8.75383, 41.3596], is_location_exact: false, }, }, availability: { - availability_30: 28, - availability_60: 47, - availability_90: 74, - availability_365: 239, + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 46, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 9, + review_scores_value: 10, + review_scores_rating: 96, }, - host_id: '51399391', }, { - _id: '10009999', - listing_url: 'https://www.airbnb.com/rooms/10009999', - name: 'Horto flat with small garden', - interaction: - 'I´ll be happy to help you with any doubts, tips or any other information needed during your stay.', - house_rules: - 'I just hope the guests treat the space as they´re own, with respect to it as well as to my neighbours! Espero apenas que os hóspedes tratem o lugar com carinho e respeito aos vizinhos!', + _id: '10108388', + listing_url: 'https://www.airbnb.com/rooms/10108388', + name: 'Sydney Hyde Park City Apartment (checkin from 6am)', + notes: + 'IMPORTANT: Our apartment is privately owned and serviced. It is not part of the hotel that is operated from within the building. Internet: Our internet connection is wifi and dedicated to our apartment. So there is no sharing with other guests and no need to pay additional fees for internet usage.', property_type: 'Apartment', room_type: 'Entire home/apt', bed_type: 'Real Bed', minimum_nights: '2', - maximum_nights: '1125', - cancellation_policy: 'flexible', + maximum_nights: '30', + cancellation_policy: 'moderate', last_scraped: { - $date: { - $numberLong: '1549861200000', - }, + $date: '2019-03-07T05:00:00.000Z', }, calendar_last_scraped: { - $date: { - $numberLong: '1549861200000', - }, + $date: '2019-03-07T05:00:00.000Z', }, - accommodates: 4, + first_review: { + $date: '2016-06-30T04:00:00.000Z', + }, + last_review: { + $date: '2019-03-06T05:00:00.000Z', + }, + accommodates: 2, bedrooms: 1, - beds: 2, - number_of_reviews: 0, + beds: 1, + number_of_reviews: 109, bathrooms: { $numberDecimal: '1.0', }, + amenities: [ + 'TV', + 'Wifi', + 'Air conditioning', + 'Pool', + 'Kitchen', + 'Gym', + 'Elevator', + 'Heating', + 'Washer', + 'Dryer', + 'Smoke detector', + 'Carbon monoxide detector', + 'First aid kit', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'translation missing: en.hosting_amenity_49', + 'translation missing: en.hosting_amenity_50', + 'Self check-in', + 'Building staff', + 'Private living room', + 'Hot water', + 'Bed linens', + 'Extra pillows and blankets', + 'Microwave', + 'Coffee maker', + 'Refrigerator', + 'Dishwasher', + 'Dishes and silverware', + 'Cooking basics', + 'Oven', + 'Stove', + 'Patio or balcony', + 'Cleaning before checkout', + 'Step-free access', + 'Flat path to front door', + 'Well-lit path to entrance', + 'Step-free access', + ], price: { - $numberDecimal: '317.00', + $numberDecimal: '185.00', + }, + security_deposit: { + $numberDecimal: '800.00', }, cleaning_fee: { - $numberDecimal: '187.00', + $numberDecimal: '120.00', }, extra_people: { $numberDecimal: '0.00', @@ -128,75 +221,122 @@ export default [ thumbnail_url: '', medium_url: '', picture_url: - 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + 'https://a0.muscache.com/im/pictures/a2e7de4a-6349-4515-acd3-c788d6f2abcf.jpg?aki_policy=large', xl_picture_url: '', }, + host: { + host_id: '16187044', + host_url: 'https://www.airbnb.com/users/show/16187044', + host_name: 'Desireé', + host_location: 'Australia', + host_about: + "At the centre of my life is my beautiful family...home is wherever my family is.\r\n\r\nI enjoy filling my life with positive experiences and love to travel and experience new cultures, to meet new people, to read and just enjoy the beauty and wonders of the 'littlest' things in the world around me and my family. \r\n", + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/users/16187044/profile_pic/1402737505/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/16187044/profile_pic/1402737505/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Darlinghurst', + host_response_rate: 100, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'government_id', + ], + }, address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Jardim Botânico', - government_area: 'Jardim Botânico', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', + street: 'Darlinghurst, NSW, Australia', + suburb: 'Darlinghurst', + government_area: 'Sydney', + market: 'Sydney', + country: 'Australia', + country_code: 'AU', location: { type: 'Point', - coordinates: [-43.23074991429229, -22.966253551739655], - is_location_exact: true, + coordinates: [151.21346, -33.87603], + is_location_exact: false, }, }, availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, + availability_30: 5, + availability_60: 16, + availability_90: 35, + availability_365: 265, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 100, }, - host_id: '1282196', }, { - _id: '1001265', - listing_url: 'https://www.airbnb.com/rooms/1001265', - name: 'Ocean View Waikiki Marina w/prkg', - interaction: - 'We try our best at creating, simple responsive management which never bothers the guest.', - house_rules: 'The general welfare and well being of all the community.', - property_type: 'Condominium', + _id: '10057826', + listing_url: 'https://www.airbnb.com/rooms/10057826', + name: 'Deluxe Loft Suite', + notes: '', + property_type: 'Apartment', room_type: 'Entire home/apt', bed_type: 'Real Bed', minimum_nights: '3', - maximum_nights: '365', + maximum_nights: '1125', cancellation_policy: 'strict_14_with_grace_period', last_scraped: { - $date: { - $numberLong: '1551848400000', - }, + $date: '2019-03-07T05:00:00.000Z', }, calendar_last_scraped: { - $date: { - $numberLong: '1551848400000', - }, + $date: '2019-03-07T05:00:00.000Z', }, first_review: { - $date: { - $numberLong: '1369368000000', - }, + $date: '2016-01-03T05:00:00.000Z', }, last_review: { - $date: { - $numberLong: '1549515600000', - }, + $date: '2018-02-18T05:00:00.000Z', }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 96, + accommodates: 4, + bedrooms: 0, + beds: 2, + number_of_reviews: 5, bathrooms: { $numberDecimal: '1.0', }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Doorman', + 'Gym', + 'Elevator', + 'Heating', + 'Family/kid friendly', + 'Washer', + 'Dryer', + 'Smoke detector', + 'Carbon monoxide detector', + 'First aid kit', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + ], price: { - $numberDecimal: '115.00', - }, - cleaning_fee: { - $numberDecimal: '100.00', + $numberDecimal: '205.00', }, extra_people: { $numberDecimal: '0.00', @@ -208,71 +348,121 @@ export default [ thumbnail_url: '', medium_url: '', picture_url: - 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + 'https://a0.muscache.com/im/pictures/40ace1e3-4917-46e5-994f-30a5965f5159.jpg?aki_policy=large', xl_picture_url: '', }, + host: { + host_id: '47554473', + host_url: 'https://www.airbnb.com/users/show/47554473', + host_name: 'Mae', + host_location: 'US', + host_about: '', + host_response_time: 'within a few hours', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/c680ce22-d6ec-4b00-8ef3-b5b7fc0d76f2.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/c680ce22-d6ec-4b00-8ef3-b5b7fc0d76f2.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Greenpoint', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 13, + host_total_listings_count: 13, + host_verifications: [ + 'email', + 'phone', + 'google', + 'reviews', + 'jumio', + 'government_id', + ], + }, address: { - street: 'Honolulu, HI, United States', - suburb: 'Oʻahu', - government_area: 'Primary Urban Center', - market: 'Oahu', + street: 'Brooklyn, NY, United States', + suburb: 'Greenpoint', + government_area: 'Greenpoint', + market: 'New York', country: 'United States', country_code: 'US', location: { type: 'Point', - coordinates: [-157.83919, 21.28634], + coordinates: [-73.94472, 40.72778], is_location_exact: true, }, }, availability: { - availability_30: 16, - availability_60: 46, - availability_90: 76, - availability_365: 343, + availability_30: 30, + availability_60: 31, + availability_90: 31, + availability_365: 243, + }, + review_scores: { + review_scores_accuracy: 9, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 8, + review_scores_location: 9, + review_scores_value: 9, + review_scores_rating: 88, }, - host_id: '5448114', }, { - _id: '10021707', - listing_url: 'https://www.airbnb.com/rooms/10021707', - name: 'Private Room in Bushwick', - interaction: '', - house_rules: '', + _id: '10133350', + listing_url: 'https://www.airbnb.com/rooms/10133350', + name: '2 bedroom Upper east side', + notes: '', property_type: 'Apartment', - room_type: 'Private room', + room_type: 'Entire home/apt', bed_type: 'Real Bed', - minimum_nights: '14', - maximum_nights: '1125', - cancellation_policy: 'flexible', + minimum_nights: '2', + maximum_nights: '7', + cancellation_policy: 'strict_14_with_grace_period', last_scraped: { - $date: { - $numberLong: '1551848400000', - }, + $date: '2019-03-06T05:00:00.000Z', }, calendar_last_scraped: { - $date: { - $numberLong: '1551848400000', - }, + $date: '2019-03-06T05:00:00.000Z', }, first_review: { - $date: { - $numberLong: '1454216400000', - }, + $date: '2016-05-28T04:00:00.000Z', }, last_review: { - $date: { - $numberLong: '1454216400000', - }, + $date: '2017-08-19T04:00:00.000Z', }, - accommodates: 1, - bedrooms: 1, - beds: 1, - number_of_reviews: 1, + accommodates: 5, + bedrooms: 2, + beds: 2, + number_of_reviews: 9, bathrooms: { - $numberDecimal: '1.5', + $numberDecimal: '1.0', }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Pets allowed', + 'Pets live on this property', + 'Buzzer/wireless intercom', + 'Heating', + 'Family/kid friendly', + 'Essentials', + 'Shampoo', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + ], price: { - $numberDecimal: '40.00', + $numberDecimal: '275.00', + }, + security_deposit: { + $numberDecimal: '0.00', + }, + cleaning_fee: { + $numberDecimal: '35.00', }, extra_people: { $numberDecimal: '0.00', @@ -284,20 +474,45 @@ export default [ thumbnail_url: '', medium_url: '', picture_url: - 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + 'https://a0.muscache.com/im/pictures/d9886a79-0633-4ab4-b03a-7686bab13d71.jpg?aki_policy=large', xl_picture_url: '', }, + host: { + host_id: '52004369', + host_url: 'https://www.airbnb.com/users/show/52004369', + host_name: 'Chelsea', + host_location: 'Sea Cliff, New York, United States', + host_about: '', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/4d361f57-f65e-4885-b934-0e92eebf288d.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/4d361f57-f65e-4885-b934-0e92eebf288d.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 2, + host_total_listings_count: 2, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'offline_government_id', + 'government_id', + ], + }, address: { - street: 'Brooklyn, NY, United States', - suburb: 'Brooklyn', - government_area: 'Bushwick', + street: 'New York, NY, United States', + suburb: 'Upper East Side', + government_area: 'Upper East Side', market: 'New York', country: 'United States', country_code: 'US', location: { type: 'Point', - coordinates: [-73.93615, 40.69791], - is_location_exact: true, + coordinates: [-73.95854, 40.7664], + is_location_exact: false, }, }, availability: { @@ -306,45 +521,69 @@ export default [ availability_90: 0, availability_365: 0, }, - host_id: '11275734', + review_scores: { + review_scores_accuracy: 9, + review_scores_cleanliness: 8, + review_scores_checkin: 10, + review_scores_communication: 9, + review_scores_location: 9, + review_scores_value: 9, + review_scores_rating: 90, + }, }, { - _id: '10030955', - listing_url: 'https://www.airbnb.com/rooms/10030955', - name: 'Apt Linda Vista Lagoa - Rio', - interaction: '', - house_rules: '', - property_type: 'Apartment', + _id: '10133554', + listing_url: 'https://www.airbnb.com/rooms/10133554', + name: 'Double and triple rooms Blue mosque', + notes: '', + property_type: 'Bed and breakfast', room_type: 'Private room', bed_type: 'Real Bed', minimum_nights: '1', maximum_nights: '1125', - cancellation_policy: 'flexible', + cancellation_policy: 'moderate', last_scraped: { - $date: { - $numberLong: '1549861200000', - }, + $date: '2019-02-18T05:00:00.000Z', }, calendar_last_scraped: { - $date: { - $numberLong: '1549861200000', - }, + $date: '2019-02-18T05:00:00.000Z', }, - accommodates: 2, + first_review: { + $date: '2017-05-04T04:00:00.000Z', + }, + last_review: { + $date: '2018-05-07T04:00:00.000Z', + }, + accommodates: 3, bedrooms: 1, - beds: 1, - number_of_reviews: 0, + beds: 2, + number_of_reviews: 29, bathrooms: { - $numberDecimal: '2.0', + $numberDecimal: '1.0', }, + amenities: [ + 'Internet', + 'Wifi', + 'Air conditioning', + 'Free parking on premises', + 'Smoking allowed', + 'Heating', + 'Family/kid friendly', + 'Suitable for events', + 'Washer', + 'Dryer', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Self check-in', + 'Building staff', + ], price: { - $numberDecimal: '701.00', - }, - security_deposit: { - $numberDecimal: '1000.00', - }, - cleaning_fee: { - $numberDecimal: '250.00', + $numberDecimal: '121.00', }, extra_people: { $numberDecimal: '0.00', @@ -356,78 +595,134 @@ export default [ thumbnail_url: '', medium_url: '', picture_url: - 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + 'https://a0.muscache.com/im/pictures/68de30b5-ece5-42ab-8152-c1834d5e25fd.jpg?aki_policy=large', xl_picture_url: '', }, + host: { + host_id: '52004703', + host_url: 'https://www.airbnb.com/users/show/52004703', + host_name: 'Mehmet Emin', + host_location: 'Istanbul, İstanbul, Turkey', + host_about: '', + host_response_time: 'within a few hours', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/user/4cb6be34-659b-42cc-a93d-77a5d3501e7a.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/user/4cb6be34-659b-42cc-a93d-77a5d3501e7a.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 2, + host_total_listings_count: 2, + host_verifications: [ + 'email', + 'phone', + 'facebook', + 'reviews', + 'jumio', + 'offline_government_id', + 'government_id', + ], + }, address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Lagoa', - government_area: 'Lagoa', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', + street: 'Fatih , İstanbul, Turkey', + suburb: 'Fatih', + government_area: 'Fatih', + market: 'Istanbul', + country: 'Turkey', + country_code: 'TR', location: { type: 'Point', - coordinates: [-43.205047082633435, -22.971950988341874], - is_location_exact: true, + coordinates: [28.98009, 41.0062], + is_location_exact: false, }, }, availability: { - availability_30: 28, - availability_60: 58, - availability_90: 88, - availability_365: 363, + availability_30: 30, + availability_60: 60, + availability_90: 90, + availability_365: 365, + }, + review_scores: { + review_scores_accuracy: 9, + review_scores_cleanliness: 9, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 9, + review_scores_rating: 92, }, - host_id: '51496939', }, { - _id: '1003530', - listing_url: 'https://www.airbnb.com/rooms/1003530', - name: 'New York City - Upper West Side Apt', - interaction: '', - house_rules: - 'No smoking is permitted in the apartment. All towels that are used should be placed in the bath tub upon departure. I have a cat, Samantha, who can stay or go, whichever is preferred. Please text me upon departure.', - property_type: 'Apartment', - room_type: 'Private room', + _id: '10115921', + listing_url: 'https://www.airbnb.com/rooms/10115921', + name: 'GOLF ROYAL RESİDENCE TAXİM(1+1):3', + notes: '', + property_type: 'Serviced apartment', + room_type: 'Entire home/apt', bed_type: 'Real Bed', - minimum_nights: '12', - maximum_nights: '360', + minimum_nights: '1', + maximum_nights: '1125', cancellation_policy: 'strict_14_with_grace_period', last_scraped: { - $date: { - $numberLong: '1551934800000', - }, + $date: '2019-02-18T05:00:00.000Z', }, calendar_last_scraped: { - $date: { - $numberLong: '1551934800000', - }, + $date: '2019-02-18T05:00:00.000Z', }, first_review: { - $date: { - $numberLong: '1367208000000', - }, + $date: '2016-02-01T05:00:00.000Z', }, last_review: { - $date: { - $numberLong: '1534046400000', - }, + $date: '2017-08-07T04:00:00.000Z', }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 70, + accommodates: 4, + bedrooms: 2, + beds: 4, + number_of_reviews: 3, bathrooms: { $numberDecimal: '1.0', }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Wheelchair accessible', + 'Kitchen', + 'Paid parking off premises', + 'Smoking allowed', + 'Doorman', + 'Elevator', + 'Buzzer/wireless intercom', + 'Heating', + 'Family/kid friendly', + 'Suitable for events', + 'Dryer', + 'Smoke detector', + 'Carbon monoxide detector', + 'First aid kit', + 'Safety card', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Self check-in', + 'Building staff', + 'Crib', + 'Hot water', + 'Luggage dropoff allowed', + 'Long term stays allowed', + ], price: { - $numberDecimal: '135.00', - }, - security_deposit: { - $numberDecimal: '0.00', - }, - cleaning_fee: { - $numberDecimal: '135.00', + $numberDecimal: '838.00', }, extra_people: { $numberDecimal: '0.00', @@ -439,121 +734,177 @@ export default [ thumbnail_url: '', medium_url: '', picture_url: - 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + 'https://a0.muscache.com/im/pictures/fbdaf067-9682-48a6-9838-f51589d4791a.jpg?aki_policy=large', xl_picture_url: '', }, + host: { + host_id: '51471538', + host_url: 'https://www.airbnb.com/users/show/51471538', + host_name: 'Ahmet', + host_location: 'Istanbul, İstanbul, Turkey', + host_about: '', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/user/d8c830d0-16da-455c-818a-790864132e0a.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/user/d8c830d0-16da-455c-818a-790864132e0a.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Şişli', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 16, + host_total_listings_count: 16, + host_verifications: ['email', 'phone', 'reviews'], + }, address: { - street: 'New York, NY, United States', - suburb: 'Manhattan', - government_area: 'Upper West Side', - market: 'New York', - country: 'United States', - country_code: 'US', + street: 'Şişli, İstanbul, Turkey', + suburb: 'Şişli', + government_area: 'Sisli', + market: 'Istanbul', + country: 'Turkey', + country_code: 'TR', location: { type: 'Point', - coordinates: [-73.96523, 40.79962], + coordinates: [28.98713, 41.04841], is_location_exact: false, }, }, availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 93, + availability_30: 30, + availability_60: 60, + availability_90: 90, + availability_365: 365, + }, + review_scores: { + review_scores_accuracy: 7, + review_scores_cleanliness: 7, + review_scores_checkin: 8, + review_scores_communication: 8, + review_scores_location: 10, + review_scores_value: 7, + review_scores_rating: 67, }, - host_id: '454250', }, { - _id: '10038496', - listing_url: 'https://www.airbnb.com/rooms/10038496', - name: 'Copacabana Apartment Posto 6', - interaction: - 'Contact telephone numbers if needed: Valeria ((PHONE NUMBER HIDDEN) (URL HIDDEN) ((PHONE NUMBER HIDDEN) cell phone (URL HIDDEN) (021) mobile/(PHONE NUMBER HIDDEN) José (URL HIDDEN)Concierge support; Fernando (caretaker boss) business hours.', - house_rules: - 'Entreguem o imóvel conforme receberam e respeitem as regras do condomínio para não serem incomodados. Não danificar os utensílios e tudo que se refere as boas condições referentes ao mesmo . Não fazer barulho após às 22:00 até às 8:00. Usar entrada de serviço se estiver molhado voltando da praia.', - property_type: 'Apartment', + _id: '10116256', + listing_url: 'https://www.airbnb.com/rooms/10116256', + name: 'GOLF ROYAL RESIDENCE SUİTES(2+1)-2', + notes: '', + property_type: 'Serviced apartment', room_type: 'Entire home/apt', bed_type: 'Real Bed', - minimum_nights: '3', - maximum_nights: '75', - cancellation_policy: 'strict_14_with_grace_period', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'moderate', last_scraped: { - $date: { - $numberLong: '1549861200000', - }, + $date: '2019-02-18T05:00:00.000Z', }, calendar_last_scraped: { - $date: { - $numberLong: '1549861200000', - }, - }, - first_review: { - $date: { - $numberLong: '1453093200000', - }, - }, - last_review: { - $date: { - $numberLong: '1548651600000', - }, + $date: '2019-02-18T05:00:00.000Z', }, - accommodates: 4, - bedrooms: 1, - beds: 3, - number_of_reviews: 70, + accommodates: 6, + bedrooms: 2, + beds: 5, + number_of_reviews: 0, bathrooms: { $numberDecimal: '2.0', }, + amenities: [ + 'TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Wheelchair accessible', + 'Kitchen', + 'Paid parking off premises', + 'Smoking allowed', + 'Doorman', + 'Elevator', + 'Buzzer/wireless intercom', + 'Heating', + 'Family/kid friendly', + 'Suitable for events', + 'Washer', + 'Dryer', + 'Smoke detector', + 'Carbon monoxide detector', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Self check-in', + 'Building staff', + 'Hot water', + 'Luggage dropoff allowed', + 'Long term stays allowed', + ], price: { - $numberDecimal: '119.00', - }, - security_deposit: { - $numberDecimal: '600.00', - }, - cleaning_fee: { - $numberDecimal: '150.00', + $numberDecimal: '997.00', }, extra_people: { - $numberDecimal: '40.00', + $numberDecimal: '0.00', }, guests_included: { - $numberDecimal: '3', + $numberDecimal: '1', }, images: { thumbnail_url: '', medium_url: '', picture_url: - 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + 'https://a0.muscache.com/im/pictures/79955df9-923e-44ee-bc3c-5e88041a8c53.jpg?aki_policy=large', xl_picture_url: '', }, + host: { + host_id: '51471538', + host_url: 'https://www.airbnb.com/users/show/51471538', + host_name: 'Ahmet', + host_location: 'Istanbul, İstanbul, Turkey', + host_about: '', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/user/d8c830d0-16da-455c-818a-790864132e0a.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/user/d8c830d0-16da-455c-818a-790864132e0a.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Şişli', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 16, + host_total_listings_count: 16, + host_verifications: ['email', 'phone', 'reviews'], + }, address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Copacabana', - government_area: 'Copacabana', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', + street: 'Şişli, İstanbul, Turkey', + suburb: 'Şişli', + government_area: 'Sisli', + market: 'Istanbul', + country: 'Turkey', + country_code: 'TR', location: { type: 'Point', - coordinates: [-43.190849194463404, -22.984339360067814], + coordinates: [28.98818, 41.04772], is_location_exact: false, }, }, availability: { - availability_30: 7, - availability_60: 19, - availability_90: 33, - availability_365: 118, + availability_30: 30, + availability_60: 60, + availability_90: 90, + availability_365: 365, }, - host_id: '51530266', + review_scores: {}, }, { _id: '10047964', listing_url: 'https://www.airbnb.com/rooms/10047964', name: 'Charming Flat in Downtown Moda', - interaction: '', - house_rules: - 'Be and feel like your own home, with total respect and love..this would be wonderful!', + notes: '', property_type: 'House', room_type: 'Entire home/apt', bed_type: 'Real Bed', @@ -561,24 +912,16 @@ export default [ maximum_nights: '1125', cancellation_policy: 'flexible', last_scraped: { - $date: { - $numberLong: '1550466000000', - }, + $date: '2019-02-18T05:00:00.000Z', }, calendar_last_scraped: { - $date: { - $numberLong: '1550466000000', - }, + $date: '2019-02-18T05:00:00.000Z', }, first_review: { - $date: { - $numberLong: '1459569600000', - }, + $date: '2016-04-02T04:00:00.000Z', }, last_review: { - $date: { - $numberLong: '1459569600000', - }, + $date: '2016-04-02T04:00:00.000Z', }, accommodates: 6, bedrooms: 2, @@ -587,6 +930,27 @@ export default [ bathrooms: { $numberDecimal: '1.0', }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Kitchen', + 'Free parking on premises', + 'Pets allowed', + 'Pets live on this property', + 'Cat(s)', + 'Heating', + 'Family/kid friendly', + 'Washer', + 'Essentials', + 'Shampoo', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + ], price: { $numberDecimal: '527.00', }, @@ -603,9 +967,34 @@ export default [ thumbnail_url: '', medium_url: '', picture_url: - 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + 'https://a0.muscache.com/im/pictures/231120b6-e6e5-4514-93cd-53722ac67de1.jpg?aki_policy=large', xl_picture_url: '', }, + host: { + host_id: '1241644', + host_url: 'https://www.airbnb.com/users/show/1241644', + host_name: 'Zeynep', + host_location: 'Istanbul, Istanbul, Turkey', + host_about: 'Z.', + host_thumbnail_url: + 'https://a0.muscache.com/im/users/1241644/profile_pic/1426581715/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/1241644/profile_pic/1426581715/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Moda', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 2, + host_total_listings_count: 2, + host_verifications: [ + 'email', + 'phone', + 'facebook', + 'reviews', + 'jumio', + 'government_id', + ], + }, address: { street: 'Kadıköy, İstanbul, Turkey', suburb: 'Moda', @@ -625,125 +1014,206 @@ export default [ availability_90: 87, availability_365: 362, }, - host_id: '1241644', + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 100, + }, }, { - _id: '10051164', - listing_url: 'https://www.airbnb.com/rooms/10051164', - name: "Catete's Colonial Big Hause Room B", - interaction: - 'Sou geógrafa, gosto de arte e cultura. Moro neste endereço (porém em outro espaço, que não o casarão) com meu companheiro Carlos Henrique, que é músico, farmacêutico e acupunturista, meus filhos Pedro, estudante do ensino médio e Estevão estudante de antropologia . Somos todos os três responsáveis pelas hospedagens e manutenção do Casarão. Sejam bem vindos! Estaremos com total disponibilidade para ajudá-los.', - house_rules: '', - property_type: 'House', + _id: '1003530', + listing_url: 'https://www.airbnb.com/rooms/1003530', + name: 'New York City - Upper West Side Apt', + notes: + 'My cat, Samantha, are in and out during the summer. The apt is layed out in such a way that each bedroom is very private.', + property_type: 'Apartment', room_type: 'Private room', bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '1125', + minimum_nights: '12', + maximum_nights: '360', cancellation_policy: 'strict_14_with_grace_period', last_scraped: { - $date: { - $numberLong: '1549861200000', - }, + $date: '2019-03-07T05:00:00.000Z', }, calendar_last_scraped: { - $date: { - $numberLong: '1549861200000', - }, + $date: '2019-03-07T05:00:00.000Z', }, first_review: { - $date: { - $numberLong: '1455080400000', - }, + $date: '2013-04-29T04:00:00.000Z', }, last_review: { - $date: { - $numberLong: '1455080400000', - }, + $date: '2018-08-12T04:00:00.000Z', }, - accommodates: 8, + accommodates: 2, bedrooms: 1, - beds: 8, - number_of_reviews: 1, + beds: 1, + number_of_reviews: 70, bathrooms: { - $numberDecimal: '4.0', + $numberDecimal: '1.0', }, + amenities: [ + 'Internet', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Elevator', + 'Buzzer/wireless intercom', + 'Heating', + 'Family/kid friendly', + 'Washer', + 'Dryer', + 'translation missing: en.hosting_amenity_50', + ], price: { - $numberDecimal: '250.00', + $numberDecimal: '135.00', }, security_deposit: { $numberDecimal: '0.00', }, cleaning_fee: { - $numberDecimal: '0.00', + $numberDecimal: '135.00', }, extra_people: { - $numberDecimal: '40.00', + $numberDecimal: '0.00', }, guests_included: { - $numberDecimal: '4', + $numberDecimal: '1', }, images: { thumbnail_url: '', medium_url: '', picture_url: - 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + 'https://a0.muscache.com/im/pictures/15074036/a97119ed_original.jpg?aki_policy=large', xl_picture_url: '', }, + host: { + host_id: '454250', + host_url: 'https://www.airbnb.com/users/show/454250', + host_name: 'Greta', + host_location: 'New York, New York, United States', + host_about: + 'By now I have lived longer in the city than the country however I feel equally at home in each. I like to keep one foot in each and help others to do the same!', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/f1022be4-e72a-4b35-b6d2-3d2736ddaff9.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/f1022be4-e72a-4b35-b6d2-3d2736ddaff9.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_response_rate: 100, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 3, + host_total_listings_count: 3, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'offline_government_id', + 'government_id', + ], + }, address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Catete', - government_area: 'Catete', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', + street: 'New York, NY, United States', + suburb: 'Manhattan', + government_area: 'Upper West Side', + market: 'New York', + country: 'United States', + country_code: 'US', location: { type: 'Point', - coordinates: [-43.18015675229857, -22.92638234778768], - is_location_exact: true, + coordinates: [-73.96523, 40.79962], + is_location_exact: false, }, }, availability: { - availability_30: 10, - availability_60: 10, - availability_90: 21, - availability_365: 296, + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 93, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 9, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 94, }, - host_id: '51326285', }, { - _id: '10057447', - listing_url: 'https://www.airbnb.com/rooms/10057447', - name: 'Modern Spacious 1 Bedroom Loft', - interaction: '', - house_rules: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', + _id: '10084023', + listing_url: 'https://www.airbnb.com/rooms/10084023', + name: 'City center private room with bed', + notes: + 'Deposit of $1000 will be charged and will return back when check out if nothing is damaged.', + property_type: 'Guesthouse', + room_type: 'Private room', + bed_type: 'Futon', minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'flexible', + maximum_nights: '500', + cancellation_policy: 'strict_14_with_grace_period', last_scraped: { - $date: { - $numberLong: '1552276800000', - }, + $date: '2019-03-11T04:00:00.000Z', }, calendar_last_scraped: { - $date: { - $numberLong: '1552276800000', - }, + $date: '2019-03-11T04:00:00.000Z', }, - accommodates: 4, + first_review: { + $date: '2015-12-22T05:00:00.000Z', + }, + last_review: { + $date: '2019-03-01T05:00:00.000Z', + }, + accommodates: 1, bedrooms: 1, - beds: 2, - number_of_reviews: 0, + beds: 1, + number_of_reviews: 81, bathrooms: { $numberDecimal: '1.0', }, + amenities: [ + 'TV', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Elevator', + 'First aid kit', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Hot water', + 'Microwave', + 'Refrigerator', + 'Dishes and silverware', + 'Stove', + 'Long term stays allowed', + 'Host greets you', + ], price: { + $numberDecimal: '181.00', + }, + weekly_price: { + $numberDecimal: '1350.00', + }, + monthly_price: { + $numberDecimal: '5000.00', + }, + security_deposit: { + $numberDecimal: '0.00', + }, + cleaning_fee: { $numberDecimal: '50.00', }, extra_people: { - $numberDecimal: '31.00', + $numberDecimal: '100.00', }, guests_included: { $numberDecimal: '1', @@ -752,113 +1222,323 @@ export default [ thumbnail_url: '', medium_url: '', picture_url: - 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + 'https://a0.muscache.com/im/pictures/e6275515-7d73-4a70-bdc4-39ba6497e7d3.jpg?aki_policy=large', xl_picture_url: '', }, + host: { + host_id: '51744313', + host_url: 'https://www.airbnb.com/users/show/51744313', + host_name: 'Yi', + host_location: 'United States', + host_about: + 'Hi, this is Yi from Hong Kong, nice to meet you.\n\n你好!我是來自香港的Yi .', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/user/a204d442-1ae1-47fc-8d26-cf0ff9efda1b.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/user/a204d442-1ae1-47fc-8d26-cf0ff9efda1b.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Shek Kip Mei', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 2, + host_total_listings_count: 2, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'offline_government_id', + 'government_id', + ], + }, address: { - street: 'Montréal, Québec, Canada', - suburb: 'Mile End', - government_area: 'Le Plateau-Mont-Royal', - market: 'Montreal', - country: 'Canada', - country_code: 'CA', + street: 'Hong Kong , 九龍, Hong Kong', + suburb: 'Sham Shui Po District', + government_area: 'Sham Shui Po', + market: 'Hong Kong', + country: 'Hong Kong', + country_code: 'HK', location: { type: 'Point', - coordinates: [-73.59111, 45.51889], + coordinates: [114.1669, 22.3314], is_location_exact: true, }, }, availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, + availability_30: 14, + availability_60: 24, + availability_90: 40, + availability_365: 220, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 8, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 92, }, - host_id: '51612949', }, { - _id: '10057826', - listing_url: 'https://www.airbnb.com/rooms/10057826', - name: 'Deluxe Loft Suite', - interaction: '', - house_rules: - 'Guest must leave a copy of credit card with front desk for any incidentals/ damages with a copy of valid ID. There are no additional charges than what has been paid in advance.', - property_type: 'Apartment', - room_type: 'Entire home/apt', + _id: '10051164', + listing_url: 'https://www.airbnb.com/rooms/10051164', + name: "Catete's Colonial Big Hause Room B", + notes: + 'A casa possui um potencial incrível para receber grupos. Os quartos são amplos e comunicáveis.', + property_type: 'House', + room_type: 'Private room', bed_type: 'Real Bed', - minimum_nights: '3', + minimum_nights: '2', maximum_nights: '1125', cancellation_policy: 'strict_14_with_grace_period', last_scraped: { - $date: { - $numberLong: '1551934800000', - }, + $date: '2019-02-11T05:00:00.000Z', }, calendar_last_scraped: { - $date: { - $numberLong: '1551934800000', - }, + $date: '2019-02-11T05:00:00.000Z', }, first_review: { - $date: { - $numberLong: '1451797200000', - }, + $date: '2016-02-10T05:00:00.000Z', }, last_review: { - $date: { - $numberLong: '1518930000000', - }, + $date: '2016-02-10T05:00:00.000Z', }, - accommodates: 4, - bedrooms: 0, - beds: 2, - number_of_reviews: 5, + accommodates: 8, + bedrooms: 1, + beds: 8, + number_of_reviews: 1, bathrooms: { - $numberDecimal: '1.0', + $numberDecimal: '4.0', }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Smoking allowed', + 'Family/kid friendly', + 'First aid kit', + 'Fire extinguisher', + 'Essentials', + ], price: { - $numberDecimal: '205.00', + $numberDecimal: '250.00', }, - extra_people: { + security_deposit: { $numberDecimal: '0.00', }, + cleaning_fee: { + $numberDecimal: '0.00', + }, + extra_people: { + $numberDecimal: '40.00', + }, guests_included: { - $numberDecimal: '1', + $numberDecimal: '4', }, images: { thumbnail_url: '', medium_url: '', picture_url: - 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + 'https://a0.muscache.com/im/pictures/b2119f25-42e1-4770-8072-20de92e65893.jpg?aki_policy=large', xl_picture_url: '', }, + host: { + host_id: '51326285', + host_url: 'https://www.airbnb.com/users/show/51326285', + host_name: 'Beatriz', + host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', + host_about: '', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/eb09c9cb-bc70-412f-80d9-47ed3ab104f4.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/eb09c9cb-bc70-412f-80d9-47ed3ab104f4.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Catete', + host_response_rate: 80, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 5, + host_total_listings_count: 5, + host_verifications: [ + 'email', + 'phone', + 'facebook', + 'reviews', + 'jumio', + 'government_id', + ], + }, address: { - street: 'Brooklyn, NY, United States', - suburb: 'Greenpoint', - government_area: 'Greenpoint', - market: 'New York', - country: 'United States', - country_code: 'US', + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Catete', + government_area: 'Catete', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', location: { type: 'Point', - coordinates: [-73.94472, 40.72778], + coordinates: [-43.18015675229857, -22.92638234778768], is_location_exact: true, }, }, availability: { - availability_30: 30, - availability_60: 31, - availability_90: 31, - availability_365: 243, + availability_30: 10, + availability_60: 10, + availability_90: 21, + availability_365: 296, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 6, + review_scores_checkin: 8, + review_scores_communication: 8, + review_scores_location: 8, + review_scores_value: 8, + review_scores_rating: 80, + }, + }, + { + _id: '10138784', + listing_url: 'https://www.airbnb.com/rooms/10138784', + name: 'Room Close to LGA and 35 mins to Times Square', + notes: + 'Hair dryer, iron, and towels are provided. Any question or concern, please message me anytime.', + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '1125', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + first_review: { + $date: '2016-01-05T05:00:00.000Z', + }, + last_review: { + $date: '2018-11-28T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 123, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'Internet', + 'Wifi', + 'Air conditioning', + 'Pets live on this property', + 'Dog(s)', + 'Other pet(s)', + 'Elevator', + 'Buzzer/wireless intercom', + 'Heating', + 'First aid kit', + 'Essentials', + 'Shampoo', + 'Hangers', + 'Hair dryer', + 'translation missing: en.hosting_amenity_49', + 'translation missing: en.hosting_amenity_50', + 'Hot water', + 'Bed linens', + 'Host greets you', + ], + price: { + $numberDecimal: '46.00', + }, + security_deposit: { + $numberDecimal: '0.00', + }, + cleaning_fee: { + $numberDecimal: '15.00', + }, + extra_people: { + $numberDecimal: '10.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/f1c9e2c8-c619-4c97-afab-b8bf0ae9ea1d.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '52031360', + host_url: 'https://www.airbnb.com/users/show/52031360', + host_name: 'Cheer', + host_location: 'New York, New York, United States', + host_about: '', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/1e61ad3c-eb0f-486a-ac09-1a834973d8cd.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/1e61ad3c-eb0f-486a-ac09-1a834973d8cd.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Jackson Heights', + host_response_rate: 100, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'offline_government_id', + 'government_id', + ], + }, + address: { + street: 'Queens, NY, United States', + suburb: 'Queens', + government_area: 'Jackson Heights', + market: 'New York', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-73.88025, 40.74953], + is_location_exact: true, + }, + }, + availability: { + availability_30: 30, + availability_60: 60, + availability_90: 90, + availability_365: 365, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 9, + review_scores_value: 10, + review_scores_rating: 99, }, - host_id: '47554473', }, { _id: '10059244', listing_url: 'https://www.airbnb.com/rooms/10059244', name: 'Ligne verte - à 15 min de métro du centre ville.', - interaction: 'Une amie sera disponible en cas de besoin.', - house_rules: 'Non fumeur Respect des voisins Respect des biens Merci! :)', + notes: '', property_type: 'Apartment', room_type: 'Entire home/apt', bed_type: 'Real Bed', @@ -866,14 +1546,10 @@ export default [ maximum_nights: '1125', cancellation_policy: 'moderate', last_scraped: { - $date: { - $numberLong: '1552276800000', - }, + $date: '2019-03-11T04:00:00.000Z', }, calendar_last_scraped: { - $date: { - $numberLong: '1552276800000', - }, + $date: '2019-03-11T04:00:00.000Z', }, accommodates: 2, bedrooms: 0, @@ -882,6 +1558,21 @@ export default [ bathrooms: { $numberDecimal: '1.0', }, + amenities: [ + 'TV', + 'Internet', + 'Wifi', + 'Kitchen', + 'Free parking on premises', + 'Heating', + 'Washer', + 'Smoke detector', + 'Essentials', + 'Shampoo', + 'Laptop friendly workspace', + 'Hot water', + 'Bed linens', + ], price: { $numberDecimal: '43.00', }, @@ -895,9 +1586,35 @@ export default [ thumbnail_url: '', medium_url: '', picture_url: - 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + 'https://a0.muscache.com/im/pictures/af5c069c-ef73-490a-9e47-b48c0ae47c2f.jpg?aki_policy=large', xl_picture_url: '', }, + host: { + host_id: '7140229', + host_url: 'https://www.airbnb.com/users/show/7140229', + host_name: 'Caro', + host_location: 'Montreal, Quebec, Canada', + host_about: '', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/user/c64773a6-da5f-4c1a-91fe-f17131e4473b.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/user/c64773a6-da5f-4c1a-91fe-f17131e4473b.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'government_id', + ], + }, address: { street: 'Montréal, Québec, Canada', suburb: 'Hochelaga-Maisonneuve', @@ -917,49 +1634,80 @@ export default [ availability_90: 0, availability_365: 32, }, - host_id: '7140229', + review_scores: {}, }, { - _id: '10059872', - listing_url: 'https://www.airbnb.com/rooms/10059872', - name: 'Soho Cozy, Spacious and Convenient', - interaction: '', - house_rules: '', - property_type: 'Apartment', + _id: '10083468', + listing_url: 'https://www.airbnb.com/rooms/10083468', + name: 'Be Happy in Porto', + notes: '', + property_type: 'Loft', room_type: 'Entire home/apt', bed_type: 'Real Bed', - minimum_nights: '4', - maximum_nights: '20', - cancellation_policy: 'flexible', + minimum_nights: '2', + maximum_nights: '1125', + cancellation_policy: 'moderate', last_scraped: { - $date: { - $numberLong: '1552276800000', - }, + $date: '2019-02-16T05:00:00.000Z', }, calendar_last_scraped: { - $date: { - $numberLong: '1552276800000', - }, + $date: '2019-02-16T05:00:00.000Z', }, first_review: { - $date: { - $numberLong: '1450501200000', - }, + $date: '2016-01-02T05:00:00.000Z', }, last_review: { - $date: { - $numberLong: '1522123200000', - }, + $date: '2019-02-09T05:00:00.000Z', }, - accommodates: 3, + accommodates: 2, bedrooms: 1, - beds: 2, - number_of_reviews: 3, + beds: 1, + number_of_reviews: 178, bathrooms: { $numberDecimal: '1.0', }, + amenities: [ + 'TV', + 'Cable TV', + 'Wifi', + 'Kitchen', + 'Smoking allowed', + 'First aid kit', + 'Fire extinguisher', + 'Essentials', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'translation missing: en.hosting_amenity_49', + 'translation missing: en.hosting_amenity_50', + 'Hot water', + 'Bed linens', + 'Extra pillows and blankets', + 'Microwave', + 'Coffee maker', + 'Refrigerator', + 'Dishes and silverware', + 'Cooking basics', + 'Stove', + 'Long term stays allowed', + 'Well-lit path to entrance', + 'Step-free access', + 'Wide clearance to bed', + 'Accessible-height bed', + 'Step-free access', + 'Step-free access', + 'Handheld shower head', + 'Paid parking on premises', + ], price: { - $numberDecimal: '699.00', + $numberDecimal: '30.00', + }, + security_deposit: { + $numberDecimal: '0.00', + }, + cleaning_fee: { + $numberDecimal: '10.00', }, extra_people: { $numberDecimal: '0.00', @@ -971,68 +1719,145 @@ export default [ thumbnail_url: '', medium_url: '', picture_url: - 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + 'https://a0.muscache.com/im/pictures/9420dabf-661e-4e86-b69c-84d90ceeedb5.jpg?aki_policy=large', xl_picture_url: '', }, + host: { + host_id: '27518920', + host_url: 'https://www.airbnb.com/users/show/27518920', + host_name: 'Fábio', + host_location: 'São Félix da Marinha, Porto, Portugal', + host_about: + 'Olá o meu nome é Fábio Ramos tenho 32 anos.\r\nSou uma pessoa animada, divertida e altruísta, tenho inúmeros prazeres nesta vida um dos quais é viajar e conhecer pessoas de outras nacionalidades culturas. \r\nEnquanto anfitrião prometo ser o mais prestativo possível, tanto nos primeiros contactos como quando forem meus hóspedes, estarei sempre disponível para ajudar e dar todo o suporte necessário para que passa uma estadia super agradável e interessante na cidade do Porto. ', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/user/30283df3-5b0b-47bb-8f81-990bdf925fb6.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/user/30283df3-5b0b-47bb-8f81-990bdf925fb6.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_response_rate: 90, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 3, + host_total_listings_count: 3, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'manual_offline', + 'jumio', + 'government_id', + ], + }, address: { - street: 'Hong Kong, Hong Kong Island, Hong Kong', - suburb: 'Central & Western District', - government_area: 'Central & Western', - market: 'Hong Kong', - country: 'Hong Kong', - country_code: 'HK', + street: 'Porto, Porto, Portugal', + suburb: '', + government_area: 'Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória', + market: 'Porto', + country: 'Portugal', + country_code: 'PT', location: { type: 'Point', - coordinates: [114.15027, 22.28158], - is_location_exact: true, + coordinates: [-8.61123, 41.15225], + is_location_exact: false, }, }, availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, + availability_30: 16, + availability_60: 40, + availability_90: 67, + availability_365: 335, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 97, }, - host_id: '51624384', }, { - _id: '10066928', - listing_url: 'https://www.airbnb.com/rooms/10066928', - name: '3 chambres au coeur du Plateau', - interaction: - "N'hésitez pas à m'écrire pour toute demande de renseignement !", - house_rules: 'Merci de respecter ce lieu de vie.', - property_type: 'Apartment', + _id: '10006546', + listing_url: 'https://www.airbnb.com/rooms/10006546', + name: 'Ribeira Charming Duplex', + notes: + 'Lose yourself in the narrow streets and staircases zone, have lunch in pubs and typical restaurants, and find the renovated cafes and shops in town. If you like exercise, rent a bicycle in the area and ride along the river to the sea, where it will enter beautiful beaches and terraces for everyone. The area is safe, find the bus stops 1min and metro line 5min. The bustling nightlife is a 10 min walk, where the streets are filled with people and entertainment for all. But Porto is much more than the historical center, here is modern museums, concert halls, clean and cared for beaches and surf all year round. Walk through the Ponte D. Luis and visit the different Caves of Port wine, where you will enjoy the famous port wine. Porto is a spoken city everywhere in the world as the best to be visited and savored by all ... natural beauty, culture, tradition, river, sea, beach, single people, typical food, and we are among those who best receive tourists, confirm! Come visit us and feel at ho', + property_type: 'House', room_type: 'Entire home/apt', bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'flexible', + minimum_nights: '2', + maximum_nights: '30', + cancellation_policy: 'moderate', last_scraped: { - $date: { - $numberLong: '1552276800000', - }, + $date: '2019-02-16T05:00:00.000Z', }, calendar_last_scraped: { - $date: { - $numberLong: '1552276800000', - }, + $date: '2019-02-16T05:00:00.000Z', }, - accommodates: 6, + first_review: { + $date: '2016-01-03T05:00:00.000Z', + }, + last_review: { + $date: '2019-01-20T05:00:00.000Z', + }, + accommodates: 8, bedrooms: 3, - beds: 3, - number_of_reviews: 0, + beds: 5, + number_of_reviews: 51, bathrooms: { $numberDecimal: '1.0', }, + amenities: [ + 'TV', + 'Cable TV', + 'Wifi', + 'Kitchen', + 'Paid parking off premises', + 'Smoking allowed', + 'Pets allowed', + 'Buzzer/wireless intercom', + 'Heating', + 'Family/kid friendly', + 'Washer', + 'First aid kit', + 'Fire extinguisher', + 'Essentials', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Pack ’n Play/travel crib', + 'Room-darkening shades', + 'Hot water', + 'Bed linens', + 'Extra pillows and blankets', + 'Microwave', + 'Coffee maker', + 'Refrigerator', + 'Dishwasher', + 'Dishes and silverware', + 'Cooking basics', + 'Oven', + 'Stove', + 'Cleaning before checkout', + 'Waterfront', + ], price: { - $numberDecimal: '140.00', + $numberDecimal: '80.00', + }, + security_deposit: { + $numberDecimal: '200.00', + }, + cleaning_fee: { + $numberDecimal: '35.00', }, extra_people: { - $numberDecimal: '0.00', + $numberDecimal: '15.00', }, guests_included: { - $numberDecimal: '1', + $numberDecimal: '6', }, images: { thumbnail_url: '', @@ -1041,67 +1866,110 @@ export default [ 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', xl_picture_url: '', }, + host: { + host_id: '51399391', + host_url: 'https://www.airbnb.com/users/show/51399391', + host_name: 'Ana&Gonçalo', + host_location: 'Porto, Porto District, Portugal', + host_about: + 'Gostamos de passear, de viajar, de conhecer pessoas e locais novos, gostamos de desporto e animais! Vivemos na cidade mais linda do mundo!!!', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/fab79f25-2e10-4f0f-9711-663cb69dc7d8.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/fab79f25-2e10-4f0f-9711-663cb69dc7d8.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 3, + host_total_listings_count: 3, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'offline_government_id', + 'government_id', + ], + }, address: { - street: 'Montréal, Québec, Canada', - suburb: 'Le Plateau-Mont-Royal', - government_area: 'Le Plateau-Mont-Royal', - market: 'Montreal', - country: 'Canada', - country_code: 'CA', + street: 'Porto, Porto, Portugal', + suburb: '', + government_area: 'Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória', + market: 'Porto', + country: 'Portugal', + country_code: 'PT', location: { type: 'Point', - coordinates: [-73.57383, 45.52233], - is_location_exact: true, + coordinates: [-8.61308, 41.1413], + is_location_exact: false, }, }, availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, + availability_30: 28, + availability_60: 47, + availability_90: 74, + availability_365: 239, + }, + review_scores: { + review_scores_accuracy: 9, + review_scores_cleanliness: 9, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 9, + review_scores_rating: 89, }, - host_id: '9036477', }, { - _id: '10069642', - listing_url: 'https://www.airbnb.com/rooms/10069642', - name: 'Ótimo Apto proximo Parque Olimpico', - interaction: '', - house_rules: '', + _id: '10021707', + listing_url: 'https://www.airbnb.com/rooms/10021707', + name: 'Private Room in Bushwick', + notes: '', property_type: 'Apartment', - room_type: 'Entire home/apt', + room_type: 'Private room', bed_type: 'Real Bed', - minimum_nights: '15', - maximum_nights: '20', - cancellation_policy: 'strict_14_with_grace_period', + minimum_nights: '14', + maximum_nights: '1125', + cancellation_policy: 'flexible', last_scraped: { - $date: { - $numberLong: '1549861200000', - }, + $date: '2019-03-06T05:00:00.000Z', }, calendar_last_scraped: { - $date: { - $numberLong: '1549861200000', - }, + $date: '2019-03-06T05:00:00.000Z', }, - accommodates: 5, - bedrooms: 2, - beds: 2, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '2.0', + first_review: { + $date: '2016-01-31T05:00:00.000Z', }, - price: { - $numberDecimal: '858.00', + last_review: { + $date: '2016-01-31T05:00:00.000Z', }, - security_deposit: { - $numberDecimal: '4476.00', + accommodates: 1, + bedrooms: 1, + beds: 1, + number_of_reviews: 1, + bathrooms: { + $numberDecimal: '1.5', }, - cleaning_fee: { - $numberDecimal: '112.00', + amenities: [ + 'Internet', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Buzzer/wireless intercom', + 'Heating', + 'Smoke detector', + 'Carbon monoxide detector', + 'Essentials', + 'Lock on bedroom door', + ], + price: { + $numberDecimal: '40.00', }, extra_people: { - $numberDecimal: '75.00', + $numberDecimal: '0.00', }, guests_included: { $numberDecimal: '1', @@ -1110,136 +1978,9908 @@ export default [ thumbnail_url: '', medium_url: '', picture_url: - 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + 'https://a0.muscache.com/im/pictures/72844c8c-fec2-440e-a752-bba9b268c361.jpg?aki_policy=large', xl_picture_url: '', }, + host: { + host_id: '11275734', + host_url: 'https://www.airbnb.com/users/show/11275734', + host_name: 'Josh', + host_location: 'New York, New York, United States', + host_about: '', + host_thumbnail_url: + 'https://a0.muscache.com/im/users/11275734/profile_pic/1405792127/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/11275734/profile_pic/1405792127/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Bushwick', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['email', 'phone', 'reviews', 'kba'], + }, address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Recreio dos Bandeirantes', - government_area: 'Recreio dos Bandeirantes', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', + street: 'Brooklyn, NY, United States', + suburb: 'Brooklyn', + government_area: 'Bushwick', + market: 'New York', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-73.93615, 40.69791], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 8, + review_scores_value: 8, + review_scores_rating: 100, + }, + }, + { + _id: '10057447', + listing_url: 'https://www.airbnb.com/rooms/10057447', + name: 'Modern Spacious 1 Bedroom Loft', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + accommodates: 4, + bedrooms: 1, + beds: 2, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'Internet', + 'Wifi', + 'Kitchen', + 'Heating', + 'Family/kid friendly', + 'Washer', + 'Dryer', + 'Smoke detector', + 'First aid kit', + 'Safety card', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + '24-hour check-in', + 'Hangers', + 'Iron', + 'Laptop friendly workspace', + ], + price: { + $numberDecimal: '50.00', + }, + extra_people: { + $numberDecimal: '31.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/9fa69ad8-c9be-45dd-966b-b8f59bdccb2b.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '51612949', + host_url: 'https://www.airbnb.com/users/show/51612949', + host_name: 'Konstantin', + host_location: 'Montreal, Quebec, Canada', + host_about: '', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/beb6b50e-0a26-4b29-9837-d68c3eea413f.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/beb6b50e-0a26-4b29-9837-d68c3eea413f.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Mile End', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'jumio', + 'offline_government_id', + 'selfie', + 'government_id', + 'identity_manual', + ], + }, + address: { + street: 'Montréal, Québec, Canada', + suburb: 'Mile End', + government_area: 'Le Plateau-Mont-Royal', + market: 'Montreal', + country: 'Canada', + country_code: 'CA', + location: { + type: 'Point', + coordinates: [-73.59111, 45.51889], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: {}, + }, + { + _id: '10059872', + listing_url: 'https://www.airbnb.com/rooms/10059872', + name: 'Soho Cozy, Spacious and Convenient', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '4', + maximum_nights: '20', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + first_review: { + $date: '2015-12-19T05:00:00.000Z', + }, + last_review: { + $date: '2018-03-27T04:00:00.000Z', + }, + accommodates: 3, + bedrooms: 1, + beds: 2, + number_of_reviews: 3, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'Air conditioning', + 'Kitchen', + 'Smoking allowed', + 'Doorman', + 'Elevator', + 'Heating', + 'Family/kid friendly', + 'Essentials', + '24-hour check-in', + 'translation missing: en.hosting_amenity_50', + ], + price: { + $numberDecimal: '699.00', + }, + weekly_price: { + $numberDecimal: '5000.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/4533a1dc-6fd8-4167-938d-391c6eebbc19.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '51624384', + host_url: 'https://www.airbnb.com/users/show/51624384', + host_name: 'Giovanni', + host_location: 'Hong Kong, Hong Kong', + host_about: '', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/264b82a7-756f-4da8-b607-dc9759e2a10f.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/264b82a7-756f-4da8-b607-dc9759e2a10f.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Soho', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'government_id', + ], + }, + address: { + street: 'Hong Kong, Hong Kong Island, Hong Kong', + suburb: 'Central & Western District', + government_area: 'Central & Western', + market: 'Hong Kong', + country: 'Hong Kong', + country_code: 'HK', + location: { + type: 'Point', + coordinates: [114.15027, 22.28158], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 8, + review_scores_rating: 100, + }, + }, + { + _id: '10116578', + listing_url: 'https://www.airbnb.com/rooms/10116578', + name: 'Apartamento zona sul do RJ', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + accommodates: 5, + bedrooms: 3, + beds: 3, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '1.5', + }, + amenities: [ + 'Cable TV', + 'Wifi', + 'Air conditioning', + 'Wheelchair accessible', + 'Kitchen', + 'Free parking on premises', + 'Doorman', + 'Elevator', + 'Buzzer/wireless intercom', + 'Family/kid friendly', + 'Washer', + '24-hour check-in', + 'Iron', + ], + price: { + $numberDecimal: '933.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/96bb9ea5-a164-4fb6-a136-a21b168a72d7.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '51915770', + host_url: 'https://www.airbnb.com/users/show/51915770', + host_name: 'Luiz Rodrigo', + host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', + host_about: '', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/1a49003e-8025-432d-8614-b1b7aecfe381.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/1a49003e-8025-432d-8614-b1b7aecfe381.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['phone', 'facebook'], + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Laranjeiras', + government_area: 'Laranjeiras', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.1825954762751, -22.930541460367934], + is_location_exact: false, + }, + }, + availability: { + availability_30: 30, + availability_60: 60, + availability_90: 90, + availability_365: 365, + }, + review_scores: {}, + }, + { + _id: '10082307', + listing_url: 'https://www.airbnb.com/rooms/10082307', + name: 'Double Room en-suite (307)', + notes: '', + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Wheelchair accessible', + 'Doorman', + 'Elevator', + 'Family/kid friendly', + 'Shampoo', + 'Hangers', + 'Hair dryer', + 'Iron', + ], + price: { + $numberDecimal: '361.00', + }, + extra_people: { + $numberDecimal: '130.00', + }, + guests_included: { + $numberDecimal: '2', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/8ee32fb6-2094-42ee-ae6c-ff40b479f9a7.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '51289938', + host_url: 'https://www.airbnb.com/users/show/51289938', + host_name: 'Ken', + host_location: 'Hong Kong', + host_about: + 'Out-going and positive. Happy to talk to guests and exchange our difference in culture.', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/48ba1de1-bfea-446c-83ab-c21cb4272696.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/48ba1de1-bfea-446c-83ab-c21cb4272696.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Jordan', + host_response_rate: 90, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 6, + host_total_listings_count: 6, + host_verifications: ['email', 'phone', 'google', 'reviews'], + }, + address: { + street: 'Hong Kong, Kowloon, Hong Kong', + suburb: 'Yau Tsim Mong', + government_area: 'Yau Tsim Mong', + market: 'Hong Kong', + country: 'Hong Kong', + country_code: 'HK', + location: { + type: 'Point', + coordinates: [114.17158, 22.30469], + is_location_exact: true, + }, + }, + availability: { + availability_30: 30, + availability_60: 60, + availability_90: 90, + availability_365: 365, + }, + review_scores: {}, + }, + { + _id: '10091713', + listing_url: 'https://www.airbnb.com/rooms/10091713', + name: 'Surry Hills Studio - Your Perfect Base in Sydney', + notes: + "WiFi, Apple TV with Netflix App (for use with your own iTunes / Netflix account), 42' TV, Sound Dock", + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '10', + maximum_nights: '21', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + first_review: { + $date: '2016-12-29T05:00:00.000Z', + }, + last_review: { + $date: '2018-03-18T04:00:00.000Z', + }, + accommodates: 2, + bedrooms: 0, + beds: 1, + number_of_reviews: 64, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Wifi', + 'Kitchen', + 'Elevator', + 'Heating', + 'Washer', + 'Dryer', + 'Smoke detector', + 'Essentials', + 'Shampoo', + 'Iron', + 'Laptop friendly workspace', + 'translation missing: en.hosting_amenity_49', + 'translation missing: en.hosting_amenity_50', + 'Hot water', + 'Bed linens', + 'Ethernet connection', + 'Other', + ], + price: { + $numberDecimal: '181.00', + }, + security_deposit: { + $numberDecimal: '300.00', + }, + cleaning_fee: { + $numberDecimal: '50.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/f8eaba4e-d211-42fb-a3ca-887c0ff766f8.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '13764143', + host_url: 'https://www.airbnb.com/users/show/13764143', + host_name: 'Ben', + host_location: 'New South Wales, Australia', + host_about: 'Software developer from Sydney, Australia. ', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/03c4d82b-7e4a-4457-976d-c4e9dfdb13fa.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/03c4d82b-7e4a-4457-976d-c4e9dfdb13fa.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Surry Hills', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'google', + 'reviews', + 'jumio', + 'offline_government_id', + 'government_id', + 'work_email', + ], + }, + address: { + street: 'Surry Hills, NSW, Australia', + suburb: 'Darlinghurst', + government_area: 'Sydney', + market: 'Sydney', + country: 'Australia', + country_code: 'AU', + location: { + type: 'Point', + coordinates: [151.21554, -33.88029], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 9, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 9, + review_scores_rating: 95, + }, + }, + { + _id: '10069642', + listing_url: 'https://www.airbnb.com/rooms/10069642', + name: 'Ótimo Apto proximo Parque Olimpico', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '15', + maximum_nights: '20', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + accommodates: 5, + bedrooms: 2, + beds: 2, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '2.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Wheelchair accessible', + 'Kitchen', + 'Free parking on premises', + 'Doorman', + 'Gym', + 'Elevator', + 'Buzzer/wireless intercom', + 'Family/kid friendly', + 'Washer', + 'Essentials', + 'Hair dryer', + 'Iron', + ], + price: { + $numberDecimal: '858.00', + }, + security_deposit: { + $numberDecimal: '4476.00', + }, + cleaning_fee: { + $numberDecimal: '112.00', + }, + extra_people: { + $numberDecimal: '75.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/5b1f4beb-6e06-41f0-970b-044f2f28d957.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '51670240', + host_url: 'https://www.airbnb.com/users/show/51670240', + host_name: 'Jonathan', + host_location: 'Resende, Rio de Janeiro, Brazil', + host_about: '', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/9a6839d9-9bea-451b-961d-5965894b9b9a.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/9a6839d9-9bea-451b-961d-5965894b9b9a.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['email', 'phone', 'jumio', 'government_id'], + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Recreio dos Bandeirantes', + government_area: 'Recreio dos Bandeirantes', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.4311123147628, -23.00035792660916], + is_location_exact: false, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: {}, + }, + { + _id: '10120414', + listing_url: 'https://www.airbnb.com/rooms/10120414', + name: 'The LES Apartment', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '3', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + accommodates: 3, + bedrooms: 1, + beds: 1, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Buzzer/wireless intercom', + 'Family/kid friendly', + 'Washer', + 'Dryer', + 'Essentials', + 'Shampoo', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + ], + price: { + $numberDecimal: '150.00', + }, + security_deposit: { + $numberDecimal: '200.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/0113fa69-96c5-4241-a949-854a48d8d9e0.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '33231070', + host_url: 'https://www.airbnb.com/users/show/33231070', + host_name: 'Mert', + host_location: 'New York, New York, United States', + host_about: + 'Hello to prospect guests and hosts,\r\nI am an international student from Istanbul/Turkey studying in New York, which I believe are the two most wonderful cities in the world that everyone should visit. \r\nThere are two things in life that I really like to do; traveling and making music. When two combined, it encourages me to discover ethnic music all around the world. In addition to that, I love meeting new people and always helpful to make people feel comfortable. ', + host_thumbnail_url: + 'https://a0.muscache.com/im/users/33231070/profile_pic/1431469729/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/33231070/profile_pic/1431469729/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'government_id', + 'work_email', + ], + }, + address: { + street: 'New York, NY, United States', + suburb: 'Manhattan', + government_area: 'Lower East Side', + market: 'New York', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-73.98944, 40.72063], + is_location_exact: false, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: {}, + }, + { + _id: '10038496', + listing_url: 'https://www.airbnb.com/rooms/10038496', + name: 'Copacabana Apartment Posto 6', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '3', + maximum_nights: '75', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + first_review: { + $date: '2016-01-18T05:00:00.000Z', + }, + last_review: { + $date: '2019-01-28T05:00:00.000Z', + }, + accommodates: 4, + bedrooms: 1, + beds: 3, + number_of_reviews: 70, + bathrooms: { + $numberDecimal: '2.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Paid parking off premises', + 'Smoking allowed', + 'Doorman', + 'Elevator', + 'Buzzer/wireless intercom', + 'Family/kid friendly', + 'Washer', + 'Fire extinguisher', + 'Essentials', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Hot water', + 'Bed linens', + 'Extra pillows and blankets', + 'Microwave', + 'Coffee maker', + 'Refrigerator', + 'Dishes and silverware', + 'Oven', + 'Stove', + 'Long term stays allowed', + 'Wide hallway clearance', + 'Host greets you', + ], + price: { + $numberDecimal: '119.00', + }, + security_deposit: { + $numberDecimal: '600.00', + }, + cleaning_fee: { + $numberDecimal: '150.00', + }, + extra_people: { + $numberDecimal: '40.00', + }, + guests_included: { + $numberDecimal: '3', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/159d489e-62ad-44c4-80a0-fab2a8f3b455.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '51530266', + host_url: 'https://www.airbnb.com/users/show/51530266', + host_name: 'Ana Valéria', + host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', + host_about: + 'Professora de Educação Física formada pela universidade Gama Filho.', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/8c7bb5fe-7b6d-4d03-a465-aae8971a87a0.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/8c7bb5fe-7b6d-4d03-a465-aae8971a87a0.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Copacabana', + host_response_rate: 100, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 2, + host_total_listings_count: 2, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'government_id', + ], + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Copacabana', + government_area: 'Copacabana', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.190849194463404, -22.984339360067814], + is_location_exact: false, + }, + }, + availability: { + availability_30: 7, + availability_60: 19, + availability_90: 33, + availability_365: 118, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 98, + }, + }, + { + _id: '10140368', + listing_url: 'https://www.airbnb.com/rooms/10140368', + name: 'A bedroom far away from home', + notes: '', + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '10', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + first_review: { + $date: '2016-01-06T05:00:00.000Z', + }, + last_review: { + $date: '2019-03-03T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 239, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'Wifi', + 'Kitchen', + 'Free street parking', + 'Heating', + 'Family/kid friendly', + 'Smoke detector', + 'Carbon monoxide detector', + 'Essentials', + 'Shampoo', + 'Lock on bedroom door', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'translation missing: en.hosting_amenity_50', + 'Private entrance', + 'Hot water', + 'Host greets you', + ], + price: { + $numberDecimal: '45.00', + }, + extra_people: { + $numberDecimal: '10.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/e15dbb07-8de4-4e4e-9217-1d0763419532.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '1017772', + host_url: 'https://www.airbnb.com/users/show/1017772', + host_name: 'Lane', + host_location: 'US', + host_about: + 'Hello. I am a very passionate person with whatever I do. I love adventures and travelling. \r\nI love meeting and talking to people of any race, color and gender. I think I can learn something from every person I meet and I value learning so much that \r\n\r\nHope to meet new friendships on my travels. ', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/user/0a118b69-9d68-4b0e-99ba-34fefc2df36b.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/user/0a118b69-9d68-4b0e-99ba-34fefc2df36b.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Jamaica', + host_response_rate: 100, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'manual_online', + 'facebook', + 'reviews', + 'manual_offline', + 'jumio', + 'government_id', + ], + }, + address: { + street: 'Queens, NY, United States', + suburb: 'Queens', + government_area: 'Briarwood', + market: 'New York', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-73.82257, 40.71485], + is_location_exact: true, + }, + }, + availability: { + availability_30: 20, + availability_60: 29, + availability_90: 29, + availability_365: 34, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 9, + review_scores_value: 10, + review_scores_rating: 95, + }, + }, + { + _id: '1001265', + listing_url: 'https://www.airbnb.com/rooms/1001265', + name: 'Ocean View Waikiki Marina w/prkg', + notes: '', + property_type: 'Condominium', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '3', + maximum_nights: '365', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + first_review: { + $date: '2013-05-24T04:00:00.000Z', + }, + last_review: { + $date: '2019-02-07T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 96, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Wifi', + 'Air conditioning', + 'Pool', + 'Kitchen', + 'Free parking on premises', + 'Elevator', + 'Hot tub', + 'Washer', + 'Dryer', + 'Essentials', + 'Shampoo', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Self check-in', + 'Lockbox', + 'Hot water', + 'Bed linens', + 'Extra pillows and blankets', + 'Ethernet connection', + 'Microwave', + 'Coffee maker', + 'Refrigerator', + 'Dishes and silverware', + 'Cooking basics', + 'Stove', + 'BBQ grill', + 'Garden or backyard', + 'Well-lit path to entrance', + 'Disabled parking spot', + 'Step-free access', + 'Wide clearance to bed', + 'Step-free access', + ], + price: { + $numberDecimal: '115.00', + }, + weekly_price: { + $numberDecimal: '650.00', + }, + monthly_price: { + $numberDecimal: '2150.00', + }, + cleaning_fee: { + $numberDecimal: '100.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/15037101/5aff14a7_original.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '5448114', + host_url: 'https://www.airbnb.com/users/show/5448114', + host_name: 'David', + host_location: 'Honolulu, Hawaii, United States', + host_about: + 'I have 30 years of experience in the Waikiki Real Estate Market. We specialize in local sales and property management. Our goal is service and aloha. We want to help people enjoy Hawaii.', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/users/5448114/profile_pic/1363202219/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/5448114/profile_pic/1363202219/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Waikiki', + host_response_rate: 98, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 18, + host_total_listings_count: 18, + host_verifications: ['email', 'phone', 'reviews', 'kba'], + }, + address: { + street: 'Honolulu, HI, United States', + suburb: 'Oʻahu', + government_area: 'Primary Urban Center', + market: 'Oahu', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-157.83919, 21.28634], + is_location_exact: true, + }, + }, + availability: { + availability_30: 16, + availability_60: 46, + availability_90: 76, + availability_365: 343, + }, + review_scores: { + review_scores_accuracy: 9, + review_scores_cleanliness: 8, + review_scores_checkin: 9, + review_scores_communication: 9, + review_scores_location: 10, + review_scores_value: 9, + review_scores_rating: 84, + }, + }, + { + _id: '10092679', + listing_url: 'https://www.airbnb.com/rooms/10092679', + name: 'Cozy house at Beyoğlu', + notes: 'Just enjoy your holiday', + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Pull-out Sofa', + minimum_nights: '2', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-02-18T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-18T05:00:00.000Z', + }, + first_review: { + $date: '2017-10-08T04:00:00.000Z', + }, + last_review: { + $date: '2018-12-21T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 27, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'Wifi', + 'Kitchen', + 'Smoking allowed', + 'Breakfast', + 'Pets live on this property', + 'Cat(s)', + 'Free street parking', + 'Heating', + 'Washer', + 'Essentials', + 'Shampoo', + 'Lock on bedroom door', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Hot water', + 'Bed linens', + 'Extra pillows and blankets', + 'Coffee maker', + 'Refrigerator', + 'Dishwasher', + 'Cooking basics', + 'Patio or balcony', + 'Luggage dropoff allowed', + 'Host greets you', + ], + price: { + $numberDecimal: '58.00', + }, + weekly_price: { + $numberDecimal: '387.00', + }, + security_deposit: { + $numberDecimal: '0.00', + }, + cleaning_fee: { + $numberDecimal: '0.00', + }, + extra_people: { + $numberDecimal: '60.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/23876199-7472-48f4-b215-7c727be47fd7.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '21331922', + host_url: 'https://www.airbnb.com/users/show/21331922', + host_name: 'Ali', + host_location: 'İstanbul', + host_about: + 'I am Ali, 33 years old and a Psychological Counceler - Teacher. I am working at Secondary School. \r\nI like meet with new people, chess, cinema and arts. I have blog about cinema and write critics sometimes. \r\n\r\nI like travel, I visited Austria, Belgium, Bulgaria, Czech Republic, England, France, Germany, Greece, Hungary, Italy, Kosovo, Macedonia, Netherlands, Portugal, Serbia, Spain and Ukraine. And I met many peaople in this countries, I think Airbnb is one of the best way to meet new people and share the life. So I opened my home for guests who is coming from the any part of the world.\r\n\r\nUsualy I watch films, some of my favourite directors are Michael Haneke, Kim Ki Duk, Emir Kustarica, Lars Von Trier, Andrei Zyvanigitsev, Bahman Ghobadi, Majid Majidi, Abbas Kiyarüstemi, Ingmar Bergman, Stanley Kubrick etc. \r\n\r\nMy favorite Tv Series are Prison Break, Breaking Bad, Better Call Soul, Mr. Robot, Black Mirror, Narcos, Intreatmant. \r\n\r\nI try to explain of me. You wellcome to my home. My house is very safety, lovely and peaceful.\r\n\r\nEasy access to popular destinations : Taksim, Beyoğlu, Eminönü, Sultanahmet, Topkapı Palace, Galata Tower, Kadıköy, Princes Islands.\r\nI am pleased to welcome you.\r\n\r\nPeople who stay with me are from Germany, Canada, Norway, Sweeden, Jordan, Russian, Iran, China, South Korea, United States, Mexico City, Malasia, Italy, Australia until yet. \r\n', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/user/bcd9b30d-f858-4fab-b7a3-f98b45df73cb.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/user/bcd9b30d-f858-4fab-b7a3-f98b45df73cb.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Taksim', + host_response_rate: 100, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 8, + host_total_listings_count: 8, + host_verifications: ['email', 'phone', 'reviews', 'jumio'], + }, + address: { + street: 'Beyoğlu, İstanbul, Turkey', + suburb: 'Beyoglu', + government_area: 'Beyoglu', + market: 'Istanbul', + country: 'Turkey', + country_code: 'TR', + location: { + type: 'Point', + coordinates: [28.95825, 41.03777], + is_location_exact: false, + }, + }, + availability: { + availability_30: 3, + availability_60: 19, + availability_90: 37, + availability_365: 37, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 9, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 9, + review_scores_value: 10, + review_scores_rating: 99, + }, + }, + { + _id: '10096773', + listing_url: 'https://www.airbnb.com/rooms/10096773', + name: 'Easy 1 Bedroom in Chelsea', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + first_review: { + $date: '2016-01-03T05:00:00.000Z', + }, + last_review: { + $date: '2016-01-03T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 1, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Internet', + 'Wifi', + 'Kitchen', + 'Heating', + 'Smoke detector', + 'Carbon monoxide detector', + 'Fire extinguisher', + 'Essentials', + ], + price: { + $numberDecimal: '145.00', + }, + weekly_price: { + $numberDecimal: '1000.00', + }, + cleaning_fee: { + $numberDecimal: '60.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/ceb6e8b2-d006-4f1f-b0c4-001e48de11db.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '34607505', + host_url: 'https://www.airbnb.com/users/show/34607505', + host_name: 'Scott', + host_location: 'New York, New York, United States', + host_about: + 'I am pretty much your average early/mid career working professional in NYC.', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/675cec89-71eb-4ca7-bacd-bbed62ef6fad.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/675cec89-71eb-4ca7-bacd-bbed62ef6fad.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Chelsea', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['email', 'phone', 'facebook', 'reviews', 'kba'], + }, + address: { + street: 'New York, NY, United States', + suburb: 'Manhattan', + government_area: 'Chelsea', + market: 'New York', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-74.00074, 40.74577], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 100, + }, + }, + { + _id: '10030955', + listing_url: 'https://www.airbnb.com/rooms/10030955', + name: 'Apt Linda Vista Lagoa - Rio', + notes: '', + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '2.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Pool', + 'Kitchen', + 'Free parking on premises', + 'Doorman', + 'Gym', + 'Elevator', + 'Buzzer/wireless intercom', + 'Family/kid friendly', + 'Washer', + 'Essentials', + '24-hour check-in', + ], + price: { + $numberDecimal: '701.00', + }, + security_deposit: { + $numberDecimal: '1000.00', + }, + cleaning_fee: { + $numberDecimal: '250.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/59c516bd-c7c3-4dae-8625-aff5f55ece53.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '51496939', + host_url: 'https://www.airbnb.com/users/show/51496939', + host_name: 'Livia', + host_location: 'BR', + host_about: '', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/b7911710-9088-451d-a27b-62ad2fc2eac0.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/b7911710-9088-451d-a27b-62ad2fc2eac0.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Lagoa', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['email', 'phone', 'jumio', 'government_id'], + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Lagoa', + government_area: 'Lagoa', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.205047082633435, -22.971950988341874], + is_location_exact: true, + }, + }, + availability: { + availability_30: 28, + availability_60: 58, + availability_90: 88, + availability_365: 363, + }, + review_scores: {}, + }, + { + _id: '10112159', + listing_url: 'https://www.airbnb.com/rooms/10112159', + name: 'Downtown Oporto Inn (room cleaning)', + notes: 'No private parking.', + property_type: 'Hostel', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'moderate', + last_scraped: { + $date: '2019-02-16T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-16T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Wifi', + 'Family/kid friendly', + 'Smoke detector', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + 'Lock on bedroom door', + 'Hangers', + 'Hair dryer', + 'Hot water', + 'Long term stays allowed', + 'Other', + ], + price: { + $numberDecimal: '40.00', + }, + weekly_price: { + $numberDecimal: '230.00', + }, + monthly_price: { + $numberDecimal: '600.00', + }, + security_deposit: { + $numberDecimal: '0.00', + }, + cleaning_fee: { + $numberDecimal: '50.00', + }, + extra_people: { + $numberDecimal: '25.00', + }, + guests_included: { + $numberDecimal: '2', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/442ad717-ecf2-4bb5-a186-17a46cfb5f5f.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '2649859', + host_url: 'https://www.airbnb.com/users/show/2649859', + host_name: 'Elisabete', + host_location: 'Porto, Porto, Portugal', + host_about: + "Sou activa, responsável, interessada por leitura, por cinema e por passeio. Sobretudo, sou escritora. Adoro escrever! Escrevo sobre o Porto e sobre as pessoas, pois são o que de mais importante temos! Venha conhecer o nosso espaço, que inspirou o nascimento de dois livros, já editados, além de outros dois, ainda na forja... | I'm an active, responsible person, who loves reading, movies and walking through our beautiful country. Mainly, I'm a writer. I love to write! I write about Oporto and about people, cause they are the most important thing we have. Come and know our space, where two books were already born, and two others are on their way out..", + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/3e7725d5-79ea-4290-a99c-5bd5e0691f02.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/3e7725d5-79ea-4290-a99c-5bd5e0691f02.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 2, + host_total_listings_count: 2, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'government_id', + ], + }, + address: { + street: 'Porto, Porto, Portugal', + suburb: '', + government_area: 'Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória', + market: 'Porto', + country: 'Portugal', + country_code: 'PT', + location: { + type: 'Point', + coordinates: [-8.60867, 41.1543], + is_location_exact: false, + }, + }, + availability: { + availability_30: 30, + availability_60: 60, + availability_90: 87, + availability_365: 359, + }, + review_scores: {}, + }, + { + _id: '10109896', + listing_url: 'https://www.airbnb.com/rooms/10109896', + name: "THE Place to See Sydney's FIREWORKS", + notes: + "We live with our stud dog, and our son; we won't be here during your stay, but if you're allergic to dogs or babies, best to pick another place. :)", + property_type: 'House', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '1125', + cancellation_policy: 'moderate', + last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '2.5', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Buzzer/wireless intercom', + 'Heating', + 'Family/kid friendly', + 'Washer', + 'Dryer', + 'Smoke detector', + 'Essentials', + 'Shampoo', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + ], + price: { + $numberDecimal: '250.00', + }, + security_deposit: { + $numberDecimal: '400.00', + }, + cleaning_fee: { + $numberDecimal: '150.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/aca46512-3f26-432e-8114-e13fa5707217.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '6517277', + host_url: 'https://www.airbnb.com/users/show/6517277', + host_name: 'Kristin', + host_location: 'Sydney, New South Wales, Australia', + host_about: '', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/a304162e-015b-4e94-a891-84c4355fad39.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/a304162e-015b-4e94-a891-84c4355fad39.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Lilyfield/Rozelle', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'offline_government_id', + 'government_id', + ], + }, + address: { + street: 'Rozelle, NSW, Australia', + suburb: 'Lilyfield/Rozelle', + government_area: 'Leichhardt', + market: 'Sydney', + country: 'Australia', + country_code: 'AU', + location: { + type: 'Point', + coordinates: [151.17956, -33.86296], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: {}, + }, + { + _id: '10066928', + listing_url: 'https://www.airbnb.com/rooms/10066928', + name: '3 chambres au coeur du Plateau', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + accommodates: 6, + bedrooms: 3, + beds: 3, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'Internet', + 'Wifi', + 'Kitchen', + 'Heating', + 'Family/kid friendly', + 'Washer', + 'Dryer', + 'Essentials', + 'Shampoo', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + ], + price: { + $numberDecimal: '140.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/f208bdd7-bdab-4d4d-b529-8e6b1e5a83c1.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '9036477', + host_url: 'https://www.airbnb.com/users/show/9036477', + host_name: 'Margaux', + host_location: 'Montreal, Quebec, Canada', + host_about: '', + host_thumbnail_url: + 'https://a0.muscache.com/im/users/9036477/profile_pic/1425247510/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/9036477/profile_pic/1425247510/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Le Plateau', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 2, + host_total_listings_count: 2, + host_verifications: ['email', 'phone', 'reviews', 'work_email'], + }, + address: { + street: 'Montréal, Québec, Canada', + suburb: 'Le Plateau-Mont-Royal', + government_area: 'Le Plateau-Mont-Royal', + market: 'Montreal', + country: 'Canada', + country_code: 'CA', + location: { + type: 'Point', + coordinates: [-73.57383, 45.52233], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: {}, + }, + { + _id: '10082422', + listing_url: 'https://www.airbnb.com/rooms/10082422', + name: 'Nice room in Barcelona Center', + notes: '', + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '9', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-03-08T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-08T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 2, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'Internet', + 'Wifi', + 'Kitchen', + 'Elevator', + 'Heating', + 'Washer', + 'Shampoo', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + ], + price: { + $numberDecimal: '50.00', + }, + security_deposit: { + $numberDecimal: '100.00', + }, + cleaning_fee: { + $numberDecimal: '10.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/aed1923a-69a6-4614-99d0-fd5c8f41ebda.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '30393403', + host_url: 'https://www.airbnb.com/users/show/30393403', + host_name: 'Anna', + host_location: 'Barcelona, Catalonia, Spain', + host_about: + "I'm Anna, italian. I'm 28, friendly and easygoing. I love travelling, reading, dancing tango. Can wait to meet new people! :)", + host_thumbnail_url: + 'https://a0.muscache.com/im/users/30393403/profile_pic/1427876639/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/30393403/profile_pic/1427876639/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: "Dreta de l'Eixample", + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['phone', 'facebook'], + }, + address: { + street: 'Barcelona, Catalunya, Spain', + suburb: 'Eixample', + government_area: "la Dreta de l'Eixample", + market: 'Barcelona', + country: 'Spain', + country_code: 'ES', + location: { + type: 'Point', + coordinates: [2.16942, 41.40082], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: {}, + }, + { + _id: '10209136', + listing_url: 'https://www.airbnb.com/rooms/10209136', + name: 'Friendly Apartment, 10m from Manly', + notes: + "Everyone in the block of apartments know each other and will often hang out together in the backyard. Big mix of ages and professions- everyone loves surfing and skating. Also worth noting, there will be a party in the backyard on NYE which you'd be welcome to join.", + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + first_review: { + $date: '2016-01-24T05:00:00.000Z', + }, + last_review: { + $date: '2016-02-16T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 4, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'Internet', + 'Wifi', + 'Kitchen', + 'Free parking on premises', + 'Heating', + 'Family/kid friendly', + 'Washer', + 'Dryer', + 'First aid kit', + 'Essentials', + ], + price: { + $numberDecimal: '36.00', + }, + extra_people: { + $numberDecimal: '20.00', + }, + guests_included: { + $numberDecimal: '2', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/f2da856f-1eb3-4b89-af8e-24e95322625d.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '52453573', + host_url: 'https://www.airbnb.com/users/show/52453573', + host_name: 'Isaac', + host_location: 'Sydney, New South Wales, Australia', + host_about: '', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/4c3ec070-d880-4c2b-80ab-5009f416cc43.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/4c3ec070-d880-4c2b-80ab-5009f416cc43.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'government_id', + ], + }, + address: { + street: 'Fairlight, NSW, Australia', + suburb: 'Fairlight', + government_area: 'Manly', + market: 'Sydney', + country: 'Australia', + country_code: 'AU', + location: { + type: 'Point', + coordinates: [151.26969, -33.79629], + is_location_exact: false, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 9, + review_scores_communication: 9, + review_scores_location: 10, + review_scores_value: 9, + review_scores_rating: 95, + }, + }, + { + _id: '10240767', + listing_url: 'https://www.airbnb.com/rooms/10240767', + name: 'Cozy double bed room 東涌鄉村雅緻雙人房', + notes: + 'Bring your own toothbrush and toothpaste 7-minute walk to my village house from the main road. The room is on G/F. No lift is in the building. 請自備牙膏,牙刷及拖鞋。 屋子遠離馬路,客人需步行約七分鐘才能到達。', + property_type: 'Guesthouse', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'moderate', + last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + first_review: { + $date: '2016-07-29T04:00:00.000Z', + }, + last_review: { + $date: '2019-02-18T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 162, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Free parking on premises', + 'Pets live on this property', + 'Cat(s)', + 'Family/kid friendly', + 'Suitable for events', + 'Washer', + 'Dryer', + 'Smoke detector', + 'First aid kit', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Children’s books and toys', + 'Hot water', + 'Bed linens', + 'Extra pillows and blankets', + 'Microwave', + 'Coffee maker', + 'Refrigerator', + 'Dishes and silverware', + 'Cooking basics', + 'Oven', + 'Stove', + 'BBQ grill', + 'Patio or balcony', + 'Garden or backyard', + 'Luggage dropoff allowed', + 'Long term stays allowed', + 'Cleaning before checkout', + 'Host greets you', + ], + price: { + $numberDecimal: '487.00', + }, + security_deposit: { + $numberDecimal: '0.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/410fb8a8-673d-44a8-80bd-0b4ac09e6bf2.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '52491634', + host_url: 'https://www.airbnb.com/users/show/52491634', + host_name: 'Ricky', + host_location: 'Hong Kong', + host_about: + 'I am Ricky. I enjoy getting to know people from all around the world and their unique cultures. Nice to meet you all! ^_^', + host_response_time: 'within a few hours', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/0ea05bb0-cadf-42a7-812b-671f1f00757d.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/0ea05bb0-cadf-42a7-812b-671f1f00757d.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_response_rate: 100, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 5, + host_total_listings_count: 5, + host_verifications: ['email', 'phone', 'reviews'], + }, + address: { + street: 'Hong Kong, New Territories, Hong Kong', + suburb: '', + government_area: 'Islands', + market: 'Hong Kong', + country: 'Hong Kong', + country_code: 'HK', + location: { + type: 'Point', + coordinates: [113.92823, 22.27671], + is_location_exact: false, + }, + }, + availability: { + availability_30: 18, + availability_60: 41, + availability_90: 67, + availability_365: 339, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 9, + review_scores_value: 9, + review_scores_rating: 96, + }, + }, + { + _id: '10332161', + listing_url: 'https://www.airbnb.com/rooms/10332161', + name: 'A large sunny bedroom', + notes: '', + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '3', + maximum_nights: '1125', + cancellation_policy: 'moderate', + last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + first_review: { + $date: '2016-08-05T04:00:00.000Z', + }, + last_review: { + $date: '2016-08-20T04:00:00.000Z', + }, + accommodates: 1, + bedrooms: 1, + beds: 1, + number_of_reviews: 2, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Heating', + 'Washer', + 'Dryer', + 'Smoke detector', + 'First aid kit', + 'Essentials', + 'Lock on bedroom door', + 'Hangers', + 'Hair dryer', + 'Iron', + 'translation missing: en.hosting_amenity_49', + 'translation missing: en.hosting_amenity_50', + ], + price: { + $numberDecimal: '35.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/7e68a65c-562e-42b2-bc6c-c95a87eac969.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '53169195', + host_url: 'https://www.airbnb.com/users/show/53169195', + host_name: 'Ehssan', + host_location: 'New York, New York, United States', + host_about: '', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/c6f4d130-30d3-482c-994b-4a4ea575ac39.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/c6f4d130-30d3-482c-994b-4a4ea575ac39.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Tremont', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'facebook', + 'reviews', + 'jumio', + 'government_id', + ], + }, + address: { + street: 'Bronx, NY, United States', + suburb: 'Tremont', + government_area: 'Fordham', + market: 'New York', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-73.90052, 40.85598], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 9, + review_scores_communication: 9, + review_scores_location: 6, + review_scores_value: 9, + review_scores_rating: 90, + }, + }, + { + _id: '10459480', + listing_url: 'https://www.airbnb.com/rooms/10459480', + name: 'Greenwich Fun and Luxury', + notes: + 'Plenty of off-street parking for guests, climate controlled heating and cooling as needed.', + property_type: 'House', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '5', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + accommodates: 6, + bedrooms: 4, + beds: 4, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '4.0', + }, + amenities: [ + 'TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Pool', + 'Kitchen', + 'Free parking on premises', + 'Indoor fireplace', + 'Buzzer/wireless intercom', + 'Heating', + 'Family/kid friendly', + 'Washer', + 'Smoke detector', + 'First aid kit', + 'Essentials', + 'Shampoo', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + ], + price: { + $numberDecimal: '999.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/bab17a39-035d-4ad8-ba38-e6bd9be4245f.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '45186586', + host_url: 'https://www.airbnb.com/users/show/45186586', + host_name: 'Craig', + host_location: 'Sydney, New South Wales, Australia', + host_about: + "I'm an entrepreneur with a couple of different business interests. I work from home on the Sydney lower north shore. \r\n\r\nOne of my businesses is based in Shanghai, the other has operations in Shanghai and Singapore (mainly). \r\n\r\nI travel more than I would like, and am looking for an alternative to always staying in hotels, which get old after many years. While travelling, I usually spend most of my evenings doing email after having dinner out. No wild parties, but I enjoy a beer and/or a glass or two of red : ) \r\n\r\nI use a personal email address for correspondence associated with AirBnB and other websites to do with travel and administration. ", + host_response_time: 'within a day', + host_thumbnail_url: + 'https://a0.muscache.com/im/users/45186586/profile_pic/1443513819/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/45186586/profile_pic/1443513819/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Greenwich', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'offline_government_id', + 'government_id', + 'work_email', + ], + }, + address: { + street: 'Greenwich, NSW, Australia', + suburb: 'Greenwich', + government_area: 'Lane Cove', + market: 'Sydney', + country: 'Australia', + country_code: 'AU', + location: { + type: 'Point', + coordinates: [151.18563, -33.8289], + is_location_exact: true, + }, + }, + availability: { + availability_30: 30, + availability_60: 60, + availability_90: 90, + availability_365: 365, + }, + review_scores: {}, + }, + { + _id: '1016739', + listing_url: 'https://www.airbnb.com/rooms/1016739', + name: 'Private Room (2) in Guest House at Coogee Beach', + notes: 'Guests may extend their stay long term up to 12 months', + property_type: 'House', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '3', + maximum_nights: '365', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + first_review: { + $date: '2013-07-15T04:00:00.000Z', + }, + last_review: { + $date: '2017-12-01T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 2, + number_of_reviews: 8, + bathrooms: { + $numberDecimal: '3.5', + }, + amenities: [ + 'TV', + 'Internet', + 'Wifi', + 'Kitchen', + 'Smoking allowed', + 'Doorman', + 'Free street parking', + 'Family/kid friendly', + 'Washer', + 'Dryer', + 'Smoke detector', + 'Safety card', + 'Fire extinguisher', + 'Essentials', + 'Lock on bedroom door', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Self check-in', + 'Keypad', + 'Hot water', + ], + price: { + $numberDecimal: '64.00', + }, + weekly_price: { + $numberDecimal: '500.00', + }, + monthly_price: { + $numberDecimal: '2000.00', + }, + security_deposit: { + $numberDecimal: '0.00', + }, + cleaning_fee: { + $numberDecimal: '30.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/15288404/3f765cd7_original.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '5595776', + host_url: 'https://www.airbnb.com/users/show/5595776', + host_name: 'David', + host_location: 'Sydney, New South Wales, Australia', + host_about: + 'Welcoming host who wants you to enjoy the beautiful surrounds at Coogee Beach', + host_response_time: 'within a few hours', + host_thumbnail_url: + 'https://a0.muscache.com/im/users/5595776/profile_pic/1372823881/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/5595776/profile_pic/1372823881/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Coogee', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 6, + host_total_listings_count: 6, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'offline_government_id', + 'government_id', + ], + }, + address: { + street: 'Coogee, NSW, Australia', + suburb: 'Coogee', + government_area: 'Randwick', + market: 'Sydney', + country: 'Australia', + country_code: 'AU', + location: { + type: 'Point', + coordinates: [151.25541, -33.92398], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 19, + availability_365: 20, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 9, + review_scores_rating: 100, + }, + }, + { + _id: '10299095', + listing_url: 'https://www.airbnb.com/rooms/10299095', + name: 'Small Room w Bathroom Flamengo Rio de Janeiro', + notes: + "We live my grandmother and I, she is very open minded and cool. But we aren't much of a party. So it wouldn't be a good idea to came home at dawn drunk, vomiting in the bathroom. Oh! I have a cat, he is very docile and rarely mine. This is important because if you are choosing a place to stay keep that in mind.", + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '4', + maximum_nights: '1125', + cancellation_policy: 'moderate', + last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + first_review: { + $date: '2016-08-20T04:00:00.000Z', + }, + last_review: { + $date: '2016-08-20T04:00:00.000Z', + }, + accommodates: 1, + bedrooms: 1, + beds: 1, + number_of_reviews: 1, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Wifi', + 'Kitchen', + 'Pets live on this property', + 'Cat(s)', + 'Elevator', + 'Washer', + 'Dryer', + 'Fire extinguisher', + 'Essentials', + 'translation missing: en.hosting_amenity_49', + 'translation missing: en.hosting_amenity_50', + ], + price: { + $numberDecimal: '71.00', + }, + cleaning_fee: { + $numberDecimal: '20.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/26459098-5f3e-4d82-a419-1839af1eaa9a.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '52988408', + host_url: 'https://www.airbnb.com/users/show/52988408', + host_name: 'Fernanda', + host_location: 'BR', + host_about: '', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/0c78bdd8-1e12-497e-a64c-b39f808ccfa7.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/0c78bdd8-1e12-497e-a64c-b39f808ccfa7.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 2, + host_total_listings_count: 2, + host_verifications: ['email', 'phone', 'reviews'], + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Flamengo', + government_area: 'Flamengo', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.17645081249057, -22.93848268819496], + is_location_exact: false, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: { + review_scores_accuracy: 8, + review_scores_cleanliness: 8, + review_scores_checkin: 8, + review_scores_communication: 8, + review_scores_location: 8, + review_scores_value: 8, + review_scores_rating: 80, + }, + }, + { + _id: '10141950', + listing_url: 'https://www.airbnb.com/rooms/10141950', + name: 'Big, Bright & Convenient Sheung Wan', + notes: + 'I actually live in the studio, so my belongings will be in a wardrobe space', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '1125', + cancellation_policy: 'moderate', + last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + first_review: { + $date: '2016-01-06T05:00:00.000Z', + }, + last_review: { + $date: '2016-01-06T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 0, + beds: 1, + number_of_reviews: 1, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Elevator', + 'Buzzer/wireless intercom', + 'Heating', + 'Washer', + 'Dryer', + 'Essentials', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + ], + price: { + $numberDecimal: '966.00', + }, + cleaning_fee: { + $numberDecimal: '118.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/aee73a00-c7dd-43bd-93eb-8d96de467a89.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '11435086', + host_url: 'https://www.airbnb.com/users/show/11435086', + host_name: 'Regg', + host_location: 'Hong Kong', + host_about: + 'I am a consultant and travel very often. I usually host my apartment when I leave and search for Airbnb rentals for accomodation.', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/user/736908a8-0792-4428-a630-d47a3df44bb9.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/user/736908a8-0792-4428-a630-d47a3df44bb9.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Sheung Wan', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'offline_government_id', + 'government_id', + 'work_email', + ], + }, + address: { + street: 'Hong Kong, Hong Kong Island, Hong Kong', + suburb: 'Central & Western District', + government_area: 'Central & Western', + market: 'Hong Kong', + country: 'Hong Kong', + country_code: 'HK', + location: { + type: 'Point', + coordinates: [114.15007, 22.28422], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 100, + }, + }, + { + _id: '10269320', + listing_url: 'https://www.airbnb.com/rooms/10269320', + name: 'FloresRooms 3T', + notes: + 'Informamos os nossos hospedes que no prédio ao lado está em reconstrução. Os trabalhos na obra realizam se entre as 8 da manha e as 18 horas, de segunda a sexta feira.', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '1124', + cancellation_policy: 'moderate', + last_scraped: { + $date: '2019-02-16T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-16T05:00:00.000Z', + }, + first_review: { + $date: '2016-01-18T05:00:00.000Z', + }, + last_review: { + $date: '2019-02-01T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 0, + beds: 1, + number_of_reviews: 225, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Elevator', + 'First aid kit', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + 'Hangers', + 'Hair dryer', + 'Laptop friendly workspace', + 'translation missing: en.hosting_amenity_49', + 'translation missing: en.hosting_amenity_50', + 'Self check-in', + 'Lockbox', + 'Hot water', + 'Bed linens', + 'Extra pillows and blankets', + ], + price: { + $numberDecimal: '31.00', + }, + security_deposit: { + $numberDecimal: '200.00', + }, + cleaning_fee: { + $numberDecimal: '10.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/1404e592-e245-4144-a135-0f49e80f384d.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '51724179', + host_url: 'https://www.airbnb.com/users/show/51724179', + host_name: 'Andreia', + host_location: 'Porto, Porto District, Portugal', + host_about: '', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/f1425353-8f70-4d49-a5dc-6e9f17a362c5.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/f1425353-8f70-4d49-a5dc-6e9f17a362c5.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_response_rate: 100, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 6, + host_total_listings_count: 6, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'government_id', + ], + }, + address: { + street: 'Porto, Porto, Portugal', + suburb: '', + government_area: 'Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória', + market: 'Porto', + country: 'Portugal', + country_code: 'PT', + location: { + type: 'Point', + coordinates: [-8.61205, 41.14404], + is_location_exact: false, + }, + }, + availability: { + availability_30: 13, + availability_60: 43, + availability_90: 62, + availability_365: 278, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 96, + }, + }, + { + _id: '10415637', + listing_url: 'https://www.airbnb.com/rooms/10415637', + name: '(1) Beach Guest House - Go Make A Trip', + notes: '', + property_type: 'Bed and breakfast', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + first_review: { + $date: '2016-02-11T05:00:00.000Z', + }, + last_review: { + $date: '2017-09-22T04:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 11, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Free parking on premises', + 'Family/kid friendly', + 'Essentials', + 'Shampoo', + 'Hair dryer', + 'Iron', + ], + price: { + $numberDecimal: '112.00', + }, + security_deposit: { + $numberDecimal: '0.00', + }, + cleaning_fee: { + $numberDecimal: '0.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '2', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/fb4ee284-ef42-4abe-96af-75124426a9c8.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '4765935', + host_url: 'https://www.airbnb.com/users/show/4765935', + host_name: 'Rafael', + host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', + host_about: '28 Years Old Micro Entrepreneur and Photo Travel Devoted.', + host_response_time: 'within a few hours', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/449d3f0f-1315-4eab-b48d-7470b278c0ce.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/449d3f0f-1315-4eab-b48d-7470b278c0ce.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Barra da Tijuca', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 8, + host_total_listings_count: 8, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'offline_government_id', + 'government_id', + ], + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Barra da Tijuca', + government_area: 'Barra da Tijuca', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.353970672578306, -23.008991691724663], + is_location_exact: false, + }, + }, + availability: { + availability_30: 24, + availability_60: 45, + availability_90: 60, + availability_365: 309, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 98, + }, + }, + { + _id: '10201975', + listing_url: 'https://www.airbnb.com/rooms/10201975', + name: 'Ipanema: moderno apê 2BR + garagem', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '4', + maximum_nights: '1125', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + first_review: { + $date: '2016-02-23T05:00:00.000Z', + }, + last_review: { + $date: '2019-01-28T05:00:00.000Z', + }, + accommodates: 4, + bedrooms: 2, + beds: 2, + number_of_reviews: 24, + bathrooms: { + $numberDecimal: '2.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Free parking on premises', + 'Smoking allowed', + 'Doorman', + 'Elevator', + 'Buzzer/wireless intercom', + 'Family/kid friendly', + 'Washer', + 'Dryer', + 'Essentials', + 'Shampoo', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Hot water', + 'Luggage dropoff allowed', + 'Long term stays allowed', + 'Host greets you', + ], + price: { + $numberDecimal: '298.00', + }, + security_deposit: { + $numberDecimal: '600.00', + }, + cleaning_fee: { + $numberDecimal: '180.00', + }, + extra_people: { + $numberDecimal: '50.00', + }, + guests_included: { + $numberDecimal: '2', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/d2ccb4bd-1cda-417f-98e4-4d8695ba3a8c.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '2537111', + host_url: 'https://www.airbnb.com/users/show/2537111', + host_name: 'Barbara', + host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', + host_about: + "My name is Barbara.\r\nI'm an administrator and real state manager. I study photography.\r\nI've always enjoyed showing Rio around and helping people take the most out of the city.\r\nIt has been seven years I share my love for Rio renting apartments for short period and helping my guests with hints on tourist spots.\r\nI love cooking and It will be a pleasure to be able to help with information about restaurants, bars and gastronomy in general.\r\nI love to make new friends and to know different cultures.\r\nMy husband Ricardo is a chemical engeneer, a great companion, but not talkative as I'm.\r\nOur daughter Alice is 8 years-old. She is into dancing classical ballet, jazz and loves to exchange experiences with people in general.\r\nI look foward to having you at my place!\r\n\r\nSeja bem vindo (a)! Meu nome é Bárbara, sou administradora de empresas e estudante de fotografia.\r\nHá 7 anos eu compartilho o amor pela cidade do Rio de Janeiro alugando apartamentos por temporada e ajudando meus hóspedes com dicas sobre a cidade e pontos turísticos.\r\nUma das minhas paixões é cozinhar e será um prazer poder compartilhar dicas sobre restaurantes, bares e gastronomia em geral.\r\nAdoro viajar, fazer novos amigos e conhecer diferentes culturas.\r\nSe você ficar na minha casa também vai conhecer o meu marido Ricardo, que é engenheiro químico e meu grande parceiro na hospedagem, gente boa, mas não tão falante como eu. Nossa filha Alice tem 8 anos, dança ballet e jazz e também adora conhecer novas pessoas e trocar experiências.\r\nTambém tenho apartamentos inteiros no Centro, Lapa e Zona Sul da cidade.\r\nSeja bem vindo a um cantinho para chamar de seu. :)", + host_response_time: 'within a few hours', + host_thumbnail_url: + 'https://a0.muscache.com/im/users/2537111/profile_pic/1418360168/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/2537111/profile_pic/1418360168/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Santa Teresa', + host_response_rate: 92, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 13, + host_total_listings_count: 13, + host_verifications: [ + 'email', + 'phone', + 'facebook', + 'reviews', + 'jumio', + 'government_id', + ], + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: '', + government_area: 'Ipanema', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.1998455458952, -22.980051683700506], + is_location_exact: false, + }, + }, + availability: { + availability_30: 24, + availability_60: 54, + availability_90: 84, + availability_365: 174, + }, + review_scores: { + review_scores_accuracy: 9, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 9, + review_scores_rating: 92, + }, + }, + { + _id: '1019168', + listing_url: 'https://www.airbnb.com/rooms/1019168', + name: 'Cozy Nest, heart of the Plateau', + notes: + "Since we are on the ground floor, access in and out of the house is possible for folks who may have a limited mobility, however there is 1 step to get through the front door and the bathroom is unfortunately a bit too narrow to accomodate a wheelchair. Let me know if you have questions regarding specifics and I'll be able to assist!", + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '120', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + first_review: { + $date: '2014-06-22T04:00:00.000Z', + }, + last_review: { + $date: '2019-01-08T05:00:00.000Z', + }, + accommodates: 1, + bedrooms: 1, + beds: 1, + number_of_reviews: 62, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Wifi', + 'Kitchen', + 'Paid parking off premises', + 'Pets live on this property', + 'Cat(s)', + 'Free street parking', + 'Heating', + 'Family/kid friendly', + 'Washer', + 'Dryer', + 'Smoke detector', + 'First aid kit', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Self check-in', + 'Lockbox', + 'Hot water', + 'Microwave', + 'Coffee maker', + 'Refrigerator', + 'Dishes and silverware', + 'Cooking basics', + 'Oven', + 'Stove', + 'BBQ grill', + 'Garden or backyard', + 'Luggage dropoff allowed', + 'Long term stays allowed', + ], + price: { + $numberDecimal: '34.00', + }, + weekly_price: { + $numberDecimal: '250.00', + }, + monthly_price: { + $numberDecimal: '900.00', + }, + security_deposit: { + $numberDecimal: '0.00', + }, + cleaning_fee: { + $numberDecimal: '25.00', + }, + extra_people: { + $numberDecimal: '10.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/a27beb17-c028-49a1-a374-9f4244f7b2ff.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '39300', + host_url: 'https://www.airbnb.com/users/show/39300', + host_name: 'Lilou', + host_location: 'Montreal, Quebec, Canada', + host_about: + "Hello,\r\nMy name is Laura, I am a young and active professional living in Montreal and working for a concert promoter.\r\nI've been living in this apartment for over 12 years now. It holds a very special place in my heart and I am glad to be opening the doors of my cosy nest to new guests!\r\nYou will also be sharing the common space with a cat or two as well as maybe another traveling guest.\r\nLooking forward to meeting you and helping make your stay in our lovely city as comfortable as possible.\r\nÀ bientôt !", + host_response_time: 'within a day', + host_thumbnail_url: + 'https://a0.muscache.com/im/users/39300/profile_pic/1400790873/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/39300/profile_pic/1400790873/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Mile End', + host_response_rate: 100, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'facebook', + 'reviews', + 'jumio', + 'offline_government_id', + 'government_id', + ], + }, + address: { + street: 'Montreal, QC, Canada', + suburb: 'Le Plateau-Mont-Royal', + government_area: 'Le Plateau-Mont-Royal', + market: 'Montreal', + country: 'Canada', + country_code: 'CA', + location: { + type: 'Point', + coordinates: [-73.58774, 45.52028], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 9, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 98, + }, + }, + { + _id: '10264100', + listing_url: 'https://www.airbnb.com/rooms/10264100', + name: 'Your spot in Copacabana', + notes: 'There is no parking in the building.', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '15', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + first_review: { + $date: '2016-08-13T04:00:00.000Z', + }, + last_review: { + $date: '2018-03-18T04:00:00.000Z', + }, + accommodates: 6, + bedrooms: 2, + beds: 5, + number_of_reviews: 8, + bathrooms: { + $numberDecimal: '2.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Paid parking off premises', + 'Doorman', + 'Elevator', + 'Buzzer/wireless intercom', + 'Family/kid friendly', + 'Washer', + 'First aid kit', + 'Essentials', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'translation missing: en.hosting_amenity_50', + 'Window guards', + 'Hot water', + 'Bed linens', + 'Extra pillows and blankets', + 'Microwave', + 'Coffee maker', + 'Refrigerator', + 'Dishes and silverware', + 'Cooking basics', + 'Oven', + 'Stove', + 'Long term stays allowed', + 'Host greets you', + ], + price: { + $numberDecimal: '798.00', + }, + security_deposit: { + $numberDecimal: '500.00', + }, + cleaning_fee: { + $numberDecimal: '150.00', + }, + extra_people: { + $numberDecimal: '20.00', + }, + guests_included: { + $numberDecimal: '4', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/83dbb5af-8b0c-48a4-b210-4fb60d642119.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '52772199', + host_url: 'https://www.airbnb.com/users/show/52772199', + host_name: 'Ana Lúcia', + host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', + host_about: + 'Tenho muito prazer em fazer novos amigos, com outras culturas, informações e vivências. Gosto de ser uma anfitriã atenciosa e disponível. O que estiver ao meu alcance tenha certeza que será feito, para tornar sua estadia no Rio inesquecível. ', + host_response_time: 'within a few hours', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/40611c34-2c83-4269-b2bf-1998f5ccf3e0.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/40611c34-2c83-4269-b2bf-1998f5ccf3e0.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['email', 'phone', 'facebook', 'google', 'reviews'], + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Copacabana', + government_area: 'Copacabana', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.17714541632985, -22.96270793328072], + is_location_exact: false, + }, + }, + availability: { + availability_30: 11, + availability_60: 41, + availability_90: 71, + availability_365: 247, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 9, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 100, + }, + }, + { + _id: '10416859', + listing_url: 'https://www.airbnb.com/rooms/10416859', + name: 'Studio convenient to CBD, beaches, street parking.', + notes: + 'OPAL cards are available for adults and children. I try to make sure the correct number are in the room, but if they are not, just ask. As summer has arrived and doors and windows are open you may hear voices in the morning from us and the neighbours. Mainly In the evenings around dinner time and in the mornings as the family is getting ready for work and school you can hear sounds.', + property_type: 'Guest suite', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '3', + cancellation_policy: 'moderate', + last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + first_review: { + $date: '2016-02-10T05:00:00.000Z', + }, + last_review: { + $date: '2018-09-23T04:00:00.000Z', + }, + accommodates: 5, + bedrooms: 1, + beds: 4, + number_of_reviews: 104, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Gym', + 'Free street parking', + 'Heating', + 'Family/kid friendly', + 'Washer', + 'Smoke detector', + 'Carbon monoxide detector', + 'First aid kit', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + 'Lock on bedroom door', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Self check-in', + 'Lockbox', + 'Private living room', + 'Private entrance', + 'Outlet covers', + 'High chair', + 'Children’s books and toys', + 'Children’s dinnerware', + 'Hot water', + 'Bed linens', + 'Extra pillows and blankets', + 'Microwave', + 'Coffee maker', + 'Refrigerator', + 'Dishwasher', + 'Dishes and silverware', + 'Cooking basics', + 'Stove', + 'BBQ grill', + 'Patio or balcony', + 'Garden or backyard', + 'Luggage dropoff allowed', + 'Wide hallway clearance', + 'Well-lit path to entrance', + 'Step-free access', + 'Wide doorway', + 'Accessible-height bed', + 'Step-free access', + 'Step-free access', + ], + price: { + $numberDecimal: '45.00', + }, + security_deposit: { + $numberDecimal: '136.00', + }, + cleaning_fee: { + $numberDecimal: '50.00', + }, + extra_people: { + $numberDecimal: '25.00', + }, + guests_included: { + $numberDecimal: '2', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/9c8ce5db-4ec6-4233-b51f-dcab88f4e4d9.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '4548918', + host_url: 'https://www.airbnb.com/users/show/4548918', + host_name: 'Leslie', + host_location: 'Sydney, New South Wales, Australia', + host_about: + 'We are a family of four (Two teens). We love meeting our Airbnb guests and sharing our favourite places to eat, travel, hike, cycle, or sight see in Sydney. We are originally from the US, but have lived here for over 10 years.', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/9e2b516d-2d03-4d0c-9464-44b508343347.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/9e2b516d-2d03-4d0c-9464-44b508343347.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Balgowlah', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'facebook', + 'reviews', + 'jumio', + 'government_id', + ], + }, + address: { + street: 'Balgowlah, NSW, Australia', + suburb: 'Balgowlah', + government_area: 'Manly', + market: 'Sydney', + country: 'Australia', + country_code: 'AU', + location: { + type: 'Point', + coordinates: [151.26108, -33.7975], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 9, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 96, + }, + }, + { + _id: '1047087', + listing_url: 'https://www.airbnb.com/rooms/1047087', + name: 'The Garden Studio', + notes: '', + property_type: 'Guesthouse', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '40', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + first_review: { + $date: '2013-04-29T04:00:00.000Z', + }, + last_review: { + $date: '2019-02-11T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 146, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Internet', + 'Wifi', + 'Kitchen', + 'Breakfast', + 'Free street parking', + 'Heating', + 'Smoke detector', + 'Carbon monoxide detector', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'translation missing: en.hosting_amenity_49', + 'translation missing: en.hosting_amenity_50', + 'Private entrance', + 'Hot water', + 'Other', + ], + price: { + $numberDecimal: '129.00', + }, + security_deposit: { + $numberDecimal: '0.00', + }, + cleaning_fee: { + $numberDecimal: '60.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/15742170/c4b4754f_original.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '3251237', + host_url: 'https://www.airbnb.com/users/show/3251237', + host_name: 'Cath', + host_location: 'Sydney, New South Wales, Australia', + host_about: + 'I am a professional photographer, based in Sydney. Australia. Covering lifestyle subjects such as Food, Interiors and travel, mostly for magazines and books and advertising clients. Born and raised in Sydney, I do love to travel and I have been lucky to have done a lot of that both personally and professionally. \r\nI enjoy making things and have always got a project on the go\r\nCooking is another great passion of mine. Hence the offer of baked goods and homemade jam!\r\nPlease feel free to email me with any question you might have.', + host_response_time: 'within a few hours', + host_thumbnail_url: + 'https://a0.muscache.com/im/users/3251237/profile_pic/1365404736/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/3251237/profile_pic/1365404736/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_response_rate: 100, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'facebook', + 'reviews', + 'jumio', + 'government_id', + 'work_email', + ], + }, + address: { + street: 'Marrickville, NSW, Australia', + suburb: 'Marrickville', + government_area: 'Marrickville', + market: 'Sydney', + country: 'Australia', + country_code: 'AU', + location: { + type: 'Point', + coordinates: [151.15036, -33.90318], + is_location_exact: false, + }, + }, + availability: { + availability_30: 30, + availability_60: 60, + availability_90: 90, + availability_365: 365, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 9, + review_scores_value: 10, + review_scores_rating: 97, + }, + }, + { + _id: '10578580', + listing_url: 'https://www.airbnb.com/rooms/10578580', + name: 'Panoramic Ocean View Studio in Quiet Setting', + notes: + 'There is high-speed Internet and Wi-Fi service. There is no laundry service on the premises and for longer stays, housekeeping can be offered upon request. The unit is in a residential, single-family neighborhood and there is lots of street parking available. Guests are welcome to park along the mock orange hedge. The setting is lush and tropical and sometimes you may come in contact with flying insects or bugs, which are part of the Hawaii eco system. For example at night, when you have the lights on, its best to keep the entry door closed; all windows have mosquito screens and we have the company Orkin under contract for pest control.', + property_type: 'Guesthouse', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '1125', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + first_review: { + $date: '2016-02-08T05:00:00.000Z', + }, + last_review: { + $date: '2019-02-18T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 114, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Kitchen', + 'Free parking on premises', + 'Pets live on this property', + 'Free street parking', + 'Smoke detector', + 'First aid kit', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'translation missing: en.hosting_amenity_49', + 'translation missing: en.hosting_amenity_50', + 'Self check-in', + 'Keypad', + 'Hot water', + 'Luggage dropoff allowed', + 'Long term stays allowed', + ], + price: { + $numberDecimal: '120.00', + }, + security_deposit: { + $numberDecimal: '200.00', + }, + cleaning_fee: { + $numberDecimal: '100.00', + }, + extra_people: { + $numberDecimal: '15.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/16099e47-1309-4bc0-b271-fc4643604d23.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '308899', + host_url: 'https://www.airbnb.com/users/show/308899', + host_name: 'Andrei', + host_location: 'Honolulu, Hawaii, United States', + host_about: + 'I am a clinical psychologist and a passionate Argentine tango dancer. Moved to Hawaii 15 years ago from Los Angeles, CA. I love the island and its quiet pace. In addition to the obvious water sports, it is surprising how much great hiking is available on Oahu! I often travel to Europe (especially Italy) and Argentina and when I am off-island, I enjoy sharing my studio with folks from all over the world!! Sharing the studio was so well received by our guests, we just decided to offer a second apartment. I take a lot of pride in offering our guests an excellent experience!!!', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/34ca9715-2599-479e-94f2-fddba4c51398.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/34ca9715-2599-479e-94f2-fddba4c51398.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Kaimuki', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 2, + host_total_listings_count: 2, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'offline_government_id', + 'government_id', + ], + }, + address: { + street: 'Honolulu, HI, United States', + suburb: 'Oʻahu', + government_area: 'Primary Urban Center', + market: 'Oahu', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-157.78578, 21.29561], + is_location_exact: true, + }, + }, + availability: { + availability_30: 3, + availability_60: 26, + availability_90: 53, + availability_365: 323, + }, + review_scores: { + review_scores_accuracy: 9, + review_scores_cleanliness: 9, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 9, + review_scores_rating: 95, + }, + }, + { + _id: '10612199', + listing_url: 'https://www.airbnb.com/rooms/10612199', + name: 'Serene luxury in Harlem', + notes: '', + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '3', + maximum_nights: '1125', + cancellation_policy: 'moderate', + last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + first_review: { + $date: '2016-08-13T04:00:00.000Z', + }, + last_review: { + $date: '2019-01-05T05:00:00.000Z', + }, + accommodates: 1, + bedrooms: 1, + beds: 1, + number_of_reviews: 10, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Elevator', + 'Buzzer/wireless intercom', + 'Heating', + 'Washer', + 'Essentials', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Bed linens', + 'Extra pillows and blankets', + ], + price: { + $numberDecimal: '80.00', + }, + security_deposit: { + $numberDecimal: '100.00', + }, + cleaning_fee: { + $numberDecimal: '50.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/84254dd0-e266-4345-afcc-e8f7c56f4634.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '54761069', + host_url: 'https://www.airbnb.com/users/show/54761069', + host_name: 'Erika', + host_location: 'New York, New York, United States', + host_about: '', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/8f1942a1-dde8-4733-aff6-5971a0678594.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/8f1942a1-dde8-4733-aff6-5971a0678594.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Harlem', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['email', 'phone', 'facebook', 'reviews', 'kba'], + }, + address: { + street: 'New York, NY, United States', + suburb: 'Manhattan', + government_area: 'Harlem', + market: 'New York', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-73.95211, 40.80708], + is_location_exact: true, + }, + }, + availability: { + availability_30: 5, + availability_60: 35, + availability_90: 65, + availability_365: 339, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 100, + }, + }, + { + _id: '10228731', + listing_url: 'https://www.airbnb.com/rooms/10228731', + name: 'Quarto inteiro na Tijuca', + notes: '', + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '15', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + first_review: { + $date: '2016-05-26T04:00:00.000Z', + }, + last_review: { + $date: '2016-05-26T04:00:00.000Z', + }, + accommodates: 1, + bedrooms: 1, + beds: 1, + number_of_reviews: 1, + bathrooms: { + $numberDecimal: '2.0', + }, + amenities: [ + 'Internet', + 'Wifi', + 'Kitchen', + 'Free parking on premises', + 'Family/kid friendly', + 'Washer', + ], + price: { + $numberDecimal: '149.00', + }, + cleaning_fee: { + $numberDecimal: '30.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/de6ab94d-9bcb-4f57-80f6-388aeaaa89c6.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '12673423', + host_url: 'https://www.airbnb.com/users/show/12673423', + host_name: 'Gilberto', + host_location: 'Rio, Rio de Janeiro, Brazil', + host_about: + 'I am a retired chemist from glass-tubing manufacturing segment that actually is enjoying life through his granddaughters Flora and Ana, as well as has emphasized to contact friends all over the world, offering my apartment to receive some friends all over the world to take some nice time.\r\n ', + host_thumbnail_url: + 'https://a0.muscache.com/im/users/12673423/profile_pic/1393616988/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/12673423/profile_pic/1393616988/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Tijuca', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 2, + host_total_listings_count: 2, + host_verifications: ['email', 'phone', 'reviews'], + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Tijuca', + government_area: 'Tijuca', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.247421907135774, -22.936203246553816], + is_location_exact: false, + }, + }, + availability: { + availability_30: 28, + availability_60: 58, + availability_90: 88, + availability_365: 178, + }, + review_scores: { + review_scores_accuracy: 8, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 100, + }, + }, + { + _id: '10295352', + listing_url: 'https://www.airbnb.com/rooms/10295352', + name: 'Amazing and Big Apt, Ipanema Beach.', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + accommodates: 6, + bedrooms: 3, + beds: 4, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '3.0', + }, + amenities: [ + 'Cable TV', + 'Wifi', + 'Air conditioning', + 'Wheelchair accessible', + 'Smoking allowed', + 'Doorman', + 'Elevator', + 'Buzzer/wireless intercom', + 'Family/kid friendly', + 'Washer', + 'Iron', + ], + price: { + $numberDecimal: '1999.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/3424f266-bc71-4847-a9da-c0b3bf95e4ff.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '52966539', + host_url: 'https://www.airbnb.com/users/show/52966539', + host_name: 'Pedro', + host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', + host_about: '', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/a327f115-a9e3-46fe-ad2e-58487b2d9639.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/a327f115-a9e3-46fe-ad2e-58487b2d9639.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['phone', 'facebook'], + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Ipanema', + government_area: 'Ipanema', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.20465630892734, -22.983108745795256], + is_location_exact: false, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: {}, + }, + { + _id: '102995', + listing_url: 'https://www.airbnb.com/rooms/102995', + name: 'UWS Brownstone Near Central Park', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '21', + maximum_nights: '30', + cancellation_policy: 'moderate', + last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + first_review: { + $date: '2011-05-29T04:00:00.000Z', + }, + last_review: { + $date: '2018-01-01T05:00:00.000Z', + }, + accommodates: 3, + bedrooms: 1, + beds: 3, + number_of_reviews: 45, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Buzzer/wireless intercom', + 'Heating', + 'Washer', + 'Dryer', + 'Smoke detector', + 'Carbon monoxide detector', + 'First aid kit', + 'Fire extinguisher', + 'Essentials', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'translation missing: en.hosting_amenity_49', + 'translation missing: en.hosting_amenity_50', + 'Private entrance', + ], + price: { + $numberDecimal: '212.00', + }, + weekly_price: { + $numberDecimal: '1702.00', + }, + monthly_price: { + $numberDecimal: '6000.00', + }, + security_deposit: { + $numberDecimal: '275.00', + }, + cleaning_fee: { + $numberDecimal: '120.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/1915586/9e2d0945_original.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '178043', + host_url: 'https://www.airbnb.com/users/show/178043', + host_name: 'Chas', + host_location: 'San Francisco, California, United States', + host_about: + "We live in San Francisco and spend time in New York as well. We also have another place in Northern California in the country we spend time at. I'm a private pilot and Paul is quite an accomplished ceramicist, though he does non-profit management consulting by profession. I run a retreat center ( (Website hidden by Airbnb) and am a computer consultant some of the time and real estate investor other times. We have a cat who stays at our house here in San Francisco when we travel. She is very, very affectionate and easy to care for. ", + host_response_time: 'within a day', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/ab609821-a596-4111-9ae9-1b6fdd919c74.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/ab609821-a596-4111-9ae9-1b6fdd919c74.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'The Castro', + host_response_rate: 95, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 4, + host_total_listings_count: 4, + host_verifications: [ + 'email', + 'phone', + 'facebook', + 'reviews', + 'jumio', + 'offline_government_id', + 'government_id', + 'work_email', + ], + }, + address: { + street: 'New York, NY, United States', + suburb: 'Upper West Side', + government_area: 'Upper West Side', + market: 'New York', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-73.9696, 40.78558], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 3, + availability_90: 5, + availability_365: 5, + }, + review_scores: { + review_scores_accuracy: 9, + review_scores_cleanliness: 9, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 9, + review_scores_rating: 93, + }, + }, + { + _id: '10343118', + listing_url: 'https://www.airbnb.com/rooms/10343118', + name: 'Best location 1BR Apt in HK - Shops & Sights', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '60', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + first_review: { + $date: '2016-02-09T05:00:00.000Z', + }, + last_review: { + $date: '2019-02-06T05:00:00.000Z', + }, + accommodates: 4, + bedrooms: 1, + beds: 2, + number_of_reviews: 145, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Wheelchair accessible', + 'Kitchen', + 'Paid parking off premises', + 'Elevator', + 'Heating', + 'Family/kid friendly', + 'Smoke detector', + 'Carbon monoxide detector', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Self check-in', + 'Lockbox', + 'Hot water', + ], + price: { + $numberDecimal: '997.00', + }, + security_deposit: { + $numberDecimal: '1000.00', + }, + cleaning_fee: { + $numberDecimal: '380.00', + }, + extra_people: { + $numberDecimal: '160.00', + }, + guests_included: { + $numberDecimal: '2', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/f0134013-7f06-457e-a0fc-5ecd294f43a0.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '2657469', + host_url: 'https://www.airbnb.com/users/show/2657469', + host_name: 'Simon', + host_location: 'Hong Kong', + host_about: + "Loves to travel and see the world. Over recent years, I've travelled to London, Amsterdam, Paris, LA, San Francisco, Taiwan, Shanghai, Beijing, Australia, India, Thailand, Singapore, Malaysia, and Korea. However, there is no place like home.\r\n\r\nThat is why I want to be a great host and have you enjoy your holiday. Welcome fellow travellers.", + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/6cb7aff2-5036-4846-91d8-56bd04d9302e.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/6cb7aff2-5036-4846-91d8-56bd04d9302e.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Tsim Sha Tsui', + host_response_rate: 98, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 17, + host_total_listings_count: 17, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'offline_government_id', + 'government_id', + ], + }, + address: { + street: 'Hong Kong, Kowloon, Hong Kong', + suburb: 'Tsim Sha Tsui', + government_area: 'Yau Tsim Mong', + market: 'Hong Kong', + country: 'Hong Kong', + country_code: 'HK', + location: { + type: 'Point', + coordinates: [114.17088, 22.29663], + is_location_exact: true, + }, + }, + availability: { + availability_30: 20, + availability_60: 50, + availability_90: 80, + availability_365: 170, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 9, + review_scores_rating: 94, + }, + }, + { + _id: '10411341', + listing_url: 'https://www.airbnb.com/rooms/10411341', + name: 'Beautiful flat with services', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '3', + maximum_nights: '1125', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + first_review: { + $date: '2016-01-15T05:00:00.000Z', + }, + last_review: { + $date: '2019-01-22T05:00:00.000Z', + }, + accommodates: 4, + bedrooms: 2, + beds: 2, + number_of_reviews: 32, + bathrooms: { + $numberDecimal: '2.0', + }, + amenities: [ + 'Cable TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Pool', + 'Kitchen', + 'Free parking on premises', + 'Smoking allowed', + 'Doorman', + 'Gym', + 'Elevator', + 'Hot tub', + 'Buzzer/wireless intercom', + 'Family/kid friendly', + 'Washer', + 'Dryer', + 'Essentials', + '24-hour check-in', + 'Hangers', + 'Iron', + 'Laptop friendly workspace', + 'Hot water', + 'Bed linens', + 'Microwave', + 'Refrigerator', + 'Dishes and silverware', + 'Oven', + 'Stove', + ], + price: { + $numberDecimal: '351.00', + }, + security_deposit: { + $numberDecimal: '500.00', + }, + cleaning_fee: { + $numberDecimal: '120.00', + }, + extra_people: { + $numberDecimal: '500.00', + }, + guests_included: { + $numberDecimal: '4', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/02d44d8f-9367-42a5-bf41-243aaea1f179.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '36696735', + host_url: 'https://www.airbnb.com/users/show/36696735', + host_name: 'Liliane', + host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', + host_about: '', + host_response_time: 'within a day', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/ef9dda14-3105-4819-b850-1255bd8500da.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/ef9dda14-3105-4819-b850-1255bd8500da.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Barra da Tijuca', + host_response_rate: 100, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 2, + host_total_listings_count: 2, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'government_id', + ], + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Ipanema', + government_area: 'Ipanema', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.20577175003696, -22.982557305257775], + is_location_exact: false, + }, + }, + availability: { + availability_30: 3, + availability_60: 18, + availability_90: 41, + availability_365: 316, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 9, + review_scores_checkin: 9, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 9, + review_scores_rating: 95, + }, + }, + { + _id: '10458796', + listing_url: 'https://www.airbnb.com/rooms/10458796', + name: 'Homely Room in 5-Star New Condo@MTR', + notes: + "Just feel as home. We will give you all assistance. The 3rd guest is allowed to sleep on the sofa in the living room, and it's subject to an extra charge HK$250 per night.", + property_type: 'Condominium', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '28', + maximum_nights: '1125', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + first_review: { + $date: '2016-01-16T05:00:00.000Z', + }, + last_review: { + $date: '2017-08-31T04:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 179, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Wifi', + 'Air conditioning', + 'Pool', + 'Kitchen', + 'Gym', + 'Elevator', + 'Heating', + 'Family/kid friendly', + 'Smoke detector', + 'Carbon monoxide detector', + 'First aid kit', + 'Fire extinguisher', + 'Essentials', + 'Lock on bedroom door', + 'Hangers', + 'Hair dryer', + 'Laptop friendly workspace', + 'Hot water', + 'Bed linens', + 'Microwave', + 'Refrigerator', + 'Dishes and silverware', + 'Cooking basics', + 'Oven', + 'Stove', + 'Single level home', + 'Patio or balcony', + 'Luggage dropoff allowed', + 'Long term stays allowed', + 'Wide hallway clearance', + 'Step-free access', + 'Wide doorway', + 'Flat path to front door', + 'Well-lit path to entrance', + 'Step-free access', + 'Step-free access', + 'Step-free access', + 'Wide entryway', + 'Host greets you', + ], + price: { + $numberDecimal: '479.00', + }, + monthly_price: { + $numberDecimal: '10000.00', + }, + extra_people: { + $numberDecimal: '150.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/6c1b8132-6b6e-4b64-86e6-2fcb20dd5763.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '53247930', + host_url: 'https://www.airbnb.com/users/show/53247930', + host_name: 'Crystal', + host_location: 'Hong Kong', + host_about: '', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/9d8bd938-b44a-479d-84d2-2387aeeeab20.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/9d8bd938-b44a-479d-84d2-2387aeeeab20.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Mong Kok', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 5, + host_total_listings_count: 5, + host_verifications: [ + 'email', + 'phone', + 'facebook', + 'google', + 'reviews', + 'jumio', + 'government_id', + ], + }, + address: { + street: 'Mongkok, Kowloon, Hong Kong', + suburb: 'Yau Tsim Mong', + government_area: 'Yau Tsim Mong', + market: 'Hong Kong', + country: 'Hong Kong', + country_code: 'HK', + location: { + type: 'Point', + coordinates: [114.17094, 22.32074], + is_location_exact: false, + }, + }, + availability: { + availability_30: 0, + availability_60: 3, + availability_90: 3, + availability_365: 3, + }, + review_scores: { + review_scores_accuracy: 9, + review_scores_cleanliness: 9, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 9, + review_scores_rating: 94, + }, + }, + { + _id: '10233856', + listing_url: 'https://www.airbnb.com/rooms/10233856', + name: 'Twin Bed room+MTR Mongkok shopping&My', + notes: + 'After check-in time is 14:00, check out time is 12:00 the next day (we need to do the cleaning after you check out, the room clean and ready for the next guest to stay), arrive early the day of arrival or check out we can offer free luggage service, luggage storage after check-out time is 18:00 pm the day before check-out. If you need to store your luggage after check-out storage than 18:00, we need extra charge. After our order book to confirm the order, we will after payment systems One How come our guesthouse specific routes sent to your mailbox. To store the same day directly to the shop to show identification registration word, to pay 200 yuan (HK $) check deposit you can check in. Before booking please note: our room once confirmed the order, which does not accept the changes can only be rescheduled according to unsubscribe from the implementation of policies to unsubscribe. ★ Our room photos are all on the ground to take pictures, but despite this, room photos are for reference ', + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '500', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + first_review: { + $date: '2016-08-28T04:00:00.000Z', + }, + last_review: { + $date: '2018-07-12T04:00:00.000Z', + }, + accommodates: 3, + bedrooms: 1, + beds: 2, + number_of_reviews: 22, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Wifi', + 'Air conditioning', + 'Doorman', + 'Elevator', + 'Family/kid friendly', + 'Smoke detector', + 'Essentials', + 'Lock on bedroom door', + 'Hangers', + 'Hair dryer', + ], + price: { + $numberDecimal: '400.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/06185984-3faf-4967-8d6d-e24304d0f572.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '52473150', + host_url: 'https://www.airbnb.com/users/show/52473150', + host_name: 'Danny', + host_location: 'Hong Kong', + host_about: + '每次旅行都是一种到达别人家做客的体验。自己有好几处单位,住不了那么多,多半出租,我是位非常好客的人,也是很喜欢旅行!不管你是商务出差还是旅游度假,来我家住吧,很高兴能和你成为好朋友!给你们的旅行一个安全干净舒适实惠的居住环境。\r\nP.S:如你订好,请留个言给我~O(∩_∩)O谢谢~(Complete payment, please leave a message ~)\r\nDuring the period of stay: if you are not Chinese, please leave a message directly to me, you need to, immediately to make arrangements for your service\r\n可以加我 (Hidden by Airbnb) (You can add me (Hidden by Airbnb) \r\n)ID: (Phone number hidden by Airbnb)', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/13dcc152-382c-43ac-9933-c241ae596c3a.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/13dcc152-382c-43ac-9933-c241ae596c3a.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Mong Kok', + host_response_rate: 97, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 29, + host_total_listings_count: 29, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'offline_government_id', + 'selfie', + 'government_id', + 'identity_manual', + ], + }, + address: { + street: 'Hong Kong, Kowloon, Hong Kong', + suburb: 'Mong Kok', + government_area: 'Yau Tsim Mong', + market: 'Hong Kong', + country: 'Hong Kong', + country_code: 'HK', + location: { + type: 'Point', + coordinates: [114.17073, 22.31723], + is_location_exact: true, + }, + }, + availability: { + availability_30: 30, + availability_60: 60, + availability_90: 90, + availability_365: 145, + }, + review_scores: { + review_scores_accuracy: 8, + review_scores_cleanliness: 9, + review_scores_checkin: 9, + review_scores_communication: 9, + review_scores_location: 10, + review_scores_value: 9, + review_scores_rating: 83, + }, + }, + { + _id: '10471178', + listing_url: 'https://www.airbnb.com/rooms/10471178', + name: 'Rented Room', + notes: '', + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + accommodates: 1, + bedrooms: 1, + beds: 1, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'Wifi', + 'Kitchen', + 'Doorman', + 'Elevator', + 'Buzzer/wireless intercom', + 'Dryer', + 'Essentials', + 'Lock on bedroom door', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + ], + price: { + $numberDecimal: '112.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/fc7aaab6-23fd-44ca-8dfe-ed794fef1c3a.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '53957975', + host_url: 'https://www.airbnb.com/users/show/53957975', + host_name: 'Jercilene', + host_location: 'São Gonçalo, Rio de Janeiro, Brazil', + host_about: '', + host_response_time: 'a few days or more', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/191ca5bb-275c-4bf4-8c2c-1ed3b343a892.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/191ca5bb-275c-4bf4-8c2c-1ed3b343a892.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_response_rate: 0, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['email', 'phone', 'facebook', 'google'], + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Botafogo', + government_area: 'Botafogo', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.17933175178738, -22.941321220162784], + is_location_exact: false, + }, + }, + availability: { + availability_30: 30, + availability_60: 60, + availability_90: 90, + availability_365: 365, + }, + review_scores: {}, + }, + { + _id: '10267144', + listing_url: 'https://www.airbnb.com/rooms/10267144', + name: 'IPANEMA LUXURY PENTHOUSE with MAID', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + first_review: { + $date: '2016-12-04T05:00:00.000Z', + }, + last_review: { + $date: '2018-12-12T05:00:00.000Z', + }, + accommodates: 3, + bedrooms: 1, + beds: 1, + number_of_reviews: 29, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Pool', + 'Kitchen', + 'Smoking allowed', + 'Doorman', + 'Breakfast', + 'Elevator', + 'Free street parking', + 'Washer', + 'First aid kit', + 'Essentials', + 'Shampoo', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Hot water', + 'Luggage dropoff allowed', + 'Long term stays allowed', + 'Host greets you', + ], + price: { + $numberDecimal: '858.00', + }, + security_deposit: { + $numberDecimal: '1865.00', + }, + cleaning_fee: { + $numberDecimal: '112.00', + }, + extra_people: { + $numberDecimal: '112.00', + }, + guests_included: { + $numberDecimal: '3', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/5d83827b-eb4f-4bfe-9075-1dc553a2c1a9.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '4428126', + host_url: 'https://www.airbnb.com/users/show/4428126', + host_name: 'Cesar', + host_location: 'Rio de Janeiro, Rio de Janeiro, Brazil', + host_about: + 'Eu sou Designer, adoro viajar e adoro os finais de tarde na praia em Ipanema. \r\nSejam bem vindos ao Rio de Janeiro.\r\n\r\nI am objects designer and plastic artist and love travelling. I simply love hosting people! Welcome in Rio!', + host_response_time: 'within a few hours', + host_thumbnail_url: + 'https://a0.muscache.com/im/users/4428126/profile_pic/1355775586/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/4428126/profile_pic/1355775586/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Ipanema', + host_response_rate: 93, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 3, + host_total_listings_count: 3, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'manual_offline', + 'jumio', + 'offline_government_id', + 'government_id', + ], + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Ipanema', + government_area: 'Ipanema', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.20056249420509, -22.98034625363379], + is_location_exact: true, + }, + }, + availability: { + availability_30: 18, + availability_60: 40, + availability_90: 70, + availability_365: 345, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 99, + }, + }, + { + _id: '1042446', + listing_url: 'https://www.airbnb.com/rooms/1042446', + name: 'March 2019 availability! Oceanview on Sugar Beach!', + notes: + 'NIGHTLY RATE INCLUDES ALL TAXES! The Kealia Resort is next to Sugar Beach Resort on the north side. The address is 191 N. Kihei Rd.', + property_type: 'Condominium', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '4', + maximum_nights: '1125', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + first_review: { + $date: '2015-04-28T04:00:00.000Z', + }, + last_review: { + $date: '2019-01-10T05:00:00.000Z', + }, + accommodates: 4, + bedrooms: 1, + beds: 3, + number_of_reviews: 19, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Pool', + 'Kitchen', + 'Free parking on premises', + 'Elevator', + 'Family/kid friendly', + 'Washer', + 'Dryer', + 'Smoke detector', + 'Essentials', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Self check-in', + 'Keypad', + 'Hot water', + ], + price: { + $numberDecimal: '229.00', + }, + cleaning_fee: { + $numberDecimal: '95.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/15715315/c1bba2c8_original.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '5738969', + host_url: 'https://www.airbnb.com/users/show/5738969', + host_name: 'Gage', + host_location: 'US', + host_about: '', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/users/5738969/profile_pic/1365017015/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/5738969/profile_pic/1365017015/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Maui', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['email', 'phone', 'reviews'], + }, + address: { + street: 'Kihei, HI, United States', + suburb: 'Maui', + government_area: 'Kihei-Makena', + market: 'Maui', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-156.46881, 20.78621], + is_location_exact: true, + }, + }, + availability: { + availability_30: 5, + availability_60: 26, + availability_90: 35, + availability_365: 228, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 9, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 9, + review_scores_rating: 94, + }, + }, + { + _id: '10306879', + listing_url: 'https://www.airbnb.com/rooms/10306879', + name: 'Alugo Apart frente mar Barra Tijuca', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '10', + maximum_nights: '90', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + accommodates: 4, + bedrooms: 1, + beds: 2, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Wifi', + 'Air conditioning', + 'Pool', + 'Kitchen', + 'Free parking on premises', + 'Pets allowed', + 'Doorman', + 'Gym', + 'Elevator', + 'Hot tub', + 'Buzzer/wireless intercom', + 'Family/kid friendly', + 'Washer', + 'Dryer', + 'Hangers', + 'Iron', + 'Laptop friendly workspace', + ], + price: { + $numberDecimal: '933.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/86a84e4e-9792-461d-8bd7-452b598becab.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '53027036', + host_url: 'https://www.airbnb.com/users/show/53027036', + host_name: 'Paulo Cesar', + host_location: 'BR', + host_about: '', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/be252b6f-f1f4-4684-9763-3f950d4422c9.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/be252b6f-f1f4-4684-9763-3f950d4422c9.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Barra da Tijuca', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['email', 'phone'], + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Barra da Tijuca', + government_area: 'Barra da Tijuca', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.36831676949888, -23.011117008024065], + is_location_exact: true, + }, + }, + availability: { + availability_30: 28, + availability_60: 58, + availability_90: 88, + availability_365: 363, + }, + review_scores: {}, + }, + { + _id: '10317142', + listing_url: 'https://www.airbnb.com/rooms/10317142', + name: 'Private OceanFront - Bathtub Beach. Spacious House', + notes: '', + property_type: 'House', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '3', + maximum_nights: '1125', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + first_review: { + $date: '2016-01-24T05:00:00.000Z', + }, + last_review: { + $date: '2019-02-19T05:00:00.000Z', + }, + accommodates: 14, + bedrooms: 4, + beds: 10, + number_of_reviews: 32, + bathrooms: { + $numberDecimal: '4.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Wheelchair accessible', + 'Kitchen', + 'Free parking on premises', + 'Family/kid friendly', + 'Suitable for events', + 'Washer', + 'Dryer', + 'Smoke detector', + 'Essentials', + '24-hour check-in', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Beachfront', + ], + price: { + $numberDecimal: '795.00', + }, + security_deposit: { + $numberDecimal: '1000.00', + }, + cleaning_fee: { + $numberDecimal: '345.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/71635659-be9e-4860-90ed-312f37e641c2.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '53086419', + host_url: 'https://www.airbnb.com/users/show/53086419', + host_name: 'Noah', + host_location: 'Laie, Hawaii, United States', + host_about: '', + host_response_time: 'within a day', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/d93c44f5-2b60-4251-a90b-fb71d66e7946.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/d93c44f5-2b60-4251-a90b-fb71d66e7946.jpg?aki_policy=profile_x_medium', + host_neighbourhood: "Ko'olauloa", + host_response_rate: 50, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'offline_government_id', + 'government_id', + ], + }, + address: { + street: 'Laie, HI, United States', + suburb: "Ko'olauloa", + government_area: 'Koolauloa', + market: 'Oahu', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-157.91952, 21.63549], + is_location_exact: true, + }, + }, + availability: { + availability_30: 10, + availability_60: 17, + availability_90: 26, + availability_365: 229, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 9, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 94, + }, + }, + { + _id: '10324377', + listing_url: 'https://www.airbnb.com/rooms/10324377', + name: 'Suíte em local tranquilo e seguro', + notes: '', + property_type: 'House', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'moderate', + last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + accommodates: 1, + bedrooms: 1, + beds: 1, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'Cable TV', + 'Internet', + 'Wifi', + 'Pool', + 'Kitchen', + 'Free parking on premises', + 'Smoking allowed', + 'Buzzer/wireless intercom', + 'Lock on bedroom door', + 'Iron', + 'Laptop friendly workspace', + ], + price: { + $numberDecimal: '101.00', + }, + security_deposit: { + $numberDecimal: '400.00', + }, + cleaning_fee: { + $numberDecimal: '100.00', + }, + extra_people: { + $numberDecimal: '50.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/bffd61db-ade5-458f-a40d-9603fc70acaa.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '53127432', + host_url: 'https://www.airbnb.com/users/show/53127432', + host_name: 'Renato', + host_location: 'Brazil', + host_about: '', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/7425fcc7-1d9b-4a3d-acd2-d05a9756372e.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/7425fcc7-1d9b-4a3d-acd2-d05a9756372e.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 7, + host_total_listings_count: 7, + host_verifications: ['email', 'phone', 'facebook', 'reviews'], + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: '', + government_area: 'Anil', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.33496705036137, -22.948365490450556], + is_location_exact: true, + }, + }, + availability: { + availability_30: 22, + availability_60: 52, + availability_90: 82, + availability_365: 357, + }, + review_scores: {}, + }, + { + _id: '10373872', + listing_url: 'https://www.airbnb.com/rooms/10373872', + name: 'Apartamento Mobiliado - Lgo do Machado', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '30', + maximum_nights: '365', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + accommodates: 4, + bedrooms: 1, + beds: 2, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Pool', + 'Kitchen', + 'Free parking on premises', + 'Doorman', + 'Gym', + 'Elevator', + 'Buzzer/wireless intercom', + 'Family/kid friendly', + 'Washer', + 'Dryer', + 'Essentials', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Self check-in', + 'Building staff', + 'Hot water', + 'Luggage dropoff allowed', + 'Long term stays allowed', + ], + price: { + $numberDecimal: '149.00', + }, + security_deposit: { + $numberDecimal: '1000.00', + }, + cleaning_fee: { + $numberDecimal: '60.00', + }, + extra_people: { + $numberDecimal: '40.00', + }, + guests_included: { + $numberDecimal: '2', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/cddd4ce4-1936-4417-9fbb-dfcc557d7bc2.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '15152328', + host_url: 'https://www.airbnb.com/users/show/15152328', + host_name: 'Marcelo', + host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', + host_about: 'Engenheiro, casado com 3 filhos', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/users/15152328/profile_pic/1400556199/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/15152328/profile_pic/1400556199/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Catete', + host_response_rate: 100, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 7, + host_total_listings_count: 7, + host_verifications: [ + 'email', + 'phone', + 'google', + 'reviews', + 'jumio', + 'government_id', + 'work_email', + ], + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Catete', + government_area: 'Catete', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.178886292069244, -22.931715899178695], + is_location_exact: false, + }, + }, + availability: { + availability_30: 0, + availability_60: 11, + availability_90: 41, + availability_365: 316, + }, + review_scores: {}, + }, + { + _id: '10431455', + listing_url: 'https://www.airbnb.com/rooms/10431455', + name: 'Sala e quarto em copacabana com cozinha americana', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '4', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + accommodates: 3, + bedrooms: 1, + beds: 1, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Smoking allowed', + 'Pets allowed', + 'Doorman', + 'Elevator', + 'Buzzer/wireless intercom', + 'Family/kid friendly', + 'Washer', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + '24-hour check-in', + 'Laptop friendly workspace', + 'translation missing: en.hosting_amenity_50', + ], + price: { + $numberDecimal: '298.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/64170e2a-2baa-4803-890b-984e416cb406.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '53729453', + host_url: 'https://www.airbnb.com/users/show/53729453', + host_name: 'Tamara', + host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', + host_about: '', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/139d850f-6c96-4154-b98d-785c0bbdb5b8.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/139d850f-6c96-4154-b98d-785c0bbdb5b8.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Copacabana', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'jumio', + 'offline_government_id', + 'government_id', + ], + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Copacabana', + government_area: 'Copacabana', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.177948896979196, -22.963149303022142], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: {}, + }, + { + _id: '10486984', + listing_url: 'https://www.airbnb.com/rooms/10486984', + name: 'Cheerful new renovated central apt', + notes: + 'From/To Airports: There are several ways to get from the airport to the apartment, but the most convenient manner is to take “HAVATAŞ" shuttle to Taksim Square departing every 30 minutes from the airport (from both airports- Atatürk and Sabiha Gökçen). As you may be unfamiliar with the area, I am happy to come and pick you up in front of Galatasaray Highschool (on Istiklal Street) which is 10 minutes walk from Taksim Square where you will get off. I can always advise you cheaper public transport options if you ask for. Useful information: You can rent the apartment/room for (a) day(s), week, month or longer periods of time. There is various supermarkets conveniently situated a block away from the apartment on the way to Istiklal street, also a small kiosk right next to the apartment and a laundry in 100 meters distance.', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '3', + maximum_nights: '1125', + cancellation_policy: 'moderate', + last_scraped: { + $date: '2019-02-18T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-18T05:00:00.000Z', + }, + first_review: { + $date: '2016-04-24T04:00:00.000Z', + }, + last_review: { + $date: '2019-02-10T05:00:00.000Z', + }, + accommodates: 8, + bedrooms: 3, + beds: 4, + number_of_reviews: 77, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Paid parking off premises', + 'Heating', + 'Family/kid friendly', + 'Suitable for events', + 'Washer', + 'First aid kit', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Crib', + 'Hot water', + 'Bed linens', + 'Extra pillows and blankets', + 'Long term stays allowed', + 'Step-free access', + 'Host greets you', + ], + price: { + $numberDecimal: '264.00', + }, + security_deposit: { + $numberDecimal: '0.00', + }, + cleaning_fee: { + $numberDecimal: '0.00', + }, + extra_people: { + $numberDecimal: '36.00', + }, + guests_included: { + $numberDecimal: '4', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/3eaf428d-d244-4985-b083-4780ece4ca5a.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '22766460', + host_url: 'https://www.airbnb.com/users/show/22766460', + host_name: 'Aybike', + host_location: 'Istanbul, İstanbul, Turkey', + host_about: + 'My name is Aybike. I love to travel, to discover new places and to meet new people. I will be glad to hosting you in Istanbul at my place. My apartment is newly renovated, clean, cosy, comfortable, large enough for 8 people and is situated literally at the heart of Istanbul. As a traveller my wish is to make you feel at home; drink your morning coffee while listening to the sound of Istanbul then take your map, jump into the street with friendly neighbourhood, and enjoy the city with walking, exploring, watching, reading and hearing. I know how it is important to be able to feel the city you are visiting from my experiences. So if you are looking for a place where you really want to taste the chaos with harmony like a real Istanbuller you are very welcome to stay in my apartment.\r\n', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/user/e87810d6-0d69-4187-8862-cc6f9e2fe8ca.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/user/e87810d6-0d69-4187-8862-cc6f9e2fe8ca.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'facebook', + 'reviews', + 'jumio', + 'government_id', + ], + }, + address: { + street: 'Beyoğlu, İstanbul, Turkey', + suburb: 'Beyoglu', + government_area: 'Beyoglu', + market: 'Istanbul', + country: 'Turkey', + country_code: 'TR', + location: { + type: 'Point', + coordinates: [28.97477, 41.03735], + is_location_exact: false, + }, + }, + availability: { + availability_30: 18, + availability_60: 29, + availability_90: 51, + availability_365: 326, + }, + review_scores: { + review_scores_accuracy: 9, + review_scores_cleanliness: 9, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 9, + review_scores_value: 9, + review_scores_rating: 94, + }, + }, + { + _id: '10487917', + listing_url: 'https://www.airbnb.com/rooms/10487917', + name: 'Heroísmo IV', + notes: + 'In the apartment you will find everything you need to spend a few pleasant days with all the confort. Accommodate 2 people, fully equipped kitchenette with all the utensils, oven, stove, refrigerator, microwave, extractor. Plates, cups and cutlery available. Sheets, duvet, pillows and towels available. The bedroom has a very comfortable double bed with 2,00 x 1,60 mt.', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'moderate', + last_scraped: { + $date: '2019-02-16T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-16T05:00:00.000Z', + }, + first_review: { + $date: '2016-02-06T05:00:00.000Z', + }, + last_review: { + $date: '2018-10-22T04:00:00.000Z', + }, + accommodates: 2, + bedrooms: 0, + beds: 1, + number_of_reviews: 31, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Kitchen', + 'Free street parking', + 'Heating', + 'First aid kit', + 'Safety card', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'translation missing: en.hosting_amenity_49', + 'translation missing: en.hosting_amenity_50', + 'Room-darkening shades', + 'Hot water', + 'Bed linens', + 'Extra pillows and blankets', + 'Microwave', + 'Refrigerator', + 'Dishes and silverware', + 'Cooking basics', + 'Stove', + 'Single level home', + 'Long term stays allowed', + 'Host greets you', + 'Handheld shower head', + ], + price: { + $numberDecimal: '29.00', + }, + security_deposit: { + $numberDecimal: '0.00', + }, + cleaning_fee: { + $numberDecimal: '10.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '2', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/c2d2ddfd-bcbc-47fa-8118-31c041fee36d.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '9320470', + host_url: 'https://www.airbnb.com/users/show/9320470', + host_name: 'Apartments2Enjoy', + host_location: 'Porto, Porto District, Portugal', + host_about: + "Welcome!\r\nThe apartments has all the things to provide you a perfect days in Porto. It is located in a very central area, inside a typical oporto building. \r\nI will give you lots of informations about Porto, my personal tips, and I'll always be available to help you with anything. All I want is for you to go home knowing Porto and inevitably loving the city! :)\r\n\r\n", + host_response_time: 'within a day', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/f3e85f0c-e28d-4698-9da9-2f203aea1f3d.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/f3e85f0c-e28d-4698-9da9-2f203aea1f3d.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_response_rate: 100, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 9, + host_total_listings_count: 9, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'government_id', + ], + }, + address: { + street: 'Porto, Porto, Portugal', + suburb: '', + government_area: 'Bonfim', + market: 'Porto', + country: 'Portugal', + country_code: 'PT', + location: { + type: 'Point', + coordinates: [-8.59275, 41.1462], + is_location_exact: true, + }, + }, + availability: { + availability_30: 16, + availability_60: 42, + availability_90: 61, + availability_365: 309, + }, + review_scores: { + review_scores_accuracy: 9, + review_scores_cleanliness: 9, + review_scores_checkin: 9, + review_scores_communication: 9, + review_scores_location: 9, + review_scores_value: 9, + review_scores_rating: 89, + }, + }, + { + _id: '10488837', + listing_url: 'https://www.airbnb.com/rooms/10488837', + name: 'Cozy House in Ortaköy', + notes: '', + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-02-18T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-18T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 2, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'Internet', + 'Wifi', + 'Kitchen', + 'Smoking allowed', + 'Heating', + 'Family/kid friendly', + 'Washer', + 'Essentials', + 'Shampoo', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + ], + price: { + $numberDecimal: '100.00', + }, + cleaning_fee: { + $numberDecimal: '100.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/d94001ba-f4d6-4a9c-bb62-0e4df62589bf.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '53849209', + host_url: 'https://www.airbnb.com/users/show/53849209', + host_name: 'Orcun', + host_location: 'TR', + host_about: '', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/c4a0ffbc-881d-4076-9be9-4bc6d0c649fc.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/c4a0ffbc-881d-4076-9be9-4bc6d0c649fc.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Ortaköy', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['email', 'phone'], + }, + address: { + street: 'Beşiktaş, İstanbul, Turkey', + suburb: 'Beşiktaş', + government_area: 'Besiktas', + market: 'Istanbul', + country: 'Turkey', + country_code: 'TR', + location: { + type: 'Point', + coordinates: [29.02519, 41.05197], + is_location_exact: true, + }, + }, + availability: { + availability_30: 30, + availability_60: 60, + availability_90: 90, + availability_365: 365, + }, + review_scores: {}, + }, + { + _id: '10542174', + listing_url: 'https://www.airbnb.com/rooms/10542174', + name: 'Luxury 1-Bdrm in Downtown Brooklyn', + notes: + "When you're here, please do not tell the concierge or guests that you are an AirBNB guest. Tell them you are visiting a friend at the apartment if the topic comes up.", + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '3', + maximum_nights: '30', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + first_review: { + $date: '2016-02-21T05:00:00.000Z', + }, + last_review: { + $date: '2016-02-21T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 1, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Wheelchair accessible', + 'Kitchen', + 'Doorman', + 'Gym', + 'Elevator', + 'Buzzer/wireless intercom', + 'Heating', + 'Family/kid friendly', + 'Washer', + 'Dryer', + 'Smoke detector', + 'Carbon monoxide detector', + 'First aid kit', + 'Safety card', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + ], + price: { + $numberDecimal: '144.00', + }, + security_deposit: { + $numberDecimal: '250.00', + }, + cleaning_fee: { + $numberDecimal: '150.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/418c69b1-a49a-468d-9ea9-870468e15670.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '10099253', + host_url: 'https://www.airbnb.com/users/show/10099253', + host_name: 'Ashley', + host_location: 'New York, New York, United States', + host_about: + "I'm an executive at a wellness company in New York City. Educated in Fashion at Parsons, I'm into fitness and nutrition. I've lived in the city since enrolling at Parsons in the late 90s.\r\n\r\nIf you're looking for restaurant reservations, boutique fitness studios, or things to do in the city, then just let me know what you're interested in. I'd love to offer some suggestions and help you have a wonderful stay in New York City.", + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/afca1b34-30e9-43c0-969b-7b9cf913cb8d.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/afca1b34-30e9-43c0-969b-7b9cf913cb8d.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Downtown Brooklyn', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['email', 'phone', 'jumio', 'government_id'], + }, + address: { + street: 'Brooklyn, NY, United States', + suburb: 'Fort Greene', + government_area: 'Fort Greene', + market: 'New York', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-73.98102, 40.69406], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: {}, + }, + { + _id: '10581101', + listing_url: 'https://www.airbnb.com/rooms/10581101', + name: 'Grand apartment Sagrada Familia', + notes: + 'Please contact us to report your arrival time to Barcelona at least 24 hours before check-in, to organize your check-in correctly. Late check-in (after 20: 00h) is an extra cost of 30 euros to pay cash during check-in. It is requested not to make noises from 22:00. Tourist tax is not included in the price (0.75 € / night / adult, up to 7 nights) which is payable upon arrival.', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '1125', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-08T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-08T05:00:00.000Z', + }, + first_review: { + $date: '2016-03-30T04:00:00.000Z', + }, + last_review: { + $date: '2019-02-20T05:00:00.000Z', + }, + accommodates: 8, + bedrooms: 4, + beds: 6, + number_of_reviews: 77, + bathrooms: { + $numberDecimal: '2.0', + }, + amenities: [ + 'TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Paid parking off premises', + 'Smoking allowed', + 'Buzzer/wireless intercom', + 'Family/kid friendly', + 'Washer', + 'Dryer', + 'Essentials', + 'Shampoo', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Hot water', + 'Host greets you', + ], + price: { + $numberDecimal: '169.00', + }, + security_deposit: { + $numberDecimal: '200.00', + }, + cleaning_fee: { + $numberDecimal: '60.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '10', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/10d847ae-946f-459b-b019-5a07929fcaee.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '54320669', + host_url: 'https://www.airbnb.com/users/show/54320669', + host_name: 'Alexandra Y Juan', + host_location: 'Barcelona, Catalonia, Spain', + host_about: + 'Hola, \r\n\r\nSomos Alexandra y Juan dos amigos que estamos enamorados de Barcelona, nuestras pasiones son viajar y conocer gente por lo que nos encantaría compartir con vosotros nuestros espacios para que disfrutéis a vuestro gusto de toda la cultura, actualidad y diversidad de ofertas que la ciudad os ofrece.\r\nPara nosotros lo mas importante es que nuestros huéspedes puedan aprovechar al máximo su estancia en Barcelona, que viváis vuestra historia reflejada en rincones únicos de la ciudad y por supuesto nuestra mayor satisfacción es que os sintáis como en casa según lo que busquéis.\r\n\r\nHello, \r\n\r\nWe are Alexandra and Juan two friends who are in love with Barcelona, our passion is to travel and meet new people so we would love to share our spaces with you and that you can enjoy the culture, the present and the diversity of offers that the city has to offer. \r\nFor us the most important thing is that our guests can make the most of their stay in Barcelona, that you live our history full of unique places and of course our greatest satisfaction is that you feel as if you where at home according to what you are looking for.', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/user/3fceba9a-ce84-4841-88df-b699105119b4.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/user/3fceba9a-ce84-4841-88df-b699105119b4.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Vila de Gràcia', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 12, + host_total_listings_count: 12, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'government_id', + 'work_email', + ], + }, + address: { + street: 'Barcelona, Catalunya, Spain', + suburb: 'el Fort Pienc', + government_area: 'el Fort Pienc', + market: 'Barcelona', + country: 'Spain', + country_code: 'ES', + location: { + type: 'Point', + coordinates: [2.18146, 41.39716], + is_location_exact: true, + }, + }, + availability: { + availability_30: 19, + availability_60: 32, + availability_90: 48, + availability_365: 211, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 9, + review_scores_checkin: 9, + review_scores_communication: 9, + review_scores_location: 9, + review_scores_value: 9, + review_scores_rating: 90, + }, + }, + { + _id: '10215858', + listing_url: 'https://www.airbnb.com/rooms/10215858', + name: 'Cozy Queen Guest Room&My', + notes: + 'After check-in time is 14:00, check out time is 12:00 the next day (we need to do the cleaning after you check out, the room clean and ready for the next guest to stay), arrive early the day of arrival or check out we can offer free luggage service, luggage storage after check-out time is 18:00 pm the day before check-out. If you need to store your luggage after check-out storage than 18:00, we need extra charge. After our order book to confirm the order, we will be unified payment after One specific route how come my family sent to your mailbox or leave a message Airbnb. To shop directly to the store that day to show identification registration word, to pay 200 yuan (HK $) of Check to Check deposit. Before booking please note: our room once confirmed the order, which does not accept the changes can only be rescheduled according to unsubscribe from the implementation of policies to unsubscribe. ★ Our room photos are all on the ground to take pictures, but despite this, room photos are ', + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '500', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + first_review: { + $date: '2016-07-13T04:00:00.000Z', + }, + last_review: { + $date: '2018-11-06T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 9, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Wifi', + 'Air conditioning', + 'Doorman', + 'Elevator', + 'Family/kid friendly', + 'Smoke detector', + 'Essentials', + 'Lock on bedroom door', + 'Hangers', + 'Hair dryer', + ], + price: { + $numberDecimal: '330.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/9dbed061-0c71-4932-b19b-40a115c127f1.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '52473150', + host_url: 'https://www.airbnb.com/users/show/52473150', + host_name: 'Danny', + host_location: 'Hong Kong', + host_about: + '每次旅行都是一种到达别人家做客的体验。自己有好几处单位,住不了那么多,多半出租,我是位非常好客的人,也是很喜欢旅行!不管你是商务出差还是旅游度假,来我家住吧,很高兴能和你成为好朋友!给你们的旅行一个安全干净舒适实惠的居住环境。\r\nP.S:如你订好,请留个言给我~O(∩_∩)O谢谢~(Complete payment, please leave a message ~)\r\nDuring the period of stay: if you are not Chinese, please leave a message directly to me, you need to, immediately to make arrangements for your service\r\n可以加我 (Hidden by Airbnb) (You can add me (Hidden by Airbnb) \r\n)ID: (Phone number hidden by Airbnb)', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/13dcc152-382c-43ac-9933-c241ae596c3a.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/13dcc152-382c-43ac-9933-c241ae596c3a.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Mong Kok', + host_response_rate: 97, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 29, + host_total_listings_count: 29, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'offline_government_id', + 'selfie', + 'government_id', + 'identity_manual', + ], + }, + address: { + street: 'Hong Kong, Kowloon, Hong Kong', + suburb: 'Yau Tsim Mong', + government_area: 'Yau Tsim Mong', + market: 'Hong Kong', + country: 'Hong Kong', + country_code: 'HK', + location: { + type: 'Point', + coordinates: [114.17034, 22.31655], + is_location_exact: true, + }, + }, + availability: { + availability_30: 20, + availability_60: 50, + availability_90: 80, + availability_365: 135, + }, + review_scores: { + review_scores_accuracy: 8, + review_scores_cleanliness: 7, + review_scores_checkin: 9, + review_scores_communication: 8, + review_scores_location: 10, + review_scores_value: 8, + review_scores_rating: 73, + }, + }, + { + _id: '1022200', + listing_url: 'https://www.airbnb.com/rooms/1022200', + name: 'Kailua-Kona, Kona Coast II 2b condo', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '7', + maximum_nights: '7', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + first_review: { + $date: '2018-06-15T04:00:00.000Z', + }, + last_review: { + $date: '2018-06-15T04:00:00.000Z', + }, + accommodates: 6, + bedrooms: 2, + beds: 3, + number_of_reviews: 1, + bathrooms: { + $numberDecimal: '2.0', + }, + amenities: [ + 'Cable TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Pool', + 'Kitchen', + 'Free parking on premises', + 'Gym', + 'Family/kid friendly', + 'Washer', + 'Dryer', + ], + price: { + $numberDecimal: '135.00', + }, + weekly_price: { + $numberDecimal: '950.00', + }, + security_deposit: { + $numberDecimal: '200.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/15368256/7f973058_original.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '3393610', + host_url: 'https://www.airbnb.com/users/show/3393610', + host_name: 'Daniel', + host_location: 'Las Vegas, Nevada, United States', + host_about: + 'I am a general dentist practicing in Las Vegas for 7 years after practicing in San Jose, Ca for 30 years. I own this apartment in Rio de Janeiro. I live in the apartment when I visit.', + host_thumbnail_url: + 'https://a0.muscache.com/im/users/3393610/profile_pic/1346112640/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/3393610/profile_pic/1346112640/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Kailua/Kona', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'facebook', + 'reviews', + 'jumio', + 'kba', + 'government_id', + ], + }, + address: { + street: 'Kailua-Kona, HI, United States', + suburb: 'Kailua/Kona', + government_area: 'North Kona', + market: 'The Big Island', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-155.96445, 19.5702], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 13, + availability_90: 43, + availability_365: 196, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 8, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 100, + }, + }, + { + _id: '10359729', + listing_url: 'https://www.airbnb.com/rooms/10359729', + name: '', + notes: '', + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-02-18T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-18T05:00:00.000Z', + }, + accommodates: 4, + bedrooms: 1, + beds: 2, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'Internet', + 'Wifi', + 'Kitchen', + 'Smoking allowed', + 'Doorman', + 'Heating', + 'Washer', + 'First aid kit', + 'Essentials', + 'Shampoo', + 'Lock on bedroom door', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + ], + price: { + $numberDecimal: '105.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/5e2149f5-f226-42ce-aec8-fd9b38e72048.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '53319251', + host_url: 'https://www.airbnb.com/users/show/53319251', + host_name: 'Seda', + host_location: 'TR', + host_about: '', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/057451e6-db50-44f1-b58a-241ad20b294a.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/057451e6-db50-44f1-b58a-241ad20b294a.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['email', 'phone'], + }, + address: { + street: 'Istanbul, İstanbul, Turkey', + suburb: 'Beşiktaş', + government_area: 'Sariyer', + market: 'Istanbul', + country: 'Turkey', + country_code: 'TR', + location: { + type: 'Point', + coordinates: [29.05108, 41.08835], + is_location_exact: false, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: {}, + }, + { + _id: '10570041', + listing_url: 'https://www.airbnb.com/rooms/10570041', + name: 'Jardim Botânico Gourmet 2 bdroom', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '1125', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + first_review: { + $date: '2016-02-10T05:00:00.000Z', + }, + last_review: { + $date: '2018-10-15T04:00:00.000Z', + }, + accommodates: 6, + bedrooms: 2, + beds: 5, + number_of_reviews: 9, + bathrooms: { + $numberDecimal: '2.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Wifi', + 'Air conditioning', + 'Pool', + 'Kitchen', + 'Free parking on premises', + 'Pets allowed', + 'Gym', + 'Elevator', + 'Free street parking', + 'Family/kid friendly', + 'Washer', + 'Smoke detector', + 'Carbon monoxide detector', + 'First aid kit', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + 'Lock on bedroom door', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Self check-in', + 'Building staff', + 'Private living room', + 'Changing table', + 'Stair gates', + 'Children’s books and toys', + 'Window guards', + 'Babysitter recommendations', + 'Room-darkening shades', + 'Children’s dinnerware', + 'Hot water', + 'Bed linens', + 'Extra pillows and blankets', + 'Ethernet connection', + 'Microwave', + 'Coffee maker', + 'Refrigerator', + 'Dishes and silverware', + 'Cooking basics', + 'Oven', + 'Stove', + 'Patio or balcony', + 'Garden or backyard', + 'Beach essentials', + 'Luggage dropoff allowed', + 'Long term stays allowed', + ], + price: { + $numberDecimal: '395.00', + }, + weekly_price: { + $numberDecimal: '800.00', + }, + monthly_price: { + $numberDecimal: '2000.00', + }, + security_deposit: { + $numberDecimal: '1000.00', + }, + cleaning_fee: { + $numberDecimal: '300.00', + }, + extra_people: { + $numberDecimal: '35.00', + }, + guests_included: { + $numberDecimal: '4', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/860bf0f7-4a81-4c7b-a258-2ddef02b4b35.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '3665789', + host_url: 'https://www.airbnb.com/users/show/3665789', + host_name: 'Roberta (Beta) Gatti', + host_location: 'Rio de Janeiro, Rio de Janeiro, Brazil', + host_about: + 'Trabalho com locações de imóveis mobiliados há 7 anos e AMO ser HOST. \r\nValorizo o conforto acima de tudo e tenho satisfação em buscar meus hóspedes no aeroporto, ajudar com pequenas mudanças; indicar restaurantes ou planejar passeios. Posso ajudar no que for preciso! \nAlém de produtora de locações e mãe, faço trabalhos como curadora de arte e produzo a Organização Socio Cultural “VAGALUME O VERDE - VOV” cujo BLOCO de CARNAVAL desfila há 14 anos na Rua Jardim Botânico, sempre às terças-feiras de carnaval. \nO VOV nasceu no Horto Florestal e tem a sustentabilidade e preservação ambiental como diretrizes. Estudamos e pesquisamos diariamente como usar de maneira responsável o que a Natureza nos proporciona e deixar um LEGADO para gerações futuras. \nAlém de equipe de coleta seletiva, plantio de mudas para neutralização do impacto gerado pelo desfile (compensação ambiental), mão de obra local e reutilização de materiais, \nem 2013 Implementamos a norma de certificação da “ISO 20121- Gestão em Eventos Sustentáveis”. \nEm 2015, recebemos o prêmio Serpentina de Ouro, por melhor organização. Em 2019 vamos estrear nosso novo maestro com uma bateria inovadora e arrepiante. Vem!\n', + host_response_time: 'within a few hours', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/d60dd2bb-31f0-424a-b60e-c10796cec2cc.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/d60dd2bb-31f0-424a-b60e-c10796cec2cc.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_response_rate: 98, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 18, + host_total_listings_count: 18, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'offline_government_id', + 'government_id', + ], + }, + address: { + street: 'Rio de Janeiro, RJ, Brazil', + suburb: 'Jardim Botânico', + government_area: 'Jardim Botânico', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.22076222600562, -22.96448811710617], + is_location_exact: false, + }, + }, + availability: { + availability_30: 17, + availability_60: 47, + availability_90: 77, + availability_365: 342, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 9, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 9, + review_scores_rating: 91, + }, + }, + { + _id: '10184012', + listing_url: 'https://www.airbnb.com/rooms/10184012', + name: 'Apto semi mobiliado', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 2, + beds: 2, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'Air conditioning', + 'Kitchen', + 'Free parking on premises', + 'Doorman', + 'Elevator', + 'Buzzer/wireless intercom', + 'Family/kid friendly', + 'Washer', + 'Essentials', + 'Hangers', + 'Iron', + ], + price: { + $numberDecimal: '380.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/7636a27c-6f18-41d4-b2ce-ecfa1e561451.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '52299431', + host_url: 'https://www.airbnb.com/users/show/52299431', + host_name: 'Ricardo', + host_location: 'BR', + host_about: '', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/675c6438-a5fe-4874-abbb-544270401e45.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/675c6438-a5fe-4874-abbb-544270401e45.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['email', 'phone'], + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Vila Isabel', + government_area: 'Vila Isabel', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.24277868091869, -22.915009354482486], + is_location_exact: false, + }, + }, + availability: { + availability_30: 30, + availability_60: 60, + availability_90: 90, + availability_365: 365, + }, + review_scores: {}, + }, + { + _id: '10166986', + listing_url: 'https://www.airbnb.com/rooms/10166986', + name: 'Resort-like living in Williamsburg', + notes: 'Accept only reservation for minimum 3 nights.', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '5', + maximum_nights: '1125', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + first_review: { + $date: '2016-01-01T05:00:00.000Z', + }, + last_review: { + $date: '2016-01-01T05:00:00.000Z', + }, + accommodates: 4, + bedrooms: 2, + beds: 2, + number_of_reviews: 1, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Wheelchair accessible', + 'Pool', + 'Kitchen', + 'Doorman', + 'Gym', + 'Elevator', + 'Hot tub', + 'Buzzer/wireless intercom', + 'Heating', + 'Family/kid friendly', + 'Washer', + 'Dryer', + 'Smoke detector', + 'Essentials', + '24-hour check-in', + 'Hangers', + 'Iron', + ], + price: { + $numberDecimal: '220.00', + }, + weekly_price: { + $numberDecimal: '1400.00', + }, + cleaning_fee: { + $numberDecimal: '25.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/e8e3a30b-a3e9-4925-88b2-d3977054be34.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '14461742', + host_url: 'https://www.airbnb.com/users/show/14461742', + host_name: 'Mohammed', + host_location: 'Paris, Île-de-France, France', + host_about: '', + host_thumbnail_url: + 'https://a0.muscache.com/im/users/14461742/profile_pic/1397899792/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/14461742/profile_pic/1397899792/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Williamsburg', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'government_id', + ], + }, + address: { + street: 'Brooklyn, NY, United States', + suburb: 'Williamsburg', + government_area: 'Williamsburg', + market: 'New York', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-73.93869, 40.71552], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 8, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 100, + }, + }, + { + _id: '10213499', + listing_url: 'https://www.airbnb.com/rooms/10213499', + name: 'Great studio opp. Narrabeen Lake', + notes: + 'Kayak/stand-up paddle boards and more are available on the lake Great choice of restaurants within walking distance. And of course the choice of several of the beautiful patrolled Narrabeen beaches', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'moderate', + last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + first_review: { + $date: '2016-01-23T05:00:00.000Z', + }, + last_review: { + $date: '2019-01-06T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 0, + beds: 1, + number_of_reviews: 61, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Pool', + 'Kitchen', + 'Free parking on premises', + 'Pets live on this property', + 'Dog(s)', + 'Heating', + 'Washer', + 'First aid kit', + 'Essentials', + 'Shampoo', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Hot water', + 'Bed linens', + 'Extra pillows and blankets', + 'Ethernet connection', + ], + price: { + $numberDecimal: '117.00', + }, + security_deposit: { + $numberDecimal: '0.00', + }, + cleaning_fee: { + $numberDecimal: '0.00', + }, + extra_people: { + $numberDecimal: '20.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/cf11c8a8-a9e8-476b-bdad-98a3108c1ef5.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '634664', + host_url: 'https://www.airbnb.com/users/show/634664', + host_name: 'Tracy', + host_location: 'New South Wales, Australia', + host_about: '', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/9a934b26-9946-4261-aecf-7e707cc0782a.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/9a934b26-9946-4261-aecf-7e707cc0782a.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_response_rate: 100, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['email', 'phone', 'reviews'], + }, + address: { + street: 'Narrabeen, NSW, Australia', + suburb: '', + government_area: 'Warringah', + market: 'Sydney', + country: 'Australia', + country_code: 'AU', + location: { + type: 'Point', + coordinates: [151.29792, -33.71472], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 25, + availability_365: 26, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 97, + }, + }, + { + _id: '10560325', + listing_url: 'https://www.airbnb.com/rooms/10560325', + name: 'Spacious and well located apartment', + notes: + 'The apartment is located in a strictly residential area, and silence should be kept after 10 pm. Although we love pets, here they are not welcome, not with prior consultation and approval, subject to an extra cleaning fee. No smoking in the apartment. The apartment is ideal for families and couples. It is located in a building and in a strictly residential area, and therefore requires care not to harm the other residents. So, to groups of friends who wish to rent you, I ask you to send detailed information about you, such as the name and profile of the (Hidden by Airbnb) of all travelers, and other information that allows us evaluate a suitability of the property to your needs. Thank you! Take care of the apartment and belongings with the same care that we have.', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '3', + maximum_nights: '1125', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-02-16T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-16T05:00:00.000Z', + }, + first_review: { + $date: '2016-03-30T04:00:00.000Z', + }, + last_review: { + $date: '2018-11-04T04:00:00.000Z', + }, + accommodates: 6, + bedrooms: 2, + beds: 3, + number_of_reviews: 20, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Kitchen', + 'Paid parking off premises', + 'Elevator', + 'Buzzer/wireless intercom', + 'Family/kid friendly', + 'Essentials', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Hot water', + 'Long term stays allowed', + 'Host greets you', + ], + price: { + $numberDecimal: '60.00', + }, + security_deposit: { + $numberDecimal: '200.00', + }, + cleaning_fee: { + $numberDecimal: '25.00', + }, + extra_people: { + $numberDecimal: '8.00', + }, + guests_included: { + $numberDecimal: '3', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/491297bc-cf3e-4f8c-b7f2-e5143c31b1c7.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '12870591', + host_url: 'https://www.airbnb.com/users/show/12870591', + host_name: 'Andre', + host_location: 'São Paulo, Brazil', + host_about: '', + host_response_time: 'within a day', + host_thumbnail_url: + 'https://a0.muscache.com/im/users/12870591/profile_pic/1394136948/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/12870591/profile_pic/1394136948/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Jardim Europa', + host_response_rate: 80, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 5, + host_total_listings_count: 5, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'government_id', + ], + }, + address: { + street: 'Porto, Porto, Portugal', + suburb: '', + government_area: 'Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória', + market: 'Porto', + country: 'Portugal', + country_code: 'PT', + location: { + type: 'Point', + coordinates: [-8.6114, 41.16093], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 16, + availability_90: 46, + availability_365: 314, + }, + review_scores: { + review_scores_accuracy: 9, + review_scores_cleanliness: 9, + review_scores_checkin: 10, + review_scores_communication: 9, + review_scores_location: 9, + review_scores_value: 9, + review_scores_rating: 89, + }, + }, + { + _id: '1058555', + listing_url: 'https://www.airbnb.com/rooms/1058555', + name: 'Nice Cosy Room In Taksim', + notes: '', + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '3', + maximum_nights: '1125', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-02-18T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-18T05:00:00.000Z', + }, + first_review: { + $date: '2014-04-06T04:00:00.000Z', + }, + last_review: { + $date: '2018-12-23T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 31, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Heating', + 'Washer', + 'Essentials', + 'Shampoo', + ], + price: { + $numberDecimal: '105.00', + }, + cleaning_fee: { + $numberDecimal: '60.00', + }, + extra_people: { + $numberDecimal: '60.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/106769623/0bdfdc5d_original.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '5823933', + host_url: 'https://www.airbnb.com/users/show/5823933', + host_name: 'Nihat', + host_location: 'Istanbul', + host_about: + 'I live alone in Taksim area and i work at bar.\r\nI like meet new friends from all of the world.\r\nI like to Travel a lot ofcourse if i have free time :) East Asia , Sun , Sea , Sand , Movie :) ', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/user/6bf03261-e7ac-4e0e-8121-3828612bbb6a.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/user/6bf03261-e7ac-4e0e-8121-3828612bbb6a.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Cihangir', + host_response_rate: 100, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 2, + host_total_listings_count: 2, + host_verifications: ['email', 'phone', 'facebook', 'reviews'], + }, + address: { + street: 'Taksim, Cihangir, Istanbul , Beyoğlu, Turkey', + suburb: 'Beyoglu', + government_area: 'Beyoglu', + market: 'Istanbul', + country: 'Turkey', + country_code: 'TR', + location: { + type: 'Point', + coordinates: [28.98648, 41.03376], + is_location_exact: true, + }, + }, + availability: { + availability_30: 23, + availability_60: 44, + availability_90: 74, + availability_365: 336, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 9, + review_scores_rating: 96, + }, + }, + { + _id: '10628126', + listing_url: 'https://www.airbnb.com/rooms/10628126', + name: 'Ribeira Smart Flat', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '1124', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-02-16T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-16T05:00:00.000Z', + }, + first_review: { + $date: '2016-03-15T04:00:00.000Z', + }, + last_review: { + $date: '2019-02-05T05:00:00.000Z', + }, + accommodates: 6, + bedrooms: 3, + beds: 3, + number_of_reviews: 132, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'Internet', + 'Wifi', + 'Kitchen', + 'Paid parking off premises', + 'Buzzer/wireless intercom', + 'Family/kid friendly', + 'Washer', + 'First aid kit', + 'Safety card', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + 'Hangers', + 'Hair dryer', + 'Hot water', + 'Bed linens', + 'Microwave', + 'Coffee maker', + 'Refrigerator', + 'Dishes and silverware', + 'Cooking basics', + 'Oven', + 'Stove', + 'Long term stays allowed', + 'Host greets you', + ], + price: { + $numberDecimal: '80.00', + }, + security_deposit: { + $numberDecimal: '700.00', + }, + cleaning_fee: { + $numberDecimal: '20.00', + }, + extra_people: { + $numberDecimal: '10.00', + }, + guests_included: { + $numberDecimal: '2', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/86179056/8f7f2c18_original.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '54662715', + host_url: 'https://www.airbnb.com/users/show/54662715', + host_name: 'Mathieu', + host_location: 'Porto, Porto District, Portugal', + host_about: + 'Originally from France, I have always been keen to discover new countries and cultures. I lived 2 years in Australia where I studied at the University of Southern Queensland. After that I headed back to Paris, thinking to settle down there. After some times I decided to change my life and landed in Porto. I have been living here since 2010.\r\nSince then, I did not manage to get back and got in love with Porto. The seagulls, the Douro and the amazing color of the sun set, will without a doubt, make you also fall in love with this beautiful city.\r\nMake sure that you check out the little guide! There is some nice place to visit!\r\n\r\n', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/user/c0ef722d-0a22-4552-98f9-6b80788b6319.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/user/c0ef722d-0a22-4552-98f9-6b80788b6319.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 4, + host_total_listings_count: 4, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'government_id', + ], + }, + address: { + street: 'Porto, Porto, Portugal', + suburb: '', + government_area: 'Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória', + market: 'Porto', + country: 'Portugal', + country_code: 'PT', + location: { + type: 'Point', + coordinates: [-8.61602, 41.14295], + is_location_exact: false, + }, + }, + availability: { + availability_30: 5, + availability_60: 25, + availability_90: 46, + availability_365: 214, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 9, + review_scores_rating: 92, + }, + }, + { + _id: '10354347', + listing_url: 'https://www.airbnb.com/rooms/10354347', + name: 'Room For Erasmus', + notes: '', + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-02-18T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-18T05:00:00.000Z', + }, + first_review: { + $date: '2017-12-27T05:00:00.000Z', + }, + last_review: { + $date: '2017-12-27T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 2, + beds: 2, + number_of_reviews: 1, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Kitchen', + 'Free parking on premises', + 'Smoking allowed', + 'Doorman', + 'Elevator', + 'Heating', + 'Family/kid friendly', + 'Suitable for events', + 'Washer', + 'Dryer', + 'Essentials', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Private living room', + 'Hot water', + 'Host greets you', + ], + price: { + $numberDecimal: '37.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/71d16486-b63a-4407-959e-746fee61b61d.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '53288729', + host_url: 'https://www.airbnb.com/users/show/53288729', + host_name: 'Kemal', + host_location: 'TR', + host_about: '', + host_response_time: 'within a day', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/c658d62a-2598-4ff7-80a0-633ba0bdd619.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/c658d62a-2598-4ff7-80a0-633ba0bdd619.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['email', 'phone', 'reviews'], + }, + address: { + street: 'Şişli, İstanbul, Turkey', + suburb: 'Kadıköy', + government_area: 'Kadikoy', + market: 'Istanbul', + country: 'Turkey', + country_code: 'TR', + location: { + type: 'Point', + coordinates: [29.06064, 40.98837], + is_location_exact: false, + }, + }, + availability: { + availability_30: 30, + availability_60: 60, + availability_90: 90, + availability_365: 365, + }, + review_scores: {}, + }, + { + _id: '10383490', + listing_url: 'https://www.airbnb.com/rooms/10383490', + name: 'Quarto Taquara - Jacarepaguá', + notes: '', + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '1125', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + first_review: { + $date: '2016-05-16T04:00:00.000Z', + }, + last_review: { + $date: '2016-05-16T04:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 1, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'Cable TV', + 'Wifi', + 'Kitchen', + 'Smoking allowed', + 'Elevator', + 'Buzzer/wireless intercom', + 'Family/kid friendly', + 'Washer', + 'Essentials', + 'Lock on bedroom door', + '24-hour check-in', + 'Iron', + 'Laptop friendly workspace', + 'translation missing: en.hosting_amenity_50', + ], + price: { + $numberDecimal: '101.00', + }, + weekly_price: { + $numberDecimal: '350.00', + }, + monthly_price: { + $numberDecimal: '600.00', + }, + security_deposit: { + $numberDecimal: '128.00', + }, + cleaning_fee: { + $numberDecimal: '120.00', + }, + extra_people: { + $numberDecimal: '20.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/f5e96547-9b65-4b6b-a404-8824f01cc165.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '3026612', + host_url: 'https://www.airbnb.com/users/show/3026612', + host_name: 'Luana', + host_location: 'Rio de Janeiro, Rio de Janeiro, Brazil', + host_about: + 'Carioca, profissional de marketing, maquiadora e que ama viajar, conhecer lugares, culturas e pessoas! ', + host_response_time: 'a few days or more', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/ef5a70f4-27ad-4377-b5c6-90483ed8ac91.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/ef5a70f4-27ad-4377-b5c6-90483ed8ac91.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_response_rate: 0, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 2, + host_total_listings_count: 2, + host_verifications: ['email', 'phone', 'reviews', 'work_email'], + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: '', + government_area: 'Tanque', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.37035220190699, -22.91636184358952], + is_location_exact: true, + }, + }, + availability: { + availability_30: 30, + availability_60: 60, + availability_90: 90, + availability_365: 365, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 100, + }, + }, + { + _id: '10423504', + listing_url: 'https://www.airbnb.com/rooms/10423504', + name: 'Bondi Beach Dreaming 3-Bed House', + notes: + 'Please nominate the correct number of guests before you arrive. There are extra charges for extra guests and if you do not declare guests I will make a resolution request to Airbnb and review you accordingly. Please note we have friendly neighbours and a security camera at the front gate.', + property_type: 'House', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '1125', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + first_review: { + $date: '2016-01-30T05:00:00.000Z', + }, + last_review: { + $date: '2018-11-11T05:00:00.000Z', + }, + accommodates: 8, + bedrooms: 3, + beds: 6, + number_of_reviews: 139, + bathrooms: { + $numberDecimal: '2.0', + }, + amenities: [ + 'TV', + 'Internet', + 'Wifi', + 'Kitchen', + 'Free parking on premises', + 'Paid parking off premises', + 'Smoking allowed', + 'Pets allowed', + 'Indoor fireplace', + 'Heating', + 'Family/kid friendly', + 'Washer', + 'Dryer', + 'Smoke detector', + 'Essentials', + 'Shampoo', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Self check-in', + 'Lockbox', + 'Private entrance', + 'Bathtub', + 'High chair', + 'Fireplace guards', + 'Pack ’n Play/travel crib', + 'Hot water', + 'Bed linens', + 'Extra pillows and blankets', + 'Ethernet connection', + 'Microwave', + 'Coffee maker', + 'Refrigerator', + 'Dishwasher', + 'Dishes and silverware', + 'Cooking basics', + 'Oven', + 'Stove', + 'Single level home', + 'BBQ grill', + 'Patio or balcony', + 'Garden or backyard', + 'Luggage dropoff allowed', + 'Long term stays allowed', + ], + price: { + $numberDecimal: '399.00', + }, + weekly_price: { + $numberDecimal: '2369.00', + }, + monthly_price: { + $numberDecimal: '8802.00', + }, + security_deposit: { + $numberDecimal: '1000.00', + }, + cleaning_fee: { + $numberDecimal: '185.00', + }, + extra_people: { + $numberDecimal: '35.00', + }, + guests_included: { + $numberDecimal: '6', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/3e7cc29d-813d-407c-ae90-b6f2745cd384.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '2509326', + host_url: 'https://www.airbnb.com/users/show/2509326', + host_name: 'Cat', + host_location: 'AU', + host_about: 'I like furry friends and stylish surrounds.', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/users/2509326/profile_pic/1352810233/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/2509326/profile_pic/1352810233/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'North Bondi', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 5, + host_total_listings_count: 5, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'offline_government_id', + 'government_id', + ], + }, + address: { + street: 'Bondi Beach, NSW, Australia', + suburb: 'Bondi Beach', + government_area: 'Waverley', + market: 'Sydney', + country: 'Australia', + country_code: 'AU', + location: { + type: 'Point', + coordinates: [151.27448, -33.8872], + is_location_exact: false, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 9, + review_scores_rating: 96, + }, + }, + { + _id: '10596036', + listing_url: 'https://www.airbnb.com/rooms/10596036', + name: 'Apt Quarto e Sala amplo Laranjeiras', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '5', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + accommodates: 4, + bedrooms: 1, + beds: 4, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Doorman', + 'Elevator', + 'Buzzer/wireless intercom', + 'Family/kid friendly', + 'Washer', + 'Essentials', + 'Hangers', + 'Iron', + 'Laptop friendly workspace', + ], + price: { + $numberDecimal: '701.00', + }, + cleaning_fee: { + $numberDecimal: '100.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/3b16daca-0fc6-43de-af1e-2aa3bac4b2ac.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '47039858', + host_url: 'https://www.airbnb.com/users/show/47039858', + host_name: 'Marianna', + host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', + host_about: '', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/8585dcad-1c49-47c7-80c4-ed527bccd62e.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/8585dcad-1c49-47c7-80c4-ed527bccd62e.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['email', 'phone'], + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Laranjeiras', + government_area: 'Laranjeiras', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.17974071338275, -22.9313871086666], + is_location_exact: false, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: {}, + }, + { + _id: '10220130', + listing_url: 'https://www.airbnb.com/rooms/10220130', + name: 'Cozy aptartment in Recreio (near Olympic Venues)', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '30', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + accommodates: 6, + bedrooms: 3, + beds: 3, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '3.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Pool', + 'Kitchen', + 'Free parking on premises', + 'Doorman', + 'Gym', + 'Elevator', + 'Hot tub', + 'Buzzer/wireless intercom', + 'Family/kid friendly', + 'Washer', + 'Dryer', + 'Safety card', + 'Fire extinguisher', + 'Essentials', + 'Hangers', + 'Iron', + 'Laptop friendly workspace', + 'translation missing: en.hosting_amenity_50', + ], + price: { + $numberDecimal: '746.00', + }, + cleaning_fee: { + $numberDecimal: '373.00', + }, + extra_people: { + $numberDecimal: '187.00', + }, + guests_included: { + $numberDecimal: '4', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/f48f9243-6bf3-4dea-bc50-c29d88f4e6b2.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '31553171', + host_url: 'https://www.airbnb.com/users/show/31553171', + host_name: 'José Augusto', + host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', + host_about: + 'Engenheiro Civil, 56 anos, Casado, 2 filhos maiores de idade', + host_thumbnail_url: + 'https://a0.muscache.com/im/users/31553171/profile_pic/1429551055/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/31553171/profile_pic/1429551055/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Recreio dos Bandeirantes', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'government_id', + ], + }, + address: { + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Recreio dos Bandeirantes', + government_area: 'Recreio dos Bandeirantes', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.45296045334386, -23.008710784460312], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: {}, + }, + { + _id: '10166883', + listing_url: 'https://www.airbnb.com/rooms/10166883', + name: 'Large railroad style 3 bedroom apt in Manhattan!', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '3', + maximum_nights: '6', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + first_review: { + $date: '2016-01-03T05:00:00.000Z', + }, + last_review: { + $date: '2019-01-01T05:00:00.000Z', + }, + accommodates: 9, + bedrooms: 3, + beds: 4, + number_of_reviews: 22, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Paid parking off premises', + 'Free street parking', + 'Buzzer/wireless intercom', + 'Heating', + 'Smoke detector', + 'Carbon monoxide detector', + 'Essentials', + 'Shampoo', + '24-hour check-in', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'translation missing: en.hosting_amenity_49', + 'translation missing: en.hosting_amenity_50', + 'Hot water', + 'Microwave', + 'Refrigerator', + 'Dishes and silverware', + 'Cooking basics', + 'Oven', + 'Stove', + 'Single level home', + 'Other', + ], + price: { + $numberDecimal: '180.00', + }, + security_deposit: { + $numberDecimal: '199.00', + }, + cleaning_fee: { + $numberDecimal: '59.00', + }, + extra_people: { + $numberDecimal: '19.00', + }, + guests_included: { + $numberDecimal: '4', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/5183470a-9507-4488-b113-57a919d48910.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '35215309', + host_url: 'https://www.airbnb.com/users/show/35215309', + host_name: 'Vick', + host_location: 'New York, New York, United States', + host_about: '', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/bd6a13af-36d3-4658-920b-87c221704fe2.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/bd6a13af-36d3-4658-920b-87c221704fe2.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'East Harlem', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'government_id', + ], + }, + address: { + street: 'New York, NY, United States', + suburb: 'Manhattan', + government_area: 'East Harlem', + market: 'New York', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-73.93943, 40.79805], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 9, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 9, + review_scores_value: 9, + review_scores_rating: 95, + }, + }, + { + _id: '10227000', + listing_url: 'https://www.airbnb.com/rooms/10227000', + name: 'LAHAINA, MAUI! RESORT/CONDO BEACHFRONT!! SLEEPS 4!', + notes: '', + property_type: 'Condominium', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + first_review: { + $date: '2016-02-20T05:00:00.000Z', + }, + last_review: { + $date: '2016-02-20T05:00:00.000Z', + }, + accommodates: 4, + bedrooms: 1, + beds: 2, + number_of_reviews: 1, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Wheelchair accessible', + 'Pool', + 'Kitchen', + 'Free parking on premises', + 'Doorman', + 'Gym', + 'Elevator', + 'Hot tub', + 'Indoor fireplace', + 'Buzzer/wireless intercom', + 'Heating', + 'Family/kid friendly', + 'Suitable for events', + 'Washer', + 'Dryer', + 'Smoke detector', + 'Carbon monoxide detector', + 'First aid kit', + 'Safety card', + 'Fire extinguisher', + 'Essentials', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + ], + price: { + $numberDecimal: '499.00', + }, + cleaning_fee: { + $numberDecimal: '99.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/f3fbbda4-03cb-4c39-81c0-d79600d75f00.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '12057949', + host_url: 'https://www.airbnb.com/users/show/12057949', + host_name: 'Holly', + host_location: 'Las Vegas, Nevada, United States', + host_about: + "My husband and I have been privileged with the opportunity to make our DREAMS our MEMORIES and we're here to help assist you with yours'..........Traveling is TRULY what life is about!", + host_response_time: 'within a day', + host_thumbnail_url: + 'https://a0.muscache.com/im/users/12057949/profile_pic/1415478237/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/12057949/profile_pic/1415478237/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Central Business District', + host_response_rate: 91, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 472, + host_total_listings_count: 472, + host_verifications: [ + 'email', + 'phone', + 'google', + 'reviews', + 'jumio', + 'offline_government_id', + 'kba', + 'government_id', + ], + }, + address: { + street: 'Lahaina, HI, United States', + suburb: 'Maui', + government_area: 'Lahaina', + market: 'Maui', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-156.68012, 20.96996], + is_location_exact: true, + }, + }, + availability: { + availability_30: 30, + availability_60: 60, + availability_90: 90, + availability_365: 365, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 8, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 100, + }, + }, + { + _id: '103161', + listing_url: 'https://www.airbnb.com/rooms/103161', + name: 'Cozy Art Top Floor Apt in PRIME Williamsburg!', + notes: + "CHECK OUT: it is always at 11:00 am because my cleaning lady comes at that time and I can't change her schedule for every guest . If case your flight it's in the afternoon or night and you would like to spend the afternoon there you can just pay for half day as previous guest have offered the day of their check out. In case you just need to leave your luggage there while you around that also can be arrange if I DO NOT have another guest coming up same day. Thank you so much! :)", + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '300', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + first_review: { + $date: '2013-09-21T04:00:00.000Z', + }, + last_review: { + $date: '2019-02-18T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 2, + number_of_reviews: 117, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Paid parking off premises', + 'Free street parking', + 'Heating', + 'Smoke detector', + 'Carbon monoxide detector', + 'First aid kit', + 'Essentials', + 'Shampoo', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'translation missing: en.hosting_amenity_49', + 'translation missing: en.hosting_amenity_50', + 'Hot water', + 'Bed linens', + 'Extra pillows and blankets', + 'Ethernet connection', + 'Coffee maker', + 'Refrigerator', + 'Dishes and silverware', + 'Cooking basics', + 'Oven', + 'Luggage dropoff allowed', + 'Long term stays allowed', + 'Other', + ], + price: { + $numberDecimal: '175.00', + }, + security_deposit: { + $numberDecimal: '300.00', + }, + cleaning_fee: { + $numberDecimal: '90.00', + }, + extra_people: { + $numberDecimal: '300.00', + }, + guests_included: { + $numberDecimal: '2', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/fc6b432c-c2a2-4995-9427-60c987615bd6.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '465278', + host_url: 'https://www.airbnb.com/users/show/465278', + host_name: 'Ade', + host_location: 'Brooklyn, NY', + host_about: + "I'm a Photographer and I love music, travel and good food! I speak Spanish, Italian and English! ", + host_response_time: 'within a few hours', + host_thumbnail_url: + 'https://a0.muscache.com/im/users/465278/profile_pic/1379275888/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/465278/profile_pic/1379275888/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Williamsburg', + host_response_rate: 100, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'offline_government_id', + 'selfie', + 'government_id', + ], + }, + address: { + street: 'Brooklyn, NY, United States', + suburb: 'Williamsburg', + government_area: 'Williamsburg', + market: 'New York', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-73.96053, 40.71577], + is_location_exact: true, + }, + }, + availability: { + availability_30: 28, + availability_60: 58, + availability_90: 88, + availability_365: 363, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 9, + review_scores_rating: 96, + }, + }, + { + _id: '10449328', + listing_url: 'https://www.airbnb.com/rooms/10449328', + name: 'Aluguel Temporada Casa São Conrado', + notes: '', + property_type: 'House', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '5', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-11T05:00:00.000Z', + }, + accommodates: 11, + bedrooms: 4, + beds: 8, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '7.0', + }, + amenities: [ + 'TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Pool', + 'Kitchen', + 'Free parking on premises', + 'Smoking allowed', + 'Pets allowed', + 'Breakfast', + 'Pets live on this property', + 'Hot tub', + 'Family/kid friendly', + 'Suitable for events', + 'Washer', + 'First aid kit', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + ], + price: { + $numberDecimal: '2499.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/a4f93656-c3f8-43ae-82ba-e0b59bb59d56.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '33687645', + host_url: 'https://www.airbnb.com/users/show/33687645', + host_name: 'Maria Pia', + host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', + host_about: '', + host_response_time: 'a few days or more', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/b15173b7-3cfb-45f6-8088-a2bfbacee78c.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/b15173b7-3cfb-45f6-8088-a2bfbacee78c.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_response_rate: 0, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'facebook', + 'reviews', + 'jumio', + 'government_id', + ], + }, + address: { + street: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', + suburb: 'São Conrado', + government_area: 'São Conrado', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', + location: { + type: 'Point', + coordinates: [-43.27502007153333, -22.99391888061395], + is_location_exact: false, + }, + }, + availability: { + availability_30: 30, + availability_60: 60, + availability_90: 90, + availability_365: 365, + }, + review_scores: {}, + }, + { + _id: '10545725', + listing_url: 'https://www.airbnb.com/rooms/10545725', + name: 'Cozy bedroom Sagrada Familia', + notes: '', + property_type: 'Apartment', + room_type: 'Private room', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-03-08T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-08T05:00:00.000Z', + }, + first_review: { + $date: '2016-02-14T05:00:00.000Z', + }, + last_review: { + $date: '2016-02-14T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 2, + number_of_reviews: 1, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Internet', + 'Wifi', + 'Kitchen', + 'Pets allowed', + 'Buzzer/wireless intercom', + 'Family/kid friendly', + 'Washer', + 'Essentials', + 'Laptop friendly workspace', + ], + price: { + $numberDecimal: '20.00', + }, + weekly_price: { + $numberDecimal: '280.00', + }, + monthly_price: { + $numberDecimal: '1080.00', + }, + cleaning_fee: { + $numberDecimal: '20.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/953b3c09-adb5-4d1c-a403-b3e61c8fa766.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '1929411', + host_url: 'https://www.airbnb.com/users/show/1929411', + host_name: 'Rapha', + host_location: 'Barcelona, Catalonia, Spain', + host_about: + "Hi, I'm from Brazil, but live in Barcelona.\r\nI'm an sportsman, who loves music and is organized.\r\nReally looking foward to a nice deal.\r\nCya,\r\nRapha", + host_thumbnail_url: + 'https://a0.muscache.com/im/users/1929411/profile_pic/1332942535/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/1929411/profile_pic/1332942535/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'el Fort Pienc', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'facebook', + 'reviews', + 'jumio', + 'government_id', + ], + }, + address: { + street: 'Barcelona, Catalunya, Spain', + suburb: 'Eixample', + government_area: 'el Fort Pienc', + market: 'Barcelona', + country: 'Spain', + country_code: 'ES', + location: { + type: 'Point', + coordinates: [2.17963, 41.40087], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 100, + }, + }, + { + _id: '10558807', + listing_url: 'https://www.airbnb.com/rooms/10558807', + name: 'Park Guell apartment with terrace', + notes: + 'Please contact us to report your arrival time to Barcelona at least 24 hours before check-in, to organize your check-in correctly. Late check-in (after 20: 00h) is an extra cost of 30 euros to pay cash during It is prohibited to smoke in the apartment. It is requested not to make noises from 22:00. Tourist tax is not included in the price (2.25 € / night / adult, up to 7 nights) which is payable upon arrival.', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '1125', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-08T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-08T05:00:00.000Z', + }, + first_review: { + $date: '2016-02-23T05:00:00.000Z', + }, + last_review: { + $date: '2018-12-30T05:00:00.000Z', + }, + accommodates: 6, + bedrooms: 2, + beds: 3, + number_of_reviews: 51, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Internet', + 'Wifi', + 'Kitchen', + 'Paid parking off premises', + 'Smoking allowed', + 'Buzzer/wireless intercom', + 'Heating', + 'Family/kid friendly', + 'Washer', + 'First aid kit', + 'Essentials', + 'Hangers', + 'Hair dryer', + 'Iron', + 'translation missing: en.hosting_amenity_50', + 'Hot water', + 'Bed linens', + 'Host greets you', + ], + price: { + $numberDecimal: '85.00', + }, + security_deposit: { + $numberDecimal: '100.00', + }, + cleaning_fee: { + $numberDecimal: '40.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '6', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/305fe78c-c3d6-446e-b2d2-0ed0d0c4267a.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '54320669', + host_url: 'https://www.airbnb.com/users/show/54320669', + host_name: 'Alexandra Y Juan', + host_location: 'Barcelona, Catalonia, Spain', + host_about: + 'Hola, \r\n\r\nSomos Alexandra y Juan dos amigos que estamos enamorados de Barcelona, nuestras pasiones son viajar y conocer gente por lo que nos encantaría compartir con vosotros nuestros espacios para que disfrutéis a vuestro gusto de toda la cultura, actualidad y diversidad de ofertas que la ciudad os ofrece.\r\nPara nosotros lo mas importante es que nuestros huéspedes puedan aprovechar al máximo su estancia en Barcelona, que viváis vuestra historia reflejada en rincones únicos de la ciudad y por supuesto nuestra mayor satisfacción es que os sintáis como en casa según lo que busquéis.\r\n\r\nHello, \r\n\r\nWe are Alexandra and Juan two friends who are in love with Barcelona, our passion is to travel and meet new people so we would love to share our spaces with you and that you can enjoy the culture, the present and the diversity of offers that the city has to offer. \r\nFor us the most important thing is that our guests can make the most of their stay in Barcelona, that you live our history full of unique places and of course our greatest satisfaction is that you feel as if you where at home according to what you are looking for.', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/user/3fceba9a-ce84-4841-88df-b699105119b4.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/user/3fceba9a-ce84-4841-88df-b699105119b4.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Vila de Gràcia', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 12, + host_total_listings_count: 12, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'government_id', + 'work_email', + ], + }, + address: { + street: 'Barcelona, Catalunya, Spain', + suburb: 'Can Baro', + government_area: 'Can Baró', + market: 'Barcelona', + country: 'Spain', + country_code: 'ES', + location: { + type: 'Point', + coordinates: [2.15836, 41.41582], + is_location_exact: true, + }, + }, + availability: { + availability_30: 13, + availability_60: 16, + availability_90: 27, + availability_365: 174, + }, + review_scores: { + review_scores_accuracy: 8, + review_scores_cleanliness: 7, + review_scores_checkin: 8, + review_scores_communication: 8, + review_scores_location: 8, + review_scores_value: 8, + review_scores_rating: 71, + }, + }, + { + _id: '10573225', + listing_url: 'https://www.airbnb.com/rooms/10573225', + name: 'Charming Spacious Park Slope Studio', + notes: + 'Please, no smoking, no pets, and no parties, and please use the recycling bins.', + property_type: 'Guest suite', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '3', + maximum_nights: '1125', + cancellation_policy: 'moderate', + last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-07T05:00:00.000Z', + }, + first_review: { + $date: '2016-01-22T05:00:00.000Z', + }, + last_review: { + $date: '2019-02-04T05:00:00.000Z', + }, + accommodates: 3, + bedrooms: 0, + beds: 0, + number_of_reviews: 115, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Paid parking off premises', + 'Free street parking', + 'Heating', + 'Family/kid friendly', + 'Smoke detector', + 'Carbon monoxide detector', + 'First aid kit', + 'Safety card', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Self check-in', + 'Lockbox', + 'Hot water', + 'Microwave', + 'Coffee maker', + 'Refrigerator', + 'Dishwasher', + 'Dishes and silverware', + 'Cooking basics', + 'Oven', + 'Stove', + 'Single level home', + 'Garden or backyard', + 'Luggage dropoff allowed', + 'Long term stays allowed', + ], + price: { + $numberDecimal: '135.00', + }, + security_deposit: { + $numberDecimal: '200.00', + }, + cleaning_fee: { + $numberDecimal: '50.00', + }, + extra_people: { + $numberDecimal: '25.00', + }, + guests_included: { + $numberDecimal: '2', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/abce9916-b9fb-44ad-8cfd-84c1b965941a.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '54539364', + host_url: 'https://www.airbnb.com/users/show/54539364', + host_name: 'Ildiko', + host_location: 'New York, New York, United States', + host_about: '', + host_response_time: 'within a day', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/e25c220f-afd4-4df0-9c8a-663c2ab695ab.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/e25c220f-afd4-4df0-9c8a-663c2ab695ab.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Park Slope', + host_response_rate: 93, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'offline_government_id', + 'selfie', + 'government_id', + 'identity_manual', + ], + }, + address: { + street: 'Brooklyn, NY, United States', + suburb: 'Brooklyn', + government_area: 'South Slope', + market: 'New York', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-73.98307, 40.6651], + is_location_exact: true, + }, + }, + availability: { + availability_30: 6, + availability_60: 10, + availability_90: 12, + availability_365: 204, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 98, + }, + }, + { + _id: '10624493', + listing_url: 'https://www.airbnb.com/rooms/10624493', + name: 'Cozy apartment 3 mins TAIWAI Subway', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '7', + maximum_nights: '365', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-11T04:00:00.000Z', + }, + accommodates: 5, + bedrooms: 2, + beds: 2, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '2.0', + }, + amenities: [ + 'Air conditioning', + 'Wheelchair accessible', + 'Pool', + 'Kitchen', + 'Smoking allowed', + 'Elevator', + 'Family/kid friendly', + 'Washer', + 'Essentials', + 'Hangers', + 'Laptop friendly workspace', + ], + price: { + $numberDecimal: '801.00', + }, + weekly_price: { + $numberDecimal: '6500.00', + }, + monthly_price: { + $numberDecimal: '22000.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/c231129a-f937-444d-aac9-168c4df9c408.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '19543283', + host_url: 'https://www.airbnb.com/users/show/19543283', + host_name: 'Naomi', + host_location: 'Hong Kong', + host_about: '', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/user/dc633725-798a-4dce-b8fe-013e1774b94c.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/user/dc633725-798a-4dce-b8fe-013e1774b94c.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['phone', 'reviews'], + }, + address: { + street: 'Shatin , Hong Kong, Hong Kong', + suburb: '', + government_area: 'Tsuen Wan', + market: 'Hong Kong', + country: 'Hong Kong', + country_code: 'HK', + location: { + type: 'Point', + coordinates: [114.12074, 22.40547], + is_location_exact: false, + }, + }, + availability: { + availability_30: 0, + availability_60: 0, + availability_90: 0, + availability_365: 0, + }, + review_scores: {}, + }, + { + _id: '10199760', + listing_url: 'https://www.airbnb.com/rooms/10199760', + name: 'Uygun nezih daire', + notes: '', + property_type: 'Apartment', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'flexible', + last_scraped: { + $date: '2019-02-18T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-02-18T05:00:00.000Z', + }, + accommodates: 4, + bedrooms: 1, + beds: 2, + number_of_reviews: 0, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Internet', + 'Wifi', + 'Kitchen', + 'Heating', + 'Family/kid friendly', + 'Washer', + 'Dryer', + 'Smoke detector', + 'Carbon monoxide detector', + 'First aid kit', + 'Fire extinguisher', + 'Shampoo', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + ], + price: { + $numberDecimal: '264.00', + }, + security_deposit: { + $numberDecimal: '527.00', + }, + cleaning_fee: { + $numberDecimal: '26.00', + }, + extra_people: { + $numberDecimal: '53.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/d714487a-21cf-47b4-ad3c-e983adadc6b7.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '37417314', + host_url: 'https://www.airbnb.com/users/show/37417314', + host_name: 'Yaşar', + host_location: 'Istanbul, Turkey', + host_about: '', + host_response_time: 'within a day', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/68374b9f-5808-430d-b23d-232af684477e.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/68374b9f-5808-430d-b23d-232af684477e.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['email', 'phone'], + }, + address: { + street: 'Zeytinburnu, İstanbul, Turkey', + suburb: '', + government_area: 'Zeytinburnu', + market: 'Istanbul', + country: 'Turkey', + country_code: 'TR', + location: { + type: 'Point', + coordinates: [28.89964, 40.99667], + is_location_exact: false, + }, + }, + availability: { + availability_30: 30, + availability_60: 60, + availability_90: 90, + availability_365: 365, + }, + review_scores: {}, + }, + { + _id: '10266175', + listing_url: 'https://www.airbnb.com/rooms/10266175', + name: 'Makaha Valley Paradise with OceanView', + notes: + 'Hawaii State Tax & Transient Tax will be charged separately after your booking is confirmed, rate is (Phone number hidden by Airbnb) % Hawai`i Tax ID Number GE (Phone number hidden by Airbnb) This is a residential complex, no restaurant on site. Parking is available for $4 per day, with a $50 deposit - payable to the office in cash.', + property_type: 'Condominium', + room_type: 'Entire home/apt', + bed_type: 'Pull-out Sofa', + minimum_nights: '3', + maximum_nights: '180', + cancellation_policy: 'moderate', + last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + first_review: { + $date: '2016-06-18T04:00:00.000Z', + }, + last_review: { + $date: '2019-02-28T05:00:00.000Z', + }, + accommodates: 4, + bedrooms: 1, + beds: 2, + number_of_reviews: 32, + bathrooms: { + $numberDecimal: '1.0', + }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Pool', + 'Kitchen', + 'Elevator', + 'Family/kid friendly', + 'Washer', + 'Dryer', + 'Smoke detector', + 'Carbon monoxide detector', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Hot water', + 'Long term stays allowed', + 'Other', + 'Paid parking on premises', + ], + price: { + $numberDecimal: '95.00', + }, + security_deposit: { + $numberDecimal: '0.00', + }, + cleaning_fee: { + $numberDecimal: '130.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '1', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/daee0612-9889-4ad1-8386-e8d887191a48.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '42868615', + host_url: 'https://www.airbnb.com/users/show/42868615', + host_name: 'Ray And Lise', + host_location: 'Chilliwack, British Columbia, Canada', + host_about: + 'We are a semi retired couple who enjoy nature, travel & good food !', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/4f2055ea-0725-4a4c-9bd0-47f4a254da03.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/4f2055ea-0725-4a4c-9bd0-47f4a254da03.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Waianae Coast', + host_response_rate: 100, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 2, + host_total_listings_count: 2, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'offline_government_id', + 'selfie', + 'government_id', + 'identity_manual', + 'work_email', + ], + }, + address: { + street: 'Waianae, HI, United States', + suburb: 'Leeward Side', + government_area: 'Waianae', + market: 'Oahu', + country: 'United States', + country_code: 'US', + location: { + type: 'Point', + coordinates: [-158.20291, 21.4818], + is_location_exact: true, + }, + }, + availability: { + availability_30: 0, + availability_60: 3, + availability_90: 16, + availability_365: 246, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 9, + review_scores_value: 9, + review_scores_rating: 98, + }, + }, + { + _id: '10280433', + listing_url: 'https://www.airbnb.com/rooms/10280433', + name: '~Ao Lele~ Flying Cloud', + notes: + 'Cabins are get-aways. As such, there is no TV. Internet/Wi-Fi and Bluetooth are provided as well as music, books, peace, quiet, a kitchen to thoughtfully prepare food with conversation or... just enjoy a soak in the tub', + property_type: 'Treehouse', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '30', + cancellation_policy: 'strict_14_with_grace_period', + last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + calendar_last_scraped: { + $date: '2019-03-06T05:00:00.000Z', + }, + first_review: { + $date: '2016-08-08T04:00:00.000Z', + }, + last_review: { + $date: '2019-02-19T05:00:00.000Z', + }, + accommodates: 2, + bedrooms: 1, + beds: 1, + number_of_reviews: 103, + bathrooms: { + $numberDecimal: '1.5', + }, + amenities: [ + 'Internet', + 'Wifi', + 'Kitchen', + 'Free parking on premises', + 'Breakfast', + 'Indoor fireplace', + 'Heating', + 'Smoke detector', + 'Carbon monoxide detector', + 'First aid kit', + 'Safety card', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'translation missing: en.hosting_amenity_49', + 'translation missing: en.hosting_amenity_50', + 'Hot water', + 'Bed linens', + 'Extra pillows and blankets', + 'Microwave', + 'Coffee maker', + 'Refrigerator', + 'Dishes and silverware', + 'Cooking basics', + 'Oven', + 'Stove', + 'Patio or balcony', + 'Garden or backyard', + 'Host greets you', + ], + price: { + $numberDecimal: '185.00', + }, + security_deposit: { + $numberDecimal: '300.00', + }, + cleaning_fee: { + $numberDecimal: '80.00', + }, + extra_people: { + $numberDecimal: '0.00', + }, + guests_included: { + $numberDecimal: '2', + }, + images: { + thumbnail_url: '', + medium_url: '', + picture_url: + 'https://a0.muscache.com/im/pictures/8db00646-53b4-48ad-a1f7-bd88e7129f06.jpg?aki_policy=large', + xl_picture_url: '', + }, + host: { + host_id: '52785887', + host_url: 'https://www.airbnb.com/users/show/52785887', + host_name: 'Mike', + host_location: 'Volcano, Hawaii, United States', + host_about: '', + host_response_time: 'within a few hours', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/user/69f5ee13-38a3-44fa-8ece-f53e01312b99.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/user/69f5ee13-38a3-44fa-8ece-f53e01312b99.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_response_rate: 100, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['email', 'phone', 'reviews', 'kba'], + }, + address: { + street: 'Volcano, HI, United States', + suburb: 'Island of Hawaiʻi', + government_area: 'Puna', + market: 'The Big Island', + country: 'United States', + country_code: 'US', location: { type: 'Point', - coordinates: [-43.4311123147628, -23.00035792660916], + coordinates: [-155.21763, 19.42151], is_location_exact: false, }, }, availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, + availability_30: 20, + availability_60: 45, + availability_90: 75, + availability_365: 165, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 99, }, - host_id: '51670240', }, { - _id: '10082307', - listing_url: 'https://www.airbnb.com/rooms/10082307', - name: 'Double Room en-suite (307)', - interaction: '', - house_rules: '', + _id: '1036027', + listing_url: 'https://www.airbnb.com/rooms/1036027', + name: 'BBC OPORTO 4X2', + notes: '', property_type: 'Apartment', - room_type: 'Private room', + room_type: 'Entire home/apt', bed_type: 'Real Bed', - minimum_nights: '1', + minimum_nights: '3', maximum_nights: '1125', - cancellation_policy: 'strict_14_with_grace_period', + cancellation_policy: 'flexible', last_scraped: { - $date: { - $numberLong: '1552276800000', - }, + $date: '2019-02-16T05:00:00.000Z', }, calendar_last_scraped: { - $date: { - $numberLong: '1552276800000', - }, + $date: '2019-02-16T05:00:00.000Z', }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 0, + first_review: { + $date: '2014-04-17T04:00:00.000Z', + }, + last_review: { + $date: '2018-12-30T05:00:00.000Z', + }, + accommodates: 8, + bedrooms: 4, + beds: 8, + number_of_reviews: 71, bathrooms: { - $numberDecimal: '1.0', + $numberDecimal: '2.0', }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Kitchen', + 'Elevator', + 'Heating', + 'Family/kid friendly', + 'Washer', + 'Essentials', + 'Shampoo', + ], price: { - $numberDecimal: '361.00', + $numberDecimal: '100.00', + }, + weekly_price: { + $numberDecimal: '700.00', + }, + monthly_price: { + $numberDecimal: '2800.00', }, extra_people: { - $numberDecimal: '130.00', + $numberDecimal: '0.00', }, guests_included: { - $numberDecimal: '2', + $numberDecimal: '1', }, images: { thumbnail_url: '', medium_url: '', picture_url: - 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + 'https://a0.muscache.com/im/pictures/17204641/40fc3945_original.jpg?aki_policy=large', xl_picture_url: '', }, + host: { + host_id: '3104922', + host_url: 'https://www.airbnb.com/users/show/3104922', + host_name: 'Cristina', + host_location: 'Madrid', + host_about: + 'Natural de Lisboa. Trabalho no desenvolvimento de projectos culturais.', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/users/3104922/profile_pic/1343679440/original.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/users/3104922/profile_pic/1343679440/original.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Mercês', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 3, + host_total_listings_count: 3, + host_verifications: [ + 'email', + 'phone', + 'reviews', + 'jumio', + 'offline_government_id', + 'selfie', + 'government_id', + 'identity_manual', + ], + }, address: { - street: 'Hong Kong, Kowloon, Hong Kong', - suburb: 'Yau Tsim Mong', - government_area: 'Yau Tsim Mong', - market: 'Hong Kong', - country: 'Hong Kong', - country_code: 'HK', + street: 'Porto, Porto District, Portugal', + suburb: '', + government_area: 'Bonfim', + market: 'Porto', + country: 'Portugal', + country_code: 'PT', location: { type: 'Point', - coordinates: [114.17158, 22.30469], + coordinates: [-8.60069, 41.16246], is_location_exact: true, }, }, availability: { - availability_30: 30, - availability_60: 60, - availability_90: 90, - availability_365: 365, + availability_30: 0, + availability_60: 10, + availability_90: 15, + availability_365: 264, + }, + review_scores: { + review_scores_accuracy: 9, + review_scores_cleanliness: 9, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 9, + review_scores_value: 9, + review_scores_rating: 88, }, - host_id: '51289938', }, { - _id: '10082422', - listing_url: 'https://www.airbnb.com/rooms/10082422', - name: 'Nice room in Barcelona Center', - interaction: '', - house_rules: '', - property_type: 'Apartment', - room_type: 'Private room', + _id: '10392282', + listing_url: 'https://www.airbnb.com/rooms/10392282', + name: 'Banyan Bungalow', + notes: '', + property_type: 'Bungalow', + room_type: 'Entire home/apt', bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '9', + minimum_nights: '2', + maximum_nights: '300', cancellation_policy: 'flexible', last_scraped: { - $date: { - $numberLong: '1552021200000', - }, + $date: '2019-03-06T05:00:00.000Z', }, calendar_last_scraped: { - $date: { - $numberLong: '1552021200000', - }, + $date: '2019-03-06T05:00:00.000Z', + }, + first_review: { + $date: '2016-01-29T05:00:00.000Z', + }, + last_review: { + $date: '2019-02-19T05:00:00.000Z', }, accommodates: 2, - bedrooms: 1, - beds: 2, - number_of_reviews: 0, + bedrooms: 0, + beds: 1, + number_of_reviews: 99, bathrooms: { $numberDecimal: '1.0', }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Kitchen', + 'Free parking on premises', + 'Pets live on this property', + 'Dog(s)', + 'Family/kid friendly', + 'Washer', + 'Dryer', + 'Smoke detector', + 'First aid kit', + 'Safety card', + 'Essentials', + 'Shampoo', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Hot water', + ], price: { - $numberDecimal: '50.00', + $numberDecimal: '100.00', }, security_deposit: { - $numberDecimal: '100.00', + $numberDecimal: '250.00', }, cleaning_fee: { - $numberDecimal: '10.00', + $numberDecimal: '80.00', }, extra_people: { - $numberDecimal: '0.00', + $numberDecimal: '20.00', }, guests_included: { $numberDecimal: '1', @@ -1248,78 +11888,120 @@ export default [ thumbnail_url: '', medium_url: '', picture_url: - 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + 'https://a0.muscache.com/im/pictures/c5cb209b-c982-4b54-b7a5-81da006ead12.jpg?aki_policy=large', xl_picture_url: '', }, + host: { + host_id: '53507053', + host_url: 'https://www.airbnb.com/users/show/53507053', + host_name: 'Bobby', + host_location: 'Waialua, Hawaii, United States', + host_about: + 'As an athlete, business owner, mother of twins, and a happily married wife I am always on the go. When I do get a chance to "collect dust" I love a good glass a wine to go with a nice meal. ', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/e546f542-57c5-4dff-968d-08e019c0e401.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/e546f542-57c5-4dff-968d-08e019c0e401.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_response_rate: 100, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: true, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['email', 'phone', 'reviews', 'kba'], + }, address: { - street: 'Barcelona, Catalunya, Spain', - suburb: 'Eixample', - government_area: "la Dreta de l'Eixample", - market: 'Barcelona', - country: 'Spain', - country_code: 'ES', + street: 'Waialua, HI, United States', + suburb: 'Oʻahu', + government_area: 'North Shore Oahu', + market: 'Oahu', + country: 'United States', + country_code: 'US', location: { type: 'Point', - coordinates: [2.16942, 41.40082], - is_location_exact: true, + coordinates: [-158.1602, 21.57561], + is_location_exact: false, }, }, availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, + availability_30: 12, + availability_60: 27, + availability_90: 53, + availability_365: 321, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 9, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 9, + review_scores_rating: 96, }, - host_id: '30393403', }, { - _id: '10083468', - listing_url: 'https://www.airbnb.com/rooms/10083468', - name: 'Be Happy in Porto', - interaction: 'I`am always avaiable with for my guests.', - house_rules: - '. No smoking inside the apartment. . Is forbidden receive or lead strange people to the apartment. . Only people that are part of the reservation should have access to the apartment. . Do not eat on the bedroom. . Do not drink things like wine or sugary drinks on the bedroom.', - property_type: 'Loft', + _id: '10519173', + listing_url: 'https://www.airbnb.com/rooms/10519173', + name: 'Condomínio Praia Barra da Tijuca', + notes: + 'The Condominium is located across from an excellent beach area and next to bars, restaurants, laundromats, bus stop as well other facilities.', + property_type: 'Condominium', room_type: 'Entire home/apt', bed_type: 'Real Bed', minimum_nights: '2', maximum_nights: '1125', - cancellation_policy: 'moderate', + cancellation_policy: 'strict_14_with_grace_period', last_scraped: { - $date: { - $numberLong: '1550293200000', - }, + $date: '2019-02-11T05:00:00.000Z', }, calendar_last_scraped: { - $date: { - $numberLong: '1550293200000', - }, + $date: '2019-02-11T05:00:00.000Z', }, first_review: { - $date: { - $numberLong: '1451710800000', - }, + $date: '2016-05-07T04:00:00.000Z', }, last_review: { - $date: { - $numberLong: '1549688400000', - }, + $date: '2019-01-04T05:00:00.000Z', }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 178, + accommodates: 6, + bedrooms: 2, + beds: 5, + number_of_reviews: 18, bathrooms: { - $numberDecimal: '1.0', + $numberDecimal: '2.0', }, + amenities: [ + 'TV', + 'Cable TV', + 'Wifi', + 'Air conditioning', + 'Wheelchair accessible', + 'Pool', + 'Kitchen', + 'Free parking on premises', + 'Doorman', + 'Elevator', + 'Buzzer/wireless intercom', + 'Family/kid friendly', + 'Washer', + 'First aid kit', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Hot water', + 'Microwave', + 'Coffee maker', + 'Refrigerator', + 'Dishes and silverware', + 'Stove', + 'Long term stays allowed', + 'Well-lit path to entrance', + 'Other', + ], price: { - $numberDecimal: '30.00', - }, - security_deposit: { - $numberDecimal: '0.00', - }, - cleaning_fee: { - $numberDecimal: '10.00', + $numberDecimal: '351.00', }, extra_people: { $numberDecimal: '0.00', @@ -1331,82 +12013,134 @@ export default [ thumbnail_url: '', medium_url: '', picture_url: - 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + 'https://a0.muscache.com/im/pictures/fd97365c-79d8-4f3a-b658-963b8a5bb640.jpg?aki_policy=large', xl_picture_url: '', }, + host: { + host_id: '54221119', + host_url: 'https://www.airbnb.com/users/show/54221119', + host_name: 'Paula', + host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', + host_about: '', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/5c3f0899-b688-406f-942c-a95f07fc0f46.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/5c3f0899-b688-406f-942c-a95f07fc0f46.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Barra da Tijuca', + host_response_rate: 88, + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['phone', 'reviews'], + }, address: { - street: 'Porto, Porto, Portugal', - suburb: '', - government_area: 'Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória', - market: 'Porto', - country: 'Portugal', - country_code: 'PT', + street: 'Rio de Janeiro, Rio de Janeiro, Brazil', + suburb: 'Barra da Tijuca', + government_area: 'Barra da Tijuca', + market: 'Rio De Janeiro', + country: 'Brazil', + country_code: 'BR', location: { type: 'Point', - coordinates: [-8.61123, 41.15225], - is_location_exact: false, + coordinates: [-43.32231287289854, -23.009702689174244], + is_location_exact: true, }, }, availability: { - availability_30: 16, - availability_60: 40, - availability_90: 67, - availability_365: 335, + availability_30: 22, + availability_60: 52, + availability_90: 82, + availability_365: 172, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 9, + review_scores_rating: 95, }, - host_id: '27518920', }, { - _id: '10084023', - listing_url: 'https://www.airbnb.com/rooms/10084023', - name: 'City center private room with bed', - interaction: - 'A phone card of unlimited data will be provided during the stay, and phone call can also be made by the card. We have 3 bedrooms in the house and 2 are occupied by us, lots of Hong Kong traveling tips will be provided and also simple local tour if time is allowed.', - house_rules: - '1. 禁止吸煙, 只限女生入住 (除得到批准) No smoking and only female is allowed 2.熱水爐是儲水式, 不能長開, 用後請關上 The water heater cannot be turned on overnight, it will keep boiling water, thus, turn it off after use. 3. 不收清潔費,請保持房間及客廳清潔, 用過之碗筷需即日自行清洗 No cleaning fee is charged, thus, Please keep all the places including your room and living room clean and tidy, and make sure the dishes are washed after cooking on the same day. 4. 將收取港幣$1000為按金, 退房時將會歸還 (除故意破壞物品) Deposit of HKD$1000 will be charged and will return back when check out if nothing is damaged. 5. 房人將得到1條大門 1條鐵閘 及1條房鎖匙, 遺失需扣除$50 配匙費 1 main door key, 1 gate key and 1 private room key will be given at check in, $50 will be charged if lost. 6.洗髮後請必須將掉出來的頭髮拾起丟到垃圾桶或廁所,以免堵塞渠口 After washing hair, Please pick up your own hair and throw them in rubbish bin or toilet bowl, to avoid blocking the drain.', - property_type: 'Guesthouse', - room_type: 'Private room', - bed_type: 'Futon', - minimum_nights: '1', - maximum_nights: '500', - cancellation_policy: 'strict_14_with_grace_period', + _id: '10527243', + listing_url: 'https://www.airbnb.com/rooms/10527243', + name: 'Tropical Jungle Oasis', + notes: + 'INFORMATION regarding current Kilauea Volcano Eruptions: Some of the mainland news stations have been sensationalizing what is happening with Kilauea and her current state. Sensationalized news sell advertisements!!!! FACTS they are not sharing with you: • The Big Island Is 4,028 mi². The affected area is less than 10 mi² • Kilauea is a shield volcano versus Mt. Saint Helens which is a stratovolcano • The volcanic activity and where lava has flowed along the East Rift Zone in/near Leilani Estates and Lanipuna Gardens Subdivisions is limited to an ISOLATED area in Lower Puna on the island of Hawai‘i ’s east side • This area in the Puna district covers only less than a 10-square-mile area of the island’s 4,028 square miles. The district of Puna is approximately 500 square miles (the size of half of Rhode Island) • This is more than 100 driving miles away from the western Kohala and Kona Coasts, where the island’s major visitor accommodations and resorts are located, and the area furthest', + property_type: 'Condominium', + room_type: 'Entire home/apt', + bed_type: 'Real Bed', + minimum_nights: '2', + maximum_nights: '1125', + cancellation_policy: 'moderate', last_scraped: { - $date: { - $numberLong: '1552276800000', - }, + $date: '2019-03-06T05:00:00.000Z', }, calendar_last_scraped: { - $date: { - $numberLong: '1552276800000', - }, + $date: '2019-03-06T05:00:00.000Z', }, first_review: { - $date: { - $numberLong: '1450760400000', - }, + $date: '2016-07-14T04:00:00.000Z', }, last_review: { - $date: { - $numberLong: '1551416400000', - }, + $date: '2019-02-22T05:00:00.000Z', }, - accommodates: 1, - bedrooms: 1, - beds: 1, - number_of_reviews: 81, + accommodates: 4, + bedrooms: 2, + beds: 3, + number_of_reviews: 65, bathrooms: { - $numberDecimal: '1.0', + $numberDecimal: '1.5', }, + amenities: [ + 'TV', + 'Cable TV', + 'Internet', + 'Wifi', + 'Pool', + 'Kitchen', + 'Free parking on premises', + 'Free street parking', + 'Family/kid friendly', + 'Smoke detector', + 'Carbon monoxide detector', + 'First aid kit', + 'Fire extinguisher', + 'Essentials', + 'Shampoo', + '24-hour check-in', + 'Hangers', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + 'Self check-in', + 'Keypad', + 'Hot water', + 'Microwave', + 'Coffee maker', + 'Refrigerator', + 'Dishwasher', + 'Dishes and silverware', + 'Cooking basics', + 'Oven', + 'Stove', + 'Patio or balcony', + ], price: { - $numberDecimal: '181.00', + $numberDecimal: '125.00', }, security_deposit: { - $numberDecimal: '0.00', + $numberDecimal: '250.00', }, cleaning_fee: { - $numberDecimal: '50.00', + $numberDecimal: '99.00', }, extra_people: { - $numberDecimal: '100.00', + $numberDecimal: '0.00', }, guests_included: { $numberDecimal: '1', @@ -1415,78 +12149,108 @@ export default [ thumbnail_url: '', medium_url: '', picture_url: - 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + 'https://a0.muscache.com/im/pictures/9c9dd09e-41de-4261-a9f6-942c0dcc02d1.jpg?aki_policy=large', xl_picture_url: '', }, + host: { + host_id: '54294012', + host_url: 'https://www.airbnb.com/users/show/54294012', + host_name: 'Douglas', + host_location: 'Hilo, Hawaii, United States', + host_about: '', + host_response_time: 'within an hour', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/1dbc5326-ef08-46a9-8ed9-11c709d3e74d.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/1dbc5326-ef08-46a9-8ed9-11c709d3e74d.jpg?aki_policy=profile_x_medium', + host_neighbourhood: 'Hilo', + host_response_rate: 100, + host_is_superhost: true, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: [ + 'email', + 'phone', + 'facebook', + 'reviews', + 'offline_government_id', + 'government_id', + ], + }, address: { - street: 'Hong Kong , 九龍, Hong Kong', - suburb: 'Sham Shui Po District', - government_area: 'Sham Shui Po', - market: 'Hong Kong', - country: 'Hong Kong', - country_code: 'HK', + street: 'Hilo, HI, United States', + suburb: 'Island of Hawaiʻi', + government_area: 'South Hilo', + market: 'The Big Island', + country: 'United States', + country_code: 'US', location: { type: 'Point', - coordinates: [114.1669, 22.3314], + coordinates: [-155.09259, 19.73108], is_location_exact: true, }, }, availability: { - availability_30: 14, - availability_60: 24, - availability_90: 40, - availability_365: 220, + availability_30: 12, + availability_60: 39, + availability_90: 65, + availability_365: 65, + }, + review_scores: { + review_scores_accuracy: 10, + review_scores_cleanliness: 10, + review_scores_checkin: 10, + review_scores_communication: 10, + review_scores_location: 10, + review_scores_value: 10, + review_scores_rating: 96, }, - host_id: '51744313', }, { - _id: '10091713', - listing_url: 'https://www.airbnb.com/rooms/10091713', - name: 'Surry Hills Studio - Your Perfect Base in Sydney', - interaction: 'You have complete privacy during your stay.', - house_rules: - 'No smoking: No smoking any substance, including e-cigarettes. Lost Keys / Locked out of Apartment: If you lose the key to the apartment building itself (i.e., the yellow security key) the cost of replacing it is $250. It will be deducted from your security deposit. If you lock yourself out of the apartment, it is solely your responsibility to contact a locksmith to open the apartment door for you. You are also solely responsible for the cost of the locksmith, including the cost of replacing the lock mechanism if necessary. If the lock mechanism needs to be replaced by the locksmith, you must provide 2 copies of the new key.', - property_type: 'Apartment', - room_type: 'Entire home/apt', + _id: '10186755', + listing_url: 'https://www.airbnb.com/rooms/10186755', + name: 'Roof double bed private room', + notes: '', + property_type: 'Loft', + room_type: 'Private room', bed_type: 'Real Bed', - minimum_nights: '10', - maximum_nights: '21', - cancellation_policy: 'strict_14_with_grace_period', + minimum_nights: '1', + maximum_nights: '1125', + cancellation_policy: 'flexible', last_scraped: { - $date: { - $numberLong: '1551934800000', - }, + $date: '2019-02-18T05:00:00.000Z', }, calendar_last_scraped: { - $date: { - $numberLong: '1551934800000', - }, - }, - first_review: { - $date: { - $numberLong: '1482987600000', - }, - }, - last_review: { - $date: { - $numberLong: '1521345600000', - }, + $date: '2019-02-18T05:00:00.000Z', }, accommodates: 2, - bedrooms: 0, - beds: 1, - number_of_reviews: 64, + bedrooms: 1, + beds: 2, + number_of_reviews: 0, bathrooms: { $numberDecimal: '1.0', }, + amenities: [ + 'TV', + 'Internet', + 'Wifi', + 'Air conditioning', + 'Kitchen', + 'Doorman', + 'Elevator', + 'Heating', + 'Family/kid friendly', + 'Washer', + 'Essentials', + '24-hour check-in', + 'Hair dryer', + 'Iron', + 'Laptop friendly workspace', + ], price: { - $numberDecimal: '181.00', - }, - security_deposit: { - $numberDecimal: '300.00', - }, - cleaning_fee: { - $numberDecimal: '50.00', + $numberDecimal: '185.00', }, extra_people: { $numberDecimal: '0.00', @@ -1498,28 +12262,46 @@ export default [ thumbnail_url: '', medium_url: '', picture_url: - 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', + 'https://a0.muscache.com/im/pictures/7280244f-cd51-4ac1-a9fd-9acef8a7f0bc.jpg?aki_policy=large', xl_picture_url: '', }, + host: { + host_id: '52316085', + host_url: 'https://www.airbnb.com/users/show/52316085', + host_name: 'Mustafa', + host_location: 'Istanbul, İstanbul, Turkey', + host_about: '', + host_thumbnail_url: + 'https://a0.muscache.com/im/pictures/cc4d0af8-37df-4eb6-940a-d5c80d8b8bc1.jpg?aki_policy=profile_small', + host_picture_url: + 'https://a0.muscache.com/im/pictures/cc4d0af8-37df-4eb6-940a-d5c80d8b8bc1.jpg?aki_policy=profile_x_medium', + host_neighbourhood: '', + host_is_superhost: false, + host_has_profile_pic: true, + host_identity_verified: false, + host_listings_count: 1, + host_total_listings_count: 1, + host_verifications: ['email', 'phone', 'facebook'], + }, address: { - street: 'Surry Hills, NSW, Australia', - suburb: 'Darlinghurst', - government_area: 'Sydney', - market: 'Sydney', - country: 'Australia', - country_code: 'AU', + street: 'Istanbul, İstanbul, Turkey', + suburb: '', + government_area: 'Sariyer', + market: 'Istanbul', + country: 'Turkey', + country_code: 'TR', location: { type: 'Point', - coordinates: [151.21554, -33.88029], - is_location_exact: true, + coordinates: [29.03693, 41.12452], + is_location_exact: false, }, }, availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, + availability_30: 30, + availability_60: 60, + availability_90: 90, + availability_365: 365, }, - host_id: '13764143', + review_scores: {}, }, ]; diff --git a/packages/compass-generative-ai/tests/evals/use-cases/aggregate-query.ts b/packages/compass-generative-ai/tests/evals/use-cases/aggregate-query.ts index a6bc72738b0..14b520e716f 100644 --- a/packages/compass-generative-ai/tests/evals/use-cases/aggregate-query.ts +++ b/packages/compass-generative-ai/tests/evals/use-cases/aggregate-query.ts @@ -33,11 +33,10 @@ export const aggregateQueries: GenAiUsecase[] = [ { namespace: 'berlin.cocktailbars', userInput: - 'find all the bars 10km from the berlin center, only return their names. Berlin center is at longitude 13.4050 and latitude 52.5200', - // [ { $geoNear: { near: { type: "Point", coordinates: [13.4050, 52.5200] }, distanceField: "dist", maxDistance: 10000, spherical: true, key: "koordinaten" } }, { $project: { name: 1, _id: 0 } } ] + 'find all the bars 10km from the berlin center, only return their names. Berlin center is at longitude 13.4050 and latitude 52.5200. use correct key for coordinates.', expectedOutput: ` [ - {$match: {location: {$geoWithin: {$centerSphere: [[13.4050, 52.5200], 10 / 3963.2]}}}}, + {$geoNear: { near: {type: "Point", coordinates: [13.4050, 52.5200]}, distanceField: "dist", maxDistance: 10000, spherical: true, key: "koordinaten" }}, {$project: {name: 1, _id: 0}} ] `, @@ -47,14 +46,11 @@ export const aggregateQueries: GenAiUsecase[] = [ namespace: 'airbnb.listingsAndReviews', userInput: 'Return all the properties of type "Hotel" and with ratings lte 70', - // [ { $match: { property_type: "Hotel", "review_scores.review_scores_rating": { $lte: 70 } } } ] expectedOutput: ` [{ $match: { - $and: [ - {property_type: "Hotel"}, - {number_of_reviews: {$lte: 70}} - ] + property_type: "Hotel", + "review_scores.review_scores_rating": { $lte: 70 } } }] `, @@ -69,7 +65,7 @@ export const aggregateQueries: GenAiUsecase[] = [ {$group: {_id: "$beds", count: {$sum: 1}}}, {$sort: {count: -1}}, {$limit: 1}, - {$project: {bedCount: "$_id"}} + {$project: {bedCount: "$_id", _id: 0}} ] `, name: 'aggregate with group sort limit and project', @@ -83,7 +79,7 @@ export const aggregateQueries: GenAiUsecase[] = [ {$group: {_id: "$host.host_id", totalReviews: {$sum: "$number_of_reviews"}}}, {$sort: {totalReviews: -1}}, {$limit: 1}, - {$project: {hostId: "$_id"}} + {$project: {hostId: "$_id", _id: 0}} ] `, name: 'aggregate with group sort limit and project 2', @@ -91,7 +87,7 @@ export const aggregateQueries: GenAiUsecase[] = [ { namespace: 'netflix.movies', userInput: - 'Which movies were released in last 30 years. return title and year', + 'Which movies were released 30 years ago (consider whole year). return title and year', expectedOutput: ` [ { @@ -159,26 +155,25 @@ export const aggregateQueries: GenAiUsecase[] = [ expectedOutput: ` [ {$sort: {price: -1}}, - {$project: {cancellation_policy: 1, "listing_url": 1}}, + {$project: {cancellation_policy: 1, "listing_url": 1, _id: 0}}, {$limit: 1} ] `, name: 'simple aggregate with sort and limit', }, - // { - // namespace: 'berlin.cocktailbars', - // userInput: - // '', - // expectedOutput: ` - // [ - // {$unwind: "$items"}, - // {$unwind: "$items.tags"}, - // {$group: {_id: "$items.tags", avgPrice: {$avg: "$items.price"}}}, - // {$project: {_id: 0, tag: "$_id", avgPrice: 1}} - // ] - // `, - // name: 'aggregate with unwind and group', - // }, + { + namespace: 'airbnb.listingsAndReviews', + userInput: + 'group all the listings based on the amenities tags and return only count and tag name', + expectedOutput: ` + [ + {$unwind: "$amenities"}, + {$group: {_id: "$amenities", count: {$sum: 1}}}, + {$project: {_id: 0, tag: "$_id", count: 1}} + ] + `, + name: 'aggregate with unwind and group', + }, { namespace: 'airbnb.listingsAndReviews', userInput: @@ -199,7 +194,7 @@ export const aggregateQueries: GenAiUsecase[] = [ 'What are the 5 most frequent words (case sensitive) used in movie titles in the 1980s and 1990s combined? Sorted first by frequency count then alphabetically. output fields count and word', expectedOutput: ` [ - {$match: {year: {$regex: "^(198[0-9]|199[0-9])$"}}}, + {$match: {year: { $gte: 1980, $lte: 1999 }}}, {$addFields: {titleWords: {$split: ["$title", " "]}}}, {$unwind: "$titleWords"}, {$group: {_id: "$titleWords", count: {$sum: 1}}}, @@ -254,7 +249,7 @@ export const aggregateQueries: GenAiUsecase[] = [ { namespace: 'nyc.parking', userInput: - 'Write a query that does the following: find all of the parking incidents that occurred on an ave (match all ways to write ave). Return all of the plate ids involved with their summons number and vehicle make and body type. Put the vehicle make and body type into lower case. No _id, sorted by the summons number lowest first.', + 'Write a query that does the following: find all of the parking incidents that occurred on any ave. Return all of the plate ids involved with their summons number and vehicle make and body type. Put the vehicle make and body type into lower case. No _id, sorted by the summons number lowest first.', expectedOutput: ` [ {$match: {"Street Name": {$regex: "ave", $options: "i"}}}, diff --git a/packages/compass-generative-ai/tests/evals/use-cases/find-query.ts b/packages/compass-generative-ai/tests/evals/use-cases/find-query.ts index a2093bf79a8..ee99465b850 100644 --- a/packages/compass-generative-ai/tests/evals/use-cases/find-query.ts +++ b/packages/compass-generative-ai/tests/evals/use-cases/find-query.ts @@ -19,27 +19,22 @@ export const findQueries: GenAiUsecase[] = [ `, name: 'find with filter projection sort and limit', }, - // TODO: Geo query - // { - // namespace: 'berlin.cocktailbars', - // userInput: - // 'find all the bars 10km from the berlin center, only return their names', - // expectedOutput: ` - // {_id: 'ObjectId("5ca652bf56618187558b4de3")'} - // {name: 1} - // `, - // name: 'geo-based find', - // }, + { + namespace: 'airbnb.listingsAndReviews', + userInput: 'find all the listings with 10km from the instanbul center', + expectedOutput: ` + {location: {$geoWithin: {$centerSphere: [[28.9784, 41.0082], 10 / 3963.2]}}} + `, + name: 'geo-based find', + }, { namespace: 'airbnb.listingsAndReviews', userInput: 'Return all the properties of type "Hotel" and with ratings lte 70', expectedOutput: ` { - $and: [ - { property_type: "Hotel" }, - { "review_scores.review_scores_rating": { $lte: 70 } } - ] + property_type: "Hotel", + "review_scores.review_scores_rating": { $lte: 70 } } `, name: 'find with nested match fields', @@ -80,7 +75,7 @@ export const findQueries: GenAiUsecase[] = [ expectedOutput: `[ { $group: { - _id: "$host_id", + _id: "$host.host_id", totalReviews: { $sum: "$number_of_reviews" } } }, @@ -97,9 +92,9 @@ export const findQueries: GenAiUsecase[] = [ name: 'relative date find 1', }, { - namespace: 'netflix.comments', + namespace: 'netflix.movies', userInput: - 'Which comments were posted in last 30 years. return name and date', + 'Which comments were posted 30 years ago. consider all comments from that year. return name and date', expectedOutput: `{ $and: [ { @@ -165,7 +160,7 @@ export const findQueries: GenAiUsecase[] = [ { namespace: 'nyc.parking', userInput: - 'Write a query that does the following: find all of the parking incidents that occurred on an ave (match all ways to write ave). Return all of the plate ids involved with their summons number and vehicle make and body type. Put the vehicle make and body type into lower case. No _id, sorted by the summons number lowest first.', + 'Write a query that does the following: find all of the parking incidents that occurred on any ave. Return all of the plate ids involved with their summons number and vehicle make and body type. Put the vehicle make and body type into lower case. No _id, sorted by the summons number lowest first.', expectedOutput: ` {"Street Name": {$regex: "ave", $options: "i"}} {"Summons Number": 1} diff --git a/packages/compass-generative-ai/tests/evals/use-cases/index.ts b/packages/compass-generative-ai/tests/evals/use-cases/index.ts index 44091d5fad5..d9ca9e52a31 100644 --- a/packages/compass-generative-ai/tests/evals/use-cases/index.ts +++ b/packages/compass-generative-ai/tests/evals/use-cases/index.ts @@ -5,7 +5,6 @@ import toNS from 'mongodb-ns'; export type GenAiUsecase = { namespace: string; userInput: string; - // TODO: multiple expected outputs? expectedOutput: string; name: string; }; @@ -37,7 +36,7 @@ async function getDatasets(): Promise { 'berlin.cocktailbars': await getSampleAndSchemaFromDataset(berlinBars), 'netflix.movies': await getSampleAndSchemaFromDataset(netflixMovies), 'netflix.comments': await getSampleAndSchemaFromDataset(netflixComments), - 'NYC.parking_2015': await getSampleAndSchemaFromDataset(nycParking), + 'nyc.parking': await getSampleAndSchemaFromDataset(nycParking), }; } From 534b0d823e7811f76ecfdcd473a219cd344c9881 Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Mon, 15 Dec 2025 13:57:26 +0300 Subject: [PATCH 32/35] copilot review --- .../tests/evals/use-cases/aggregate-query.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/compass-generative-ai/tests/evals/use-cases/aggregate-query.ts b/packages/compass-generative-ai/tests/evals/use-cases/aggregate-query.ts index 14b520e716f..e6347b4dcff 100644 --- a/packages/compass-generative-ai/tests/evals/use-cases/aggregate-query.ts +++ b/packages/compass-generative-ai/tests/evals/use-cases/aggregate-query.ts @@ -140,11 +140,11 @@ export const aggregateQueries: GenAiUsecase[] = [ userInput: '¿Qué alojamiento tiene el precio más bajo? devolver el número en un campo llamado "precio"', expectedOutput: ` - [{ - $project: {_id: 0, precio: "$price"}, - $sort: {price: 1}, - $limit: 1 - }] + [ + {$project: {_id: 0, precio: "$price"}}, + {$sort: {price: 1}}, + {$limit: 1} + ] `, name: 'aggregate with non-english prompt', }, From d0568ff61c1923ba192e8c80f6c62fc2d8f03259 Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Tue, 16 Dec 2025 15:58:45 +0300 Subject: [PATCH 33/35] reduce num of docs --- .../fixtures/airbnb.listingsAndReviews.ts | 9737 ----------------- 1 file changed, 9737 deletions(-) diff --git a/packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.ts b/packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.ts index 5812d7b669d..df2db838bad 100644 --- a/packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.ts +++ b/packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.ts @@ -2567,9741 +2567,4 @@ export default [ review_scores_rating: 95, }, }, - { - _id: '10069642', - listing_url: 'https://www.airbnb.com/rooms/10069642', - name: 'Ótimo Apto proximo Parque Olimpico', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '15', - maximum_nights: '20', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - accommodates: 5, - bedrooms: 2, - beds: 2, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '2.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Wheelchair accessible', - 'Kitchen', - 'Free parking on premises', - 'Doorman', - 'Gym', - 'Elevator', - 'Buzzer/wireless intercom', - 'Family/kid friendly', - 'Washer', - 'Essentials', - 'Hair dryer', - 'Iron', - ], - price: { - $numberDecimal: '858.00', - }, - security_deposit: { - $numberDecimal: '4476.00', - }, - cleaning_fee: { - $numberDecimal: '112.00', - }, - extra_people: { - $numberDecimal: '75.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/5b1f4beb-6e06-41f0-970b-044f2f28d957.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '51670240', - host_url: 'https://www.airbnb.com/users/show/51670240', - host_name: 'Jonathan', - host_location: 'Resende, Rio de Janeiro, Brazil', - host_about: '', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/9a6839d9-9bea-451b-961d-5965894b9b9a.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/9a6839d9-9bea-451b-961d-5965894b9b9a.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['email', 'phone', 'jumio', 'government_id'], - }, - address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Recreio dos Bandeirantes', - government_area: 'Recreio dos Bandeirantes', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.4311123147628, -23.00035792660916], - is_location_exact: false, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: {}, - }, - { - _id: '10120414', - listing_url: 'https://www.airbnb.com/rooms/10120414', - name: 'The LES Apartment', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '3', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - accommodates: 3, - bedrooms: 1, - beds: 1, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Buzzer/wireless intercom', - 'Family/kid friendly', - 'Washer', - 'Dryer', - 'Essentials', - 'Shampoo', - '24-hour check-in', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - ], - price: { - $numberDecimal: '150.00', - }, - security_deposit: { - $numberDecimal: '200.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/0113fa69-96c5-4241-a949-854a48d8d9e0.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '33231070', - host_url: 'https://www.airbnb.com/users/show/33231070', - host_name: 'Mert', - host_location: 'New York, New York, United States', - host_about: - 'Hello to prospect guests and hosts,\r\nI am an international student from Istanbul/Turkey studying in New York, which I believe are the two most wonderful cities in the world that everyone should visit. \r\nThere are two things in life that I really like to do; traveling and making music. When two combined, it encourages me to discover ethnic music all around the world. In addition to that, I love meeting new people and always helpful to make people feel comfortable. ', - host_thumbnail_url: - 'https://a0.muscache.com/im/users/33231070/profile_pic/1431469729/original.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/users/33231070/profile_pic/1431469729/original.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'government_id', - 'work_email', - ], - }, - address: { - street: 'New York, NY, United States', - suburb: 'Manhattan', - government_area: 'Lower East Side', - market: 'New York', - country: 'United States', - country_code: 'US', - location: { - type: 'Point', - coordinates: [-73.98944, 40.72063], - is_location_exact: false, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: {}, - }, - { - _id: '10038496', - listing_url: 'https://www.airbnb.com/rooms/10038496', - name: 'Copacabana Apartment Posto 6', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '3', - maximum_nights: '75', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - first_review: { - $date: '2016-01-18T05:00:00.000Z', - }, - last_review: { - $date: '2019-01-28T05:00:00.000Z', - }, - accommodates: 4, - bedrooms: 1, - beds: 3, - number_of_reviews: 70, - bathrooms: { - $numberDecimal: '2.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Paid parking off premises', - 'Smoking allowed', - 'Doorman', - 'Elevator', - 'Buzzer/wireless intercom', - 'Family/kid friendly', - 'Washer', - 'Fire extinguisher', - 'Essentials', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Hot water', - 'Bed linens', - 'Extra pillows and blankets', - 'Microwave', - 'Coffee maker', - 'Refrigerator', - 'Dishes and silverware', - 'Oven', - 'Stove', - 'Long term stays allowed', - 'Wide hallway clearance', - 'Host greets you', - ], - price: { - $numberDecimal: '119.00', - }, - security_deposit: { - $numberDecimal: '600.00', - }, - cleaning_fee: { - $numberDecimal: '150.00', - }, - extra_people: { - $numberDecimal: '40.00', - }, - guests_included: { - $numberDecimal: '3', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/159d489e-62ad-44c4-80a0-fab2a8f3b455.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '51530266', - host_url: 'https://www.airbnb.com/users/show/51530266', - host_name: 'Ana Valéria', - host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', - host_about: - 'Professora de Educação Física formada pela universidade Gama Filho.', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/8c7bb5fe-7b6d-4d03-a465-aae8971a87a0.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/8c7bb5fe-7b6d-4d03-a465-aae8971a87a0.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Copacabana', - host_response_rate: 100, - host_is_superhost: true, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 2, - host_total_listings_count: 2, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'government_id', - ], - }, - address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Copacabana', - government_area: 'Copacabana', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.190849194463404, -22.984339360067814], - is_location_exact: false, - }, - }, - availability: { - availability_30: 7, - availability_60: 19, - availability_90: 33, - availability_365: 118, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 10, - review_scores_rating: 98, - }, - }, - { - _id: '10140368', - listing_url: 'https://www.airbnb.com/rooms/10140368', - name: 'A bedroom far away from home', - notes: '', - property_type: 'Apartment', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '10', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - first_review: { - $date: '2016-01-06T05:00:00.000Z', - }, - last_review: { - $date: '2019-03-03T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 239, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'Wifi', - 'Kitchen', - 'Free street parking', - 'Heating', - 'Family/kid friendly', - 'Smoke detector', - 'Carbon monoxide detector', - 'Essentials', - 'Shampoo', - 'Lock on bedroom door', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'translation missing: en.hosting_amenity_50', - 'Private entrance', - 'Hot water', - 'Host greets you', - ], - price: { - $numberDecimal: '45.00', - }, - extra_people: { - $numberDecimal: '10.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/e15dbb07-8de4-4e4e-9217-1d0763419532.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '1017772', - host_url: 'https://www.airbnb.com/users/show/1017772', - host_name: 'Lane', - host_location: 'US', - host_about: - 'Hello. I am a very passionate person with whatever I do. I love adventures and travelling. \r\nI love meeting and talking to people of any race, color and gender. I think I can learn something from every person I meet and I value learning so much that \r\n\r\nHope to meet new friendships on my travels. ', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/user/0a118b69-9d68-4b0e-99ba-34fefc2df36b.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/user/0a118b69-9d68-4b0e-99ba-34fefc2df36b.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Jamaica', - host_response_rate: 100, - host_is_superhost: true, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'manual_online', - 'facebook', - 'reviews', - 'manual_offline', - 'jumio', - 'government_id', - ], - }, - address: { - street: 'Queens, NY, United States', - suburb: 'Queens', - government_area: 'Briarwood', - market: 'New York', - country: 'United States', - country_code: 'US', - location: { - type: 'Point', - coordinates: [-73.82257, 40.71485], - is_location_exact: true, - }, - }, - availability: { - availability_30: 20, - availability_60: 29, - availability_90: 29, - availability_365: 34, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 9, - review_scores_value: 10, - review_scores_rating: 95, - }, - }, - { - _id: '1001265', - listing_url: 'https://www.airbnb.com/rooms/1001265', - name: 'Ocean View Waikiki Marina w/prkg', - notes: '', - property_type: 'Condominium', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '3', - maximum_nights: '365', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - first_review: { - $date: '2013-05-24T04:00:00.000Z', - }, - last_review: { - $date: '2019-02-07T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 96, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Wifi', - 'Air conditioning', - 'Pool', - 'Kitchen', - 'Free parking on premises', - 'Elevator', - 'Hot tub', - 'Washer', - 'Dryer', - 'Essentials', - 'Shampoo', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Self check-in', - 'Lockbox', - 'Hot water', - 'Bed linens', - 'Extra pillows and blankets', - 'Ethernet connection', - 'Microwave', - 'Coffee maker', - 'Refrigerator', - 'Dishes and silverware', - 'Cooking basics', - 'Stove', - 'BBQ grill', - 'Garden or backyard', - 'Well-lit path to entrance', - 'Disabled parking spot', - 'Step-free access', - 'Wide clearance to bed', - 'Step-free access', - ], - price: { - $numberDecimal: '115.00', - }, - weekly_price: { - $numberDecimal: '650.00', - }, - monthly_price: { - $numberDecimal: '2150.00', - }, - cleaning_fee: { - $numberDecimal: '100.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/15037101/5aff14a7_original.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '5448114', - host_url: 'https://www.airbnb.com/users/show/5448114', - host_name: 'David', - host_location: 'Honolulu, Hawaii, United States', - host_about: - 'I have 30 years of experience in the Waikiki Real Estate Market. We specialize in local sales and property management. Our goal is service and aloha. We want to help people enjoy Hawaii.', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/users/5448114/profile_pic/1363202219/original.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/users/5448114/profile_pic/1363202219/original.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Waikiki', - host_response_rate: 98, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 18, - host_total_listings_count: 18, - host_verifications: ['email', 'phone', 'reviews', 'kba'], - }, - address: { - street: 'Honolulu, HI, United States', - suburb: 'Oʻahu', - government_area: 'Primary Urban Center', - market: 'Oahu', - country: 'United States', - country_code: 'US', - location: { - type: 'Point', - coordinates: [-157.83919, 21.28634], - is_location_exact: true, - }, - }, - availability: { - availability_30: 16, - availability_60: 46, - availability_90: 76, - availability_365: 343, - }, - review_scores: { - review_scores_accuracy: 9, - review_scores_cleanliness: 8, - review_scores_checkin: 9, - review_scores_communication: 9, - review_scores_location: 10, - review_scores_value: 9, - review_scores_rating: 84, - }, - }, - { - _id: '10092679', - listing_url: 'https://www.airbnb.com/rooms/10092679', - name: 'Cozy house at Beyoğlu', - notes: 'Just enjoy your holiday', - property_type: 'Apartment', - room_type: 'Private room', - bed_type: 'Pull-out Sofa', - minimum_nights: '2', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-02-18T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-18T05:00:00.000Z', - }, - first_review: { - $date: '2017-10-08T04:00:00.000Z', - }, - last_review: { - $date: '2018-12-21T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 27, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'Wifi', - 'Kitchen', - 'Smoking allowed', - 'Breakfast', - 'Pets live on this property', - 'Cat(s)', - 'Free street parking', - 'Heating', - 'Washer', - 'Essentials', - 'Shampoo', - 'Lock on bedroom door', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Hot water', - 'Bed linens', - 'Extra pillows and blankets', - 'Coffee maker', - 'Refrigerator', - 'Dishwasher', - 'Cooking basics', - 'Patio or balcony', - 'Luggage dropoff allowed', - 'Host greets you', - ], - price: { - $numberDecimal: '58.00', - }, - weekly_price: { - $numberDecimal: '387.00', - }, - security_deposit: { - $numberDecimal: '0.00', - }, - cleaning_fee: { - $numberDecimal: '0.00', - }, - extra_people: { - $numberDecimal: '60.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/23876199-7472-48f4-b215-7c727be47fd7.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '21331922', - host_url: 'https://www.airbnb.com/users/show/21331922', - host_name: 'Ali', - host_location: 'İstanbul', - host_about: - 'I am Ali, 33 years old and a Psychological Counceler - Teacher. I am working at Secondary School. \r\nI like meet with new people, chess, cinema and arts. I have blog about cinema and write critics sometimes. \r\n\r\nI like travel, I visited Austria, Belgium, Bulgaria, Czech Republic, England, France, Germany, Greece, Hungary, Italy, Kosovo, Macedonia, Netherlands, Portugal, Serbia, Spain and Ukraine. And I met many peaople in this countries, I think Airbnb is one of the best way to meet new people and share the life. So I opened my home for guests who is coming from the any part of the world.\r\n\r\nUsualy I watch films, some of my favourite directors are Michael Haneke, Kim Ki Duk, Emir Kustarica, Lars Von Trier, Andrei Zyvanigitsev, Bahman Ghobadi, Majid Majidi, Abbas Kiyarüstemi, Ingmar Bergman, Stanley Kubrick etc. \r\n\r\nMy favorite Tv Series are Prison Break, Breaking Bad, Better Call Soul, Mr. Robot, Black Mirror, Narcos, Intreatmant. \r\n\r\nI try to explain of me. You wellcome to my home. My house is very safety, lovely and peaceful.\r\n\r\nEasy access to popular destinations : Taksim, Beyoğlu, Eminönü, Sultanahmet, Topkapı Palace, Galata Tower, Kadıköy, Princes Islands.\r\nI am pleased to welcome you.\r\n\r\nPeople who stay with me are from Germany, Canada, Norway, Sweeden, Jordan, Russian, Iran, China, South Korea, United States, Mexico City, Malasia, Italy, Australia until yet. \r\n', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/user/bcd9b30d-f858-4fab-b7a3-f98b45df73cb.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/user/bcd9b30d-f858-4fab-b7a3-f98b45df73cb.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Taksim', - host_response_rate: 100, - host_is_superhost: true, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 8, - host_total_listings_count: 8, - host_verifications: ['email', 'phone', 'reviews', 'jumio'], - }, - address: { - street: 'Beyoğlu, İstanbul, Turkey', - suburb: 'Beyoglu', - government_area: 'Beyoglu', - market: 'Istanbul', - country: 'Turkey', - country_code: 'TR', - location: { - type: 'Point', - coordinates: [28.95825, 41.03777], - is_location_exact: false, - }, - }, - availability: { - availability_30: 3, - availability_60: 19, - availability_90: 37, - availability_365: 37, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 9, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 9, - review_scores_value: 10, - review_scores_rating: 99, - }, - }, - { - _id: '10096773', - listing_url: 'https://www.airbnb.com/rooms/10096773', - name: 'Easy 1 Bedroom in Chelsea', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - first_review: { - $date: '2016-01-03T05:00:00.000Z', - }, - last_review: { - $date: '2016-01-03T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 1, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Internet', - 'Wifi', - 'Kitchen', - 'Heating', - 'Smoke detector', - 'Carbon monoxide detector', - 'Fire extinguisher', - 'Essentials', - ], - price: { - $numberDecimal: '145.00', - }, - weekly_price: { - $numberDecimal: '1000.00', - }, - cleaning_fee: { - $numberDecimal: '60.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/ceb6e8b2-d006-4f1f-b0c4-001e48de11db.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '34607505', - host_url: 'https://www.airbnb.com/users/show/34607505', - host_name: 'Scott', - host_location: 'New York, New York, United States', - host_about: - 'I am pretty much your average early/mid career working professional in NYC.', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/675cec89-71eb-4ca7-bacd-bbed62ef6fad.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/675cec89-71eb-4ca7-bacd-bbed62ef6fad.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Chelsea', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['email', 'phone', 'facebook', 'reviews', 'kba'], - }, - address: { - street: 'New York, NY, United States', - suburb: 'Manhattan', - government_area: 'Chelsea', - market: 'New York', - country: 'United States', - country_code: 'US', - location: { - type: 'Point', - coordinates: [-74.00074, 40.74577], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 10, - review_scores_rating: 100, - }, - }, - { - _id: '10030955', - listing_url: 'https://www.airbnb.com/rooms/10030955', - name: 'Apt Linda Vista Lagoa - Rio', - notes: '', - property_type: 'Apartment', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '2.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Pool', - 'Kitchen', - 'Free parking on premises', - 'Doorman', - 'Gym', - 'Elevator', - 'Buzzer/wireless intercom', - 'Family/kid friendly', - 'Washer', - 'Essentials', - '24-hour check-in', - ], - price: { - $numberDecimal: '701.00', - }, - security_deposit: { - $numberDecimal: '1000.00', - }, - cleaning_fee: { - $numberDecimal: '250.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/59c516bd-c7c3-4dae-8625-aff5f55ece53.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '51496939', - host_url: 'https://www.airbnb.com/users/show/51496939', - host_name: 'Livia', - host_location: 'BR', - host_about: '', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/b7911710-9088-451d-a27b-62ad2fc2eac0.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/b7911710-9088-451d-a27b-62ad2fc2eac0.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Lagoa', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['email', 'phone', 'jumio', 'government_id'], - }, - address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Lagoa', - government_area: 'Lagoa', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.205047082633435, -22.971950988341874], - is_location_exact: true, - }, - }, - availability: { - availability_30: 28, - availability_60: 58, - availability_90: 88, - availability_365: 363, - }, - review_scores: {}, - }, - { - _id: '10112159', - listing_url: 'https://www.airbnb.com/rooms/10112159', - name: 'Downtown Oporto Inn (room cleaning)', - notes: 'No private parking.', - property_type: 'Hostel', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'moderate', - last_scraped: { - $date: '2019-02-16T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-16T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Wifi', - 'Family/kid friendly', - 'Smoke detector', - 'Fire extinguisher', - 'Essentials', - 'Shampoo', - 'Lock on bedroom door', - 'Hangers', - 'Hair dryer', - 'Hot water', - 'Long term stays allowed', - 'Other', - ], - price: { - $numberDecimal: '40.00', - }, - weekly_price: { - $numberDecimal: '230.00', - }, - monthly_price: { - $numberDecimal: '600.00', - }, - security_deposit: { - $numberDecimal: '0.00', - }, - cleaning_fee: { - $numberDecimal: '50.00', - }, - extra_people: { - $numberDecimal: '25.00', - }, - guests_included: { - $numberDecimal: '2', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/442ad717-ecf2-4bb5-a186-17a46cfb5f5f.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '2649859', - host_url: 'https://www.airbnb.com/users/show/2649859', - host_name: 'Elisabete', - host_location: 'Porto, Porto, Portugal', - host_about: - "Sou activa, responsável, interessada por leitura, por cinema e por passeio. Sobretudo, sou escritora. Adoro escrever! Escrevo sobre o Porto e sobre as pessoas, pois são o que de mais importante temos! Venha conhecer o nosso espaço, que inspirou o nascimento de dois livros, já editados, além de outros dois, ainda na forja... | I'm an active, responsible person, who loves reading, movies and walking through our beautiful country. Mainly, I'm a writer. I love to write! I write about Oporto and about people, cause they are the most important thing we have. Come and know our space, where two books were already born, and two others are on their way out..", - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/3e7725d5-79ea-4290-a99c-5bd5e0691f02.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/3e7725d5-79ea-4290-a99c-5bd5e0691f02.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 2, - host_total_listings_count: 2, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'government_id', - ], - }, - address: { - street: 'Porto, Porto, Portugal', - suburb: '', - government_area: 'Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória', - market: 'Porto', - country: 'Portugal', - country_code: 'PT', - location: { - type: 'Point', - coordinates: [-8.60867, 41.1543], - is_location_exact: false, - }, - }, - availability: { - availability_30: 30, - availability_60: 60, - availability_90: 87, - availability_365: 359, - }, - review_scores: {}, - }, - { - _id: '10109896', - listing_url: 'https://www.airbnb.com/rooms/10109896', - name: "THE Place to See Sydney's FIREWORKS", - notes: - "We live with our stud dog, and our son; we won't be here during your stay, but if you're allergic to dogs or babies, best to pick another place. :)", - property_type: 'House', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '1125', - cancellation_policy: 'moderate', - last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '2.5', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Buzzer/wireless intercom', - 'Heating', - 'Family/kid friendly', - 'Washer', - 'Dryer', - 'Smoke detector', - 'Essentials', - 'Shampoo', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - ], - price: { - $numberDecimal: '250.00', - }, - security_deposit: { - $numberDecimal: '400.00', - }, - cleaning_fee: { - $numberDecimal: '150.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/aca46512-3f26-432e-8114-e13fa5707217.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '6517277', - host_url: 'https://www.airbnb.com/users/show/6517277', - host_name: 'Kristin', - host_location: 'Sydney, New South Wales, Australia', - host_about: '', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/a304162e-015b-4e94-a891-84c4355fad39.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/a304162e-015b-4e94-a891-84c4355fad39.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Lilyfield/Rozelle', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'offline_government_id', - 'government_id', - ], - }, - address: { - street: 'Rozelle, NSW, Australia', - suburb: 'Lilyfield/Rozelle', - government_area: 'Leichhardt', - market: 'Sydney', - country: 'Australia', - country_code: 'AU', - location: { - type: 'Point', - coordinates: [151.17956, -33.86296], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: {}, - }, - { - _id: '10066928', - listing_url: 'https://www.airbnb.com/rooms/10066928', - name: '3 chambres au coeur du Plateau', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - accommodates: 6, - bedrooms: 3, - beds: 3, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'Internet', - 'Wifi', - 'Kitchen', - 'Heating', - 'Family/kid friendly', - 'Washer', - 'Dryer', - 'Essentials', - 'Shampoo', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - ], - price: { - $numberDecimal: '140.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/f208bdd7-bdab-4d4d-b529-8e6b1e5a83c1.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '9036477', - host_url: 'https://www.airbnb.com/users/show/9036477', - host_name: 'Margaux', - host_location: 'Montreal, Quebec, Canada', - host_about: '', - host_thumbnail_url: - 'https://a0.muscache.com/im/users/9036477/profile_pic/1425247510/original.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/users/9036477/profile_pic/1425247510/original.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Le Plateau', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 2, - host_total_listings_count: 2, - host_verifications: ['email', 'phone', 'reviews', 'work_email'], - }, - address: { - street: 'Montréal, Québec, Canada', - suburb: 'Le Plateau-Mont-Royal', - government_area: 'Le Plateau-Mont-Royal', - market: 'Montreal', - country: 'Canada', - country_code: 'CA', - location: { - type: 'Point', - coordinates: [-73.57383, 45.52233], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: {}, - }, - { - _id: '10082422', - listing_url: 'https://www.airbnb.com/rooms/10082422', - name: 'Nice room in Barcelona Center', - notes: '', - property_type: 'Apartment', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '9', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-03-08T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-08T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 2, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'Internet', - 'Wifi', - 'Kitchen', - 'Elevator', - 'Heating', - 'Washer', - 'Shampoo', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - ], - price: { - $numberDecimal: '50.00', - }, - security_deposit: { - $numberDecimal: '100.00', - }, - cleaning_fee: { - $numberDecimal: '10.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/aed1923a-69a6-4614-99d0-fd5c8f41ebda.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '30393403', - host_url: 'https://www.airbnb.com/users/show/30393403', - host_name: 'Anna', - host_location: 'Barcelona, Catalonia, Spain', - host_about: - "I'm Anna, italian. I'm 28, friendly and easygoing. I love travelling, reading, dancing tango. Can wait to meet new people! :)", - host_thumbnail_url: - 'https://a0.muscache.com/im/users/30393403/profile_pic/1427876639/original.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/users/30393403/profile_pic/1427876639/original.jpg?aki_policy=profile_x_medium', - host_neighbourhood: "Dreta de l'Eixample", - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['phone', 'facebook'], - }, - address: { - street: 'Barcelona, Catalunya, Spain', - suburb: 'Eixample', - government_area: "la Dreta de l'Eixample", - market: 'Barcelona', - country: 'Spain', - country_code: 'ES', - location: { - type: 'Point', - coordinates: [2.16942, 41.40082], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: {}, - }, - { - _id: '10209136', - listing_url: 'https://www.airbnb.com/rooms/10209136', - name: 'Friendly Apartment, 10m from Manly', - notes: - "Everyone in the block of apartments know each other and will often hang out together in the backyard. Big mix of ages and professions- everyone loves surfing and skating. Also worth noting, there will be a party in the backyard on NYE which you'd be welcome to join.", - property_type: 'Apartment', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - first_review: { - $date: '2016-01-24T05:00:00.000Z', - }, - last_review: { - $date: '2016-02-16T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 4, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'Internet', - 'Wifi', - 'Kitchen', - 'Free parking on premises', - 'Heating', - 'Family/kid friendly', - 'Washer', - 'Dryer', - 'First aid kit', - 'Essentials', - ], - price: { - $numberDecimal: '36.00', - }, - extra_people: { - $numberDecimal: '20.00', - }, - guests_included: { - $numberDecimal: '2', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/f2da856f-1eb3-4b89-af8e-24e95322625d.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '52453573', - host_url: 'https://www.airbnb.com/users/show/52453573', - host_name: 'Isaac', - host_location: 'Sydney, New South Wales, Australia', - host_about: '', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/4c3ec070-d880-4c2b-80ab-5009f416cc43.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/4c3ec070-d880-4c2b-80ab-5009f416cc43.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'government_id', - ], - }, - address: { - street: 'Fairlight, NSW, Australia', - suburb: 'Fairlight', - government_area: 'Manly', - market: 'Sydney', - country: 'Australia', - country_code: 'AU', - location: { - type: 'Point', - coordinates: [151.26969, -33.79629], - is_location_exact: false, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 9, - review_scores_communication: 9, - review_scores_location: 10, - review_scores_value: 9, - review_scores_rating: 95, - }, - }, - { - _id: '10240767', - listing_url: 'https://www.airbnb.com/rooms/10240767', - name: 'Cozy double bed room 東涌鄉村雅緻雙人房', - notes: - 'Bring your own toothbrush and toothpaste 7-minute walk to my village house from the main road. The room is on G/F. No lift is in the building. 請自備牙膏,牙刷及拖鞋。 屋子遠離馬路,客人需步行約七分鐘才能到達。', - property_type: 'Guesthouse', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'moderate', - last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - first_review: { - $date: '2016-07-29T04:00:00.000Z', - }, - last_review: { - $date: '2019-02-18T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 162, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Free parking on premises', - 'Pets live on this property', - 'Cat(s)', - 'Family/kid friendly', - 'Suitable for events', - 'Washer', - 'Dryer', - 'Smoke detector', - 'First aid kit', - 'Fire extinguisher', - 'Essentials', - 'Shampoo', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Children’s books and toys', - 'Hot water', - 'Bed linens', - 'Extra pillows and blankets', - 'Microwave', - 'Coffee maker', - 'Refrigerator', - 'Dishes and silverware', - 'Cooking basics', - 'Oven', - 'Stove', - 'BBQ grill', - 'Patio or balcony', - 'Garden or backyard', - 'Luggage dropoff allowed', - 'Long term stays allowed', - 'Cleaning before checkout', - 'Host greets you', - ], - price: { - $numberDecimal: '487.00', - }, - security_deposit: { - $numberDecimal: '0.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/410fb8a8-673d-44a8-80bd-0b4ac09e6bf2.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '52491634', - host_url: 'https://www.airbnb.com/users/show/52491634', - host_name: 'Ricky', - host_location: 'Hong Kong', - host_about: - 'I am Ricky. I enjoy getting to know people from all around the world and their unique cultures. Nice to meet you all! ^_^', - host_response_time: 'within a few hours', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/0ea05bb0-cadf-42a7-812b-671f1f00757d.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/0ea05bb0-cadf-42a7-812b-671f1f00757d.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_response_rate: 100, - host_is_superhost: true, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 5, - host_total_listings_count: 5, - host_verifications: ['email', 'phone', 'reviews'], - }, - address: { - street: 'Hong Kong, New Territories, Hong Kong', - suburb: '', - government_area: 'Islands', - market: 'Hong Kong', - country: 'Hong Kong', - country_code: 'HK', - location: { - type: 'Point', - coordinates: [113.92823, 22.27671], - is_location_exact: false, - }, - }, - availability: { - availability_30: 18, - availability_60: 41, - availability_90: 67, - availability_365: 339, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 9, - review_scores_value: 9, - review_scores_rating: 96, - }, - }, - { - _id: '10332161', - listing_url: 'https://www.airbnb.com/rooms/10332161', - name: 'A large sunny bedroom', - notes: '', - property_type: 'Apartment', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '3', - maximum_nights: '1125', - cancellation_policy: 'moderate', - last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - first_review: { - $date: '2016-08-05T04:00:00.000Z', - }, - last_review: { - $date: '2016-08-20T04:00:00.000Z', - }, - accommodates: 1, - bedrooms: 1, - beds: 1, - number_of_reviews: 2, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Heating', - 'Washer', - 'Dryer', - 'Smoke detector', - 'First aid kit', - 'Essentials', - 'Lock on bedroom door', - 'Hangers', - 'Hair dryer', - 'Iron', - 'translation missing: en.hosting_amenity_49', - 'translation missing: en.hosting_amenity_50', - ], - price: { - $numberDecimal: '35.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/7e68a65c-562e-42b2-bc6c-c95a87eac969.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '53169195', - host_url: 'https://www.airbnb.com/users/show/53169195', - host_name: 'Ehssan', - host_location: 'New York, New York, United States', - host_about: '', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/c6f4d130-30d3-482c-994b-4a4ea575ac39.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/c6f4d130-30d3-482c-994b-4a4ea575ac39.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Tremont', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'facebook', - 'reviews', - 'jumio', - 'government_id', - ], - }, - address: { - street: 'Bronx, NY, United States', - suburb: 'Tremont', - government_area: 'Fordham', - market: 'New York', - country: 'United States', - country_code: 'US', - location: { - type: 'Point', - coordinates: [-73.90052, 40.85598], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 9, - review_scores_communication: 9, - review_scores_location: 6, - review_scores_value: 9, - review_scores_rating: 90, - }, - }, - { - _id: '10459480', - listing_url: 'https://www.airbnb.com/rooms/10459480', - name: 'Greenwich Fun and Luxury', - notes: - 'Plenty of off-street parking for guests, climate controlled heating and cooling as needed.', - property_type: 'House', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '5', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - accommodates: 6, - bedrooms: 4, - beds: 4, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '4.0', - }, - amenities: [ - 'TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Pool', - 'Kitchen', - 'Free parking on premises', - 'Indoor fireplace', - 'Buzzer/wireless intercom', - 'Heating', - 'Family/kid friendly', - 'Washer', - 'Smoke detector', - 'First aid kit', - 'Essentials', - 'Shampoo', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - ], - price: { - $numberDecimal: '999.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/bab17a39-035d-4ad8-ba38-e6bd9be4245f.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '45186586', - host_url: 'https://www.airbnb.com/users/show/45186586', - host_name: 'Craig', - host_location: 'Sydney, New South Wales, Australia', - host_about: - "I'm an entrepreneur with a couple of different business interests. I work from home on the Sydney lower north shore. \r\n\r\nOne of my businesses is based in Shanghai, the other has operations in Shanghai and Singapore (mainly). \r\n\r\nI travel more than I would like, and am looking for an alternative to always staying in hotels, which get old after many years. While travelling, I usually spend most of my evenings doing email after having dinner out. No wild parties, but I enjoy a beer and/or a glass or two of red : ) \r\n\r\nI use a personal email address for correspondence associated with AirBnB and other websites to do with travel and administration. ", - host_response_time: 'within a day', - host_thumbnail_url: - 'https://a0.muscache.com/im/users/45186586/profile_pic/1443513819/original.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/users/45186586/profile_pic/1443513819/original.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Greenwich', - host_response_rate: 100, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'offline_government_id', - 'government_id', - 'work_email', - ], - }, - address: { - street: 'Greenwich, NSW, Australia', - suburb: 'Greenwich', - government_area: 'Lane Cove', - market: 'Sydney', - country: 'Australia', - country_code: 'AU', - location: { - type: 'Point', - coordinates: [151.18563, -33.8289], - is_location_exact: true, - }, - }, - availability: { - availability_30: 30, - availability_60: 60, - availability_90: 90, - availability_365: 365, - }, - review_scores: {}, - }, - { - _id: '1016739', - listing_url: 'https://www.airbnb.com/rooms/1016739', - name: 'Private Room (2) in Guest House at Coogee Beach', - notes: 'Guests may extend their stay long term up to 12 months', - property_type: 'House', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '3', - maximum_nights: '365', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - first_review: { - $date: '2013-07-15T04:00:00.000Z', - }, - last_review: { - $date: '2017-12-01T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 2, - number_of_reviews: 8, - bathrooms: { - $numberDecimal: '3.5', - }, - amenities: [ - 'TV', - 'Internet', - 'Wifi', - 'Kitchen', - 'Smoking allowed', - 'Doorman', - 'Free street parking', - 'Family/kid friendly', - 'Washer', - 'Dryer', - 'Smoke detector', - 'Safety card', - 'Fire extinguisher', - 'Essentials', - 'Lock on bedroom door', - '24-hour check-in', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Self check-in', - 'Keypad', - 'Hot water', - ], - price: { - $numberDecimal: '64.00', - }, - weekly_price: { - $numberDecimal: '500.00', - }, - monthly_price: { - $numberDecimal: '2000.00', - }, - security_deposit: { - $numberDecimal: '0.00', - }, - cleaning_fee: { - $numberDecimal: '30.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/15288404/3f765cd7_original.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '5595776', - host_url: 'https://www.airbnb.com/users/show/5595776', - host_name: 'David', - host_location: 'Sydney, New South Wales, Australia', - host_about: - 'Welcoming host who wants you to enjoy the beautiful surrounds at Coogee Beach', - host_response_time: 'within a few hours', - host_thumbnail_url: - 'https://a0.muscache.com/im/users/5595776/profile_pic/1372823881/original.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/users/5595776/profile_pic/1372823881/original.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Coogee', - host_response_rate: 100, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 6, - host_total_listings_count: 6, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'offline_government_id', - 'government_id', - ], - }, - address: { - street: 'Coogee, NSW, Australia', - suburb: 'Coogee', - government_area: 'Randwick', - market: 'Sydney', - country: 'Australia', - country_code: 'AU', - location: { - type: 'Point', - coordinates: [151.25541, -33.92398], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 19, - availability_365: 20, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 9, - review_scores_rating: 100, - }, - }, - { - _id: '10299095', - listing_url: 'https://www.airbnb.com/rooms/10299095', - name: 'Small Room w Bathroom Flamengo Rio de Janeiro', - notes: - "We live my grandmother and I, she is very open minded and cool. But we aren't much of a party. So it wouldn't be a good idea to came home at dawn drunk, vomiting in the bathroom. Oh! I have a cat, he is very docile and rarely mine. This is important because if you are choosing a place to stay keep that in mind.", - property_type: 'Apartment', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '4', - maximum_nights: '1125', - cancellation_policy: 'moderate', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - first_review: { - $date: '2016-08-20T04:00:00.000Z', - }, - last_review: { - $date: '2016-08-20T04:00:00.000Z', - }, - accommodates: 1, - bedrooms: 1, - beds: 1, - number_of_reviews: 1, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Wifi', - 'Kitchen', - 'Pets live on this property', - 'Cat(s)', - 'Elevator', - 'Washer', - 'Dryer', - 'Fire extinguisher', - 'Essentials', - 'translation missing: en.hosting_amenity_49', - 'translation missing: en.hosting_amenity_50', - ], - price: { - $numberDecimal: '71.00', - }, - cleaning_fee: { - $numberDecimal: '20.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/26459098-5f3e-4d82-a419-1839af1eaa9a.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '52988408', - host_url: 'https://www.airbnb.com/users/show/52988408', - host_name: 'Fernanda', - host_location: 'BR', - host_about: '', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/0c78bdd8-1e12-497e-a64c-b39f808ccfa7.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/0c78bdd8-1e12-497e-a64c-b39f808ccfa7.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 2, - host_total_listings_count: 2, - host_verifications: ['email', 'phone', 'reviews'], - }, - address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Flamengo', - government_area: 'Flamengo', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.17645081249057, -22.93848268819496], - is_location_exact: false, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: { - review_scores_accuracy: 8, - review_scores_cleanliness: 8, - review_scores_checkin: 8, - review_scores_communication: 8, - review_scores_location: 8, - review_scores_value: 8, - review_scores_rating: 80, - }, - }, - { - _id: '10141950', - listing_url: 'https://www.airbnb.com/rooms/10141950', - name: 'Big, Bright & Convenient Sheung Wan', - notes: - 'I actually live in the studio, so my belongings will be in a wardrobe space', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '1125', - cancellation_policy: 'moderate', - last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - first_review: { - $date: '2016-01-06T05:00:00.000Z', - }, - last_review: { - $date: '2016-01-06T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 0, - beds: 1, - number_of_reviews: 1, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Elevator', - 'Buzzer/wireless intercom', - 'Heating', - 'Washer', - 'Dryer', - 'Essentials', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - ], - price: { - $numberDecimal: '966.00', - }, - cleaning_fee: { - $numberDecimal: '118.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/aee73a00-c7dd-43bd-93eb-8d96de467a89.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '11435086', - host_url: 'https://www.airbnb.com/users/show/11435086', - host_name: 'Regg', - host_location: 'Hong Kong', - host_about: - 'I am a consultant and travel very often. I usually host my apartment when I leave and search for Airbnb rentals for accomodation.', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/user/736908a8-0792-4428-a630-d47a3df44bb9.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/user/736908a8-0792-4428-a630-d47a3df44bb9.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Sheung Wan', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'offline_government_id', - 'government_id', - 'work_email', - ], - }, - address: { - street: 'Hong Kong, Hong Kong Island, Hong Kong', - suburb: 'Central & Western District', - government_area: 'Central & Western', - market: 'Hong Kong', - country: 'Hong Kong', - country_code: 'HK', - location: { - type: 'Point', - coordinates: [114.15007, 22.28422], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 10, - review_scores_rating: 100, - }, - }, - { - _id: '10269320', - listing_url: 'https://www.airbnb.com/rooms/10269320', - name: 'FloresRooms 3T', - notes: - 'Informamos os nossos hospedes que no prédio ao lado está em reconstrução. Os trabalhos na obra realizam se entre as 8 da manha e as 18 horas, de segunda a sexta feira.', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '1124', - cancellation_policy: 'moderate', - last_scraped: { - $date: '2019-02-16T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-16T05:00:00.000Z', - }, - first_review: { - $date: '2016-01-18T05:00:00.000Z', - }, - last_review: { - $date: '2019-02-01T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 0, - beds: 1, - number_of_reviews: 225, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Elevator', - 'First aid kit', - 'Fire extinguisher', - 'Essentials', - 'Shampoo', - 'Hangers', - 'Hair dryer', - 'Laptop friendly workspace', - 'translation missing: en.hosting_amenity_49', - 'translation missing: en.hosting_amenity_50', - 'Self check-in', - 'Lockbox', - 'Hot water', - 'Bed linens', - 'Extra pillows and blankets', - ], - price: { - $numberDecimal: '31.00', - }, - security_deposit: { - $numberDecimal: '200.00', - }, - cleaning_fee: { - $numberDecimal: '10.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/1404e592-e245-4144-a135-0f49e80f384d.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '51724179', - host_url: 'https://www.airbnb.com/users/show/51724179', - host_name: 'Andreia', - host_location: 'Porto, Porto District, Portugal', - host_about: '', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/f1425353-8f70-4d49-a5dc-6e9f17a362c5.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/f1425353-8f70-4d49-a5dc-6e9f17a362c5.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_response_rate: 100, - host_is_superhost: true, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 6, - host_total_listings_count: 6, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'government_id', - ], - }, - address: { - street: 'Porto, Porto, Portugal', - suburb: '', - government_area: 'Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória', - market: 'Porto', - country: 'Portugal', - country_code: 'PT', - location: { - type: 'Point', - coordinates: [-8.61205, 41.14404], - is_location_exact: false, - }, - }, - availability: { - availability_30: 13, - availability_60: 43, - availability_90: 62, - availability_365: 278, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 10, - review_scores_rating: 96, - }, - }, - { - _id: '10415637', - listing_url: 'https://www.airbnb.com/rooms/10415637', - name: '(1) Beach Guest House - Go Make A Trip', - notes: '', - property_type: 'Bed and breakfast', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - first_review: { - $date: '2016-02-11T05:00:00.000Z', - }, - last_review: { - $date: '2017-09-22T04:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 11, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Free parking on premises', - 'Family/kid friendly', - 'Essentials', - 'Shampoo', - 'Hair dryer', - 'Iron', - ], - price: { - $numberDecimal: '112.00', - }, - security_deposit: { - $numberDecimal: '0.00', - }, - cleaning_fee: { - $numberDecimal: '0.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '2', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/fb4ee284-ef42-4abe-96af-75124426a9c8.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '4765935', - host_url: 'https://www.airbnb.com/users/show/4765935', - host_name: 'Rafael', - host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', - host_about: '28 Years Old Micro Entrepreneur and Photo Travel Devoted.', - host_response_time: 'within a few hours', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/449d3f0f-1315-4eab-b48d-7470b278c0ce.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/449d3f0f-1315-4eab-b48d-7470b278c0ce.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Barra da Tijuca', - host_response_rate: 100, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 8, - host_total_listings_count: 8, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'offline_government_id', - 'government_id', - ], - }, - address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Barra da Tijuca', - government_area: 'Barra da Tijuca', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.353970672578306, -23.008991691724663], - is_location_exact: false, - }, - }, - availability: { - availability_30: 24, - availability_60: 45, - availability_90: 60, - availability_365: 309, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 10, - review_scores_rating: 98, - }, - }, - { - _id: '10201975', - listing_url: 'https://www.airbnb.com/rooms/10201975', - name: 'Ipanema: moderno apê 2BR + garagem', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '4', - maximum_nights: '1125', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - first_review: { - $date: '2016-02-23T05:00:00.000Z', - }, - last_review: { - $date: '2019-01-28T05:00:00.000Z', - }, - accommodates: 4, - bedrooms: 2, - beds: 2, - number_of_reviews: 24, - bathrooms: { - $numberDecimal: '2.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Free parking on premises', - 'Smoking allowed', - 'Doorman', - 'Elevator', - 'Buzzer/wireless intercom', - 'Family/kid friendly', - 'Washer', - 'Dryer', - 'Essentials', - 'Shampoo', - '24-hour check-in', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Hot water', - 'Luggage dropoff allowed', - 'Long term stays allowed', - 'Host greets you', - ], - price: { - $numberDecimal: '298.00', - }, - security_deposit: { - $numberDecimal: '600.00', - }, - cleaning_fee: { - $numberDecimal: '180.00', - }, - extra_people: { - $numberDecimal: '50.00', - }, - guests_included: { - $numberDecimal: '2', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/d2ccb4bd-1cda-417f-98e4-4d8695ba3a8c.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '2537111', - host_url: 'https://www.airbnb.com/users/show/2537111', - host_name: 'Barbara', - host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', - host_about: - "My name is Barbara.\r\nI'm an administrator and real state manager. I study photography.\r\nI've always enjoyed showing Rio around and helping people take the most out of the city.\r\nIt has been seven years I share my love for Rio renting apartments for short period and helping my guests with hints on tourist spots.\r\nI love cooking and It will be a pleasure to be able to help with information about restaurants, bars and gastronomy in general.\r\nI love to make new friends and to know different cultures.\r\nMy husband Ricardo is a chemical engeneer, a great companion, but not talkative as I'm.\r\nOur daughter Alice is 8 years-old. She is into dancing classical ballet, jazz and loves to exchange experiences with people in general.\r\nI look foward to having you at my place!\r\n\r\nSeja bem vindo (a)! Meu nome é Bárbara, sou administradora de empresas e estudante de fotografia.\r\nHá 7 anos eu compartilho o amor pela cidade do Rio de Janeiro alugando apartamentos por temporada e ajudando meus hóspedes com dicas sobre a cidade e pontos turísticos.\r\nUma das minhas paixões é cozinhar e será um prazer poder compartilhar dicas sobre restaurantes, bares e gastronomia em geral.\r\nAdoro viajar, fazer novos amigos e conhecer diferentes culturas.\r\nSe você ficar na minha casa também vai conhecer o meu marido Ricardo, que é engenheiro químico e meu grande parceiro na hospedagem, gente boa, mas não tão falante como eu. Nossa filha Alice tem 8 anos, dança ballet e jazz e também adora conhecer novas pessoas e trocar experiências.\r\nTambém tenho apartamentos inteiros no Centro, Lapa e Zona Sul da cidade.\r\nSeja bem vindo a um cantinho para chamar de seu. :)", - host_response_time: 'within a few hours', - host_thumbnail_url: - 'https://a0.muscache.com/im/users/2537111/profile_pic/1418360168/original.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/users/2537111/profile_pic/1418360168/original.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Santa Teresa', - host_response_rate: 92, - host_is_superhost: true, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 13, - host_total_listings_count: 13, - host_verifications: [ - 'email', - 'phone', - 'facebook', - 'reviews', - 'jumio', - 'government_id', - ], - }, - address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: '', - government_area: 'Ipanema', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.1998455458952, -22.980051683700506], - is_location_exact: false, - }, - }, - availability: { - availability_30: 24, - availability_60: 54, - availability_90: 84, - availability_365: 174, - }, - review_scores: { - review_scores_accuracy: 9, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 9, - review_scores_rating: 92, - }, - }, - { - _id: '1019168', - listing_url: 'https://www.airbnb.com/rooms/1019168', - name: 'Cozy Nest, heart of the Plateau', - notes: - "Since we are on the ground floor, access in and out of the house is possible for folks who may have a limited mobility, however there is 1 step to get through the front door and the bathroom is unfortunately a bit too narrow to accomodate a wheelchair. Let me know if you have questions regarding specifics and I'll be able to assist!", - property_type: 'Apartment', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '120', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - first_review: { - $date: '2014-06-22T04:00:00.000Z', - }, - last_review: { - $date: '2019-01-08T05:00:00.000Z', - }, - accommodates: 1, - bedrooms: 1, - beds: 1, - number_of_reviews: 62, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Wifi', - 'Kitchen', - 'Paid parking off premises', - 'Pets live on this property', - 'Cat(s)', - 'Free street parking', - 'Heating', - 'Family/kid friendly', - 'Washer', - 'Dryer', - 'Smoke detector', - 'First aid kit', - 'Fire extinguisher', - 'Essentials', - 'Shampoo', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Self check-in', - 'Lockbox', - 'Hot water', - 'Microwave', - 'Coffee maker', - 'Refrigerator', - 'Dishes and silverware', - 'Cooking basics', - 'Oven', - 'Stove', - 'BBQ grill', - 'Garden or backyard', - 'Luggage dropoff allowed', - 'Long term stays allowed', - ], - price: { - $numberDecimal: '34.00', - }, - weekly_price: { - $numberDecimal: '250.00', - }, - monthly_price: { - $numberDecimal: '900.00', - }, - security_deposit: { - $numberDecimal: '0.00', - }, - cleaning_fee: { - $numberDecimal: '25.00', - }, - extra_people: { - $numberDecimal: '10.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/a27beb17-c028-49a1-a374-9f4244f7b2ff.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '39300', - host_url: 'https://www.airbnb.com/users/show/39300', - host_name: 'Lilou', - host_location: 'Montreal, Quebec, Canada', - host_about: - "Hello,\r\nMy name is Laura, I am a young and active professional living in Montreal and working for a concert promoter.\r\nI've been living in this apartment for over 12 years now. It holds a very special place in my heart and I am glad to be opening the doors of my cosy nest to new guests!\r\nYou will also be sharing the common space with a cat or two as well as maybe another traveling guest.\r\nLooking forward to meeting you and helping make your stay in our lovely city as comfortable as possible.\r\nÀ bientôt !", - host_response_time: 'within a day', - host_thumbnail_url: - 'https://a0.muscache.com/im/users/39300/profile_pic/1400790873/original.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/users/39300/profile_pic/1400790873/original.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Mile End', - host_response_rate: 100, - host_is_superhost: true, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'facebook', - 'reviews', - 'jumio', - 'offline_government_id', - 'government_id', - ], - }, - address: { - street: 'Montreal, QC, Canada', - suburb: 'Le Plateau-Mont-Royal', - government_area: 'Le Plateau-Mont-Royal', - market: 'Montreal', - country: 'Canada', - country_code: 'CA', - location: { - type: 'Point', - coordinates: [-73.58774, 45.52028], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 9, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 10, - review_scores_rating: 98, - }, - }, - { - _id: '10264100', - listing_url: 'https://www.airbnb.com/rooms/10264100', - name: 'Your spot in Copacabana', - notes: 'There is no parking in the building.', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '15', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - first_review: { - $date: '2016-08-13T04:00:00.000Z', - }, - last_review: { - $date: '2018-03-18T04:00:00.000Z', - }, - accommodates: 6, - bedrooms: 2, - beds: 5, - number_of_reviews: 8, - bathrooms: { - $numberDecimal: '2.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Paid parking off premises', - 'Doorman', - 'Elevator', - 'Buzzer/wireless intercom', - 'Family/kid friendly', - 'Washer', - 'First aid kit', - 'Essentials', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'translation missing: en.hosting_amenity_50', - 'Window guards', - 'Hot water', - 'Bed linens', - 'Extra pillows and blankets', - 'Microwave', - 'Coffee maker', - 'Refrigerator', - 'Dishes and silverware', - 'Cooking basics', - 'Oven', - 'Stove', - 'Long term stays allowed', - 'Host greets you', - ], - price: { - $numberDecimal: '798.00', - }, - security_deposit: { - $numberDecimal: '500.00', - }, - cleaning_fee: { - $numberDecimal: '150.00', - }, - extra_people: { - $numberDecimal: '20.00', - }, - guests_included: { - $numberDecimal: '4', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/83dbb5af-8b0c-48a4-b210-4fb60d642119.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '52772199', - host_url: 'https://www.airbnb.com/users/show/52772199', - host_name: 'Ana Lúcia', - host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', - host_about: - 'Tenho muito prazer em fazer novos amigos, com outras culturas, informações e vivências. Gosto de ser uma anfitriã atenciosa e disponível. O que estiver ao meu alcance tenha certeza que será feito, para tornar sua estadia no Rio inesquecível. ', - host_response_time: 'within a few hours', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/40611c34-2c83-4269-b2bf-1998f5ccf3e0.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/40611c34-2c83-4269-b2bf-1998f5ccf3e0.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_response_rate: 100, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['email', 'phone', 'facebook', 'google', 'reviews'], - }, - address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Copacabana', - government_area: 'Copacabana', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.17714541632985, -22.96270793328072], - is_location_exact: false, - }, - }, - availability: { - availability_30: 11, - availability_60: 41, - availability_90: 71, - availability_365: 247, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 9, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 10, - review_scores_rating: 100, - }, - }, - { - _id: '10416859', - listing_url: 'https://www.airbnb.com/rooms/10416859', - name: 'Studio convenient to CBD, beaches, street parking.', - notes: - 'OPAL cards are available for adults and children. I try to make sure the correct number are in the room, but if they are not, just ask. As summer has arrived and doors and windows are open you may hear voices in the morning from us and the neighbours. Mainly In the evenings around dinner time and in the mornings as the family is getting ready for work and school you can hear sounds.', - property_type: 'Guest suite', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '3', - cancellation_policy: 'moderate', - last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - first_review: { - $date: '2016-02-10T05:00:00.000Z', - }, - last_review: { - $date: '2018-09-23T04:00:00.000Z', - }, - accommodates: 5, - bedrooms: 1, - beds: 4, - number_of_reviews: 104, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Gym', - 'Free street parking', - 'Heating', - 'Family/kid friendly', - 'Washer', - 'Smoke detector', - 'Carbon monoxide detector', - 'First aid kit', - 'Fire extinguisher', - 'Essentials', - 'Shampoo', - 'Lock on bedroom door', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Self check-in', - 'Lockbox', - 'Private living room', - 'Private entrance', - 'Outlet covers', - 'High chair', - 'Children’s books and toys', - 'Children’s dinnerware', - 'Hot water', - 'Bed linens', - 'Extra pillows and blankets', - 'Microwave', - 'Coffee maker', - 'Refrigerator', - 'Dishwasher', - 'Dishes and silverware', - 'Cooking basics', - 'Stove', - 'BBQ grill', - 'Patio or balcony', - 'Garden or backyard', - 'Luggage dropoff allowed', - 'Wide hallway clearance', - 'Well-lit path to entrance', - 'Step-free access', - 'Wide doorway', - 'Accessible-height bed', - 'Step-free access', - 'Step-free access', - ], - price: { - $numberDecimal: '45.00', - }, - security_deposit: { - $numberDecimal: '136.00', - }, - cleaning_fee: { - $numberDecimal: '50.00', - }, - extra_people: { - $numberDecimal: '25.00', - }, - guests_included: { - $numberDecimal: '2', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/9c8ce5db-4ec6-4233-b51f-dcab88f4e4d9.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '4548918', - host_url: 'https://www.airbnb.com/users/show/4548918', - host_name: 'Leslie', - host_location: 'Sydney, New South Wales, Australia', - host_about: - 'We are a family of four (Two teens). We love meeting our Airbnb guests and sharing our favourite places to eat, travel, hike, cycle, or sight see in Sydney. We are originally from the US, but have lived here for over 10 years.', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/9e2b516d-2d03-4d0c-9464-44b508343347.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/9e2b516d-2d03-4d0c-9464-44b508343347.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Balgowlah', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'facebook', - 'reviews', - 'jumio', - 'government_id', - ], - }, - address: { - street: 'Balgowlah, NSW, Australia', - suburb: 'Balgowlah', - government_area: 'Manly', - market: 'Sydney', - country: 'Australia', - country_code: 'AU', - location: { - type: 'Point', - coordinates: [151.26108, -33.7975], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 9, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 10, - review_scores_rating: 96, - }, - }, - { - _id: '1047087', - listing_url: 'https://www.airbnb.com/rooms/1047087', - name: 'The Garden Studio', - notes: '', - property_type: 'Guesthouse', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '40', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - first_review: { - $date: '2013-04-29T04:00:00.000Z', - }, - last_review: { - $date: '2019-02-11T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 146, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Internet', - 'Wifi', - 'Kitchen', - 'Breakfast', - 'Free street parking', - 'Heating', - 'Smoke detector', - 'Carbon monoxide detector', - 'Fire extinguisher', - 'Essentials', - 'Shampoo', - '24-hour check-in', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'translation missing: en.hosting_amenity_49', - 'translation missing: en.hosting_amenity_50', - 'Private entrance', - 'Hot water', - 'Other', - ], - price: { - $numberDecimal: '129.00', - }, - security_deposit: { - $numberDecimal: '0.00', - }, - cleaning_fee: { - $numberDecimal: '60.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/15742170/c4b4754f_original.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '3251237', - host_url: 'https://www.airbnb.com/users/show/3251237', - host_name: 'Cath', - host_location: 'Sydney, New South Wales, Australia', - host_about: - 'I am a professional photographer, based in Sydney. Australia. Covering lifestyle subjects such as Food, Interiors and travel, mostly for magazines and books and advertising clients. Born and raised in Sydney, I do love to travel and I have been lucky to have done a lot of that both personally and professionally. \r\nI enjoy making things and have always got a project on the go\r\nCooking is another great passion of mine. Hence the offer of baked goods and homemade jam!\r\nPlease feel free to email me with any question you might have.', - host_response_time: 'within a few hours', - host_thumbnail_url: - 'https://a0.muscache.com/im/users/3251237/profile_pic/1365404736/original.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/users/3251237/profile_pic/1365404736/original.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_response_rate: 100, - host_is_superhost: true, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'facebook', - 'reviews', - 'jumio', - 'government_id', - 'work_email', - ], - }, - address: { - street: 'Marrickville, NSW, Australia', - suburb: 'Marrickville', - government_area: 'Marrickville', - market: 'Sydney', - country: 'Australia', - country_code: 'AU', - location: { - type: 'Point', - coordinates: [151.15036, -33.90318], - is_location_exact: false, - }, - }, - availability: { - availability_30: 30, - availability_60: 60, - availability_90: 90, - availability_365: 365, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 9, - review_scores_value: 10, - review_scores_rating: 97, - }, - }, - { - _id: '10578580', - listing_url: 'https://www.airbnb.com/rooms/10578580', - name: 'Panoramic Ocean View Studio in Quiet Setting', - notes: - 'There is high-speed Internet and Wi-Fi service. There is no laundry service on the premises and for longer stays, housekeeping can be offered upon request. The unit is in a residential, single-family neighborhood and there is lots of street parking available. Guests are welcome to park along the mock orange hedge. The setting is lush and tropical and sometimes you may come in contact with flying insects or bugs, which are part of the Hawaii eco system. For example at night, when you have the lights on, its best to keep the entry door closed; all windows have mosquito screens and we have the company Orkin under contract for pest control.', - property_type: 'Guesthouse', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '1125', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - first_review: { - $date: '2016-02-08T05:00:00.000Z', - }, - last_review: { - $date: '2019-02-18T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 114, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Kitchen', - 'Free parking on premises', - 'Pets live on this property', - 'Free street parking', - 'Smoke detector', - 'First aid kit', - 'Fire extinguisher', - 'Essentials', - 'Shampoo', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'translation missing: en.hosting_amenity_49', - 'translation missing: en.hosting_amenity_50', - 'Self check-in', - 'Keypad', - 'Hot water', - 'Luggage dropoff allowed', - 'Long term stays allowed', - ], - price: { - $numberDecimal: '120.00', - }, - security_deposit: { - $numberDecimal: '200.00', - }, - cleaning_fee: { - $numberDecimal: '100.00', - }, - extra_people: { - $numberDecimal: '15.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/16099e47-1309-4bc0-b271-fc4643604d23.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '308899', - host_url: 'https://www.airbnb.com/users/show/308899', - host_name: 'Andrei', - host_location: 'Honolulu, Hawaii, United States', - host_about: - 'I am a clinical psychologist and a passionate Argentine tango dancer. Moved to Hawaii 15 years ago from Los Angeles, CA. I love the island and its quiet pace. In addition to the obvious water sports, it is surprising how much great hiking is available on Oahu! I often travel to Europe (especially Italy) and Argentina and when I am off-island, I enjoy sharing my studio with folks from all over the world!! Sharing the studio was so well received by our guests, we just decided to offer a second apartment. I take a lot of pride in offering our guests an excellent experience!!!', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/34ca9715-2599-479e-94f2-fddba4c51398.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/34ca9715-2599-479e-94f2-fddba4c51398.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Kaimuki', - host_response_rate: 100, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 2, - host_total_listings_count: 2, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'offline_government_id', - 'government_id', - ], - }, - address: { - street: 'Honolulu, HI, United States', - suburb: 'Oʻahu', - government_area: 'Primary Urban Center', - market: 'Oahu', - country: 'United States', - country_code: 'US', - location: { - type: 'Point', - coordinates: [-157.78578, 21.29561], - is_location_exact: true, - }, - }, - availability: { - availability_30: 3, - availability_60: 26, - availability_90: 53, - availability_365: 323, - }, - review_scores: { - review_scores_accuracy: 9, - review_scores_cleanliness: 9, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 9, - review_scores_rating: 95, - }, - }, - { - _id: '10612199', - listing_url: 'https://www.airbnb.com/rooms/10612199', - name: 'Serene luxury in Harlem', - notes: '', - property_type: 'Apartment', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '3', - maximum_nights: '1125', - cancellation_policy: 'moderate', - last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - first_review: { - $date: '2016-08-13T04:00:00.000Z', - }, - last_review: { - $date: '2019-01-05T05:00:00.000Z', - }, - accommodates: 1, - bedrooms: 1, - beds: 1, - number_of_reviews: 10, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Elevator', - 'Buzzer/wireless intercom', - 'Heating', - 'Washer', - 'Essentials', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Bed linens', - 'Extra pillows and blankets', - ], - price: { - $numberDecimal: '80.00', - }, - security_deposit: { - $numberDecimal: '100.00', - }, - cleaning_fee: { - $numberDecimal: '50.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/84254dd0-e266-4345-afcc-e8f7c56f4634.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '54761069', - host_url: 'https://www.airbnb.com/users/show/54761069', - host_name: 'Erika', - host_location: 'New York, New York, United States', - host_about: '', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/8f1942a1-dde8-4733-aff6-5971a0678594.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/8f1942a1-dde8-4733-aff6-5971a0678594.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Harlem', - host_response_rate: 100, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['email', 'phone', 'facebook', 'reviews', 'kba'], - }, - address: { - street: 'New York, NY, United States', - suburb: 'Manhattan', - government_area: 'Harlem', - market: 'New York', - country: 'United States', - country_code: 'US', - location: { - type: 'Point', - coordinates: [-73.95211, 40.80708], - is_location_exact: true, - }, - }, - availability: { - availability_30: 5, - availability_60: 35, - availability_90: 65, - availability_365: 339, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 10, - review_scores_rating: 100, - }, - }, - { - _id: '10228731', - listing_url: 'https://www.airbnb.com/rooms/10228731', - name: 'Quarto inteiro na Tijuca', - notes: '', - property_type: 'Apartment', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '15', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - first_review: { - $date: '2016-05-26T04:00:00.000Z', - }, - last_review: { - $date: '2016-05-26T04:00:00.000Z', - }, - accommodates: 1, - bedrooms: 1, - beds: 1, - number_of_reviews: 1, - bathrooms: { - $numberDecimal: '2.0', - }, - amenities: [ - 'Internet', - 'Wifi', - 'Kitchen', - 'Free parking on premises', - 'Family/kid friendly', - 'Washer', - ], - price: { - $numberDecimal: '149.00', - }, - cleaning_fee: { - $numberDecimal: '30.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/de6ab94d-9bcb-4f57-80f6-388aeaaa89c6.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '12673423', - host_url: 'https://www.airbnb.com/users/show/12673423', - host_name: 'Gilberto', - host_location: 'Rio, Rio de Janeiro, Brazil', - host_about: - 'I am a retired chemist from glass-tubing manufacturing segment that actually is enjoying life through his granddaughters Flora and Ana, as well as has emphasized to contact friends all over the world, offering my apartment to receive some friends all over the world to take some nice time.\r\n ', - host_thumbnail_url: - 'https://a0.muscache.com/im/users/12673423/profile_pic/1393616988/original.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/users/12673423/profile_pic/1393616988/original.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Tijuca', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 2, - host_total_listings_count: 2, - host_verifications: ['email', 'phone', 'reviews'], - }, - address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Tijuca', - government_area: 'Tijuca', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.247421907135774, -22.936203246553816], - is_location_exact: false, - }, - }, - availability: { - availability_30: 28, - availability_60: 58, - availability_90: 88, - availability_365: 178, - }, - review_scores: { - review_scores_accuracy: 8, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 10, - review_scores_rating: 100, - }, - }, - { - _id: '10295352', - listing_url: 'https://www.airbnb.com/rooms/10295352', - name: 'Amazing and Big Apt, Ipanema Beach.', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - accommodates: 6, - bedrooms: 3, - beds: 4, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '3.0', - }, - amenities: [ - 'Cable TV', - 'Wifi', - 'Air conditioning', - 'Wheelchair accessible', - 'Smoking allowed', - 'Doorman', - 'Elevator', - 'Buzzer/wireless intercom', - 'Family/kid friendly', - 'Washer', - 'Iron', - ], - price: { - $numberDecimal: '1999.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/3424f266-bc71-4847-a9da-c0b3bf95e4ff.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '52966539', - host_url: 'https://www.airbnb.com/users/show/52966539', - host_name: 'Pedro', - host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', - host_about: '', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/a327f115-a9e3-46fe-ad2e-58487b2d9639.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/a327f115-a9e3-46fe-ad2e-58487b2d9639.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['phone', 'facebook'], - }, - address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Ipanema', - government_area: 'Ipanema', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.20465630892734, -22.983108745795256], - is_location_exact: false, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: {}, - }, - { - _id: '102995', - listing_url: 'https://www.airbnb.com/rooms/102995', - name: 'UWS Brownstone Near Central Park', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '21', - maximum_nights: '30', - cancellation_policy: 'moderate', - last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - first_review: { - $date: '2011-05-29T04:00:00.000Z', - }, - last_review: { - $date: '2018-01-01T05:00:00.000Z', - }, - accommodates: 3, - bedrooms: 1, - beds: 3, - number_of_reviews: 45, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Buzzer/wireless intercom', - 'Heating', - 'Washer', - 'Dryer', - 'Smoke detector', - 'Carbon monoxide detector', - 'First aid kit', - 'Fire extinguisher', - 'Essentials', - '24-hour check-in', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'translation missing: en.hosting_amenity_49', - 'translation missing: en.hosting_amenity_50', - 'Private entrance', - ], - price: { - $numberDecimal: '212.00', - }, - weekly_price: { - $numberDecimal: '1702.00', - }, - monthly_price: { - $numberDecimal: '6000.00', - }, - security_deposit: { - $numberDecimal: '275.00', - }, - cleaning_fee: { - $numberDecimal: '120.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/1915586/9e2d0945_original.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '178043', - host_url: 'https://www.airbnb.com/users/show/178043', - host_name: 'Chas', - host_location: 'San Francisco, California, United States', - host_about: - "We live in San Francisco and spend time in New York as well. We also have another place in Northern California in the country we spend time at. I'm a private pilot and Paul is quite an accomplished ceramicist, though he does non-profit management consulting by profession. I run a retreat center ( (Website hidden by Airbnb) and am a computer consultant some of the time and real estate investor other times. We have a cat who stays at our house here in San Francisco when we travel. She is very, very affectionate and easy to care for. ", - host_response_time: 'within a day', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/ab609821-a596-4111-9ae9-1b6fdd919c74.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/ab609821-a596-4111-9ae9-1b6fdd919c74.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'The Castro', - host_response_rate: 95, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 4, - host_total_listings_count: 4, - host_verifications: [ - 'email', - 'phone', - 'facebook', - 'reviews', - 'jumio', - 'offline_government_id', - 'government_id', - 'work_email', - ], - }, - address: { - street: 'New York, NY, United States', - suburb: 'Upper West Side', - government_area: 'Upper West Side', - market: 'New York', - country: 'United States', - country_code: 'US', - location: { - type: 'Point', - coordinates: [-73.9696, 40.78558], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 3, - availability_90: 5, - availability_365: 5, - }, - review_scores: { - review_scores_accuracy: 9, - review_scores_cleanliness: 9, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 9, - review_scores_rating: 93, - }, - }, - { - _id: '10343118', - listing_url: 'https://www.airbnb.com/rooms/10343118', - name: 'Best location 1BR Apt in HK - Shops & Sights', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '60', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - first_review: { - $date: '2016-02-09T05:00:00.000Z', - }, - last_review: { - $date: '2019-02-06T05:00:00.000Z', - }, - accommodates: 4, - bedrooms: 1, - beds: 2, - number_of_reviews: 145, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Wheelchair accessible', - 'Kitchen', - 'Paid parking off premises', - 'Elevator', - 'Heating', - 'Family/kid friendly', - 'Smoke detector', - 'Carbon monoxide detector', - 'Fire extinguisher', - 'Essentials', - 'Shampoo', - '24-hour check-in', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Self check-in', - 'Lockbox', - 'Hot water', - ], - price: { - $numberDecimal: '997.00', - }, - security_deposit: { - $numberDecimal: '1000.00', - }, - cleaning_fee: { - $numberDecimal: '380.00', - }, - extra_people: { - $numberDecimal: '160.00', - }, - guests_included: { - $numberDecimal: '2', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/f0134013-7f06-457e-a0fc-5ecd294f43a0.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '2657469', - host_url: 'https://www.airbnb.com/users/show/2657469', - host_name: 'Simon', - host_location: 'Hong Kong', - host_about: - "Loves to travel and see the world. Over recent years, I've travelled to London, Amsterdam, Paris, LA, San Francisco, Taiwan, Shanghai, Beijing, Australia, India, Thailand, Singapore, Malaysia, and Korea. However, there is no place like home.\r\n\r\nThat is why I want to be a great host and have you enjoy your holiday. Welcome fellow travellers.", - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/6cb7aff2-5036-4846-91d8-56bd04d9302e.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/6cb7aff2-5036-4846-91d8-56bd04d9302e.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Tsim Sha Tsui', - host_response_rate: 98, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 17, - host_total_listings_count: 17, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'offline_government_id', - 'government_id', - ], - }, - address: { - street: 'Hong Kong, Kowloon, Hong Kong', - suburb: 'Tsim Sha Tsui', - government_area: 'Yau Tsim Mong', - market: 'Hong Kong', - country: 'Hong Kong', - country_code: 'HK', - location: { - type: 'Point', - coordinates: [114.17088, 22.29663], - is_location_exact: true, - }, - }, - availability: { - availability_30: 20, - availability_60: 50, - availability_90: 80, - availability_365: 170, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 9, - review_scores_rating: 94, - }, - }, - { - _id: '10411341', - listing_url: 'https://www.airbnb.com/rooms/10411341', - name: 'Beautiful flat with services', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '3', - maximum_nights: '1125', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - first_review: { - $date: '2016-01-15T05:00:00.000Z', - }, - last_review: { - $date: '2019-01-22T05:00:00.000Z', - }, - accommodates: 4, - bedrooms: 2, - beds: 2, - number_of_reviews: 32, - bathrooms: { - $numberDecimal: '2.0', - }, - amenities: [ - 'Cable TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Pool', - 'Kitchen', - 'Free parking on premises', - 'Smoking allowed', - 'Doorman', - 'Gym', - 'Elevator', - 'Hot tub', - 'Buzzer/wireless intercom', - 'Family/kid friendly', - 'Washer', - 'Dryer', - 'Essentials', - '24-hour check-in', - 'Hangers', - 'Iron', - 'Laptop friendly workspace', - 'Hot water', - 'Bed linens', - 'Microwave', - 'Refrigerator', - 'Dishes and silverware', - 'Oven', - 'Stove', - ], - price: { - $numberDecimal: '351.00', - }, - security_deposit: { - $numberDecimal: '500.00', - }, - cleaning_fee: { - $numberDecimal: '120.00', - }, - extra_people: { - $numberDecimal: '500.00', - }, - guests_included: { - $numberDecimal: '4', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/02d44d8f-9367-42a5-bf41-243aaea1f179.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '36696735', - host_url: 'https://www.airbnb.com/users/show/36696735', - host_name: 'Liliane', - host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', - host_about: '', - host_response_time: 'within a day', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/ef9dda14-3105-4819-b850-1255bd8500da.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/ef9dda14-3105-4819-b850-1255bd8500da.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Barra da Tijuca', - host_response_rate: 100, - host_is_superhost: true, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 2, - host_total_listings_count: 2, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'government_id', - ], - }, - address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Ipanema', - government_area: 'Ipanema', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.20577175003696, -22.982557305257775], - is_location_exact: false, - }, - }, - availability: { - availability_30: 3, - availability_60: 18, - availability_90: 41, - availability_365: 316, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 9, - review_scores_checkin: 9, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 9, - review_scores_rating: 95, - }, - }, - { - _id: '10458796', - listing_url: 'https://www.airbnb.com/rooms/10458796', - name: 'Homely Room in 5-Star New Condo@MTR', - notes: - "Just feel as home. We will give you all assistance. The 3rd guest is allowed to sleep on the sofa in the living room, and it's subject to an extra charge HK$250 per night.", - property_type: 'Condominium', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '28', - maximum_nights: '1125', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - first_review: { - $date: '2016-01-16T05:00:00.000Z', - }, - last_review: { - $date: '2017-08-31T04:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 179, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Wifi', - 'Air conditioning', - 'Pool', - 'Kitchen', - 'Gym', - 'Elevator', - 'Heating', - 'Family/kid friendly', - 'Smoke detector', - 'Carbon monoxide detector', - 'First aid kit', - 'Fire extinguisher', - 'Essentials', - 'Lock on bedroom door', - 'Hangers', - 'Hair dryer', - 'Laptop friendly workspace', - 'Hot water', - 'Bed linens', - 'Microwave', - 'Refrigerator', - 'Dishes and silverware', - 'Cooking basics', - 'Oven', - 'Stove', - 'Single level home', - 'Patio or balcony', - 'Luggage dropoff allowed', - 'Long term stays allowed', - 'Wide hallway clearance', - 'Step-free access', - 'Wide doorway', - 'Flat path to front door', - 'Well-lit path to entrance', - 'Step-free access', - 'Step-free access', - 'Step-free access', - 'Wide entryway', - 'Host greets you', - ], - price: { - $numberDecimal: '479.00', - }, - monthly_price: { - $numberDecimal: '10000.00', - }, - extra_people: { - $numberDecimal: '150.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/6c1b8132-6b6e-4b64-86e6-2fcb20dd5763.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '53247930', - host_url: 'https://www.airbnb.com/users/show/53247930', - host_name: 'Crystal', - host_location: 'Hong Kong', - host_about: '', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/9d8bd938-b44a-479d-84d2-2387aeeeab20.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/9d8bd938-b44a-479d-84d2-2387aeeeab20.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Mong Kok', - host_response_rate: 100, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 5, - host_total_listings_count: 5, - host_verifications: [ - 'email', - 'phone', - 'facebook', - 'google', - 'reviews', - 'jumio', - 'government_id', - ], - }, - address: { - street: 'Mongkok, Kowloon, Hong Kong', - suburb: 'Yau Tsim Mong', - government_area: 'Yau Tsim Mong', - market: 'Hong Kong', - country: 'Hong Kong', - country_code: 'HK', - location: { - type: 'Point', - coordinates: [114.17094, 22.32074], - is_location_exact: false, - }, - }, - availability: { - availability_30: 0, - availability_60: 3, - availability_90: 3, - availability_365: 3, - }, - review_scores: { - review_scores_accuracy: 9, - review_scores_cleanliness: 9, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 9, - review_scores_rating: 94, - }, - }, - { - _id: '10233856', - listing_url: 'https://www.airbnb.com/rooms/10233856', - name: 'Twin Bed room+MTR Mongkok shopping&My', - notes: - 'After check-in time is 14:00, check out time is 12:00 the next day (we need to do the cleaning after you check out, the room clean and ready for the next guest to stay), arrive early the day of arrival or check out we can offer free luggage service, luggage storage after check-out time is 18:00 pm the day before check-out. If you need to store your luggage after check-out storage than 18:00, we need extra charge. After our order book to confirm the order, we will after payment systems One How come our guesthouse specific routes sent to your mailbox. To store the same day directly to the shop to show identification registration word, to pay 200 yuan (HK $) check deposit you can check in. Before booking please note: our room once confirmed the order, which does not accept the changes can only be rescheduled according to unsubscribe from the implementation of policies to unsubscribe. ★ Our room photos are all on the ground to take pictures, but despite this, room photos are for reference ', - property_type: 'Apartment', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '500', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - first_review: { - $date: '2016-08-28T04:00:00.000Z', - }, - last_review: { - $date: '2018-07-12T04:00:00.000Z', - }, - accommodates: 3, - bedrooms: 1, - beds: 2, - number_of_reviews: 22, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Wifi', - 'Air conditioning', - 'Doorman', - 'Elevator', - 'Family/kid friendly', - 'Smoke detector', - 'Essentials', - 'Lock on bedroom door', - 'Hangers', - 'Hair dryer', - ], - price: { - $numberDecimal: '400.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/06185984-3faf-4967-8d6d-e24304d0f572.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '52473150', - host_url: 'https://www.airbnb.com/users/show/52473150', - host_name: 'Danny', - host_location: 'Hong Kong', - host_about: - '每次旅行都是一种到达别人家做客的体验。自己有好几处单位,住不了那么多,多半出租,我是位非常好客的人,也是很喜欢旅行!不管你是商务出差还是旅游度假,来我家住吧,很高兴能和你成为好朋友!给你们的旅行一个安全干净舒适实惠的居住环境。\r\nP.S:如你订好,请留个言给我~O(∩_∩)O谢谢~(Complete payment, please leave a message ~)\r\nDuring the period of stay: if you are not Chinese, please leave a message directly to me, you need to, immediately to make arrangements for your service\r\n可以加我 (Hidden by Airbnb) (You can add me (Hidden by Airbnb) \r\n)ID: (Phone number hidden by Airbnb)', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/13dcc152-382c-43ac-9933-c241ae596c3a.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/13dcc152-382c-43ac-9933-c241ae596c3a.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Mong Kok', - host_response_rate: 97, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 29, - host_total_listings_count: 29, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'offline_government_id', - 'selfie', - 'government_id', - 'identity_manual', - ], - }, - address: { - street: 'Hong Kong, Kowloon, Hong Kong', - suburb: 'Mong Kok', - government_area: 'Yau Tsim Mong', - market: 'Hong Kong', - country: 'Hong Kong', - country_code: 'HK', - location: { - type: 'Point', - coordinates: [114.17073, 22.31723], - is_location_exact: true, - }, - }, - availability: { - availability_30: 30, - availability_60: 60, - availability_90: 90, - availability_365: 145, - }, - review_scores: { - review_scores_accuracy: 8, - review_scores_cleanliness: 9, - review_scores_checkin: 9, - review_scores_communication: 9, - review_scores_location: 10, - review_scores_value: 9, - review_scores_rating: 83, - }, - }, - { - _id: '10471178', - listing_url: 'https://www.airbnb.com/rooms/10471178', - name: 'Rented Room', - notes: '', - property_type: 'Apartment', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - accommodates: 1, - bedrooms: 1, - beds: 1, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'Wifi', - 'Kitchen', - 'Doorman', - 'Elevator', - 'Buzzer/wireless intercom', - 'Dryer', - 'Essentials', - 'Lock on bedroom door', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - ], - price: { - $numberDecimal: '112.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/fc7aaab6-23fd-44ca-8dfe-ed794fef1c3a.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '53957975', - host_url: 'https://www.airbnb.com/users/show/53957975', - host_name: 'Jercilene', - host_location: 'São Gonçalo, Rio de Janeiro, Brazil', - host_about: '', - host_response_time: 'a few days or more', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/191ca5bb-275c-4bf4-8c2c-1ed3b343a892.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/191ca5bb-275c-4bf4-8c2c-1ed3b343a892.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_response_rate: 0, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['email', 'phone', 'facebook', 'google'], - }, - address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Botafogo', - government_area: 'Botafogo', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.17933175178738, -22.941321220162784], - is_location_exact: false, - }, - }, - availability: { - availability_30: 30, - availability_60: 60, - availability_90: 90, - availability_365: 365, - }, - review_scores: {}, - }, - { - _id: '10267144', - listing_url: 'https://www.airbnb.com/rooms/10267144', - name: 'IPANEMA LUXURY PENTHOUSE with MAID', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - first_review: { - $date: '2016-12-04T05:00:00.000Z', - }, - last_review: { - $date: '2018-12-12T05:00:00.000Z', - }, - accommodates: 3, - bedrooms: 1, - beds: 1, - number_of_reviews: 29, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Pool', - 'Kitchen', - 'Smoking allowed', - 'Doorman', - 'Breakfast', - 'Elevator', - 'Free street parking', - 'Washer', - 'First aid kit', - 'Essentials', - 'Shampoo', - '24-hour check-in', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Hot water', - 'Luggage dropoff allowed', - 'Long term stays allowed', - 'Host greets you', - ], - price: { - $numberDecimal: '858.00', - }, - security_deposit: { - $numberDecimal: '1865.00', - }, - cleaning_fee: { - $numberDecimal: '112.00', - }, - extra_people: { - $numberDecimal: '112.00', - }, - guests_included: { - $numberDecimal: '3', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/5d83827b-eb4f-4bfe-9075-1dc553a2c1a9.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '4428126', - host_url: 'https://www.airbnb.com/users/show/4428126', - host_name: 'Cesar', - host_location: 'Rio de Janeiro, Rio de Janeiro, Brazil', - host_about: - 'Eu sou Designer, adoro viajar e adoro os finais de tarde na praia em Ipanema. \r\nSejam bem vindos ao Rio de Janeiro.\r\n\r\nI am objects designer and plastic artist and love travelling. I simply love hosting people! Welcome in Rio!', - host_response_time: 'within a few hours', - host_thumbnail_url: - 'https://a0.muscache.com/im/users/4428126/profile_pic/1355775586/original.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/users/4428126/profile_pic/1355775586/original.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Ipanema', - host_response_rate: 93, - host_is_superhost: true, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 3, - host_total_listings_count: 3, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'manual_offline', - 'jumio', - 'offline_government_id', - 'government_id', - ], - }, - address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Ipanema', - government_area: 'Ipanema', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.20056249420509, -22.98034625363379], - is_location_exact: true, - }, - }, - availability: { - availability_30: 18, - availability_60: 40, - availability_90: 70, - availability_365: 345, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 10, - review_scores_rating: 99, - }, - }, - { - _id: '1042446', - listing_url: 'https://www.airbnb.com/rooms/1042446', - name: 'March 2019 availability! Oceanview on Sugar Beach!', - notes: - 'NIGHTLY RATE INCLUDES ALL TAXES! The Kealia Resort is next to Sugar Beach Resort on the north side. The address is 191 N. Kihei Rd.', - property_type: 'Condominium', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '4', - maximum_nights: '1125', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - first_review: { - $date: '2015-04-28T04:00:00.000Z', - }, - last_review: { - $date: '2019-01-10T05:00:00.000Z', - }, - accommodates: 4, - bedrooms: 1, - beds: 3, - number_of_reviews: 19, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Pool', - 'Kitchen', - 'Free parking on premises', - 'Elevator', - 'Family/kid friendly', - 'Washer', - 'Dryer', - 'Smoke detector', - 'Essentials', - '24-hour check-in', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Self check-in', - 'Keypad', - 'Hot water', - ], - price: { - $numberDecimal: '229.00', - }, - cleaning_fee: { - $numberDecimal: '95.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/15715315/c1bba2c8_original.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '5738969', - host_url: 'https://www.airbnb.com/users/show/5738969', - host_name: 'Gage', - host_location: 'US', - host_about: '', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/users/5738969/profile_pic/1365017015/original.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/users/5738969/profile_pic/1365017015/original.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Maui', - host_response_rate: 100, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['email', 'phone', 'reviews'], - }, - address: { - street: 'Kihei, HI, United States', - suburb: 'Maui', - government_area: 'Kihei-Makena', - market: 'Maui', - country: 'United States', - country_code: 'US', - location: { - type: 'Point', - coordinates: [-156.46881, 20.78621], - is_location_exact: true, - }, - }, - availability: { - availability_30: 5, - availability_60: 26, - availability_90: 35, - availability_365: 228, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 9, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 9, - review_scores_rating: 94, - }, - }, - { - _id: '10306879', - listing_url: 'https://www.airbnb.com/rooms/10306879', - name: 'Alugo Apart frente mar Barra Tijuca', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '10', - maximum_nights: '90', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - accommodates: 4, - bedrooms: 1, - beds: 2, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Wifi', - 'Air conditioning', - 'Pool', - 'Kitchen', - 'Free parking on premises', - 'Pets allowed', - 'Doorman', - 'Gym', - 'Elevator', - 'Hot tub', - 'Buzzer/wireless intercom', - 'Family/kid friendly', - 'Washer', - 'Dryer', - 'Hangers', - 'Iron', - 'Laptop friendly workspace', - ], - price: { - $numberDecimal: '933.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/86a84e4e-9792-461d-8bd7-452b598becab.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '53027036', - host_url: 'https://www.airbnb.com/users/show/53027036', - host_name: 'Paulo Cesar', - host_location: 'BR', - host_about: '', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/be252b6f-f1f4-4684-9763-3f950d4422c9.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/be252b6f-f1f4-4684-9763-3f950d4422c9.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Barra da Tijuca', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['email', 'phone'], - }, - address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Barra da Tijuca', - government_area: 'Barra da Tijuca', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.36831676949888, -23.011117008024065], - is_location_exact: true, - }, - }, - availability: { - availability_30: 28, - availability_60: 58, - availability_90: 88, - availability_365: 363, - }, - review_scores: {}, - }, - { - _id: '10317142', - listing_url: 'https://www.airbnb.com/rooms/10317142', - name: 'Private OceanFront - Bathtub Beach. Spacious House', - notes: '', - property_type: 'House', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '3', - maximum_nights: '1125', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - first_review: { - $date: '2016-01-24T05:00:00.000Z', - }, - last_review: { - $date: '2019-02-19T05:00:00.000Z', - }, - accommodates: 14, - bedrooms: 4, - beds: 10, - number_of_reviews: 32, - bathrooms: { - $numberDecimal: '4.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Wheelchair accessible', - 'Kitchen', - 'Free parking on premises', - 'Family/kid friendly', - 'Suitable for events', - 'Washer', - 'Dryer', - 'Smoke detector', - 'Essentials', - '24-hour check-in', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Beachfront', - ], - price: { - $numberDecimal: '795.00', - }, - security_deposit: { - $numberDecimal: '1000.00', - }, - cleaning_fee: { - $numberDecimal: '345.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/71635659-be9e-4860-90ed-312f37e641c2.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '53086419', - host_url: 'https://www.airbnb.com/users/show/53086419', - host_name: 'Noah', - host_location: 'Laie, Hawaii, United States', - host_about: '', - host_response_time: 'within a day', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/d93c44f5-2b60-4251-a90b-fb71d66e7946.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/d93c44f5-2b60-4251-a90b-fb71d66e7946.jpg?aki_policy=profile_x_medium', - host_neighbourhood: "Ko'olauloa", - host_response_rate: 50, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'offline_government_id', - 'government_id', - ], - }, - address: { - street: 'Laie, HI, United States', - suburb: "Ko'olauloa", - government_area: 'Koolauloa', - market: 'Oahu', - country: 'United States', - country_code: 'US', - location: { - type: 'Point', - coordinates: [-157.91952, 21.63549], - is_location_exact: true, - }, - }, - availability: { - availability_30: 10, - availability_60: 17, - availability_90: 26, - availability_365: 229, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 9, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 10, - review_scores_rating: 94, - }, - }, - { - _id: '10324377', - listing_url: 'https://www.airbnb.com/rooms/10324377', - name: 'Suíte em local tranquilo e seguro', - notes: '', - property_type: 'House', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'moderate', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - accommodates: 1, - bedrooms: 1, - beds: 1, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'Cable TV', - 'Internet', - 'Wifi', - 'Pool', - 'Kitchen', - 'Free parking on premises', - 'Smoking allowed', - 'Buzzer/wireless intercom', - 'Lock on bedroom door', - 'Iron', - 'Laptop friendly workspace', - ], - price: { - $numberDecimal: '101.00', - }, - security_deposit: { - $numberDecimal: '400.00', - }, - cleaning_fee: { - $numberDecimal: '100.00', - }, - extra_people: { - $numberDecimal: '50.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/bffd61db-ade5-458f-a40d-9603fc70acaa.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '53127432', - host_url: 'https://www.airbnb.com/users/show/53127432', - host_name: 'Renato', - host_location: 'Brazil', - host_about: '', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/7425fcc7-1d9b-4a3d-acd2-d05a9756372e.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/7425fcc7-1d9b-4a3d-acd2-d05a9756372e.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_response_rate: 100, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 7, - host_total_listings_count: 7, - host_verifications: ['email', 'phone', 'facebook', 'reviews'], - }, - address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: '', - government_area: 'Anil', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.33496705036137, -22.948365490450556], - is_location_exact: true, - }, - }, - availability: { - availability_30: 22, - availability_60: 52, - availability_90: 82, - availability_365: 357, - }, - review_scores: {}, - }, - { - _id: '10373872', - listing_url: 'https://www.airbnb.com/rooms/10373872', - name: 'Apartamento Mobiliado - Lgo do Machado', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '30', - maximum_nights: '365', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - accommodates: 4, - bedrooms: 1, - beds: 2, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Pool', - 'Kitchen', - 'Free parking on premises', - 'Doorman', - 'Gym', - 'Elevator', - 'Buzzer/wireless intercom', - 'Family/kid friendly', - 'Washer', - 'Dryer', - 'Essentials', - '24-hour check-in', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Self check-in', - 'Building staff', - 'Hot water', - 'Luggage dropoff allowed', - 'Long term stays allowed', - ], - price: { - $numberDecimal: '149.00', - }, - security_deposit: { - $numberDecimal: '1000.00', - }, - cleaning_fee: { - $numberDecimal: '60.00', - }, - extra_people: { - $numberDecimal: '40.00', - }, - guests_included: { - $numberDecimal: '2', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/cddd4ce4-1936-4417-9fbb-dfcc557d7bc2.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '15152328', - host_url: 'https://www.airbnb.com/users/show/15152328', - host_name: 'Marcelo', - host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', - host_about: 'Engenheiro, casado com 3 filhos', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/users/15152328/profile_pic/1400556199/original.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/users/15152328/profile_pic/1400556199/original.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Catete', - host_response_rate: 100, - host_is_superhost: true, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 7, - host_total_listings_count: 7, - host_verifications: [ - 'email', - 'phone', - 'google', - 'reviews', - 'jumio', - 'government_id', - 'work_email', - ], - }, - address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Catete', - government_area: 'Catete', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.178886292069244, -22.931715899178695], - is_location_exact: false, - }, - }, - availability: { - availability_30: 0, - availability_60: 11, - availability_90: 41, - availability_365: 316, - }, - review_scores: {}, - }, - { - _id: '10431455', - listing_url: 'https://www.airbnb.com/rooms/10431455', - name: 'Sala e quarto em copacabana com cozinha americana', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '4', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - accommodates: 3, - bedrooms: 1, - beds: 1, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Smoking allowed', - 'Pets allowed', - 'Doorman', - 'Elevator', - 'Buzzer/wireless intercom', - 'Family/kid friendly', - 'Washer', - 'Fire extinguisher', - 'Essentials', - 'Shampoo', - '24-hour check-in', - 'Laptop friendly workspace', - 'translation missing: en.hosting_amenity_50', - ], - price: { - $numberDecimal: '298.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/64170e2a-2baa-4803-890b-984e416cb406.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '53729453', - host_url: 'https://www.airbnb.com/users/show/53729453', - host_name: 'Tamara', - host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', - host_about: '', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/139d850f-6c96-4154-b98d-785c0bbdb5b8.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/139d850f-6c96-4154-b98d-785c0bbdb5b8.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Copacabana', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'jumio', - 'offline_government_id', - 'government_id', - ], - }, - address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Copacabana', - government_area: 'Copacabana', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.177948896979196, -22.963149303022142], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: {}, - }, - { - _id: '10486984', - listing_url: 'https://www.airbnb.com/rooms/10486984', - name: 'Cheerful new renovated central apt', - notes: - 'From/To Airports: There are several ways to get from the airport to the apartment, but the most convenient manner is to take “HAVATAŞ" shuttle to Taksim Square departing every 30 minutes from the airport (from both airports- Atatürk and Sabiha Gökçen). As you may be unfamiliar with the area, I am happy to come and pick you up in front of Galatasaray Highschool (on Istiklal Street) which is 10 minutes walk from Taksim Square where you will get off. I can always advise you cheaper public transport options if you ask for. Useful information: You can rent the apartment/room for (a) day(s), week, month or longer periods of time. There is various supermarkets conveniently situated a block away from the apartment on the way to Istiklal street, also a small kiosk right next to the apartment and a laundry in 100 meters distance.', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '3', - maximum_nights: '1125', - cancellation_policy: 'moderate', - last_scraped: { - $date: '2019-02-18T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-18T05:00:00.000Z', - }, - first_review: { - $date: '2016-04-24T04:00:00.000Z', - }, - last_review: { - $date: '2019-02-10T05:00:00.000Z', - }, - accommodates: 8, - bedrooms: 3, - beds: 4, - number_of_reviews: 77, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Paid parking off premises', - 'Heating', - 'Family/kid friendly', - 'Suitable for events', - 'Washer', - 'First aid kit', - 'Fire extinguisher', - 'Essentials', - 'Shampoo', - '24-hour check-in', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Crib', - 'Hot water', - 'Bed linens', - 'Extra pillows and blankets', - 'Long term stays allowed', - 'Step-free access', - 'Host greets you', - ], - price: { - $numberDecimal: '264.00', - }, - security_deposit: { - $numberDecimal: '0.00', - }, - cleaning_fee: { - $numberDecimal: '0.00', - }, - extra_people: { - $numberDecimal: '36.00', - }, - guests_included: { - $numberDecimal: '4', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/3eaf428d-d244-4985-b083-4780ece4ca5a.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '22766460', - host_url: 'https://www.airbnb.com/users/show/22766460', - host_name: 'Aybike', - host_location: 'Istanbul, İstanbul, Turkey', - host_about: - 'My name is Aybike. I love to travel, to discover new places and to meet new people. I will be glad to hosting you in Istanbul at my place. My apartment is newly renovated, clean, cosy, comfortable, large enough for 8 people and is situated literally at the heart of Istanbul. As a traveller my wish is to make you feel at home; drink your morning coffee while listening to the sound of Istanbul then take your map, jump into the street with friendly neighbourhood, and enjoy the city with walking, exploring, watching, reading and hearing. I know how it is important to be able to feel the city you are visiting from my experiences. So if you are looking for a place where you really want to taste the chaos with harmony like a real Istanbuller you are very welcome to stay in my apartment.\r\n', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/user/e87810d6-0d69-4187-8862-cc6f9e2fe8ca.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/user/e87810d6-0d69-4187-8862-cc6f9e2fe8ca.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_response_rate: 100, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'facebook', - 'reviews', - 'jumio', - 'government_id', - ], - }, - address: { - street: 'Beyoğlu, İstanbul, Turkey', - suburb: 'Beyoglu', - government_area: 'Beyoglu', - market: 'Istanbul', - country: 'Turkey', - country_code: 'TR', - location: { - type: 'Point', - coordinates: [28.97477, 41.03735], - is_location_exact: false, - }, - }, - availability: { - availability_30: 18, - availability_60: 29, - availability_90: 51, - availability_365: 326, - }, - review_scores: { - review_scores_accuracy: 9, - review_scores_cleanliness: 9, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 9, - review_scores_value: 9, - review_scores_rating: 94, - }, - }, - { - _id: '10487917', - listing_url: 'https://www.airbnb.com/rooms/10487917', - name: 'Heroísmo IV', - notes: - 'In the apartment you will find everything you need to spend a few pleasant days with all the confort. Accommodate 2 people, fully equipped kitchenette with all the utensils, oven, stove, refrigerator, microwave, extractor. Plates, cups and cutlery available. Sheets, duvet, pillows and towels available. The bedroom has a very comfortable double bed with 2,00 x 1,60 mt.', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'moderate', - last_scraped: { - $date: '2019-02-16T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-16T05:00:00.000Z', - }, - first_review: { - $date: '2016-02-06T05:00:00.000Z', - }, - last_review: { - $date: '2018-10-22T04:00:00.000Z', - }, - accommodates: 2, - bedrooms: 0, - beds: 1, - number_of_reviews: 31, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Kitchen', - 'Free street parking', - 'Heating', - 'First aid kit', - 'Safety card', - 'Fire extinguisher', - 'Essentials', - 'Shampoo', - '24-hour check-in', - 'Hangers', - 'Hair dryer', - 'translation missing: en.hosting_amenity_49', - 'translation missing: en.hosting_amenity_50', - 'Room-darkening shades', - 'Hot water', - 'Bed linens', - 'Extra pillows and blankets', - 'Microwave', - 'Refrigerator', - 'Dishes and silverware', - 'Cooking basics', - 'Stove', - 'Single level home', - 'Long term stays allowed', - 'Host greets you', - 'Handheld shower head', - ], - price: { - $numberDecimal: '29.00', - }, - security_deposit: { - $numberDecimal: '0.00', - }, - cleaning_fee: { - $numberDecimal: '10.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '2', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/c2d2ddfd-bcbc-47fa-8118-31c041fee36d.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '9320470', - host_url: 'https://www.airbnb.com/users/show/9320470', - host_name: 'Apartments2Enjoy', - host_location: 'Porto, Porto District, Portugal', - host_about: - "Welcome!\r\nThe apartments has all the things to provide you a perfect days in Porto. It is located in a very central area, inside a typical oporto building. \r\nI will give you lots of informations about Porto, my personal tips, and I'll always be available to help you with anything. All I want is for you to go home knowing Porto and inevitably loving the city! :)\r\n\r\n", - host_response_time: 'within a day', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/f3e85f0c-e28d-4698-9da9-2f203aea1f3d.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/f3e85f0c-e28d-4698-9da9-2f203aea1f3d.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_response_rate: 100, - host_is_superhost: true, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 9, - host_total_listings_count: 9, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'government_id', - ], - }, - address: { - street: 'Porto, Porto, Portugal', - suburb: '', - government_area: 'Bonfim', - market: 'Porto', - country: 'Portugal', - country_code: 'PT', - location: { - type: 'Point', - coordinates: [-8.59275, 41.1462], - is_location_exact: true, - }, - }, - availability: { - availability_30: 16, - availability_60: 42, - availability_90: 61, - availability_365: 309, - }, - review_scores: { - review_scores_accuracy: 9, - review_scores_cleanliness: 9, - review_scores_checkin: 9, - review_scores_communication: 9, - review_scores_location: 9, - review_scores_value: 9, - review_scores_rating: 89, - }, - }, - { - _id: '10488837', - listing_url: 'https://www.airbnb.com/rooms/10488837', - name: 'Cozy House in Ortaköy', - notes: '', - property_type: 'Apartment', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-02-18T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-18T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 2, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'Internet', - 'Wifi', - 'Kitchen', - 'Smoking allowed', - 'Heating', - 'Family/kid friendly', - 'Washer', - 'Essentials', - 'Shampoo', - '24-hour check-in', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - ], - price: { - $numberDecimal: '100.00', - }, - cleaning_fee: { - $numberDecimal: '100.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/d94001ba-f4d6-4a9c-bb62-0e4df62589bf.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '53849209', - host_url: 'https://www.airbnb.com/users/show/53849209', - host_name: 'Orcun', - host_location: 'TR', - host_about: '', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/c4a0ffbc-881d-4076-9be9-4bc6d0c649fc.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/c4a0ffbc-881d-4076-9be9-4bc6d0c649fc.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Ortaköy', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['email', 'phone'], - }, - address: { - street: 'Beşiktaş, İstanbul, Turkey', - suburb: 'Beşiktaş', - government_area: 'Besiktas', - market: 'Istanbul', - country: 'Turkey', - country_code: 'TR', - location: { - type: 'Point', - coordinates: [29.02519, 41.05197], - is_location_exact: true, - }, - }, - availability: { - availability_30: 30, - availability_60: 60, - availability_90: 90, - availability_365: 365, - }, - review_scores: {}, - }, - { - _id: '10542174', - listing_url: 'https://www.airbnb.com/rooms/10542174', - name: 'Luxury 1-Bdrm in Downtown Brooklyn', - notes: - "When you're here, please do not tell the concierge or guests that you are an AirBNB guest. Tell them you are visiting a friend at the apartment if the topic comes up.", - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '3', - maximum_nights: '30', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - first_review: { - $date: '2016-02-21T05:00:00.000Z', - }, - last_review: { - $date: '2016-02-21T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 1, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Wheelchair accessible', - 'Kitchen', - 'Doorman', - 'Gym', - 'Elevator', - 'Buzzer/wireless intercom', - 'Heating', - 'Family/kid friendly', - 'Washer', - 'Dryer', - 'Smoke detector', - 'Carbon monoxide detector', - 'First aid kit', - 'Safety card', - 'Fire extinguisher', - 'Essentials', - 'Shampoo', - '24-hour check-in', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - ], - price: { - $numberDecimal: '144.00', - }, - security_deposit: { - $numberDecimal: '250.00', - }, - cleaning_fee: { - $numberDecimal: '150.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/418c69b1-a49a-468d-9ea9-870468e15670.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '10099253', - host_url: 'https://www.airbnb.com/users/show/10099253', - host_name: 'Ashley', - host_location: 'New York, New York, United States', - host_about: - "I'm an executive at a wellness company in New York City. Educated in Fashion at Parsons, I'm into fitness and nutrition. I've lived in the city since enrolling at Parsons in the late 90s.\r\n\r\nIf you're looking for restaurant reservations, boutique fitness studios, or things to do in the city, then just let me know what you're interested in. I'd love to offer some suggestions and help you have a wonderful stay in New York City.", - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/afca1b34-30e9-43c0-969b-7b9cf913cb8d.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/afca1b34-30e9-43c0-969b-7b9cf913cb8d.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Downtown Brooklyn', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['email', 'phone', 'jumio', 'government_id'], - }, - address: { - street: 'Brooklyn, NY, United States', - suburb: 'Fort Greene', - government_area: 'Fort Greene', - market: 'New York', - country: 'United States', - country_code: 'US', - location: { - type: 'Point', - coordinates: [-73.98102, 40.69406], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: {}, - }, - { - _id: '10581101', - listing_url: 'https://www.airbnb.com/rooms/10581101', - name: 'Grand apartment Sagrada Familia', - notes: - 'Please contact us to report your arrival time to Barcelona at least 24 hours before check-in, to organize your check-in correctly. Late check-in (after 20: 00h) is an extra cost of 30 euros to pay cash during check-in. It is requested not to make noises from 22:00. Tourist tax is not included in the price (0.75 € / night / adult, up to 7 nights) which is payable upon arrival.', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '1125', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-08T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-08T05:00:00.000Z', - }, - first_review: { - $date: '2016-03-30T04:00:00.000Z', - }, - last_review: { - $date: '2019-02-20T05:00:00.000Z', - }, - accommodates: 8, - bedrooms: 4, - beds: 6, - number_of_reviews: 77, - bathrooms: { - $numberDecimal: '2.0', - }, - amenities: [ - 'TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Paid parking off premises', - 'Smoking allowed', - 'Buzzer/wireless intercom', - 'Family/kid friendly', - 'Washer', - 'Dryer', - 'Essentials', - 'Shampoo', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Hot water', - 'Host greets you', - ], - price: { - $numberDecimal: '169.00', - }, - security_deposit: { - $numberDecimal: '200.00', - }, - cleaning_fee: { - $numberDecimal: '60.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '10', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/10d847ae-946f-459b-b019-5a07929fcaee.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '54320669', - host_url: 'https://www.airbnb.com/users/show/54320669', - host_name: 'Alexandra Y Juan', - host_location: 'Barcelona, Catalonia, Spain', - host_about: - 'Hola, \r\n\r\nSomos Alexandra y Juan dos amigos que estamos enamorados de Barcelona, nuestras pasiones son viajar y conocer gente por lo que nos encantaría compartir con vosotros nuestros espacios para que disfrutéis a vuestro gusto de toda la cultura, actualidad y diversidad de ofertas que la ciudad os ofrece.\r\nPara nosotros lo mas importante es que nuestros huéspedes puedan aprovechar al máximo su estancia en Barcelona, que viváis vuestra historia reflejada en rincones únicos de la ciudad y por supuesto nuestra mayor satisfacción es que os sintáis como en casa según lo que busquéis.\r\n\r\nHello, \r\n\r\nWe are Alexandra and Juan two friends who are in love with Barcelona, our passion is to travel and meet new people so we would love to share our spaces with you and that you can enjoy the culture, the present and the diversity of offers that the city has to offer. \r\nFor us the most important thing is that our guests can make the most of their stay in Barcelona, that you live our history full of unique places and of course our greatest satisfaction is that you feel as if you where at home according to what you are looking for.', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/user/3fceba9a-ce84-4841-88df-b699105119b4.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/user/3fceba9a-ce84-4841-88df-b699105119b4.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Vila de Gràcia', - host_response_rate: 100, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 12, - host_total_listings_count: 12, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'government_id', - 'work_email', - ], - }, - address: { - street: 'Barcelona, Catalunya, Spain', - suburb: 'el Fort Pienc', - government_area: 'el Fort Pienc', - market: 'Barcelona', - country: 'Spain', - country_code: 'ES', - location: { - type: 'Point', - coordinates: [2.18146, 41.39716], - is_location_exact: true, - }, - }, - availability: { - availability_30: 19, - availability_60: 32, - availability_90: 48, - availability_365: 211, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 9, - review_scores_checkin: 9, - review_scores_communication: 9, - review_scores_location: 9, - review_scores_value: 9, - review_scores_rating: 90, - }, - }, - { - _id: '10215858', - listing_url: 'https://www.airbnb.com/rooms/10215858', - name: 'Cozy Queen Guest Room&My', - notes: - 'After check-in time is 14:00, check out time is 12:00 the next day (we need to do the cleaning after you check out, the room clean and ready for the next guest to stay), arrive early the day of arrival or check out we can offer free luggage service, luggage storage after check-out time is 18:00 pm the day before check-out. If you need to store your luggage after check-out storage than 18:00, we need extra charge. After our order book to confirm the order, we will be unified payment after One specific route how come my family sent to your mailbox or leave a message Airbnb. To shop directly to the store that day to show identification registration word, to pay 200 yuan (HK $) of Check to Check deposit. Before booking please note: our room once confirmed the order, which does not accept the changes can only be rescheduled according to unsubscribe from the implementation of policies to unsubscribe. ★ Our room photos are all on the ground to take pictures, but despite this, room photos are ', - property_type: 'Apartment', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '500', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - first_review: { - $date: '2016-07-13T04:00:00.000Z', - }, - last_review: { - $date: '2018-11-06T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 9, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Wifi', - 'Air conditioning', - 'Doorman', - 'Elevator', - 'Family/kid friendly', - 'Smoke detector', - 'Essentials', - 'Lock on bedroom door', - 'Hangers', - 'Hair dryer', - ], - price: { - $numberDecimal: '330.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/9dbed061-0c71-4932-b19b-40a115c127f1.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '52473150', - host_url: 'https://www.airbnb.com/users/show/52473150', - host_name: 'Danny', - host_location: 'Hong Kong', - host_about: - '每次旅行都是一种到达别人家做客的体验。自己有好几处单位,住不了那么多,多半出租,我是位非常好客的人,也是很喜欢旅行!不管你是商务出差还是旅游度假,来我家住吧,很高兴能和你成为好朋友!给你们的旅行一个安全干净舒适实惠的居住环境。\r\nP.S:如你订好,请留个言给我~O(∩_∩)O谢谢~(Complete payment, please leave a message ~)\r\nDuring the period of stay: if you are not Chinese, please leave a message directly to me, you need to, immediately to make arrangements for your service\r\n可以加我 (Hidden by Airbnb) (You can add me (Hidden by Airbnb) \r\n)ID: (Phone number hidden by Airbnb)', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/13dcc152-382c-43ac-9933-c241ae596c3a.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/13dcc152-382c-43ac-9933-c241ae596c3a.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Mong Kok', - host_response_rate: 97, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 29, - host_total_listings_count: 29, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'offline_government_id', - 'selfie', - 'government_id', - 'identity_manual', - ], - }, - address: { - street: 'Hong Kong, Kowloon, Hong Kong', - suburb: 'Yau Tsim Mong', - government_area: 'Yau Tsim Mong', - market: 'Hong Kong', - country: 'Hong Kong', - country_code: 'HK', - location: { - type: 'Point', - coordinates: [114.17034, 22.31655], - is_location_exact: true, - }, - }, - availability: { - availability_30: 20, - availability_60: 50, - availability_90: 80, - availability_365: 135, - }, - review_scores: { - review_scores_accuracy: 8, - review_scores_cleanliness: 7, - review_scores_checkin: 9, - review_scores_communication: 8, - review_scores_location: 10, - review_scores_value: 8, - review_scores_rating: 73, - }, - }, - { - _id: '1022200', - listing_url: 'https://www.airbnb.com/rooms/1022200', - name: 'Kailua-Kona, Kona Coast II 2b condo', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '7', - maximum_nights: '7', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - first_review: { - $date: '2018-06-15T04:00:00.000Z', - }, - last_review: { - $date: '2018-06-15T04:00:00.000Z', - }, - accommodates: 6, - bedrooms: 2, - beds: 3, - number_of_reviews: 1, - bathrooms: { - $numberDecimal: '2.0', - }, - amenities: [ - 'Cable TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Pool', - 'Kitchen', - 'Free parking on premises', - 'Gym', - 'Family/kid friendly', - 'Washer', - 'Dryer', - ], - price: { - $numberDecimal: '135.00', - }, - weekly_price: { - $numberDecimal: '950.00', - }, - security_deposit: { - $numberDecimal: '200.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/15368256/7f973058_original.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '3393610', - host_url: 'https://www.airbnb.com/users/show/3393610', - host_name: 'Daniel', - host_location: 'Las Vegas, Nevada, United States', - host_about: - 'I am a general dentist practicing in Las Vegas for 7 years after practicing in San Jose, Ca for 30 years. I own this apartment in Rio de Janeiro. I live in the apartment when I visit.', - host_thumbnail_url: - 'https://a0.muscache.com/im/users/3393610/profile_pic/1346112640/original.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/users/3393610/profile_pic/1346112640/original.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Kailua/Kona', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'facebook', - 'reviews', - 'jumio', - 'kba', - 'government_id', - ], - }, - address: { - street: 'Kailua-Kona, HI, United States', - suburb: 'Kailua/Kona', - government_area: 'North Kona', - market: 'The Big Island', - country: 'United States', - country_code: 'US', - location: { - type: 'Point', - coordinates: [-155.96445, 19.5702], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 13, - availability_90: 43, - availability_365: 196, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 8, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 10, - review_scores_rating: 100, - }, - }, - { - _id: '10359729', - listing_url: 'https://www.airbnb.com/rooms/10359729', - name: '', - notes: '', - property_type: 'Apartment', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-02-18T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-18T05:00:00.000Z', - }, - accommodates: 4, - bedrooms: 1, - beds: 2, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'Internet', - 'Wifi', - 'Kitchen', - 'Smoking allowed', - 'Doorman', - 'Heating', - 'Washer', - 'First aid kit', - 'Essentials', - 'Shampoo', - 'Lock on bedroom door', - '24-hour check-in', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - ], - price: { - $numberDecimal: '105.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/5e2149f5-f226-42ce-aec8-fd9b38e72048.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '53319251', - host_url: 'https://www.airbnb.com/users/show/53319251', - host_name: 'Seda', - host_location: 'TR', - host_about: '', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/057451e6-db50-44f1-b58a-241ad20b294a.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/057451e6-db50-44f1-b58a-241ad20b294a.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['email', 'phone'], - }, - address: { - street: 'Istanbul, İstanbul, Turkey', - suburb: 'Beşiktaş', - government_area: 'Sariyer', - market: 'Istanbul', - country: 'Turkey', - country_code: 'TR', - location: { - type: 'Point', - coordinates: [29.05108, 41.08835], - is_location_exact: false, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: {}, - }, - { - _id: '10570041', - listing_url: 'https://www.airbnb.com/rooms/10570041', - name: 'Jardim Botânico Gourmet 2 bdroom', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '1125', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - first_review: { - $date: '2016-02-10T05:00:00.000Z', - }, - last_review: { - $date: '2018-10-15T04:00:00.000Z', - }, - accommodates: 6, - bedrooms: 2, - beds: 5, - number_of_reviews: 9, - bathrooms: { - $numberDecimal: '2.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Wifi', - 'Air conditioning', - 'Pool', - 'Kitchen', - 'Free parking on premises', - 'Pets allowed', - 'Gym', - 'Elevator', - 'Free street parking', - 'Family/kid friendly', - 'Washer', - 'Smoke detector', - 'Carbon monoxide detector', - 'First aid kit', - 'Fire extinguisher', - 'Essentials', - 'Shampoo', - 'Lock on bedroom door', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Self check-in', - 'Building staff', - 'Private living room', - 'Changing table', - 'Stair gates', - 'Children’s books and toys', - 'Window guards', - 'Babysitter recommendations', - 'Room-darkening shades', - 'Children’s dinnerware', - 'Hot water', - 'Bed linens', - 'Extra pillows and blankets', - 'Ethernet connection', - 'Microwave', - 'Coffee maker', - 'Refrigerator', - 'Dishes and silverware', - 'Cooking basics', - 'Oven', - 'Stove', - 'Patio or balcony', - 'Garden or backyard', - 'Beach essentials', - 'Luggage dropoff allowed', - 'Long term stays allowed', - ], - price: { - $numberDecimal: '395.00', - }, - weekly_price: { - $numberDecimal: '800.00', - }, - monthly_price: { - $numberDecimal: '2000.00', - }, - security_deposit: { - $numberDecimal: '1000.00', - }, - cleaning_fee: { - $numberDecimal: '300.00', - }, - extra_people: { - $numberDecimal: '35.00', - }, - guests_included: { - $numberDecimal: '4', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/860bf0f7-4a81-4c7b-a258-2ddef02b4b35.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '3665789', - host_url: 'https://www.airbnb.com/users/show/3665789', - host_name: 'Roberta (Beta) Gatti', - host_location: 'Rio de Janeiro, Rio de Janeiro, Brazil', - host_about: - 'Trabalho com locações de imóveis mobiliados há 7 anos e AMO ser HOST. \r\nValorizo o conforto acima de tudo e tenho satisfação em buscar meus hóspedes no aeroporto, ajudar com pequenas mudanças; indicar restaurantes ou planejar passeios. Posso ajudar no que for preciso! \nAlém de produtora de locações e mãe, faço trabalhos como curadora de arte e produzo a Organização Socio Cultural “VAGALUME O VERDE - VOV” cujo BLOCO de CARNAVAL desfila há 14 anos na Rua Jardim Botânico, sempre às terças-feiras de carnaval. \nO VOV nasceu no Horto Florestal e tem a sustentabilidade e preservação ambiental como diretrizes. Estudamos e pesquisamos diariamente como usar de maneira responsável o que a Natureza nos proporciona e deixar um LEGADO para gerações futuras. \nAlém de equipe de coleta seletiva, plantio de mudas para neutralização do impacto gerado pelo desfile (compensação ambiental), mão de obra local e reutilização de materiais, \nem 2013 Implementamos a norma de certificação da “ISO 20121- Gestão em Eventos Sustentáveis”. \nEm 2015, recebemos o prêmio Serpentina de Ouro, por melhor organização. Em 2019 vamos estrear nosso novo maestro com uma bateria inovadora e arrepiante. Vem!\n', - host_response_time: 'within a few hours', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/d60dd2bb-31f0-424a-b60e-c10796cec2cc.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/d60dd2bb-31f0-424a-b60e-c10796cec2cc.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_response_rate: 98, - host_is_superhost: true, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 18, - host_total_listings_count: 18, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'offline_government_id', - 'government_id', - ], - }, - address: { - street: 'Rio de Janeiro, RJ, Brazil', - suburb: 'Jardim Botânico', - government_area: 'Jardim Botânico', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.22076222600562, -22.96448811710617], - is_location_exact: false, - }, - }, - availability: { - availability_30: 17, - availability_60: 47, - availability_90: 77, - availability_365: 342, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 9, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 9, - review_scores_rating: 91, - }, - }, - { - _id: '10184012', - listing_url: 'https://www.airbnb.com/rooms/10184012', - name: 'Apto semi mobiliado', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 2, - beds: 2, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'Air conditioning', - 'Kitchen', - 'Free parking on premises', - 'Doorman', - 'Elevator', - 'Buzzer/wireless intercom', - 'Family/kid friendly', - 'Washer', - 'Essentials', - 'Hangers', - 'Iron', - ], - price: { - $numberDecimal: '380.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/7636a27c-6f18-41d4-b2ce-ecfa1e561451.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '52299431', - host_url: 'https://www.airbnb.com/users/show/52299431', - host_name: 'Ricardo', - host_location: 'BR', - host_about: '', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/675c6438-a5fe-4874-abbb-544270401e45.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/675c6438-a5fe-4874-abbb-544270401e45.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['email', 'phone'], - }, - address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Vila Isabel', - government_area: 'Vila Isabel', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.24277868091869, -22.915009354482486], - is_location_exact: false, - }, - }, - availability: { - availability_30: 30, - availability_60: 60, - availability_90: 90, - availability_365: 365, - }, - review_scores: {}, - }, - { - _id: '10166986', - listing_url: 'https://www.airbnb.com/rooms/10166986', - name: 'Resort-like living in Williamsburg', - notes: 'Accept only reservation for minimum 3 nights.', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '5', - maximum_nights: '1125', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - first_review: { - $date: '2016-01-01T05:00:00.000Z', - }, - last_review: { - $date: '2016-01-01T05:00:00.000Z', - }, - accommodates: 4, - bedrooms: 2, - beds: 2, - number_of_reviews: 1, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Wheelchair accessible', - 'Pool', - 'Kitchen', - 'Doorman', - 'Gym', - 'Elevator', - 'Hot tub', - 'Buzzer/wireless intercom', - 'Heating', - 'Family/kid friendly', - 'Washer', - 'Dryer', - 'Smoke detector', - 'Essentials', - '24-hour check-in', - 'Hangers', - 'Iron', - ], - price: { - $numberDecimal: '220.00', - }, - weekly_price: { - $numberDecimal: '1400.00', - }, - cleaning_fee: { - $numberDecimal: '25.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/e8e3a30b-a3e9-4925-88b2-d3977054be34.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '14461742', - host_url: 'https://www.airbnb.com/users/show/14461742', - host_name: 'Mohammed', - host_location: 'Paris, Île-de-France, France', - host_about: '', - host_thumbnail_url: - 'https://a0.muscache.com/im/users/14461742/profile_pic/1397899792/original.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/users/14461742/profile_pic/1397899792/original.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Williamsburg', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'government_id', - ], - }, - address: { - street: 'Brooklyn, NY, United States', - suburb: 'Williamsburg', - government_area: 'Williamsburg', - market: 'New York', - country: 'United States', - country_code: 'US', - location: { - type: 'Point', - coordinates: [-73.93869, 40.71552], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 8, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 10, - review_scores_rating: 100, - }, - }, - { - _id: '10213499', - listing_url: 'https://www.airbnb.com/rooms/10213499', - name: 'Great studio opp. Narrabeen Lake', - notes: - 'Kayak/stand-up paddle boards and more are available on the lake Great choice of restaurants within walking distance. And of course the choice of several of the beautiful patrolled Narrabeen beaches', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'moderate', - last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - first_review: { - $date: '2016-01-23T05:00:00.000Z', - }, - last_review: { - $date: '2019-01-06T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 0, - beds: 1, - number_of_reviews: 61, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Pool', - 'Kitchen', - 'Free parking on premises', - 'Pets live on this property', - 'Dog(s)', - 'Heating', - 'Washer', - 'First aid kit', - 'Essentials', - 'Shampoo', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Hot water', - 'Bed linens', - 'Extra pillows and blankets', - 'Ethernet connection', - ], - price: { - $numberDecimal: '117.00', - }, - security_deposit: { - $numberDecimal: '0.00', - }, - cleaning_fee: { - $numberDecimal: '0.00', - }, - extra_people: { - $numberDecimal: '20.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/cf11c8a8-a9e8-476b-bdad-98a3108c1ef5.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '634664', - host_url: 'https://www.airbnb.com/users/show/634664', - host_name: 'Tracy', - host_location: 'New South Wales, Australia', - host_about: '', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/9a934b26-9946-4261-aecf-7e707cc0782a.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/9a934b26-9946-4261-aecf-7e707cc0782a.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_response_rate: 100, - host_is_superhost: true, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['email', 'phone', 'reviews'], - }, - address: { - street: 'Narrabeen, NSW, Australia', - suburb: '', - government_area: 'Warringah', - market: 'Sydney', - country: 'Australia', - country_code: 'AU', - location: { - type: 'Point', - coordinates: [151.29792, -33.71472], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 25, - availability_365: 26, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 10, - review_scores_rating: 97, - }, - }, - { - _id: '10560325', - listing_url: 'https://www.airbnb.com/rooms/10560325', - name: 'Spacious and well located apartment', - notes: - 'The apartment is located in a strictly residential area, and silence should be kept after 10 pm. Although we love pets, here they are not welcome, not with prior consultation and approval, subject to an extra cleaning fee. No smoking in the apartment. The apartment is ideal for families and couples. It is located in a building and in a strictly residential area, and therefore requires care not to harm the other residents. So, to groups of friends who wish to rent you, I ask you to send detailed information about you, such as the name and profile of the (Hidden by Airbnb) of all travelers, and other information that allows us evaluate a suitability of the property to your needs. Thank you! Take care of the apartment and belongings with the same care that we have.', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '3', - maximum_nights: '1125', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-02-16T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-16T05:00:00.000Z', - }, - first_review: { - $date: '2016-03-30T04:00:00.000Z', - }, - last_review: { - $date: '2018-11-04T04:00:00.000Z', - }, - accommodates: 6, - bedrooms: 2, - beds: 3, - number_of_reviews: 20, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Kitchen', - 'Paid parking off premises', - 'Elevator', - 'Buzzer/wireless intercom', - 'Family/kid friendly', - 'Essentials', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Hot water', - 'Long term stays allowed', - 'Host greets you', - ], - price: { - $numberDecimal: '60.00', - }, - security_deposit: { - $numberDecimal: '200.00', - }, - cleaning_fee: { - $numberDecimal: '25.00', - }, - extra_people: { - $numberDecimal: '8.00', - }, - guests_included: { - $numberDecimal: '3', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/491297bc-cf3e-4f8c-b7f2-e5143c31b1c7.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '12870591', - host_url: 'https://www.airbnb.com/users/show/12870591', - host_name: 'Andre', - host_location: 'São Paulo, Brazil', - host_about: '', - host_response_time: 'within a day', - host_thumbnail_url: - 'https://a0.muscache.com/im/users/12870591/profile_pic/1394136948/original.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/users/12870591/profile_pic/1394136948/original.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Jardim Europa', - host_response_rate: 80, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 5, - host_total_listings_count: 5, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'government_id', - ], - }, - address: { - street: 'Porto, Porto, Portugal', - suburb: '', - government_area: 'Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória', - market: 'Porto', - country: 'Portugal', - country_code: 'PT', - location: { - type: 'Point', - coordinates: [-8.6114, 41.16093], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 16, - availability_90: 46, - availability_365: 314, - }, - review_scores: { - review_scores_accuracy: 9, - review_scores_cleanliness: 9, - review_scores_checkin: 10, - review_scores_communication: 9, - review_scores_location: 9, - review_scores_value: 9, - review_scores_rating: 89, - }, - }, - { - _id: '1058555', - listing_url: 'https://www.airbnb.com/rooms/1058555', - name: 'Nice Cosy Room In Taksim', - notes: '', - property_type: 'Apartment', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '3', - maximum_nights: '1125', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-02-18T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-18T05:00:00.000Z', - }, - first_review: { - $date: '2014-04-06T04:00:00.000Z', - }, - last_review: { - $date: '2018-12-23T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 31, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Heating', - 'Washer', - 'Essentials', - 'Shampoo', - ], - price: { - $numberDecimal: '105.00', - }, - cleaning_fee: { - $numberDecimal: '60.00', - }, - extra_people: { - $numberDecimal: '60.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/106769623/0bdfdc5d_original.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '5823933', - host_url: 'https://www.airbnb.com/users/show/5823933', - host_name: 'Nihat', - host_location: 'Istanbul', - host_about: - 'I live alone in Taksim area and i work at bar.\r\nI like meet new friends from all of the world.\r\nI like to Travel a lot ofcourse if i have free time :) East Asia , Sun , Sea , Sand , Movie :) ', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/user/6bf03261-e7ac-4e0e-8121-3828612bbb6a.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/user/6bf03261-e7ac-4e0e-8121-3828612bbb6a.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Cihangir', - host_response_rate: 100, - host_is_superhost: true, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 2, - host_total_listings_count: 2, - host_verifications: ['email', 'phone', 'facebook', 'reviews'], - }, - address: { - street: 'Taksim, Cihangir, Istanbul , Beyoğlu, Turkey', - suburb: 'Beyoglu', - government_area: 'Beyoglu', - market: 'Istanbul', - country: 'Turkey', - country_code: 'TR', - location: { - type: 'Point', - coordinates: [28.98648, 41.03376], - is_location_exact: true, - }, - }, - availability: { - availability_30: 23, - availability_60: 44, - availability_90: 74, - availability_365: 336, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 9, - review_scores_rating: 96, - }, - }, - { - _id: '10628126', - listing_url: 'https://www.airbnb.com/rooms/10628126', - name: 'Ribeira Smart Flat', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '1124', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-02-16T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-16T05:00:00.000Z', - }, - first_review: { - $date: '2016-03-15T04:00:00.000Z', - }, - last_review: { - $date: '2019-02-05T05:00:00.000Z', - }, - accommodates: 6, - bedrooms: 3, - beds: 3, - number_of_reviews: 132, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'Internet', - 'Wifi', - 'Kitchen', - 'Paid parking off premises', - 'Buzzer/wireless intercom', - 'Family/kid friendly', - 'Washer', - 'First aid kit', - 'Safety card', - 'Fire extinguisher', - 'Essentials', - 'Shampoo', - 'Hangers', - 'Hair dryer', - 'Hot water', - 'Bed linens', - 'Microwave', - 'Coffee maker', - 'Refrigerator', - 'Dishes and silverware', - 'Cooking basics', - 'Oven', - 'Stove', - 'Long term stays allowed', - 'Host greets you', - ], - price: { - $numberDecimal: '80.00', - }, - security_deposit: { - $numberDecimal: '700.00', - }, - cleaning_fee: { - $numberDecimal: '20.00', - }, - extra_people: { - $numberDecimal: '10.00', - }, - guests_included: { - $numberDecimal: '2', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/86179056/8f7f2c18_original.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '54662715', - host_url: 'https://www.airbnb.com/users/show/54662715', - host_name: 'Mathieu', - host_location: 'Porto, Porto District, Portugal', - host_about: - 'Originally from France, I have always been keen to discover new countries and cultures. I lived 2 years in Australia where I studied at the University of Southern Queensland. After that I headed back to Paris, thinking to settle down there. After some times I decided to change my life and landed in Porto. I have been living here since 2010.\r\nSince then, I did not manage to get back and got in love with Porto. The seagulls, the Douro and the amazing color of the sun set, will without a doubt, make you also fall in love with this beautiful city.\r\nMake sure that you check out the little guide! There is some nice place to visit!\r\n\r\n', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/user/c0ef722d-0a22-4552-98f9-6b80788b6319.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/user/c0ef722d-0a22-4552-98f9-6b80788b6319.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_response_rate: 100, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 4, - host_total_listings_count: 4, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'government_id', - ], - }, - address: { - street: 'Porto, Porto, Portugal', - suburb: '', - government_area: 'Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória', - market: 'Porto', - country: 'Portugal', - country_code: 'PT', - location: { - type: 'Point', - coordinates: [-8.61602, 41.14295], - is_location_exact: false, - }, - }, - availability: { - availability_30: 5, - availability_60: 25, - availability_90: 46, - availability_365: 214, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 9, - review_scores_rating: 92, - }, - }, - { - _id: '10354347', - listing_url: 'https://www.airbnb.com/rooms/10354347', - name: 'Room For Erasmus', - notes: '', - property_type: 'Apartment', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-02-18T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-18T05:00:00.000Z', - }, - first_review: { - $date: '2017-12-27T05:00:00.000Z', - }, - last_review: { - $date: '2017-12-27T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 2, - beds: 2, - number_of_reviews: 1, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Kitchen', - 'Free parking on premises', - 'Smoking allowed', - 'Doorman', - 'Elevator', - 'Heating', - 'Family/kid friendly', - 'Suitable for events', - 'Washer', - 'Dryer', - 'Essentials', - '24-hour check-in', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Private living room', - 'Hot water', - 'Host greets you', - ], - price: { - $numberDecimal: '37.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/71d16486-b63a-4407-959e-746fee61b61d.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '53288729', - host_url: 'https://www.airbnb.com/users/show/53288729', - host_name: 'Kemal', - host_location: 'TR', - host_about: '', - host_response_time: 'within a day', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/c658d62a-2598-4ff7-80a0-633ba0bdd619.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/c658d62a-2598-4ff7-80a0-633ba0bdd619.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_response_rate: 100, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['email', 'phone', 'reviews'], - }, - address: { - street: 'Şişli, İstanbul, Turkey', - suburb: 'Kadıköy', - government_area: 'Kadikoy', - market: 'Istanbul', - country: 'Turkey', - country_code: 'TR', - location: { - type: 'Point', - coordinates: [29.06064, 40.98837], - is_location_exact: false, - }, - }, - availability: { - availability_30: 30, - availability_60: 60, - availability_90: 90, - availability_365: 365, - }, - review_scores: {}, - }, - { - _id: '10383490', - listing_url: 'https://www.airbnb.com/rooms/10383490', - name: 'Quarto Taquara - Jacarepaguá', - notes: '', - property_type: 'Apartment', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '1125', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - first_review: { - $date: '2016-05-16T04:00:00.000Z', - }, - last_review: { - $date: '2016-05-16T04:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 1, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'Cable TV', - 'Wifi', - 'Kitchen', - 'Smoking allowed', - 'Elevator', - 'Buzzer/wireless intercom', - 'Family/kid friendly', - 'Washer', - 'Essentials', - 'Lock on bedroom door', - '24-hour check-in', - 'Iron', - 'Laptop friendly workspace', - 'translation missing: en.hosting_amenity_50', - ], - price: { - $numberDecimal: '101.00', - }, - weekly_price: { - $numberDecimal: '350.00', - }, - monthly_price: { - $numberDecimal: '600.00', - }, - security_deposit: { - $numberDecimal: '128.00', - }, - cleaning_fee: { - $numberDecimal: '120.00', - }, - extra_people: { - $numberDecimal: '20.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/f5e96547-9b65-4b6b-a404-8824f01cc165.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '3026612', - host_url: 'https://www.airbnb.com/users/show/3026612', - host_name: 'Luana', - host_location: 'Rio de Janeiro, Rio de Janeiro, Brazil', - host_about: - 'Carioca, profissional de marketing, maquiadora e que ama viajar, conhecer lugares, culturas e pessoas! ', - host_response_time: 'a few days or more', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/ef5a70f4-27ad-4377-b5c6-90483ed8ac91.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/ef5a70f4-27ad-4377-b5c6-90483ed8ac91.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_response_rate: 0, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 2, - host_total_listings_count: 2, - host_verifications: ['email', 'phone', 'reviews', 'work_email'], - }, - address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: '', - government_area: 'Tanque', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.37035220190699, -22.91636184358952], - is_location_exact: true, - }, - }, - availability: { - availability_30: 30, - availability_60: 60, - availability_90: 90, - availability_365: 365, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 10, - review_scores_rating: 100, - }, - }, - { - _id: '10423504', - listing_url: 'https://www.airbnb.com/rooms/10423504', - name: 'Bondi Beach Dreaming 3-Bed House', - notes: - 'Please nominate the correct number of guests before you arrive. There are extra charges for extra guests and if you do not declare guests I will make a resolution request to Airbnb and review you accordingly. Please note we have friendly neighbours and a security camera at the front gate.', - property_type: 'House', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '1125', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - first_review: { - $date: '2016-01-30T05:00:00.000Z', - }, - last_review: { - $date: '2018-11-11T05:00:00.000Z', - }, - accommodates: 8, - bedrooms: 3, - beds: 6, - number_of_reviews: 139, - bathrooms: { - $numberDecimal: '2.0', - }, - amenities: [ - 'TV', - 'Internet', - 'Wifi', - 'Kitchen', - 'Free parking on premises', - 'Paid parking off premises', - 'Smoking allowed', - 'Pets allowed', - 'Indoor fireplace', - 'Heating', - 'Family/kid friendly', - 'Washer', - 'Dryer', - 'Smoke detector', - 'Essentials', - 'Shampoo', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Self check-in', - 'Lockbox', - 'Private entrance', - 'Bathtub', - 'High chair', - 'Fireplace guards', - 'Pack ’n Play/travel crib', - 'Hot water', - 'Bed linens', - 'Extra pillows and blankets', - 'Ethernet connection', - 'Microwave', - 'Coffee maker', - 'Refrigerator', - 'Dishwasher', - 'Dishes and silverware', - 'Cooking basics', - 'Oven', - 'Stove', - 'Single level home', - 'BBQ grill', - 'Patio or balcony', - 'Garden or backyard', - 'Luggage dropoff allowed', - 'Long term stays allowed', - ], - price: { - $numberDecimal: '399.00', - }, - weekly_price: { - $numberDecimal: '2369.00', - }, - monthly_price: { - $numberDecimal: '8802.00', - }, - security_deposit: { - $numberDecimal: '1000.00', - }, - cleaning_fee: { - $numberDecimal: '185.00', - }, - extra_people: { - $numberDecimal: '35.00', - }, - guests_included: { - $numberDecimal: '6', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/3e7cc29d-813d-407c-ae90-b6f2745cd384.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '2509326', - host_url: 'https://www.airbnb.com/users/show/2509326', - host_name: 'Cat', - host_location: 'AU', - host_about: 'I like furry friends and stylish surrounds.', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/users/2509326/profile_pic/1352810233/original.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/users/2509326/profile_pic/1352810233/original.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'North Bondi', - host_response_rate: 100, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 5, - host_total_listings_count: 5, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'offline_government_id', - 'government_id', - ], - }, - address: { - street: 'Bondi Beach, NSW, Australia', - suburb: 'Bondi Beach', - government_area: 'Waverley', - market: 'Sydney', - country: 'Australia', - country_code: 'AU', - location: { - type: 'Point', - coordinates: [151.27448, -33.8872], - is_location_exact: false, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 9, - review_scores_rating: 96, - }, - }, - { - _id: '10596036', - listing_url: 'https://www.airbnb.com/rooms/10596036', - name: 'Apt Quarto e Sala amplo Laranjeiras', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '5', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - accommodates: 4, - bedrooms: 1, - beds: 4, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Doorman', - 'Elevator', - 'Buzzer/wireless intercom', - 'Family/kid friendly', - 'Washer', - 'Essentials', - 'Hangers', - 'Iron', - 'Laptop friendly workspace', - ], - price: { - $numberDecimal: '701.00', - }, - cleaning_fee: { - $numberDecimal: '100.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/3b16daca-0fc6-43de-af1e-2aa3bac4b2ac.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '47039858', - host_url: 'https://www.airbnb.com/users/show/47039858', - host_name: 'Marianna', - host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', - host_about: '', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/8585dcad-1c49-47c7-80c4-ed527bccd62e.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/8585dcad-1c49-47c7-80c4-ed527bccd62e.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['email', 'phone'], - }, - address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Laranjeiras', - government_area: 'Laranjeiras', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.17974071338275, -22.9313871086666], - is_location_exact: false, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: {}, - }, - { - _id: '10220130', - listing_url: 'https://www.airbnb.com/rooms/10220130', - name: 'Cozy aptartment in Recreio (near Olympic Venues)', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '30', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - accommodates: 6, - bedrooms: 3, - beds: 3, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '3.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Pool', - 'Kitchen', - 'Free parking on premises', - 'Doorman', - 'Gym', - 'Elevator', - 'Hot tub', - 'Buzzer/wireless intercom', - 'Family/kid friendly', - 'Washer', - 'Dryer', - 'Safety card', - 'Fire extinguisher', - 'Essentials', - 'Hangers', - 'Iron', - 'Laptop friendly workspace', - 'translation missing: en.hosting_amenity_50', - ], - price: { - $numberDecimal: '746.00', - }, - cleaning_fee: { - $numberDecimal: '373.00', - }, - extra_people: { - $numberDecimal: '187.00', - }, - guests_included: { - $numberDecimal: '4', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/f48f9243-6bf3-4dea-bc50-c29d88f4e6b2.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '31553171', - host_url: 'https://www.airbnb.com/users/show/31553171', - host_name: 'José Augusto', - host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', - host_about: - 'Engenheiro Civil, 56 anos, Casado, 2 filhos maiores de idade', - host_thumbnail_url: - 'https://a0.muscache.com/im/users/31553171/profile_pic/1429551055/original.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/users/31553171/profile_pic/1429551055/original.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Recreio dos Bandeirantes', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'government_id', - ], - }, - address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Recreio dos Bandeirantes', - government_area: 'Recreio dos Bandeirantes', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.45296045334386, -23.008710784460312], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: {}, - }, - { - _id: '10166883', - listing_url: 'https://www.airbnb.com/rooms/10166883', - name: 'Large railroad style 3 bedroom apt in Manhattan!', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '3', - maximum_nights: '6', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - first_review: { - $date: '2016-01-03T05:00:00.000Z', - }, - last_review: { - $date: '2019-01-01T05:00:00.000Z', - }, - accommodates: 9, - bedrooms: 3, - beds: 4, - number_of_reviews: 22, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Paid parking off premises', - 'Free street parking', - 'Buzzer/wireless intercom', - 'Heating', - 'Smoke detector', - 'Carbon monoxide detector', - 'Essentials', - 'Shampoo', - '24-hour check-in', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'translation missing: en.hosting_amenity_49', - 'translation missing: en.hosting_amenity_50', - 'Hot water', - 'Microwave', - 'Refrigerator', - 'Dishes and silverware', - 'Cooking basics', - 'Oven', - 'Stove', - 'Single level home', - 'Other', - ], - price: { - $numberDecimal: '180.00', - }, - security_deposit: { - $numberDecimal: '199.00', - }, - cleaning_fee: { - $numberDecimal: '59.00', - }, - extra_people: { - $numberDecimal: '19.00', - }, - guests_included: { - $numberDecimal: '4', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/5183470a-9507-4488-b113-57a919d48910.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '35215309', - host_url: 'https://www.airbnb.com/users/show/35215309', - host_name: 'Vick', - host_location: 'New York, New York, United States', - host_about: '', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/bd6a13af-36d3-4658-920b-87c221704fe2.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/bd6a13af-36d3-4658-920b-87c221704fe2.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'East Harlem', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'government_id', - ], - }, - address: { - street: 'New York, NY, United States', - suburb: 'Manhattan', - government_area: 'East Harlem', - market: 'New York', - country: 'United States', - country_code: 'US', - location: { - type: 'Point', - coordinates: [-73.93943, 40.79805], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 9, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 9, - review_scores_value: 9, - review_scores_rating: 95, - }, - }, - { - _id: '10227000', - listing_url: 'https://www.airbnb.com/rooms/10227000', - name: 'LAHAINA, MAUI! RESORT/CONDO BEACHFRONT!! SLEEPS 4!', - notes: '', - property_type: 'Condominium', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - first_review: { - $date: '2016-02-20T05:00:00.000Z', - }, - last_review: { - $date: '2016-02-20T05:00:00.000Z', - }, - accommodates: 4, - bedrooms: 1, - beds: 2, - number_of_reviews: 1, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Wheelchair accessible', - 'Pool', - 'Kitchen', - 'Free parking on premises', - 'Doorman', - 'Gym', - 'Elevator', - 'Hot tub', - 'Indoor fireplace', - 'Buzzer/wireless intercom', - 'Heating', - 'Family/kid friendly', - 'Suitable for events', - 'Washer', - 'Dryer', - 'Smoke detector', - 'Carbon monoxide detector', - 'First aid kit', - 'Safety card', - 'Fire extinguisher', - 'Essentials', - '24-hour check-in', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - ], - price: { - $numberDecimal: '499.00', - }, - cleaning_fee: { - $numberDecimal: '99.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/f3fbbda4-03cb-4c39-81c0-d79600d75f00.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '12057949', - host_url: 'https://www.airbnb.com/users/show/12057949', - host_name: 'Holly', - host_location: 'Las Vegas, Nevada, United States', - host_about: - "My husband and I have been privileged with the opportunity to make our DREAMS our MEMORIES and we're here to help assist you with yours'..........Traveling is TRULY what life is about!", - host_response_time: 'within a day', - host_thumbnail_url: - 'https://a0.muscache.com/im/users/12057949/profile_pic/1415478237/original.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/users/12057949/profile_pic/1415478237/original.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Central Business District', - host_response_rate: 91, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 472, - host_total_listings_count: 472, - host_verifications: [ - 'email', - 'phone', - 'google', - 'reviews', - 'jumio', - 'offline_government_id', - 'kba', - 'government_id', - ], - }, - address: { - street: 'Lahaina, HI, United States', - suburb: 'Maui', - government_area: 'Lahaina', - market: 'Maui', - country: 'United States', - country_code: 'US', - location: { - type: 'Point', - coordinates: [-156.68012, 20.96996], - is_location_exact: true, - }, - }, - availability: { - availability_30: 30, - availability_60: 60, - availability_90: 90, - availability_365: 365, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 8, - review_scores_location: 10, - review_scores_value: 10, - review_scores_rating: 100, - }, - }, - { - _id: '103161', - listing_url: 'https://www.airbnb.com/rooms/103161', - name: 'Cozy Art Top Floor Apt in PRIME Williamsburg!', - notes: - "CHECK OUT: it is always at 11:00 am because my cleaning lady comes at that time and I can't change her schedule for every guest . If case your flight it's in the afternoon or night and you would like to spend the afternoon there you can just pay for half day as previous guest have offered the day of their check out. In case you just need to leave your luggage there while you around that also can be arrange if I DO NOT have another guest coming up same day. Thank you so much! :)", - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '300', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - first_review: { - $date: '2013-09-21T04:00:00.000Z', - }, - last_review: { - $date: '2019-02-18T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 2, - number_of_reviews: 117, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Paid parking off premises', - 'Free street parking', - 'Heating', - 'Smoke detector', - 'Carbon monoxide detector', - 'First aid kit', - 'Essentials', - 'Shampoo', - '24-hour check-in', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'translation missing: en.hosting_amenity_49', - 'translation missing: en.hosting_amenity_50', - 'Hot water', - 'Bed linens', - 'Extra pillows and blankets', - 'Ethernet connection', - 'Coffee maker', - 'Refrigerator', - 'Dishes and silverware', - 'Cooking basics', - 'Oven', - 'Luggage dropoff allowed', - 'Long term stays allowed', - 'Other', - ], - price: { - $numberDecimal: '175.00', - }, - security_deposit: { - $numberDecimal: '300.00', - }, - cleaning_fee: { - $numberDecimal: '90.00', - }, - extra_people: { - $numberDecimal: '300.00', - }, - guests_included: { - $numberDecimal: '2', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/fc6b432c-c2a2-4995-9427-60c987615bd6.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '465278', - host_url: 'https://www.airbnb.com/users/show/465278', - host_name: 'Ade', - host_location: 'Brooklyn, NY', - host_about: - "I'm a Photographer and I love music, travel and good food! I speak Spanish, Italian and English! ", - host_response_time: 'within a few hours', - host_thumbnail_url: - 'https://a0.muscache.com/im/users/465278/profile_pic/1379275888/original.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/users/465278/profile_pic/1379275888/original.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Williamsburg', - host_response_rate: 100, - host_is_superhost: true, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'offline_government_id', - 'selfie', - 'government_id', - ], - }, - address: { - street: 'Brooklyn, NY, United States', - suburb: 'Williamsburg', - government_area: 'Williamsburg', - market: 'New York', - country: 'United States', - country_code: 'US', - location: { - type: 'Point', - coordinates: [-73.96053, 40.71577], - is_location_exact: true, - }, - }, - availability: { - availability_30: 28, - availability_60: 58, - availability_90: 88, - availability_365: 363, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 9, - review_scores_rating: 96, - }, - }, - { - _id: '10449328', - listing_url: 'https://www.airbnb.com/rooms/10449328', - name: 'Aluguel Temporada Casa São Conrado', - notes: '', - property_type: 'House', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '5', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - accommodates: 11, - bedrooms: 4, - beds: 8, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '7.0', - }, - amenities: [ - 'TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Pool', - 'Kitchen', - 'Free parking on premises', - 'Smoking allowed', - 'Pets allowed', - 'Breakfast', - 'Pets live on this property', - 'Hot tub', - 'Family/kid friendly', - 'Suitable for events', - 'Washer', - 'First aid kit', - 'Fire extinguisher', - 'Essentials', - 'Shampoo', - ], - price: { - $numberDecimal: '2499.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/a4f93656-c3f8-43ae-82ba-e0b59bb59d56.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '33687645', - host_url: 'https://www.airbnb.com/users/show/33687645', - host_name: 'Maria Pia', - host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', - host_about: '', - host_response_time: 'a few days or more', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/b15173b7-3cfb-45f6-8088-a2bfbacee78c.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/b15173b7-3cfb-45f6-8088-a2bfbacee78c.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_response_rate: 0, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'facebook', - 'reviews', - 'jumio', - 'government_id', - ], - }, - address: { - street: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', - suburb: 'São Conrado', - government_area: 'São Conrado', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.27502007153333, -22.99391888061395], - is_location_exact: false, - }, - }, - availability: { - availability_30: 30, - availability_60: 60, - availability_90: 90, - availability_365: 365, - }, - review_scores: {}, - }, - { - _id: '10545725', - listing_url: 'https://www.airbnb.com/rooms/10545725', - name: 'Cozy bedroom Sagrada Familia', - notes: '', - property_type: 'Apartment', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-03-08T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-08T05:00:00.000Z', - }, - first_review: { - $date: '2016-02-14T05:00:00.000Z', - }, - last_review: { - $date: '2016-02-14T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 2, - number_of_reviews: 1, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Internet', - 'Wifi', - 'Kitchen', - 'Pets allowed', - 'Buzzer/wireless intercom', - 'Family/kid friendly', - 'Washer', - 'Essentials', - 'Laptop friendly workspace', - ], - price: { - $numberDecimal: '20.00', - }, - weekly_price: { - $numberDecimal: '280.00', - }, - monthly_price: { - $numberDecimal: '1080.00', - }, - cleaning_fee: { - $numberDecimal: '20.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/953b3c09-adb5-4d1c-a403-b3e61c8fa766.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '1929411', - host_url: 'https://www.airbnb.com/users/show/1929411', - host_name: 'Rapha', - host_location: 'Barcelona, Catalonia, Spain', - host_about: - "Hi, I'm from Brazil, but live in Barcelona.\r\nI'm an sportsman, who loves music and is organized.\r\nReally looking foward to a nice deal.\r\nCya,\r\nRapha", - host_thumbnail_url: - 'https://a0.muscache.com/im/users/1929411/profile_pic/1332942535/original.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/users/1929411/profile_pic/1332942535/original.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'el Fort Pienc', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'facebook', - 'reviews', - 'jumio', - 'government_id', - ], - }, - address: { - street: 'Barcelona, Catalunya, Spain', - suburb: 'Eixample', - government_area: 'el Fort Pienc', - market: 'Barcelona', - country: 'Spain', - country_code: 'ES', - location: { - type: 'Point', - coordinates: [2.17963, 41.40087], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 10, - review_scores_rating: 100, - }, - }, - { - _id: '10558807', - listing_url: 'https://www.airbnb.com/rooms/10558807', - name: 'Park Guell apartment with terrace', - notes: - 'Please contact us to report your arrival time to Barcelona at least 24 hours before check-in, to organize your check-in correctly. Late check-in (after 20: 00h) is an extra cost of 30 euros to pay cash during It is prohibited to smoke in the apartment. It is requested not to make noises from 22:00. Tourist tax is not included in the price (2.25 € / night / adult, up to 7 nights) which is payable upon arrival.', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '1125', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-08T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-08T05:00:00.000Z', - }, - first_review: { - $date: '2016-02-23T05:00:00.000Z', - }, - last_review: { - $date: '2018-12-30T05:00:00.000Z', - }, - accommodates: 6, - bedrooms: 2, - beds: 3, - number_of_reviews: 51, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Internet', - 'Wifi', - 'Kitchen', - 'Paid parking off premises', - 'Smoking allowed', - 'Buzzer/wireless intercom', - 'Heating', - 'Family/kid friendly', - 'Washer', - 'First aid kit', - 'Essentials', - 'Hangers', - 'Hair dryer', - 'Iron', - 'translation missing: en.hosting_amenity_50', - 'Hot water', - 'Bed linens', - 'Host greets you', - ], - price: { - $numberDecimal: '85.00', - }, - security_deposit: { - $numberDecimal: '100.00', - }, - cleaning_fee: { - $numberDecimal: '40.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '6', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/305fe78c-c3d6-446e-b2d2-0ed0d0c4267a.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '54320669', - host_url: 'https://www.airbnb.com/users/show/54320669', - host_name: 'Alexandra Y Juan', - host_location: 'Barcelona, Catalonia, Spain', - host_about: - 'Hola, \r\n\r\nSomos Alexandra y Juan dos amigos que estamos enamorados de Barcelona, nuestras pasiones son viajar y conocer gente por lo que nos encantaría compartir con vosotros nuestros espacios para que disfrutéis a vuestro gusto de toda la cultura, actualidad y diversidad de ofertas que la ciudad os ofrece.\r\nPara nosotros lo mas importante es que nuestros huéspedes puedan aprovechar al máximo su estancia en Barcelona, que viváis vuestra historia reflejada en rincones únicos de la ciudad y por supuesto nuestra mayor satisfacción es que os sintáis como en casa según lo que busquéis.\r\n\r\nHello, \r\n\r\nWe are Alexandra and Juan two friends who are in love with Barcelona, our passion is to travel and meet new people so we would love to share our spaces with you and that you can enjoy the culture, the present and the diversity of offers that the city has to offer. \r\nFor us the most important thing is that our guests can make the most of their stay in Barcelona, that you live our history full of unique places and of course our greatest satisfaction is that you feel as if you where at home according to what you are looking for.', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/user/3fceba9a-ce84-4841-88df-b699105119b4.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/user/3fceba9a-ce84-4841-88df-b699105119b4.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Vila de Gràcia', - host_response_rate: 100, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 12, - host_total_listings_count: 12, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'government_id', - 'work_email', - ], - }, - address: { - street: 'Barcelona, Catalunya, Spain', - suburb: 'Can Baro', - government_area: 'Can Baró', - market: 'Barcelona', - country: 'Spain', - country_code: 'ES', - location: { - type: 'Point', - coordinates: [2.15836, 41.41582], - is_location_exact: true, - }, - }, - availability: { - availability_30: 13, - availability_60: 16, - availability_90: 27, - availability_365: 174, - }, - review_scores: { - review_scores_accuracy: 8, - review_scores_cleanliness: 7, - review_scores_checkin: 8, - review_scores_communication: 8, - review_scores_location: 8, - review_scores_value: 8, - review_scores_rating: 71, - }, - }, - { - _id: '10573225', - listing_url: 'https://www.airbnb.com/rooms/10573225', - name: 'Charming Spacious Park Slope Studio', - notes: - 'Please, no smoking, no pets, and no parties, and please use the recycling bins.', - property_type: 'Guest suite', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '3', - maximum_nights: '1125', - cancellation_policy: 'moderate', - last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - first_review: { - $date: '2016-01-22T05:00:00.000Z', - }, - last_review: { - $date: '2019-02-04T05:00:00.000Z', - }, - accommodates: 3, - bedrooms: 0, - beds: 0, - number_of_reviews: 115, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Paid parking off premises', - 'Free street parking', - 'Heating', - 'Family/kid friendly', - 'Smoke detector', - 'Carbon monoxide detector', - 'First aid kit', - 'Safety card', - 'Fire extinguisher', - 'Essentials', - 'Shampoo', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Self check-in', - 'Lockbox', - 'Hot water', - 'Microwave', - 'Coffee maker', - 'Refrigerator', - 'Dishwasher', - 'Dishes and silverware', - 'Cooking basics', - 'Oven', - 'Stove', - 'Single level home', - 'Garden or backyard', - 'Luggage dropoff allowed', - 'Long term stays allowed', - ], - price: { - $numberDecimal: '135.00', - }, - security_deposit: { - $numberDecimal: '200.00', - }, - cleaning_fee: { - $numberDecimal: '50.00', - }, - extra_people: { - $numberDecimal: '25.00', - }, - guests_included: { - $numberDecimal: '2', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/abce9916-b9fb-44ad-8cfd-84c1b965941a.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '54539364', - host_url: 'https://www.airbnb.com/users/show/54539364', - host_name: 'Ildiko', - host_location: 'New York, New York, United States', - host_about: '', - host_response_time: 'within a day', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/e25c220f-afd4-4df0-9c8a-663c2ab695ab.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/e25c220f-afd4-4df0-9c8a-663c2ab695ab.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Park Slope', - host_response_rate: 93, - host_is_superhost: true, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'offline_government_id', - 'selfie', - 'government_id', - 'identity_manual', - ], - }, - address: { - street: 'Brooklyn, NY, United States', - suburb: 'Brooklyn', - government_area: 'South Slope', - market: 'New York', - country: 'United States', - country_code: 'US', - location: { - type: 'Point', - coordinates: [-73.98307, 40.6651], - is_location_exact: true, - }, - }, - availability: { - availability_30: 6, - availability_60: 10, - availability_90: 12, - availability_365: 204, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 10, - review_scores_rating: 98, - }, - }, - { - _id: '10624493', - listing_url: 'https://www.airbnb.com/rooms/10624493', - name: 'Cozy apartment 3 mins TAIWAI Subway', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '7', - maximum_nights: '365', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - accommodates: 5, - bedrooms: 2, - beds: 2, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '2.0', - }, - amenities: [ - 'Air conditioning', - 'Wheelchair accessible', - 'Pool', - 'Kitchen', - 'Smoking allowed', - 'Elevator', - 'Family/kid friendly', - 'Washer', - 'Essentials', - 'Hangers', - 'Laptop friendly workspace', - ], - price: { - $numberDecimal: '801.00', - }, - weekly_price: { - $numberDecimal: '6500.00', - }, - monthly_price: { - $numberDecimal: '22000.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/c231129a-f937-444d-aac9-168c4df9c408.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '19543283', - host_url: 'https://www.airbnb.com/users/show/19543283', - host_name: 'Naomi', - host_location: 'Hong Kong', - host_about: '', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/user/dc633725-798a-4dce-b8fe-013e1774b94c.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/user/dc633725-798a-4dce-b8fe-013e1774b94c.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['phone', 'reviews'], - }, - address: { - street: 'Shatin , Hong Kong, Hong Kong', - suburb: '', - government_area: 'Tsuen Wan', - market: 'Hong Kong', - country: 'Hong Kong', - country_code: 'HK', - location: { - type: 'Point', - coordinates: [114.12074, 22.40547], - is_location_exact: false, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: {}, - }, - { - _id: '10199760', - listing_url: 'https://www.airbnb.com/rooms/10199760', - name: 'Uygun nezih daire', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-02-18T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-18T05:00:00.000Z', - }, - accommodates: 4, - bedrooms: 1, - beds: 2, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Internet', - 'Wifi', - 'Kitchen', - 'Heating', - 'Family/kid friendly', - 'Washer', - 'Dryer', - 'Smoke detector', - 'Carbon monoxide detector', - 'First aid kit', - 'Fire extinguisher', - 'Shampoo', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - ], - price: { - $numberDecimal: '264.00', - }, - security_deposit: { - $numberDecimal: '527.00', - }, - cleaning_fee: { - $numberDecimal: '26.00', - }, - extra_people: { - $numberDecimal: '53.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/d714487a-21cf-47b4-ad3c-e983adadc6b7.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '37417314', - host_url: 'https://www.airbnb.com/users/show/37417314', - host_name: 'Yaşar', - host_location: 'Istanbul, Turkey', - host_about: '', - host_response_time: 'within a day', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/68374b9f-5808-430d-b23d-232af684477e.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/68374b9f-5808-430d-b23d-232af684477e.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_response_rate: 100, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['email', 'phone'], - }, - address: { - street: 'Zeytinburnu, İstanbul, Turkey', - suburb: '', - government_area: 'Zeytinburnu', - market: 'Istanbul', - country: 'Turkey', - country_code: 'TR', - location: { - type: 'Point', - coordinates: [28.89964, 40.99667], - is_location_exact: false, - }, - }, - availability: { - availability_30: 30, - availability_60: 60, - availability_90: 90, - availability_365: 365, - }, - review_scores: {}, - }, - { - _id: '10266175', - listing_url: 'https://www.airbnb.com/rooms/10266175', - name: 'Makaha Valley Paradise with OceanView', - notes: - 'Hawaii State Tax & Transient Tax will be charged separately after your booking is confirmed, rate is (Phone number hidden by Airbnb) % Hawai`i Tax ID Number GE (Phone number hidden by Airbnb) This is a residential complex, no restaurant on site. Parking is available for $4 per day, with a $50 deposit - payable to the office in cash.', - property_type: 'Condominium', - room_type: 'Entire home/apt', - bed_type: 'Pull-out Sofa', - minimum_nights: '3', - maximum_nights: '180', - cancellation_policy: 'moderate', - last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - first_review: { - $date: '2016-06-18T04:00:00.000Z', - }, - last_review: { - $date: '2019-02-28T05:00:00.000Z', - }, - accommodates: 4, - bedrooms: 1, - beds: 2, - number_of_reviews: 32, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Pool', - 'Kitchen', - 'Elevator', - 'Family/kid friendly', - 'Washer', - 'Dryer', - 'Smoke detector', - 'Carbon monoxide detector', - 'Fire extinguisher', - 'Essentials', - 'Shampoo', - '24-hour check-in', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Hot water', - 'Long term stays allowed', - 'Other', - 'Paid parking on premises', - ], - price: { - $numberDecimal: '95.00', - }, - security_deposit: { - $numberDecimal: '0.00', - }, - cleaning_fee: { - $numberDecimal: '130.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/daee0612-9889-4ad1-8386-e8d887191a48.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '42868615', - host_url: 'https://www.airbnb.com/users/show/42868615', - host_name: 'Ray And Lise', - host_location: 'Chilliwack, British Columbia, Canada', - host_about: - 'We are a semi retired couple who enjoy nature, travel & good food !', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/4f2055ea-0725-4a4c-9bd0-47f4a254da03.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/4f2055ea-0725-4a4c-9bd0-47f4a254da03.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Waianae Coast', - host_response_rate: 100, - host_is_superhost: true, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 2, - host_total_listings_count: 2, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'offline_government_id', - 'selfie', - 'government_id', - 'identity_manual', - 'work_email', - ], - }, - address: { - street: 'Waianae, HI, United States', - suburb: 'Leeward Side', - government_area: 'Waianae', - market: 'Oahu', - country: 'United States', - country_code: 'US', - location: { - type: 'Point', - coordinates: [-158.20291, 21.4818], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 3, - availability_90: 16, - availability_365: 246, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 9, - review_scores_value: 9, - review_scores_rating: 98, - }, - }, - { - _id: '10280433', - listing_url: 'https://www.airbnb.com/rooms/10280433', - name: '~Ao Lele~ Flying Cloud', - notes: - 'Cabins are get-aways. As such, there is no TV. Internet/Wi-Fi and Bluetooth are provided as well as music, books, peace, quiet, a kitchen to thoughtfully prepare food with conversation or... just enjoy a soak in the tub', - property_type: 'Treehouse', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '30', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - first_review: { - $date: '2016-08-08T04:00:00.000Z', - }, - last_review: { - $date: '2019-02-19T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 103, - bathrooms: { - $numberDecimal: '1.5', - }, - amenities: [ - 'Internet', - 'Wifi', - 'Kitchen', - 'Free parking on premises', - 'Breakfast', - 'Indoor fireplace', - 'Heating', - 'Smoke detector', - 'Carbon monoxide detector', - 'First aid kit', - 'Safety card', - 'Fire extinguisher', - 'Essentials', - 'Shampoo', - '24-hour check-in', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'translation missing: en.hosting_amenity_49', - 'translation missing: en.hosting_amenity_50', - 'Hot water', - 'Bed linens', - 'Extra pillows and blankets', - 'Microwave', - 'Coffee maker', - 'Refrigerator', - 'Dishes and silverware', - 'Cooking basics', - 'Oven', - 'Stove', - 'Patio or balcony', - 'Garden or backyard', - 'Host greets you', - ], - price: { - $numberDecimal: '185.00', - }, - security_deposit: { - $numberDecimal: '300.00', - }, - cleaning_fee: { - $numberDecimal: '80.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '2', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/8db00646-53b4-48ad-a1f7-bd88e7129f06.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '52785887', - host_url: 'https://www.airbnb.com/users/show/52785887', - host_name: 'Mike', - host_location: 'Volcano, Hawaii, United States', - host_about: '', - host_response_time: 'within a few hours', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/user/69f5ee13-38a3-44fa-8ece-f53e01312b99.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/user/69f5ee13-38a3-44fa-8ece-f53e01312b99.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_response_rate: 100, - host_is_superhost: true, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['email', 'phone', 'reviews', 'kba'], - }, - address: { - street: 'Volcano, HI, United States', - suburb: 'Island of Hawaiʻi', - government_area: 'Puna', - market: 'The Big Island', - country: 'United States', - country_code: 'US', - location: { - type: 'Point', - coordinates: [-155.21763, 19.42151], - is_location_exact: false, - }, - }, - availability: { - availability_30: 20, - availability_60: 45, - availability_90: 75, - availability_365: 165, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 10, - review_scores_rating: 99, - }, - }, - { - _id: '1036027', - listing_url: 'https://www.airbnb.com/rooms/1036027', - name: 'BBC OPORTO 4X2', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '3', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-02-16T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-16T05:00:00.000Z', - }, - first_review: { - $date: '2014-04-17T04:00:00.000Z', - }, - last_review: { - $date: '2018-12-30T05:00:00.000Z', - }, - accommodates: 8, - bedrooms: 4, - beds: 8, - number_of_reviews: 71, - bathrooms: { - $numberDecimal: '2.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Kitchen', - 'Elevator', - 'Heating', - 'Family/kid friendly', - 'Washer', - 'Essentials', - 'Shampoo', - ], - price: { - $numberDecimal: '100.00', - }, - weekly_price: { - $numberDecimal: '700.00', - }, - monthly_price: { - $numberDecimal: '2800.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/17204641/40fc3945_original.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '3104922', - host_url: 'https://www.airbnb.com/users/show/3104922', - host_name: 'Cristina', - host_location: 'Madrid', - host_about: - 'Natural de Lisboa. Trabalho no desenvolvimento de projectos culturais.', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/users/3104922/profile_pic/1343679440/original.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/users/3104922/profile_pic/1343679440/original.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Mercês', - host_response_rate: 100, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 3, - host_total_listings_count: 3, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'offline_government_id', - 'selfie', - 'government_id', - 'identity_manual', - ], - }, - address: { - street: 'Porto, Porto District, Portugal', - suburb: '', - government_area: 'Bonfim', - market: 'Porto', - country: 'Portugal', - country_code: 'PT', - location: { - type: 'Point', - coordinates: [-8.60069, 41.16246], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 10, - availability_90: 15, - availability_365: 264, - }, - review_scores: { - review_scores_accuracy: 9, - review_scores_cleanliness: 9, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 9, - review_scores_value: 9, - review_scores_rating: 88, - }, - }, - { - _id: '10392282', - listing_url: 'https://www.airbnb.com/rooms/10392282', - name: 'Banyan Bungalow', - notes: '', - property_type: 'Bungalow', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '300', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - first_review: { - $date: '2016-01-29T05:00:00.000Z', - }, - last_review: { - $date: '2019-02-19T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 0, - beds: 1, - number_of_reviews: 99, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Kitchen', - 'Free parking on premises', - 'Pets live on this property', - 'Dog(s)', - 'Family/kid friendly', - 'Washer', - 'Dryer', - 'Smoke detector', - 'First aid kit', - 'Safety card', - 'Essentials', - 'Shampoo', - '24-hour check-in', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Hot water', - ], - price: { - $numberDecimal: '100.00', - }, - security_deposit: { - $numberDecimal: '250.00', - }, - cleaning_fee: { - $numberDecimal: '80.00', - }, - extra_people: { - $numberDecimal: '20.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/c5cb209b-c982-4b54-b7a5-81da006ead12.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '53507053', - host_url: 'https://www.airbnb.com/users/show/53507053', - host_name: 'Bobby', - host_location: 'Waialua, Hawaii, United States', - host_about: - 'As an athlete, business owner, mother of twins, and a happily married wife I am always on the go. When I do get a chance to "collect dust" I love a good glass a wine to go with a nice meal. ', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/e546f542-57c5-4dff-968d-08e019c0e401.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/e546f542-57c5-4dff-968d-08e019c0e401.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_response_rate: 100, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['email', 'phone', 'reviews', 'kba'], - }, - address: { - street: 'Waialua, HI, United States', - suburb: 'Oʻahu', - government_area: 'North Shore Oahu', - market: 'Oahu', - country: 'United States', - country_code: 'US', - location: { - type: 'Point', - coordinates: [-158.1602, 21.57561], - is_location_exact: false, - }, - }, - availability: { - availability_30: 12, - availability_60: 27, - availability_90: 53, - availability_365: 321, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 9, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 9, - review_scores_rating: 96, - }, - }, - { - _id: '10519173', - listing_url: 'https://www.airbnb.com/rooms/10519173', - name: 'Condomínio Praia Barra da Tijuca', - notes: - 'The Condominium is located across from an excellent beach area and next to bars, restaurants, laundromats, bus stop as well other facilities.', - property_type: 'Condominium', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '1125', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - first_review: { - $date: '2016-05-07T04:00:00.000Z', - }, - last_review: { - $date: '2019-01-04T05:00:00.000Z', - }, - accommodates: 6, - bedrooms: 2, - beds: 5, - number_of_reviews: 18, - bathrooms: { - $numberDecimal: '2.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Wifi', - 'Air conditioning', - 'Wheelchair accessible', - 'Pool', - 'Kitchen', - 'Free parking on premises', - 'Doorman', - 'Elevator', - 'Buzzer/wireless intercom', - 'Family/kid friendly', - 'Washer', - 'First aid kit', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Hot water', - 'Microwave', - 'Coffee maker', - 'Refrigerator', - 'Dishes and silverware', - 'Stove', - 'Long term stays allowed', - 'Well-lit path to entrance', - 'Other', - ], - price: { - $numberDecimal: '351.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/fd97365c-79d8-4f3a-b658-963b8a5bb640.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '54221119', - host_url: 'https://www.airbnb.com/users/show/54221119', - host_name: 'Paula', - host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', - host_about: '', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/5c3f0899-b688-406f-942c-a95f07fc0f46.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/5c3f0899-b688-406f-942c-a95f07fc0f46.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Barra da Tijuca', - host_response_rate: 88, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['phone', 'reviews'], - }, - address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Barra da Tijuca', - government_area: 'Barra da Tijuca', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.32231287289854, -23.009702689174244], - is_location_exact: true, - }, - }, - availability: { - availability_30: 22, - availability_60: 52, - availability_90: 82, - availability_365: 172, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 9, - review_scores_rating: 95, - }, - }, - { - _id: '10527243', - listing_url: 'https://www.airbnb.com/rooms/10527243', - name: 'Tropical Jungle Oasis', - notes: - 'INFORMATION regarding current Kilauea Volcano Eruptions: Some of the mainland news stations have been sensationalizing what is happening with Kilauea and her current state. Sensationalized news sell advertisements!!!! FACTS they are not sharing with you: • The Big Island Is 4,028 mi². The affected area is less than 10 mi² • Kilauea is a shield volcano versus Mt. Saint Helens which is a stratovolcano • The volcanic activity and where lava has flowed along the East Rift Zone in/near Leilani Estates and Lanipuna Gardens Subdivisions is limited to an ISOLATED area in Lower Puna on the island of Hawai‘i ’s east side • This area in the Puna district covers only less than a 10-square-mile area of the island’s 4,028 square miles. The district of Puna is approximately 500 square miles (the size of half of Rhode Island) • This is more than 100 driving miles away from the western Kohala and Kona Coasts, where the island’s major visitor accommodations and resorts are located, and the area furthest', - property_type: 'Condominium', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '1125', - cancellation_policy: 'moderate', - last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - first_review: { - $date: '2016-07-14T04:00:00.000Z', - }, - last_review: { - $date: '2019-02-22T05:00:00.000Z', - }, - accommodates: 4, - bedrooms: 2, - beds: 3, - number_of_reviews: 65, - bathrooms: { - $numberDecimal: '1.5', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Pool', - 'Kitchen', - 'Free parking on premises', - 'Free street parking', - 'Family/kid friendly', - 'Smoke detector', - 'Carbon monoxide detector', - 'First aid kit', - 'Fire extinguisher', - 'Essentials', - 'Shampoo', - '24-hour check-in', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Self check-in', - 'Keypad', - 'Hot water', - 'Microwave', - 'Coffee maker', - 'Refrigerator', - 'Dishwasher', - 'Dishes and silverware', - 'Cooking basics', - 'Oven', - 'Stove', - 'Patio or balcony', - ], - price: { - $numberDecimal: '125.00', - }, - security_deposit: { - $numberDecimal: '250.00', - }, - cleaning_fee: { - $numberDecimal: '99.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/9c9dd09e-41de-4261-a9f6-942c0dcc02d1.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '54294012', - host_url: 'https://www.airbnb.com/users/show/54294012', - host_name: 'Douglas', - host_location: 'Hilo, Hawaii, United States', - host_about: '', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/1dbc5326-ef08-46a9-8ed9-11c709d3e74d.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/1dbc5326-ef08-46a9-8ed9-11c709d3e74d.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Hilo', - host_response_rate: 100, - host_is_superhost: true, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'facebook', - 'reviews', - 'offline_government_id', - 'government_id', - ], - }, - address: { - street: 'Hilo, HI, United States', - suburb: 'Island of Hawaiʻi', - government_area: 'South Hilo', - market: 'The Big Island', - country: 'United States', - country_code: 'US', - location: { - type: 'Point', - coordinates: [-155.09259, 19.73108], - is_location_exact: true, - }, - }, - availability: { - availability_30: 12, - availability_60: 39, - availability_90: 65, - availability_365: 65, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 10, - review_scores_rating: 96, - }, - }, - { - _id: '10186755', - listing_url: 'https://www.airbnb.com/rooms/10186755', - name: 'Roof double bed private room', - notes: '', - property_type: 'Loft', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-02-18T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-18T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 2, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Doorman', - 'Elevator', - 'Heating', - 'Family/kid friendly', - 'Washer', - 'Essentials', - '24-hour check-in', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - ], - price: { - $numberDecimal: '185.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/7280244f-cd51-4ac1-a9fd-9acef8a7f0bc.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '52316085', - host_url: 'https://www.airbnb.com/users/show/52316085', - host_name: 'Mustafa', - host_location: 'Istanbul, İstanbul, Turkey', - host_about: '', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/cc4d0af8-37df-4eb6-940a-d5c80d8b8bc1.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/cc4d0af8-37df-4eb6-940a-d5c80d8b8bc1.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['email', 'phone', 'facebook'], - }, - address: { - street: 'Istanbul, İstanbul, Turkey', - suburb: '', - government_area: 'Sariyer', - market: 'Istanbul', - country: 'Turkey', - country_code: 'TR', - location: { - type: 'Point', - coordinates: [29.03693, 41.12452], - is_location_exact: false, - }, - }, - availability: { - availability_30: 30, - availability_60: 60, - availability_90: 90, - availability_365: 365, - }, - review_scores: {}, - }, ]; From 40ad7c9a12662a301779f1350a4eb5c70b3f89ff Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Tue, 16 Dec 2025 16:03:14 +0300 Subject: [PATCH 34/35] reduce fixtures --- .../fixtures/airbnb.listingsAndReviews.ts | 1420 ----------------- .../evals/fixtures/berlin.cocktailbars.ts | 163 -- .../tests/evals/fixtures/netflix.comments.ts | 812 ---------- .../tests/evals/fixtures/netflix.movies.ts | 273 ---- .../tests/evals/fixtures/nyc.parking.ts | 794 --------- 5 files changed, 3462 deletions(-) diff --git a/packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.ts b/packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.ts index df2db838bad..7810ac92e72 100644 --- a/packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.ts +++ b/packages/compass-generative-ai/tests/evals/fixtures/airbnb.listingsAndReviews.ts @@ -1147,1424 +1147,4 @@ export default [ review_scores_rating: 94, }, }, - { - _id: '10084023', - listing_url: 'https://www.airbnb.com/rooms/10084023', - name: 'City center private room with bed', - notes: - 'Deposit of $1000 will be charged and will return back when check out if nothing is damaged.', - property_type: 'Guesthouse', - room_type: 'Private room', - bed_type: 'Futon', - minimum_nights: '1', - maximum_nights: '500', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - first_review: { - $date: '2015-12-22T05:00:00.000Z', - }, - last_review: { - $date: '2019-03-01T05:00:00.000Z', - }, - accommodates: 1, - bedrooms: 1, - beds: 1, - number_of_reviews: 81, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Elevator', - 'First aid kit', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'Hot water', - 'Microwave', - 'Refrigerator', - 'Dishes and silverware', - 'Stove', - 'Long term stays allowed', - 'Host greets you', - ], - price: { - $numberDecimal: '181.00', - }, - weekly_price: { - $numberDecimal: '1350.00', - }, - monthly_price: { - $numberDecimal: '5000.00', - }, - security_deposit: { - $numberDecimal: '0.00', - }, - cleaning_fee: { - $numberDecimal: '50.00', - }, - extra_people: { - $numberDecimal: '100.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/e6275515-7d73-4a70-bdc4-39ba6497e7d3.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '51744313', - host_url: 'https://www.airbnb.com/users/show/51744313', - host_name: 'Yi', - host_location: 'United States', - host_about: - 'Hi, this is Yi from Hong Kong, nice to meet you.\n\n你好!我是來自香港的Yi .', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/user/a204d442-1ae1-47fc-8d26-cf0ff9efda1b.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/user/a204d442-1ae1-47fc-8d26-cf0ff9efda1b.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Shek Kip Mei', - host_response_rate: 100, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 2, - host_total_listings_count: 2, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'offline_government_id', - 'government_id', - ], - }, - address: { - street: 'Hong Kong , 九龍, Hong Kong', - suburb: 'Sham Shui Po District', - government_area: 'Sham Shui Po', - market: 'Hong Kong', - country: 'Hong Kong', - country_code: 'HK', - location: { - type: 'Point', - coordinates: [114.1669, 22.3314], - is_location_exact: true, - }, - }, - availability: { - availability_30: 14, - availability_60: 24, - availability_90: 40, - availability_365: 220, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 8, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 10, - review_scores_rating: 92, - }, - }, - { - _id: '10051164', - listing_url: 'https://www.airbnb.com/rooms/10051164', - name: "Catete's Colonial Big Hause Room B", - notes: - 'A casa possui um potencial incrível para receber grupos. Os quartos são amplos e comunicáveis.', - property_type: 'House', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '1125', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - first_review: { - $date: '2016-02-10T05:00:00.000Z', - }, - last_review: { - $date: '2016-02-10T05:00:00.000Z', - }, - accommodates: 8, - bedrooms: 1, - beds: 8, - number_of_reviews: 1, - bathrooms: { - $numberDecimal: '4.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Smoking allowed', - 'Family/kid friendly', - 'First aid kit', - 'Fire extinguisher', - 'Essentials', - ], - price: { - $numberDecimal: '250.00', - }, - security_deposit: { - $numberDecimal: '0.00', - }, - cleaning_fee: { - $numberDecimal: '0.00', - }, - extra_people: { - $numberDecimal: '40.00', - }, - guests_included: { - $numberDecimal: '4', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/b2119f25-42e1-4770-8072-20de92e65893.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '51326285', - host_url: 'https://www.airbnb.com/users/show/51326285', - host_name: 'Beatriz', - host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', - host_about: '', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/eb09c9cb-bc70-412f-80d9-47ed3ab104f4.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/eb09c9cb-bc70-412f-80d9-47ed3ab104f4.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Catete', - host_response_rate: 80, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 5, - host_total_listings_count: 5, - host_verifications: [ - 'email', - 'phone', - 'facebook', - 'reviews', - 'jumio', - 'government_id', - ], - }, - address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Catete', - government_area: 'Catete', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.18015675229857, -22.92638234778768], - is_location_exact: true, - }, - }, - availability: { - availability_30: 10, - availability_60: 10, - availability_90: 21, - availability_365: 296, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 6, - review_scores_checkin: 8, - review_scores_communication: 8, - review_scores_location: 8, - review_scores_value: 8, - review_scores_rating: 80, - }, - }, - { - _id: '10138784', - listing_url: 'https://www.airbnb.com/rooms/10138784', - name: 'Room Close to LGA and 35 mins to Times Square', - notes: - 'Hair dryer, iron, and towels are provided. Any question or concern, please message me anytime.', - property_type: 'Apartment', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '1125', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - first_review: { - $date: '2016-01-05T05:00:00.000Z', - }, - last_review: { - $date: '2018-11-28T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 123, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'Internet', - 'Wifi', - 'Air conditioning', - 'Pets live on this property', - 'Dog(s)', - 'Other pet(s)', - 'Elevator', - 'Buzzer/wireless intercom', - 'Heating', - 'First aid kit', - 'Essentials', - 'Shampoo', - 'Hangers', - 'Hair dryer', - 'translation missing: en.hosting_amenity_49', - 'translation missing: en.hosting_amenity_50', - 'Hot water', - 'Bed linens', - 'Host greets you', - ], - price: { - $numberDecimal: '46.00', - }, - security_deposit: { - $numberDecimal: '0.00', - }, - cleaning_fee: { - $numberDecimal: '15.00', - }, - extra_people: { - $numberDecimal: '10.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/f1c9e2c8-c619-4c97-afab-b8bf0ae9ea1d.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '52031360', - host_url: 'https://www.airbnb.com/users/show/52031360', - host_name: 'Cheer', - host_location: 'New York, New York, United States', - host_about: '', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/1e61ad3c-eb0f-486a-ac09-1a834973d8cd.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/1e61ad3c-eb0f-486a-ac09-1a834973d8cd.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Jackson Heights', - host_response_rate: 100, - host_is_superhost: true, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'offline_government_id', - 'government_id', - ], - }, - address: { - street: 'Queens, NY, United States', - suburb: 'Queens', - government_area: 'Jackson Heights', - market: 'New York', - country: 'United States', - country_code: 'US', - location: { - type: 'Point', - coordinates: [-73.88025, 40.74953], - is_location_exact: true, - }, - }, - availability: { - availability_30: 30, - availability_60: 60, - availability_90: 90, - availability_365: 365, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 9, - review_scores_value: 10, - review_scores_rating: 99, - }, - }, - { - _id: '10059244', - listing_url: 'https://www.airbnb.com/rooms/10059244', - name: 'Ligne verte - à 15 min de métro du centre ville.', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '1125', - cancellation_policy: 'moderate', - last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - accommodates: 2, - bedrooms: 0, - beds: 1, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Internet', - 'Wifi', - 'Kitchen', - 'Free parking on premises', - 'Heating', - 'Washer', - 'Smoke detector', - 'Essentials', - 'Shampoo', - 'Laptop friendly workspace', - 'Hot water', - 'Bed linens', - ], - price: { - $numberDecimal: '43.00', - }, - extra_people: { - $numberDecimal: '12.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/af5c069c-ef73-490a-9e47-b48c0ae47c2f.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '7140229', - host_url: 'https://www.airbnb.com/users/show/7140229', - host_name: 'Caro', - host_location: 'Montreal, Quebec, Canada', - host_about: '', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/user/c64773a6-da5f-4c1a-91fe-f17131e4473b.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/user/c64773a6-da5f-4c1a-91fe-f17131e4473b.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_response_rate: 100, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'government_id', - ], - }, - address: { - street: 'Montréal, Québec, Canada', - suburb: 'Hochelaga-Maisonneuve', - government_area: 'Mercier-Hochelaga-Maisonneuve', - market: 'Montreal', - country: 'Canada', - country_code: 'CA', - location: { - type: 'Point', - coordinates: [-73.54949, 45.54548], - is_location_exact: false, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 32, - }, - review_scores: {}, - }, - { - _id: '10083468', - listing_url: 'https://www.airbnb.com/rooms/10083468', - name: 'Be Happy in Porto', - notes: '', - property_type: 'Loft', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '1125', - cancellation_policy: 'moderate', - last_scraped: { - $date: '2019-02-16T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-16T05:00:00.000Z', - }, - first_review: { - $date: '2016-01-02T05:00:00.000Z', - }, - last_review: { - $date: '2019-02-09T05:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 178, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Wifi', - 'Kitchen', - 'Smoking allowed', - 'First aid kit', - 'Fire extinguisher', - 'Essentials', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Laptop friendly workspace', - 'translation missing: en.hosting_amenity_49', - 'translation missing: en.hosting_amenity_50', - 'Hot water', - 'Bed linens', - 'Extra pillows and blankets', - 'Microwave', - 'Coffee maker', - 'Refrigerator', - 'Dishes and silverware', - 'Cooking basics', - 'Stove', - 'Long term stays allowed', - 'Well-lit path to entrance', - 'Step-free access', - 'Wide clearance to bed', - 'Accessible-height bed', - 'Step-free access', - 'Step-free access', - 'Handheld shower head', - 'Paid parking on premises', - ], - price: { - $numberDecimal: '30.00', - }, - security_deposit: { - $numberDecimal: '0.00', - }, - cleaning_fee: { - $numberDecimal: '10.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/9420dabf-661e-4e86-b69c-84d90ceeedb5.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '27518920', - host_url: 'https://www.airbnb.com/users/show/27518920', - host_name: 'Fábio', - host_location: 'São Félix da Marinha, Porto, Portugal', - host_about: - 'Olá o meu nome é Fábio Ramos tenho 32 anos.\r\nSou uma pessoa animada, divertida e altruísta, tenho inúmeros prazeres nesta vida um dos quais é viajar e conhecer pessoas de outras nacionalidades culturas. \r\nEnquanto anfitrião prometo ser o mais prestativo possível, tanto nos primeiros contactos como quando forem meus hóspedes, estarei sempre disponível para ajudar e dar todo o suporte necessário para que passa uma estadia super agradável e interessante na cidade do Porto. ', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/user/30283df3-5b0b-47bb-8f81-990bdf925fb6.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/user/30283df3-5b0b-47bb-8f81-990bdf925fb6.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_response_rate: 90, - host_is_superhost: true, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 3, - host_total_listings_count: 3, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'manual_offline', - 'jumio', - 'government_id', - ], - }, - address: { - street: 'Porto, Porto, Portugal', - suburb: '', - government_area: 'Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória', - market: 'Porto', - country: 'Portugal', - country_code: 'PT', - location: { - type: 'Point', - coordinates: [-8.61123, 41.15225], - is_location_exact: false, - }, - }, - availability: { - availability_30: 16, - availability_60: 40, - availability_90: 67, - availability_365: 335, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 10, - review_scores_rating: 97, - }, - }, - { - _id: '10006546', - listing_url: 'https://www.airbnb.com/rooms/10006546', - name: 'Ribeira Charming Duplex', - notes: - 'Lose yourself in the narrow streets and staircases zone, have lunch in pubs and typical restaurants, and find the renovated cafes and shops in town. If you like exercise, rent a bicycle in the area and ride along the river to the sea, where it will enter beautiful beaches and terraces for everyone. The area is safe, find the bus stops 1min and metro line 5min. The bustling nightlife is a 10 min walk, where the streets are filled with people and entertainment for all. But Porto is much more than the historical center, here is modern museums, concert halls, clean and cared for beaches and surf all year round. Walk through the Ponte D. Luis and visit the different Caves of Port wine, where you will enjoy the famous port wine. Porto is a spoken city everywhere in the world as the best to be visited and savored by all ... natural beauty, culture, tradition, river, sea, beach, single people, typical food, and we are among those who best receive tourists, confirm! Come visit us and feel at ho', - property_type: 'House', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '2', - maximum_nights: '30', - cancellation_policy: 'moderate', - last_scraped: { - $date: '2019-02-16T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-16T05:00:00.000Z', - }, - first_review: { - $date: '2016-01-03T05:00:00.000Z', - }, - last_review: { - $date: '2019-01-20T05:00:00.000Z', - }, - accommodates: 8, - bedrooms: 3, - beds: 5, - number_of_reviews: 51, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Cable TV', - 'Wifi', - 'Kitchen', - 'Paid parking off premises', - 'Smoking allowed', - 'Pets allowed', - 'Buzzer/wireless intercom', - 'Heating', - 'Family/kid friendly', - 'Washer', - 'First aid kit', - 'Fire extinguisher', - 'Essentials', - 'Hangers', - 'Hair dryer', - 'Iron', - 'Pack ’n Play/travel crib', - 'Room-darkening shades', - 'Hot water', - 'Bed linens', - 'Extra pillows and blankets', - 'Microwave', - 'Coffee maker', - 'Refrigerator', - 'Dishwasher', - 'Dishes and silverware', - 'Cooking basics', - 'Oven', - 'Stove', - 'Cleaning before checkout', - 'Waterfront', - ], - price: { - $numberDecimal: '80.00', - }, - security_deposit: { - $numberDecimal: '200.00', - }, - cleaning_fee: { - $numberDecimal: '35.00', - }, - extra_people: { - $numberDecimal: '15.00', - }, - guests_included: { - $numberDecimal: '6', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/e83e702f-ef49-40fb-8fa0-6512d7e26e9b.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '51399391', - host_url: 'https://www.airbnb.com/users/show/51399391', - host_name: 'Ana&Gonçalo', - host_location: 'Porto, Porto District, Portugal', - host_about: - 'Gostamos de passear, de viajar, de conhecer pessoas e locais novos, gostamos de desporto e animais! Vivemos na cidade mais linda do mundo!!!', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/fab79f25-2e10-4f0f-9711-663cb69dc7d8.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/fab79f25-2e10-4f0f-9711-663cb69dc7d8.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_response_rate: 100, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 3, - host_total_listings_count: 3, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'offline_government_id', - 'government_id', - ], - }, - address: { - street: 'Porto, Porto, Portugal', - suburb: '', - government_area: 'Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória', - market: 'Porto', - country: 'Portugal', - country_code: 'PT', - location: { - type: 'Point', - coordinates: [-8.61308, 41.1413], - is_location_exact: false, - }, - }, - availability: { - availability_30: 28, - availability_60: 47, - availability_90: 74, - availability_365: 239, - }, - review_scores: { - review_scores_accuracy: 9, - review_scores_cleanliness: 9, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 9, - review_scores_rating: 89, - }, - }, - { - _id: '10021707', - listing_url: 'https://www.airbnb.com/rooms/10021707', - name: 'Private Room in Bushwick', - notes: '', - property_type: 'Apartment', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '14', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-06T05:00:00.000Z', - }, - first_review: { - $date: '2016-01-31T05:00:00.000Z', - }, - last_review: { - $date: '2016-01-31T05:00:00.000Z', - }, - accommodates: 1, - bedrooms: 1, - beds: 1, - number_of_reviews: 1, - bathrooms: { - $numberDecimal: '1.5', - }, - amenities: [ - 'Internet', - 'Wifi', - 'Air conditioning', - 'Kitchen', - 'Buzzer/wireless intercom', - 'Heating', - 'Smoke detector', - 'Carbon monoxide detector', - 'Essentials', - 'Lock on bedroom door', - ], - price: { - $numberDecimal: '40.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/72844c8c-fec2-440e-a752-bba9b268c361.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '11275734', - host_url: 'https://www.airbnb.com/users/show/11275734', - host_name: 'Josh', - host_location: 'New York, New York, United States', - host_about: '', - host_thumbnail_url: - 'https://a0.muscache.com/im/users/11275734/profile_pic/1405792127/original.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/users/11275734/profile_pic/1405792127/original.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Bushwick', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['email', 'phone', 'reviews', 'kba'], - }, - address: { - street: 'Brooklyn, NY, United States', - suburb: 'Brooklyn', - government_area: 'Bushwick', - market: 'New York', - country: 'United States', - country_code: 'US', - location: { - type: 'Point', - coordinates: [-73.93615, 40.69791], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 8, - review_scores_value: 8, - review_scores_rating: 100, - }, - }, - { - _id: '10057447', - listing_url: 'https://www.airbnb.com/rooms/10057447', - name: 'Modern Spacious 1 Bedroom Loft', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - accommodates: 4, - bedrooms: 1, - beds: 2, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'Internet', - 'Wifi', - 'Kitchen', - 'Heating', - 'Family/kid friendly', - 'Washer', - 'Dryer', - 'Smoke detector', - 'First aid kit', - 'Safety card', - 'Fire extinguisher', - 'Essentials', - 'Shampoo', - '24-hour check-in', - 'Hangers', - 'Iron', - 'Laptop friendly workspace', - ], - price: { - $numberDecimal: '50.00', - }, - extra_people: { - $numberDecimal: '31.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/9fa69ad8-c9be-45dd-966b-b8f59bdccb2b.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '51612949', - host_url: 'https://www.airbnb.com/users/show/51612949', - host_name: 'Konstantin', - host_location: 'Montreal, Quebec, Canada', - host_about: '', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/beb6b50e-0a26-4b29-9837-d68c3eea413f.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/beb6b50e-0a26-4b29-9837-d68c3eea413f.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Mile End', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'jumio', - 'offline_government_id', - 'selfie', - 'government_id', - 'identity_manual', - ], - }, - address: { - street: 'Montréal, Québec, Canada', - suburb: 'Mile End', - government_area: 'Le Plateau-Mont-Royal', - market: 'Montreal', - country: 'Canada', - country_code: 'CA', - location: { - type: 'Point', - coordinates: [-73.59111, 45.51889], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: {}, - }, - { - _id: '10059872', - listing_url: 'https://www.airbnb.com/rooms/10059872', - name: 'Soho Cozy, Spacious and Convenient', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '4', - maximum_nights: '20', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - first_review: { - $date: '2015-12-19T05:00:00.000Z', - }, - last_review: { - $date: '2018-03-27T04:00:00.000Z', - }, - accommodates: 3, - bedrooms: 1, - beds: 2, - number_of_reviews: 3, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'Air conditioning', - 'Kitchen', - 'Smoking allowed', - 'Doorman', - 'Elevator', - 'Heating', - 'Family/kid friendly', - 'Essentials', - '24-hour check-in', - 'translation missing: en.hosting_amenity_50', - ], - price: { - $numberDecimal: '699.00', - }, - weekly_price: { - $numberDecimal: '5000.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/4533a1dc-6fd8-4167-938d-391c6eebbc19.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '51624384', - host_url: 'https://www.airbnb.com/users/show/51624384', - host_name: 'Giovanni', - host_location: 'Hong Kong, Hong Kong', - host_about: '', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/264b82a7-756f-4da8-b607-dc9759e2a10f.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/264b82a7-756f-4da8-b607-dc9759e2a10f.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Soho', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'reviews', - 'jumio', - 'government_id', - ], - }, - address: { - street: 'Hong Kong, Hong Kong Island, Hong Kong', - suburb: 'Central & Western District', - government_area: 'Central & Western', - market: 'Hong Kong', - country: 'Hong Kong', - country_code: 'HK', - location: { - type: 'Point', - coordinates: [114.15027, 22.28158], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 10, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 8, - review_scores_rating: 100, - }, - }, - { - _id: '10116578', - listing_url: 'https://www.airbnb.com/rooms/10116578', - name: 'Apartamento zona sul do RJ', - notes: '', - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'flexible', - last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-02-11T05:00:00.000Z', - }, - accommodates: 5, - bedrooms: 3, - beds: 3, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '1.5', - }, - amenities: [ - 'Cable TV', - 'Wifi', - 'Air conditioning', - 'Wheelchair accessible', - 'Kitchen', - 'Free parking on premises', - 'Doorman', - 'Elevator', - 'Buzzer/wireless intercom', - 'Family/kid friendly', - 'Washer', - '24-hour check-in', - 'Iron', - ], - price: { - $numberDecimal: '933.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/96bb9ea5-a164-4fb6-a136-a21b168a72d7.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '51915770', - host_url: 'https://www.airbnb.com/users/show/51915770', - host_name: 'Luiz Rodrigo', - host_location: 'Rio de Janeiro, State of Rio de Janeiro, Brazil', - host_about: '', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/1a49003e-8025-432d-8614-b1b7aecfe381.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/1a49003e-8025-432d-8614-b1b7aecfe381.jpg?aki_policy=profile_x_medium', - host_neighbourhood: '', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: ['phone', 'facebook'], - }, - address: { - street: 'Rio de Janeiro, Rio de Janeiro, Brazil', - suburb: 'Laranjeiras', - government_area: 'Laranjeiras', - market: 'Rio De Janeiro', - country: 'Brazil', - country_code: 'BR', - location: { - type: 'Point', - coordinates: [-43.1825954762751, -22.930541460367934], - is_location_exact: false, - }, - }, - availability: { - availability_30: 30, - availability_60: 60, - availability_90: 90, - availability_365: 365, - }, - review_scores: {}, - }, - { - _id: '10082307', - listing_url: 'https://www.airbnb.com/rooms/10082307', - name: 'Double Room en-suite (307)', - notes: '', - property_type: 'Apartment', - room_type: 'Private room', - bed_type: 'Real Bed', - minimum_nights: '1', - maximum_nights: '1125', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-11T04:00:00.000Z', - }, - accommodates: 2, - bedrooms: 1, - beds: 1, - number_of_reviews: 0, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Internet', - 'Wifi', - 'Air conditioning', - 'Wheelchair accessible', - 'Doorman', - 'Elevator', - 'Family/kid friendly', - 'Shampoo', - 'Hangers', - 'Hair dryer', - 'Iron', - ], - price: { - $numberDecimal: '361.00', - }, - extra_people: { - $numberDecimal: '130.00', - }, - guests_included: { - $numberDecimal: '2', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/8ee32fb6-2094-42ee-ae6c-ff40b479f9a7.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '51289938', - host_url: 'https://www.airbnb.com/users/show/51289938', - host_name: 'Ken', - host_location: 'Hong Kong', - host_about: - 'Out-going and positive. Happy to talk to guests and exchange our difference in culture.', - host_response_time: 'within an hour', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/48ba1de1-bfea-446c-83ab-c21cb4272696.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/48ba1de1-bfea-446c-83ab-c21cb4272696.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Jordan', - host_response_rate: 90, - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: false, - host_listings_count: 6, - host_total_listings_count: 6, - host_verifications: ['email', 'phone', 'google', 'reviews'], - }, - address: { - street: 'Hong Kong, Kowloon, Hong Kong', - suburb: 'Yau Tsim Mong', - government_area: 'Yau Tsim Mong', - market: 'Hong Kong', - country: 'Hong Kong', - country_code: 'HK', - location: { - type: 'Point', - coordinates: [114.17158, 22.30469], - is_location_exact: true, - }, - }, - availability: { - availability_30: 30, - availability_60: 60, - availability_90: 90, - availability_365: 365, - }, - review_scores: {}, - }, - { - _id: '10091713', - listing_url: 'https://www.airbnb.com/rooms/10091713', - name: 'Surry Hills Studio - Your Perfect Base in Sydney', - notes: - "WiFi, Apple TV with Netflix App (for use with your own iTunes / Netflix account), 42' TV, Sound Dock", - property_type: 'Apartment', - room_type: 'Entire home/apt', - bed_type: 'Real Bed', - minimum_nights: '10', - maximum_nights: '21', - cancellation_policy: 'strict_14_with_grace_period', - last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - calendar_last_scraped: { - $date: '2019-03-07T05:00:00.000Z', - }, - first_review: { - $date: '2016-12-29T05:00:00.000Z', - }, - last_review: { - $date: '2018-03-18T04:00:00.000Z', - }, - accommodates: 2, - bedrooms: 0, - beds: 1, - number_of_reviews: 64, - bathrooms: { - $numberDecimal: '1.0', - }, - amenities: [ - 'TV', - 'Wifi', - 'Kitchen', - 'Elevator', - 'Heating', - 'Washer', - 'Dryer', - 'Smoke detector', - 'Essentials', - 'Shampoo', - 'Iron', - 'Laptop friendly workspace', - 'translation missing: en.hosting_amenity_49', - 'translation missing: en.hosting_amenity_50', - 'Hot water', - 'Bed linens', - 'Ethernet connection', - 'Other', - ], - price: { - $numberDecimal: '181.00', - }, - security_deposit: { - $numberDecimal: '300.00', - }, - cleaning_fee: { - $numberDecimal: '50.00', - }, - extra_people: { - $numberDecimal: '0.00', - }, - guests_included: { - $numberDecimal: '1', - }, - images: { - thumbnail_url: '', - medium_url: '', - picture_url: - 'https://a0.muscache.com/im/pictures/f8eaba4e-d211-42fb-a3ca-887c0ff766f8.jpg?aki_policy=large', - xl_picture_url: '', - }, - host: { - host_id: '13764143', - host_url: 'https://www.airbnb.com/users/show/13764143', - host_name: 'Ben', - host_location: 'New South Wales, Australia', - host_about: 'Software developer from Sydney, Australia. ', - host_thumbnail_url: - 'https://a0.muscache.com/im/pictures/03c4d82b-7e4a-4457-976d-c4e9dfdb13fa.jpg?aki_policy=profile_small', - host_picture_url: - 'https://a0.muscache.com/im/pictures/03c4d82b-7e4a-4457-976d-c4e9dfdb13fa.jpg?aki_policy=profile_x_medium', - host_neighbourhood: 'Surry Hills', - host_is_superhost: false, - host_has_profile_pic: true, - host_identity_verified: true, - host_listings_count: 1, - host_total_listings_count: 1, - host_verifications: [ - 'email', - 'phone', - 'google', - 'reviews', - 'jumio', - 'offline_government_id', - 'government_id', - 'work_email', - ], - }, - address: { - street: 'Surry Hills, NSW, Australia', - suburb: 'Darlinghurst', - government_area: 'Sydney', - market: 'Sydney', - country: 'Australia', - country_code: 'AU', - location: { - type: 'Point', - coordinates: [151.21554, -33.88029], - is_location_exact: true, - }, - }, - availability: { - availability_30: 0, - availability_60: 0, - availability_90: 0, - availability_365: 0, - }, - review_scores: { - review_scores_accuracy: 10, - review_scores_cleanliness: 9, - review_scores_checkin: 10, - review_scores_communication: 10, - review_scores_location: 10, - review_scores_value: 9, - review_scores_rating: 95, - }, - }, ]; diff --git a/packages/compass-generative-ai/tests/evals/fixtures/berlin.cocktailbars.ts b/packages/compass-generative-ai/tests/evals/fixtures/berlin.cocktailbars.ts index 79263a04156..2b2b7ffd441 100644 --- a/packages/compass-generative-ai/tests/evals/fixtures/berlin.cocktailbars.ts +++ b/packages/compass-generative-ai/tests/evals/fixtures/berlin.cocktailbars.ts @@ -96,167 +96,4 @@ export default [ webseite: 'lebens-stern.de', koordinaten: [13.3524999, 52.502059], }, - { - _id: { - $oid: '5ca6588397aed3878f9b0917', - }, - name: 'Victoria Bar', - strasse: 'Potsdamer Str.', - hausnummer: 102, - plz: 10785, - webseite: 'victoriabar.de', - koordinaten: [13.3616635, 52.5014176], - }, - { - _id: { - $oid: '5ca661b697aed3878f9b0918', - }, - name: 'Buck and Breck', - strasse: 'Brunnenstr.', - hausnummer: 177, - plz: 10119, - webseite: 'buckandbreck.com', - koordinaten: [13.396757, 52.5321334], - }, - { - _id: { - $oid: '5ca662b297aed3878f9b0919', - }, - name: 'Becketts Kopf', - strasse: 'Pappelallee', - hausnummer: 64, - plz: 10437, - webseite: 'becketts-kopf.de', - koordinaten: [13.4146512, 52.5456032], - }, - { - _id: { - $oid: '5ca6634597aed3878f9b091a', - }, - name: 'TiER', - strasse: 'Weserstr.', - hausnummer: 42, - plz: 12045, - webseite: 'tier.bar', - koordinaten: [13.3924945, 52.5139491], - }, - { - _id: { - $oid: '5ca663c997aed3878f9b091b', - }, - name: 'Limonadier', - strasse: 'Nostitzstr.', - hausnummer: 12, - plz: 10961, - webseite: 'limonadier.de', - koordinaten: [13.3805451, 52.4905438], - }, - { - _id: { - $oid: '5ca6654e97aed3878f9b091c', - }, - name: 'Galander-Kreuzberg', - strasse: 'Großbeerenstr.', - hausnummer: 54, - plz: 10965, - webseite: 'galander.berlin', - koordinaten: [13.3805451, 52.4905438], - }, - { - _id: { - $oid: '5ca665b097aed3878f9b091d', - }, - name: 'Stagger Lee', - strasse: 'Nollendorfstr.', - hausnummer: 27, - plz: 10777, - webseite: 'staggerlee.de', - koordinaten: [13.3494225, 52.4975759], - }, - { - _id: { - $oid: '5ca6666a97aed3878f9b091e', - }, - name: 'Schwarze Traube', - strasse: 'Wrangelstr.', - hausnummer: 24, - plz: 10997, - webseite: 'schwarzetraube.de', - koordinaten: [13.414625, 52.5011464], - }, - { - _id: { - $oid: '5ca666cb97aed3878f9b091f', - }, - name: 'Kirk Bar', - strasse: 'Skalitzer Str.', - hausnummer: 75, - plz: 10997, - webseite: 'kirkbar-berlin.de', - koordinaten: [13.4317823, 52.5010796], - }, - { - _id: { - $oid: '5ca6673797aed3878f9b0920', - }, - name: 'John Muir', - strasse: 'Skalitzer Str.', - hausnummer: 51, - plz: 10997, - webseite: 'johnmuirberlin.com', - koordinaten: [13.4317823, 52.5010796], - }, - { - _id: { - $oid: '5ca72bc2db8ece608c5f3269', - }, - name: 'Mr. Susan', - strasse: 'Krausnickstr.', - hausnummer: 1, - plz: 10115, - koordinaten: [13.3936122, 52.52443], - }, - { - _id: { - $oid: '5ca72eabdb8ece608c5f326c', - }, - name: 'Velvet', - strasse: 'Ganghoferstr.', - hausnummer: 1, - plz: 12043, - koordinaten: [13.437435, 52.4792766], - }, - { - _id: { - $oid: '6054a874b5990f127b71361b', - }, - name: 'Testing', - }, - { - _id: { - $oid: '6054a8f6b5990f127b71361c', - }, - name: 'Testing', - }, - { - _id: { - $oid: '66d8655c461606b7bd7e34b7', - }, - name: 'John Muir', - strasse: 'Skalitzer Str.', - hausnummer: 51, - plz: 10997, - webseite: 'johnmuirberlin.com', - koordinaten: [13.4317823, 52.5010796], - }, - { - _id: { - $oid: '66d86639461606b7bd7e34ba', - }, - name: 'Rum Trader', - strasse: 'Fasanenstr.', - hausnummer: 40, - plz: 10719, - koordinaten: [13.3244667, 52.4984012], - }, ]; diff --git a/packages/compass-generative-ai/tests/evals/fixtures/netflix.comments.ts b/packages/compass-generative-ai/tests/evals/fixtures/netflix.comments.ts index e93ed3efb88..8afda595db3 100644 --- a/packages/compass-generative-ai/tests/evals/fixtures/netflix.comments.ts +++ b/packages/compass-generative-ai/tests/evals/fixtures/netflix.comments.ts @@ -125,816 +125,4 @@ export default [ $date: '1971-08-31T07:24:20.000Z', }, }, - { - _id: { - $oid: '5a9427648b0beebeb6957a0b', - }, - name: 'Amy Ramirez', - email: 'amy_ramirez@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd4b1b', - }, - text: 'Incidunt possimus quasi suscipit. Rem fugit labore nisi cum. Sit facere tempora dolores quia rerum atque. Ab minima iure voluptatibus dolor quos cumque placeat quos.', - date: { - $date: '1999-10-27T05:03:04.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a10', - }, - name: 'Richard Schmidt', - email: 'richard_schmidt@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd4c0b', - }, - text: 'Quaerat occaecati eveniet repellat. Distinctio suscipit illo unde veniam. Expedita magni adipisci excepturi unde nihil dicta.', - date: { - $date: '2007-03-05T21:28:35.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a4b', - }, - name: 'Gregor Clegane', - email: 'hafthór_júlíus_björnsson@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd5b9a', - }, - text: 'Voluptatum voluptatem nam et accusamus ullam qui explicabo exercitationem. Ut sint facilis aut similique dolorum non. Necessitatibus unde molestias incidunt asperiores nesciunt molestias.', - date: { - $date: '2015-02-08T01:28:23.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb69579d0', - }, - name: 'Talisa Maegyr', - email: 'oona_chaplin@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd41b1', - }, - text: 'Rem itaque ad sit rem voluptatibus. Ad fugiat maxime illum optio iure alias minus. Optio ratione suscipit corporis qui dicta.', - date: { - $date: '1998-08-22T11:45:03.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a03', - }, - name: 'Beric Dondarrion', - email: 'richard_dormer@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd47f0', - }, - text: 'Placeat sapiente in natus nemo. Qui quibusdam praesentium doloribus aut provident. Optio nihil officia suscipit numquam at.', - date: { - $date: '1998-09-04T04:41:51.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a12', - }, - name: 'Brenda Martin', - email: 'brenda_martin@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd4cf1', - }, - text: 'Explicabo est officia magni quod ab quis. Tenetur consequuntur facilis recusandae incidunt eligendi.', - date: { - $date: '2012-01-18T09:50:15.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb69579cc', - }, - name: 'Andrea Le', - email: 'andrea_le@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd418c', - }, - text: 'Rem officiis eaque repellendus amet eos doloribus. Porro dolor voluptatum voluptates neque culpa molestias. Voluptate unde nulla temporibus ullam.', - date: { - $date: '2012-03-26T23:20:16.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a1a', - }, - name: 'Robb Stark', - email: 'richard_madden@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd4ec2', - }, - text: 'Illum laudantium deserunt totam. Repudiandae explicabo soluta dolores atque corrupti. Odit laudantium quam aperiam ullam.', - date: { - $date: '2005-06-26T12:20:51.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a38', - }, - name: 'Yara Greyjoy', - email: 'gemma_whelan@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd587d', - }, - text: 'Nobis incidunt ea tempore cupiditate sint. Itaque beatae hic ut quis.', - date: { - $date: '2012-11-26T11:00:57.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb69579d6', - }, - name: 'Taylor Hill', - email: 'taylor_hill@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd4137', - }, - text: 'Neque repudiandae laborum earum ipsam facilis blanditiis voluptate. Aliquam vitae porro repellendus voluptatum facere.', - date: { - $date: '1993-10-23T13:16:51.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a0f', - }, - name: 'Melisandre', - email: 'carice_van_houten@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd4c0b', - }, - text: 'Perspiciatis non debitis magnam. Voluptate adipisci quo et laborum. Recusandae quia officiis ad aut rem blanditiis sit.', - date: { - $date: '1974-06-22T07:31:47.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb69579d5', - }, - name: 'Petyr Baelish', - email: 'aidan_gillen@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd4218', - }, - text: 'Quo deserunt ipsam ipsum. Tenetur eos nemo nam sint praesentium minus exercitationem.', - date: { - $date: '2001-07-13T19:25:09.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a01', - }, - name: 'Sarah Lewis', - email: 'sarah_lewis@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd471c', - }, - text: 'Totam molestiae accusamus sed illum aut autem maiores quo. Necessitatibus dolorum sed ea rem. Nihil perferendis fugit tempore quam. Laboriosam aliquam nulla ratione explicabo unde consectetur.', - date: { - $date: '1981-03-31T06:38:59.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a5a', - }, - name: 'Janos Slynt', - email: 'dominic_carter@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd5d89', - }, - text: 'Voluptates necessitatibus cum modi repellendus perferendis. Ipsa numquam eum nulla recusandae impedit recusandae. In ex autem tempora nam excepturi earum.', - date: { - $date: '1975-05-12T23:28:20.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a7d', - }, - name: 'Stannis Baratheon', - email: 'stephen_dillane@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd63cb', - }, - text: 'Earum eaque pariatur tempora aut perferendis. Repellat expedita dolore unde placeat corporis. Rerum animi similique doloremque iste.', - date: { - $date: '1988-08-11T09:30:55.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a84', - }, - name: 'Mace Tyrell', - email: 'roger_ashton-griffiths@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd67e9', - }, - text: 'Ipsam non non dignissimos incidunt perspiciatis voluptatibus. Corporis dicta unde tempore sapiente. Voluptatem quia esse deserunt assumenda porro. Eius totam ratione sed voluptatibus culpa.', - date: { - $date: '1993-08-12T00:26:22.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a86', - }, - name: 'Barbara Gonzalez', - email: 'barbara_gonzalez@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd681b', - }, - text: 'Accusantium ex veritatis est aut facere commodi asperiores. Dignissimos cum rerum odit labore. Eum quos architecto perspiciatis molestiae voluptate doloribus dolorem veniam.', - date: { - $date: '1982-03-09T02:56:42.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a99', - }, - name: 'Connie Johnson', - email: 'connie_johnson@fakegmail.com', - movie_id: { - $oid: '573a1391f29313caabcd695a', - }, - text: 'Quo minima excepturi quisquam blanditiis quod velit. Minus dolor incidunt repellat eligendi ducimus quod. Minus officiis possimus iure nemo nisi ab eos magni.', - date: { - $date: '2005-05-17T16:52:25.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a2e', - }, - name: 'Bowen Marsh', - email: 'michael_condron@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd5570', - }, - text: 'Odit laudantium cupiditate ipsum ipsam. Officia nisi totam sequi recusandae excepturi. Impedit vitae iste nisi eius. Consequuntur iusto animi nemo libero.', - date: { - $date: '1987-07-03T12:54:13.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a09', - }, - name: 'Daario Naharis', - email: 'michiel_huisman@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd4aa2', - }, - text: 'Distinctio commodi autem amet molestias. Dolorem numquam vitae voluptas corporis fugit aut autem earum.', - date: { - $date: '1979-07-06T20:36:21.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a55', - }, - name: 'Javier Smith', - email: 'javier_smith@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd5c04', - }, - text: 'Omnis temporibus at ut saepe dolor saepe suscipit. Laborum veritatis autem cumque exercitationem aliquam. Nulla laudantium ab esse deserunt reprehenderit veniam. Ea deserunt nesciunt dicta nisi.', - date: { - $date: '2006-10-18T01:20:58.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a1e', - }, - name: 'Emily Ellis', - email: 'emily_ellis@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd5104', - }, - text: 'Illo optio ipsa similique quo maxime. Fugiat illum ullam aliquid. Corporis distinctio omnis fugiat facilis aliquam ea commodi labore.', - date: { - $date: '2002-08-25T09:37:45.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a3f', - }, - name: 'Rickon Stark', - email: 'art_parkinson@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd5954', - }, - text: 'Aliquam fuga quos nihil exercitationem maiores maxime. Ex sit velit repellendus. Vitae cupiditate laudantium facilis culpa ea nostrum labore. Cum animi vitae incidunt ipsum facilis repellendus.', - date: { - $date: '1991-08-12T23:00:32.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a75', - }, - name: 'Talisa Maegyr', - email: 'oona_chaplin@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd62f3', - }, - text: 'Error laudantium omnis delectus facilis illum repellat praesentium. Possimus quo doloremque occaecati a laborum sapiente dolore.', - date: { - $date: '1972-06-28T16:06:43.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a88', - }, - name: 'Thomas Morris', - email: 'thomas_morris@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd680a', - }, - text: 'Perspiciatis sequi nesciunt maiores. Molestiae earum odio voluptas animi ipsam. Dolorem libero temporibus omnis quaerat deleniti atque. Tempore delectus esse explicabo nemo.', - date: { - $date: '2004-02-26T06:33:03.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb69579d3', - }, - name: 'Cameron Duran', - email: 'cameron_duran@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd4217', - }, - text: 'Quasi dicta culpa asperiores quaerat perferendis neque. Est animi pariatur impedit itaque exercitationem.', - date: { - $date: '1983-04-27T20:39:15.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a42', - }, - name: 'Davos Seaworth', - email: 'liam_cunningham@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd592c', - }, - text: 'Illo amet aliquid molestias repellat modi reprehenderit. Nobis totam dicta accusamus voluptates. Eaque distinctio nostrum accusamus eos inventore iste iste sapiente.', - date: { - $date: '2010-06-14T05:19:24.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb69579fe', - }, - name: 'Daario Naharis', - email: 'michiel_huisman@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd47c2', - }, - text: 'Enim enim deleniti in debitis. Delectus nesciunt id tenetur.', - date: { - $date: '1988-11-19T05:22:18.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a25', - }, - name: 'Osha', - email: 'natalia_tena@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd5181', - }, - text: 'Dolor inventore commodi eos ipsum earum vitae quidem. Optio debitis rerum voluptas voluptatibus quos. Harum quam delectus rem sint.', - date: { - $date: '1992-08-26T21:07:54.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a2c', - }, - name: 'Samwell Tarly', - email: 'john_bradley-west@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd54ed', - }, - text: 'Natus enim voluptate dolore. Quo porro ipsum enim. Est totam sapiente nam vero.', - date: { - $date: '1988-02-25T03:56:33.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a46', - }, - name: 'Denise Davidson', - email: 'denise_davidson@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd5b2a', - }, - text: 'Numquam voluptas veniam ducimus sunt accusamus harum distinctio autem. Aliquid dicta nulla aperiam veniam placeat quam. Veritatis maiores ipsa quos accusantium molestiae eum voluptatibus.', - date: { - $date: '1986-11-08T13:05:21.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a52', - }, - name: 'Sarah Lewis', - email: 'sarah_lewis@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd5ca5', - }, - text: 'Incidunt molestiae quam ipsum hic incidunt harum magnam perspiciatis. Quisquam eum sunt fuga ut laborum ducimus ratione. Ut dolorum totam voluptatem excepturi.', - date: { - $date: '2000-12-25T08:51:17.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a77', - }, - name: 'Bran Stark', - email: 'isaac_hempstead_wright@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd62f3', - }, - text: 'Quibusdam ea excepturi quo suscipit suscipit ipsa beatae. Id optio ratione incidunt dolor. Maiores optio aspernatur velit laudantium. Repudiandae vel voluptatum laudantium sint.', - date: { - $date: '1979-12-25T14:48:19.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb69579eb', - }, - name: 'Emily Ellis', - email: 'emily_ellis@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd432a', - }, - text: 'Iste molestiae animi minima quod ad. Corporis maiores suscipit sapiente nam perferendis autem eos. Id adipisci natus aut facilis iste consequuntur.', - date: { - $date: '1988-10-16T19:08:23.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb69579ea', - }, - name: 'Cameron Duran', - email: 'cameron_duran@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd433d', - }, - text: 'Ad asperiores mollitia aperiam non incidunt. Totam fugiat cumque praesentium placeat. Debitis tenetur eligendi recusandae enim perferendis. Vero maiores eveniet reiciendis necessitatibus.', - date: { - $date: '1989-01-21T14:20:47.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb69579ee', - }, - name: 'Theon Greyjoy', - email: 'alfie_allen@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd437c', - }, - text: 'Dicta asperiores necessitatibus corporis. Quidem fugiat eius animi fugiat laborum. Quas maiores mollitia amet quibusdam. Ducimus sed asperiores sint recusandae accusamus veniam.', - date: { - $date: '2000-12-06T07:26:29.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a0e', - }, - name: 'Viserys Targaryen', - email: 'harry_lloyd@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd4b1b', - }, - text: 'Itaque minima enim mollitia rerum hic. Doloribus dolor nobis corporis fuga quod error. Consequuntur eligendi quibusdam sequi error aliquam dolore.', - date: { - $date: '2010-03-20T02:11:01.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a54', - }, - name: 'Loras Tyrell', - email: 'finn_jones@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd5ca5', - }, - text: 'Ratione nemo cumque provident itaque voluptatem mollitia quas. Atque possimus asperiores dicta non. Libero aliquam nihil nisi quasi.', - date: { - $date: '1970-06-22T12:20:24.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a72', - }, - name: 'Jaime Lannister', - email: 'nikolaj_coster-waldau@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd604c', - }, - text: 'Laborum reprehenderit repellat necessitatibus non molestias adipisci excepturi. Illum magni dolore iure. Quo itaque beatae culpa porro necessitatibus. Magnam natus quos maiores nihil.', - date: { - $date: '1993-06-24T03:08:50.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a73', - }, - name: 'Kathryn Sosa', - email: 'kathryn_sosa@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd62d6', - }, - text: 'Error enim architecto ipsam voluptatum. Deleniti voluptates unde cumque aperiam veritatis magni repellendus aliquid. Voluptas quibusdam sit ullam tempora omnis cumque tempora.', - date: { - $date: '1997-07-18T16:35:33.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb69579f5', - }, - name: 'John Bishop', - email: 'john_bishop@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd446f', - }, - text: 'Id error ab at molestias dolorum incidunt. Non deserunt praesentium dolorem nihil. Optio tempora vel ut quas.\nMinus dicta numquam quasi. Rem totam cumque at eum. Ullam hic ut ea magni.', - date: { - $date: '1975-01-21T00:31:22.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a22', - }, - name: 'Taylor Scott', - email: 'taylor_scott@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd4eaf', - }, - text: 'Iure laboriosam quo et necessitatibus sed. Id iure delectus soluta. Quaerat officiis maiores commodi earum. Autem odio labore debitis optio libero.', - date: { - $date: '1970-11-15T05:54:02.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a7c', - }, - name: 'Ronald Cox', - email: 'ronald_cox@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd6424', - }, - text: 'Reprehenderit commodi ut odit. Maxime perspiciatis eum in sapiente unde doloremque. Occaecati atque asperiores error velit. Amet assumenda tenetur veniam numquam occaecati nam.', - date: { - $date: '1982-03-26T09:37:11.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb69579db', - }, - name: 'Olly', - email: "brenock_o'connor@gameofthron.es", - movie_id: { - $oid: '573a1390f29313caabcd413b', - }, - text: 'Perspiciatis sit pariatur quas. Perferendis officia harum ipsum deleniti vel inventore. Nobis culpa eaque in blanditiis porro esse. Nisi deserunt culpa expedita dolorum quo aperiam.', - date: { - $date: '2005-01-04T13:49:05.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb69579cf', - }, - name: 'Greg Powell', - email: 'greg_powell@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd41b1', - }, - text: 'Tenetur dolorum molestiae ea. Eligendi praesentium unde quod porro. Commodi nisi sit placeat rerum vero cupiditate neque. Dolorum nihil vero animi.', - date: { - $date: '1987-02-10T00:29:36.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb69579dd', - }, - name: 'Joshua Kent', - email: 'joshua_kent@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd42ee', - }, - text: 'Corporis pariatur rem autem accusamus debitis. Eaque aspernatur quae accusantium non ea quasi ullam. Assumenda quibusdam blanditiis inventore velit dolorem. Adipisci quaerat quae architecto sint.', - date: { - $date: '1993-12-06T18:45:21.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a40', - }, - name: 'Jason Smith', - email: 'jason_smith@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd5a37', - }, - text: 'Blanditiis sunt quis voluptate ex soluta id. Debitis excepturi consequuntur quis nemo amet. Fuga voluptas modi rerum aliquam optio quae a aspernatur.', - date: { - $date: '1978-06-30T21:42:48.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a67', - }, - name: 'Sarah Lewis', - email: 'sarah_lewis@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd5fa9', - }, - text: 'Ab consequatur numquam sed eligendi ex unde. Dolorem illum minima numquam dicta ipsa magnam nostrum. Possimus sed inventore cum non.', - date: { - $date: '2005-09-18T01:30:56.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a6b', - }, - name: 'Maester Luwin', - email: 'donald_sumpter@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd61b1', - }, - text: 'Excepturi vitae mollitia voluptates esse facere. Minus a distinctio error natus totam eos. Ducimus dicta maiores iusto. Facilis sequi sunt velit minus.', - date: { - $date: '1988-04-30T15:49:35.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a87', - }, - name: 'Anthony Cline', - email: 'anthony_cline@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd681b', - }, - text: 'Reiciendis adipisci veritatis molestias sint officiis ab cupiditate. Reiciendis laudantium nam explicabo rerum. Ea accusamus iste necessitatibus.', - date: { - $date: '1979-12-27T23:39:52.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a94', - }, - name: 'Victoria Sanders', - email: 'victoria_sanders@fakegmail.com', - movie_id: { - $oid: '573a1391f29313caabcd6864', - }, - text: 'Nulla fugiat nulla omnis atque. Architecto libero rem blanditiis ea ea ut praesentium accusamus. Possimus est quibusdam numquam optio eveniet. Magni fuga neque ad consequuntur maxime.', - date: { - $date: '1986-03-11T12:35:36.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a23', - }, - name: 'Shae', - email: 'sibel_kekilli@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd4b1b', - }, - text: 'Ullam excepturi animi voluptates magnam quos dolore aliquid. Praesentium illum non vitae ab debitis blanditiis. Tempore quam iste inventore minima. Ad itaque dignissimos soluta fugiat aliquid.', - date: { - $date: '1995-03-05T06:06:17.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a27', - }, - name: 'Jerry Cabrera', - email: 'jerry_cabrera@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd51e1', - }, - text: 'In facere explicabo inventore dolorum dignissimos neque. Voluptate amet numquam doloribus temporibus necessitatibus eius inventore. Quaerat itaque sunt voluptas dicta maxime.', - date: { - $date: '1993-03-19T05:34:13.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a63', - }, - name: 'Anthony Smith', - email: 'anthony_smith@fakegmail.com', - movie_id: { - $oid: '573a1390f29313caabcd5e52', - }, - text: 'Veniam tenetur culpa aliquam provident explicabo nesciunt. Numquam exercitationem deserunt dolore quas facere ducimus.', - date: { - $date: '1971-07-29T19:40:20.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a64', - }, - name: 'Beric Dondarrion', - email: 'richard_dormer@gameofthron.es', - movie_id: { - $oid: '573a1390f29313caabcd5fe6', - }, - text: 'Odit eligendi explicabo ab unde aut laboriosam officia. Dolorem expedita molestiae voluptates esse quaerat hic. Consequatur dolor aspernatur sequi necessitatibus maxime.', - date: { - $date: '1980-07-09T14:30:12.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957a9c', - }, - name: 'Jose Hall', - email: 'jose_hall@fakegmail.com', - movie_id: { - $oid: '573a1391f29313caabcd69c9', - }, - text: 'Asperiores delectus officia non. Consequuntur pariatur laborum dolor optio animi. Debitis deserunt maxime voluptatem asperiores. Officiis architecto sit modi doloribus autem.', - date: { - $date: '2016-09-01T05:25:31.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957aa3', - }, - name: 'Yolanda Owen', - email: 'yolanda_owen@fakegmail.com', - movie_id: { - $oid: '573a1391f29313caabcd6d40', - }, - text: 'Occaecati commodi quidem aliquid delectus dolores. Facilis fugiat soluta maxime ipsum. Facere quibusdam vitae eius in fugit voluptatum beatae.', - date: { - $date: '1980-07-13T06:41:13.000Z', - }, - }, - { - _id: { - $oid: '5a9427648b0beebeb6957ad7', - }, - name: 'Mary Mitchell', - email: 'mary_mitchell@fakegmail.com', - movie_id: { - $oid: '573a1391f29313caabcd712f', - }, - text: 'Possimus odio laborum labore modi nihil molestiae nostrum. Placeat tempora neque ut. Sit sunt cupiditate error corrupti aperiam ducimus deserunt. Deserunt explicabo libero quo iste voluptas.', - date: { - $date: '1980-06-12T13:14:32.000Z', - }, - }, ]; diff --git a/packages/compass-generative-ai/tests/evals/fixtures/netflix.movies.ts b/packages/compass-generative-ai/tests/evals/fixtures/netflix.movies.ts index 9f85aa6b813..dc696ac485f 100644 --- a/packages/compass-generative-ai/tests/evals/fixtures/netflix.movies.ts +++ b/packages/compass-generative-ai/tests/evals/fixtures/netflix.movies.ts @@ -71,277 +71,4 @@ export default [ year: 1991, id: '9', }, - { - _id: { - $oid: '573b864df29313caabe354f7', - }, - title: 'My Favorite Brunette', - year: 1947, - id: '12', - }, - { - _id: { - $oid: '573b864df29313caabe354f8', - }, - title: 'Full Frame: Documentary Shorts', - year: 1999, - id: '11', - }, - { - _id: { - $oid: '573b864df29313caabe354f9', - }, - title: - 'Lord of the Rings: The Return of the King: Extended Edition: Bonus Material', - year: 2003, - id: '13', - }, - { - _id: { - $oid: '573b864df29313caabe354fa', - }, - title: 'Neil Diamond: Greatest Hits Live', - year: 1988, - id: '15', - }, - { - _id: { - $oid: '573b864df29313caabe354fb', - }, - title: '7 Seconds', - year: 2005, - id: '17', - }, - { - _id: { - $oid: '573b864df29313caabe354fc', - }, - title: 'Nature: Antarctica', - year: 1982, - id: '14', - }, - { - _id: { - $oid: '573b864df29313caabe354fe', - }, - title: "By Dawn's Early Light", - year: 2000, - id: '19', - }, - { - _id: { - $oid: '573b864df29313caabe35500', - }, - title: 'Strange Relations', - year: 2002, - id: '21', - }, - { - _id: { - $oid: '573b864df29313caabe35501', - }, - title: 'Chump Change', - year: 2000, - id: '22', - }, - { - _id: { - $oid: '573b864df29313caabe35502', - }, - title: 'Screamers', - year: 1996, - id: '16', - }, - { - _id: { - $oid: '573b864df29313caabe35505', - }, - title: 'Inspector Morse 31: Death Is Now My Neighbour', - year: 1997, - id: '25', - }, - { - _id: { - $oid: '573b864df29313caabe35506', - }, - title: 'Never Die Alone', - year: 2004, - id: '26', - }, - { - _id: { - $oid: '573b864df29313caabe35508', - }, - title: 'Lilo and Stitch', - year: 2002, - id: '28', - }, - { - _id: { - $oid: '573b864df29313caabe3550a', - }, - title: "Something's Gotta Give", - year: 2003, - id: '30', - }, - { - _id: { - $oid: '573b864df29313caabe3550c', - }, - title: "ABC Primetime: Mel Gibson's The Passion of the Christ", - year: 2004, - id: '32', - }, - { - _id: { - $oid: '573b864df29313caabe3550d', - }, - title: 'Ferngully 2: The Magical Rescue', - year: 2000, - id: '35', - }, - { - _id: { - $oid: '573b864df29313caabe3550e', - }, - title: "Ashtanga Yoga: Beginner's Practice with Nicki Doane", - year: 2003, - id: '34', - }, - { - _id: { - $oid: '573b864df29313caabe35513', - }, - title: 'Love Reinvented', - year: 2000, - id: '39', - }, - { - _id: { - $oid: '573b864df29313caabe35514', - }, - title: 'Pitcher and the Pin-Up', - year: 2004, - id: '40', - }, - { - _id: { - $oid: '573b864df29313caabe35515', - }, - title: 'Horror Vision', - year: 2000, - id: '41', - }, - { - _id: { - $oid: '573b864df29313caabe35516', - }, - title: 'Silent Service', - year: 2000, - id: '43', - }, - { - _id: { - $oid: '573b864df29313caabe35517', - }, - title: 'Searching for Paradise', - year: 2002, - id: '42', - }, - { - _id: { - $oid: '573b864df29313caabe35518', - }, - title: 'Spitfire Grill', - year: 1996, - id: '44', - }, - { - _id: { - $oid: '573b864df29313caabe3551a', - }, - title: 'Rudolph the Red-Nosed Reindeer', - year: 1964, - id: '46', - }, - { - _id: { - $oid: '573b864df29313caabe3551e', - }, - title: 'A Yank in the R.A.F.', - year: 1941, - id: '50', - }, - { - _id: { - $oid: '573b864df29313caabe35524', - }, - title: 'Carandiru', - year: 2004, - id: '56', - }, - { - _id: { - $oid: '573b864df29313caabe35526', - }, - title: 'Dragonheart', - year: 1996, - id: '58', - }, - { - _id: { - $oid: '573b864df29313caabe35528', - }, - title: 'Ricky Martin: One Night Only', - year: 1999, - id: '61', - }, - { - _id: { - $oid: '573b864df29313caabe35529', - }, - title: 'The Libertine', - year: 1969, - id: '60', - }, - { - _id: { - $oid: '573b864df29313caabe3552a', - }, - title: "Ken Burns' America: Empire of the Air", - year: 1991, - id: '62', - }, - { - _id: { - $oid: '573b864df29313caabe3552b', - }, - title: 'Crash Dive', - year: 1943, - id: '63', - }, - { - _id: { - $oid: '573b864df29313caabe3552e', - }, - title: 'Invader Zim', - year: 2004, - id: '68', - }, - { - _id: { - $oid: '573b864df29313caabe35530', - }, - title: 'Tai Chi: The 24 Forms', - year: 1999, - id: '70', - }, - { - _id: { - $oid: '573b864df29313caabe35531', - }, - title: 'WWE: Armageddon 2003', - year: 2003, - id: '69', - }, ]; diff --git a/packages/compass-generative-ai/tests/evals/fixtures/nyc.parking.ts b/packages/compass-generative-ai/tests/evals/fixtures/nyc.parking.ts index 9558bcec991..0f872a97f20 100644 --- a/packages/compass-generative-ai/tests/evals/fixtures/nyc.parking.ts +++ b/packages/compass-generative-ai/tests/evals/fixtures/nyc.parking.ts @@ -447,798 +447,4 @@ export default [ 'Hydrant Violation': '', 'Double Parking Violation': '', }, - { - _id: { - $oid: '5735040085629ed4fa839478', - }, - 'Summons Number': { - $numberLong: '7431929330', - }, - 'Plate ID': 'FHM2618', - 'Registration State': 'NY', - 'Plate Type': 'PAS', - 'Issue Date': '03/12/2015', - 'Violation Code': 38, - 'Vehicle Body Type': '4DSD', - 'Vehicle Make': 'LEXUS', - 'Issuing Agency': 'T', - 'Street Code1': 54580, - 'Street Code2': 15290, - 'Street Code3': 15190, - 'Vehicle Expiration Date': '01/01/20170216 12:00:00 PM', - 'Violation Location': 107, - 'Violation Precinct': 107, - 'Issuer Precinct': 107, - 'Issuer Code': 361100, - 'Issuer Command': 'T402', - 'Issuer Squad': 'B', - 'Violation Time': '0235P', - 'Time First Observed': '', - 'Violation County': 'Q', - 'Violation In Front Of Or Opposite': 'O', - 'House Number': '72-32', - 'Street Name': 'Main St', - 'Intersecting Street': '', - 'Date First Observed': '01/05/0001 12:00:00 PM', - 'Law Section': 408, - 'Sub Division': 'h1', - 'Violation Legal Code': '', - 'Days Parking In Effect': 'YYYYY', - 'From Hours In Effect': '0800A', - 'To Hours In Effect': '0700P', - 'Vehicle Color': 'LT/', - 'Unregistered Vehicle?': '', - 'Vehicle Year': 2008, - 'Meter Number': '', - 'Feet From Curb': 0, - 'Violation Post Code': '06 4', - 'Violation Description': '38-Failure to Display Muni Rec', - 'No Standing or Stopping Violation': '', - 'Hydrant Violation': '', - 'Double Parking Violation': '', - }, - { - _id: { - $oid: '5735040085629ed4fa839479', - }, - 'Summons Number': { - $numberLong: '7381962433', - }, - 'Plate ID': '50204JT', - 'Registration State': 'NY', - 'Plate Type': 'COM', - 'Issue Date': '02/20/2015', - 'Violation Code': 17, - 'Vehicle Body Type': 'VAN', - 'Vehicle Make': 'CHEVR', - 'Issuing Agency': 'T', - 'Street Code1': 93250, - 'Street Code2': 52930, - 'Street Code3': 54650, - 'Vehicle Expiration Date': '01/01/88888888 12:00:00 PM', - 'Violation Location': 84, - 'Violation Precinct': 84, - 'Issuer Precinct': 84, - 'Issuer Code': 355301, - 'Issuer Command': 'T301', - 'Issuer Squad': 'C', - 'Violation Time': '1012A', - 'Time First Observed': '', - 'Violation County': 'K', - 'Violation In Front Of Or Opposite': 'F', - 'House Number': 57, - 'Street Name': 'Willoughby St', - 'Intersecting Street': '', - 'Date First Observed': '01/05/0001 12:00:00 PM', - 'Law Section': 408, - 'Sub Division': 'c4', - 'Violation Legal Code': '', - 'Days Parking In Effect': 'YYYYYYY', - 'From Hours In Effect': '', - 'To Hours In Effect': '', - 'Vehicle Color': 'WHITE', - 'Unregistered Vehicle?': '', - 'Vehicle Year': 2005, - 'Meter Number': '', - 'Feet From Curb': 0, - 'Violation Post Code': '03 3', - 'Violation Description': '17-No Stand (exc auth veh)', - 'No Standing or Stopping Violation': '', - 'Hydrant Violation': '', - 'Double Parking Violation': '', - }, - { - _id: { - $oid: '5735040085629ed4fa83947a', - }, - 'Summons Number': 1377361196, - 'Plate ID': 'GSA1316', - 'Registration State': 'NY', - 'Plate Type': 'PAS', - 'Issue Date': '01/29/2015', - 'Violation Code': 80, - 'Vehicle Body Type': 'SUBN', - 'Vehicle Make': 'HONDA', - 'Issuing Agency': 'P', - 'Street Code1': 12120, - 'Street Code2': 9720, - 'Street Code3': 45720, - 'Vehicle Expiration Date': '01/01/20160907 12:00:00 PM', - 'Violation Location': 41, - 'Violation Precinct': 41, - 'Issuer Precinct': 41, - 'Issuer Code': 936738, - 'Issuer Command': 41, - 'Issuer Squad': 0, - 'Violation Time': '0216A', - 'Time First Observed': '', - 'Violation County': 'BX', - 'Violation In Front Of Or Opposite': 'F', - 'House Number': 687, - 'Street Name': 'BECK ST', - 'Intersecting Street': '', - 'Date First Observed': '01/05/0001 12:00:00 PM', - 'Law Section': 408, - 'Sub Division': 99, - 'Violation Legal Code': '', - 'Days Parking In Effect': 'BBBBBBB', - 'From Hours In Effect': 'ALL', - 'To Hours In Effect': 'ALL', - 'Vehicle Color': 'GRAY', - 'Unregistered Vehicle?': 0, - 'Vehicle Year': 0, - 'Meter Number': '-', - 'Feet From Curb': 0, - 'Violation Post Code': '', - 'Violation Description': '', - 'No Standing or Stopping Violation': '', - 'Hydrant Violation': '', - 'Double Parking Violation': '', - }, - { - _id: { - $oid: '5735040085629ed4fa83947b', - }, - 'Summons Number': { - $numberLong: '7575556758', - }, - 'Plate ID': 'BXV8565', - 'Registration State': 'NY', - 'Plate Type': 'PAS', - 'Issue Date': '10/29/2014', - 'Violation Code': 37, - 'Vehicle Body Type': '4DSD', - 'Vehicle Make': 'CHEVR', - 'Issuing Agency': 'T', - 'Street Code1': 10210, - 'Street Code2': 0, - 'Street Code3': 0, - 'Vehicle Expiration Date': '01/01/20160902 12:00:00 PM', - 'Violation Location': 19, - 'Violation Precinct': 19, - 'Issuer Precinct': 19, - 'Issuer Code': 356258, - 'Issuer Command': 'T103', - 'Issuer Squad': 'F', - 'Violation Time': '0104P', - 'Time First Observed': '1256P', - 'Violation County': 'NY', - 'Violation In Front Of Or Opposite': 'I', - 'House Number': 'W', - 'Street Name': '3rd Ave', - 'Intersecting Street': '12ft S/of E 90th St', - 'Date First Observed': '01/05/0001 12:00:00 PM', - 'Law Section': 408, - 'Sub Division': 'h1', - 'Violation Legal Code': '', - 'Days Parking In Effect': 'Y', - 'From Hours In Effect': '0800A', - 'To Hours In Effect': '0700P', - 'Vehicle Color': 'GR', - 'Unregistered Vehicle?': '', - 'Vehicle Year': 1998, - 'Meter Number': '120-8032', - 'Feet From Curb': 0, - 'Violation Post Code': '06 7', - 'Violation Description': '37-Expired Muni Meter', - 'No Standing or Stopping Violation': '', - 'Hydrant Violation': '', - 'Double Parking Violation': '', - }, - { - _id: { - $oid: '5735040085629ed4fa83947c', - }, - 'Summons Number': { - $numberLong: '7462760484', - }, - 'Plate ID': 'EPH7313', - 'Registration State': 'NY', - 'Plate Type': 'PAS', - 'Issue Date': '10/10/2014', - 'Violation Code': 20, - 'Vehicle Body Type': 'SUBN', - 'Vehicle Make': 'TOYOT', - 'Issuing Agency': 'T', - 'Street Code1': 5580, - 'Street Code2': 5230, - 'Street Code3': 5380, - 'Vehicle Expiration Date': '01/01/20150201 12:00:00 PM', - 'Violation Location': 78, - 'Violation Precinct': 78, - 'Issuer Precinct': 78, - 'Issuer Code': 350415, - 'Issuer Command': 'T802', - 'Issuer Squad': 'B', - 'Violation Time': '0824P', - 'Time First Observed': '', - 'Violation County': 'K', - 'Violation In Front Of Or Opposite': 'F', - 'House Number': 322, - 'Street Name': '5th Ave', - 'Intersecting Street': '', - 'Date First Observed': '01/05/0001 12:00:00 PM', - 'Law Section': 408, - 'Sub Division': 'd', - 'Violation Legal Code': '', - 'Days Parking In Effect': 'YYYYYYY', - 'From Hours In Effect': '', - 'To Hours In Effect': '', - 'Vehicle Color': 'GY', - 'Unregistered Vehicle?': '', - 'Vehicle Year': 2009, - 'Meter Number': '', - 'Feet From Curb': 0, - 'Violation Post Code': 'G 31', - 'Violation Description': '20A-No Parking (Non-COM)', - 'No Standing or Stopping Violation': '', - 'Hydrant Violation': '', - 'Double Parking Violation': '', - }, - { - _id: { - $oid: '5735040085629ed4fa83947d', - }, - 'Summons Number': 1370095480, - 'Plate ID': 'GJZ3562', - 'Registration State': 'NY', - 'Plate Type': 'PAS', - 'Issue Date': '08/07/2014', - 'Violation Code': 21, - 'Vehicle Body Type': 'SDN', - 'Vehicle Make': 'HYUND', - 'Issuing Agency': 'S', - 'Street Code1': 24830, - 'Street Code2': 67030, - 'Street Code3': 64830, - 'Vehicle Expiration Date': '01/01/20151124 12:00:00 PM', - 'Violation Location': 71, - 'Violation Precinct': 71, - 'Issuer Precinct': 0, - 'Issuer Code': 537860, - 'Issuer Command': 'KN09', - 'Issuer Squad': 0, - 'Violation Time': '0842A', - 'Time First Observed': '', - 'Violation County': 'K', - 'Violation In Front Of Or Opposite': 'F', - 'House Number': 1197, - 'Street Name': 'CARROLL ST', - 'Intersecting Street': '', - 'Date First Observed': '01/05/0001 12:00:00 PM', - 'Law Section': 408, - 'Sub Division': 'D1', - 'Violation Legal Code': '', - 'Days Parking In Effect': 'YBBYBBB', - 'From Hours In Effect': '0830A', - 'To Hours In Effect': '1000A', - 'Vehicle Color': 'BLACK', - 'Unregistered Vehicle?': 0, - 'Vehicle Year': 2003, - 'Meter Number': '-', - 'Feet From Curb': 0, - 'Violation Post Code': '', - 'Violation Description': '', - 'No Standing or Stopping Violation': '', - 'Hydrant Violation': '', - 'Double Parking Violation': '', - }, - { - _id: { - $oid: '5735040085629ed4fa83947e', - }, - 'Summons Number': { - $numberLong: '7307439736', - }, - 'Plate ID': '34976JS', - 'Registration State': 'NY', - 'Plate Type': 'COM', - 'Issue Date': '08/15/2014', - 'Violation Code': 37, - 'Vehicle Body Type': 'VAN', - 'Vehicle Make': 'CHEVR', - 'Issuing Agency': 'T', - 'Street Code1': 10110, - 'Street Code2': 18590, - 'Street Code3': 18610, - 'Vehicle Expiration Date': '01/01/20150131 12:00:00 PM', - 'Violation Location': 19, - 'Violation Precinct': 19, - 'Issuer Precinct': 19, - 'Issuer Code': 356214, - 'Issuer Command': 'T103', - 'Issuer Squad': 'O', - 'Violation Time': '0848A', - 'Time First Observed': '0842A', - 'Violation County': 'NY', - 'Violation In Front Of Or Opposite': 'F', - 'House Number': 1546, - 'Street Name': '2nd Ave', - 'Intersecting Street': '', - 'Date First Observed': '01/01/20140815 12:00:00 PM', - 'Law Section': 408, - 'Sub Division': 'h1', - 'Violation Legal Code': '', - 'Days Parking In Effect': 'Y', - 'From Hours In Effect': '0830A', - 'To Hours In Effect': '0700P', - 'Vehicle Color': 'WH', - 'Unregistered Vehicle?': '', - 'Vehicle Year': 2005, - 'Meter Number': '126-4950', - 'Feet From Curb': 0, - 'Violation Post Code': '07 7', - 'Violation Description': '37-Expired Muni Meter', - 'No Standing or Stopping Violation': '', - 'Hydrant Violation': '', - 'Double Parking Violation': '', - }, - { - _id: { - $oid: '5735040085629ed4fa83947f', - }, - 'Summons Number': { - $numberLong: '8003919708', - }, - 'Plate ID': '62958JM', - 'Registration State': 'NY', - 'Plate Type': 'COM', - 'Issue Date': '10/14/2014', - 'Violation Code': 19, - 'Vehicle Body Type': 'DELV', - 'Vehicle Make': 'INTER', - 'Issuing Agency': 'T', - 'Street Code1': 20190, - 'Street Code2': 14810, - 'Street Code3': 14890, - 'Vehicle Expiration Date': '01/01/88888888 12:00:00 PM', - 'Violation Location': 112, - 'Violation Precinct': 112, - 'Issuer Precinct': 112, - 'Issuer Code': 356951, - 'Issuer Command': 'T401', - 'Issuer Squad': 'N', - 'Violation Time': '0417P', - 'Time First Observed': '', - 'Violation County': 'Q', - 'Violation In Front Of Or Opposite': 'O', - 'House Number': '70-31', - 'Street Name': '108th St', - 'Intersecting Street': '', - 'Date First Observed': '01/05/0001 12:00:00 PM', - 'Law Section': 408, - 'Sub Division': 'c3', - 'Violation Legal Code': '', - 'Days Parking In Effect': 'YYYYYYY', - 'From Hours In Effect': '', - 'To Hours In Effect': '', - 'Vehicle Color': 'BROWN', - 'Unregistered Vehicle?': '', - 'Vehicle Year': 1997, - 'Meter Number': '', - 'Feet From Curb': 0, - 'Violation Post Code': 'K 41', - 'Violation Description': '19-No Stand (bus stop)', - 'No Standing or Stopping Violation': '', - 'Hydrant Violation': '', - 'Double Parking Violation': '', - }, - { - _id: { - $oid: '5735040085629ed4fa839480', - }, - 'Summons Number': { - $numberLong: '7098091911', - }, - 'Plate ID': '37644JE', - 'Registration State': 'NY', - 'Plate Type': 'COM', - 'Issue Date': '01/29/2015', - 'Violation Code': 38, - 'Vehicle Body Type': 'VAN', - 'Vehicle Make': 'NS/OT', - 'Issuing Agency': 'T', - 'Street Code1': 61090, - 'Street Code2': 12390, - 'Street Code3': 12690, - 'Vehicle Expiration Date': '01/01/20150930 12:00:00 PM', - 'Violation Location': 108, - 'Violation Precinct': 108, - 'Issuer Precinct': 108, - 'Issuer Code': 358566, - 'Issuer Command': 'T401', - 'Issuer Squad': 'A', - 'Violation Time': '0907A', - 'Time First Observed': '', - 'Violation County': 'Q', - 'Violation In Front Of Or Opposite': 'F', - 'House Number': '59-17', - 'Street Name': 'Roosevelt Ave', - 'Intersecting Street': '', - 'Date First Observed': '01/05/0001 12:00:00 PM', - 'Law Section': 408, - 'Sub Division': 'h1', - 'Violation Legal Code': '', - 'Days Parking In Effect': 'Y', - 'From Hours In Effect': '0900A', - 'To Hours In Effect': '0700P', - 'Vehicle Color': 'WHITE', - 'Unregistered Vehicle?': '', - 'Vehicle Year': 2001, - 'Meter Number': '', - 'Feet From Curb': 0, - 'Violation Post Code': '42 4', - 'Violation Description': '38-Failure to Display Muni Rec', - 'No Standing or Stopping Violation': '', - 'Hydrant Violation': '', - 'Double Parking Violation': '', - }, - { - _id: { - $oid: '5735040085629ed4fa839481', - }, - 'Summons Number': { - $numberLong: '7350729133', - }, - 'Plate ID': '65776MA', - 'Registration State': 'NY', - 'Plate Type': 'COM', - 'Issue Date': '03/11/2015', - 'Violation Code': 47, - 'Vehicle Body Type': 'VAN', - 'Vehicle Make': 'CHEVR', - 'Issuing Agency': 'T', - 'Street Code1': 34970, - 'Street Code2': 13610, - 'Street Code3': 15710, - 'Vehicle Expiration Date': '01/01/20161231 12:00:00 PM', - 'Violation Location': 20, - 'Violation Precinct': 20, - 'Issuer Precinct': 20, - 'Issuer Code': 356498, - 'Issuer Command': 'T103', - 'Issuer Squad': 'F', - 'Violation Time': '1045A', - 'Time First Observed': '', - 'Violation County': 'NY', - 'Violation In Front Of Or Opposite': 'F', - 'House Number': 30, - 'Street Name': 'W 60th St', - 'Intersecting Street': '', - 'Date First Observed': '01/05/0001 12:00:00 PM', - 'Law Section': 408, - 'Sub Division': 'l2', - 'Violation Legal Code': '', - 'Days Parking In Effect': 'Y', - 'From Hours In Effect': '0706A', - 'To Hours In Effect': '0700P', - 'Vehicle Color': 'WH', - 'Unregistered Vehicle?': '', - 'Vehicle Year': 2011, - 'Meter Number': '', - 'Feet From Curb': 0, - 'Violation Post Code': 'CC1', - 'Violation Description': '47-Double PKG-Midtown', - 'No Standing or Stopping Violation': '', - 'Hydrant Violation': '', - 'Double Parking Violation': '', - }, - { - _id: { - $oid: '5735040085629ed4fa839482', - }, - 'Summons Number': { - $numberLong: '7798742244', - }, - 'Plate ID': 'EWD3297', - 'Registration State': 'NY', - 'Plate Type': 'PAS', - 'Issue Date': '03/07/2015', - 'Violation Code': 71, - 'Vehicle Body Type': 'SUBN', - 'Vehicle Make': 'NISSA', - 'Issuing Agency': 'T', - 'Street Code1': 59220, - 'Street Code2': 59720, - 'Street Code3': 55720, - 'Vehicle Expiration Date': '01/01/20151207 12:00:00 PM', - 'Violation Location': 43, - 'Violation Precinct': 43, - 'Issuer Precinct': 43, - 'Issuer Code': 358648, - 'Issuer Command': 'T202', - 'Issuer Squad': 'M', - 'Violation Time': '0906A', - 'Time First Observed': '', - 'Violation County': 'BX', - 'Violation In Front Of Or Opposite': 'F', - 'House Number': 2010, - 'Street Name': 'Powell Ave', - 'Intersecting Street': '', - 'Date First Observed': '01/05/0001 12:00:00 PM', - 'Law Section': 408, - 'Sub Division': 'j6', - 'Violation Legal Code': '', - 'Days Parking In Effect': 'YYYYYYY', - 'From Hours In Effect': '', - 'To Hours In Effect': '', - 'Vehicle Color': 'WH', - 'Unregistered Vehicle?': '', - 'Vehicle Year': 2014, - 'Meter Number': '', - 'Feet From Curb': 0, - 'Violation Post Code': 'A 22', - 'Violation Description': '71A-Insp Sticker Expired (NYS)', - 'No Standing or Stopping Violation': '', - 'Hydrant Violation': '', - 'Double Parking Violation': '', - }, - { - _id: { - $oid: '5735040085629ed4fa839483', - }, - 'Summons Number': { - $numberLong: '7188999776', - }, - 'Plate ID': 'BCS4502', - 'Registration State': 'NY', - 'Plate Type': 'PAS', - 'Issue Date': '03/25/2015', - 'Violation Code': 71, - 'Vehicle Body Type': '4DSD', - 'Vehicle Make': 'NISSA', - 'Issuing Agency': 'T', - 'Street Code1': 27270, - 'Street Code2': 40220, - 'Street Code3': 9520, - 'Vehicle Expiration Date': '01/01/20160303 12:00:00 PM', - 'Violation Location': 48, - 'Violation Precinct': 48, - 'Issuer Precinct': 48, - 'Issuer Code': 361903, - 'Issuer Command': 'T201', - 'Issuer Squad': 'H', - 'Violation Time': '1013A', - 'Time First Observed': '', - 'Violation County': 'BX', - 'Violation In Front Of Or Opposite': 'F', - 'House Number': 587, - 'Street Name': 'E 187th St', - 'Intersecting Street': '', - 'Date First Observed': '01/05/0001 12:00:00 PM', - 'Law Section': 408, - 'Sub Division': 'j6', - 'Violation Legal Code': '', - 'Days Parking In Effect': 'YYYYYYY', - 'From Hours In Effect': '', - 'To Hours In Effect': '', - 'Vehicle Color': 'BK', - 'Unregistered Vehicle?': '', - 'Vehicle Year': 2002, - 'Meter Number': '', - 'Feet From Curb': 0, - 'Violation Post Code': '58 2', - 'Violation Description': '71A-Insp Sticker Expired (NYS)', - 'No Standing or Stopping Violation': '', - 'Hydrant Violation': '', - 'Double Parking Violation': '', - }, - { - _id: { - $oid: '5735040085629ed4fa839484', - }, - 'Summons Number': 1375410519, - 'Plate ID': 'GMR8682', - 'Registration State': 'NY', - 'Plate Type': 'PAS', - 'Issue Date': '10/05/2014', - 'Violation Code': 71, - 'Vehicle Body Type': 'SUBN', - 'Vehicle Make': 'KIA', - 'Issuing Agency': 'P', - 'Street Code1': 35670, - 'Street Code2': 22390, - 'Street Code3': 35807, - 'Vehicle Expiration Date': '01/01/20160601 12:00:00 PM', - 'Violation Location': 113, - 'Violation Precinct': 113, - 'Issuer Precinct': 113, - 'Issuer Code': 952110, - 'Issuer Command': 113, - 'Issuer Squad': 0, - 'Violation Time': '0520P', - 'Time First Observed': '', - 'Violation County': 'Q', - 'Violation In Front Of Or Opposite': 'F', - 'House Number': '137-73', - 'Street Name': 'BELKNAP ST', - 'Intersecting Street': '', - 'Date First Observed': '01/05/0001 12:00:00 PM', - 'Law Section': 408, - 'Sub Division': 'J7', - 'Violation Legal Code': '', - 'Days Parking In Effect': 'BBBBBBB', - 'From Hours In Effect': 'ALL', - 'To Hours In Effect': 'ALL', - 'Vehicle Color': 'TAN', - 'Unregistered Vehicle?': 0, - 'Vehicle Year': 2011, - 'Meter Number': '-', - 'Feet From Curb': 0, - 'Violation Post Code': '', - 'Violation Description': '', - 'No Standing or Stopping Violation': '', - 'Hydrant Violation': '', - 'Double Parking Violation': '', - }, - { - _id: { - $oid: '5735040085629ed4fa839485', - }, - 'Summons Number': { - $numberLong: '7010260047', - }, - 'Plate ID': '72541MA', - 'Registration State': 'NY', - 'Plate Type': 'COM', - 'Issue Date': '05/18/2015', - 'Violation Code': 16, - 'Vehicle Body Type': 'VAN', - 'Vehicle Make': 'FORD', - 'Issuing Agency': 'T', - 'Street Code1': 18290, - 'Street Code2': 24890, - 'Street Code3': 10210, - 'Vehicle Expiration Date': '01/01/20170228 12:00:00 PM', - 'Violation Location': 19, - 'Violation Precinct': 19, - 'Issuer Precinct': 19, - 'Issuer Code': 357327, - 'Issuer Command': 'T103', - 'Issuer Squad': 'E', - 'Violation Time': '0930A', - 'Time First Observed': '0852A', - 'Violation County': 'NY', - 'Violation In Front Of Or Opposite': 'F', - 'House Number': 160, - 'Street Name': 'E 65th St', - 'Intersecting Street': '', - 'Date First Observed': '01/05/0001 12:00:00 PM', - 'Law Section': 408, - 'Sub Division': 'k2', - 'Violation Legal Code': '', - 'Days Parking In Effect': 'Y', - 'From Hours In Effect': '0800A', - 'To Hours In Effect': '0700P', - 'Vehicle Color': 'WH', - 'Unregistered Vehicle?': '', - 'Vehicle Year': 2011, - 'Meter Number': '', - 'Feet From Curb': 0, - 'Violation Post Code': '26 7', - 'Violation Description': '16-No Std (Com Veh) Com Plate', - 'No Standing or Stopping Violation': '', - 'Hydrant Violation': '', - 'Double Parking Violation': '', - }, - { - _id: { - $oid: '5735040085629ed4fa839486', - }, - 'Summons Number': { - $numberLong: '7789198993', - }, - 'Plate ID': 'FHM2444', - 'Registration State': 'NY', - 'Plate Type': 'PAS', - 'Issue Date': '09/01/2014', - 'Violation Code': 71, - 'Vehicle Body Type': 'SUBN', - 'Vehicle Make': 'GMC', - 'Issuing Agency': 'T', - 'Street Code1': 37090, - 'Street Code2': 40404, - 'Street Code3': 40404, - 'Vehicle Expiration Date': '01/01/20150216 12:00:00 PM', - 'Violation Location': 115, - 'Violation Precinct': 115, - 'Issuer Precinct': 115, - 'Issuer Code': 358919, - 'Issuer Command': 'T401', - 'Issuer Squad': 'J', - 'Violation Time': '0144P', - 'Time First Observed': '', - 'Violation County': 'Q', - 'Violation In Front Of Or Opposite': 'F', - 'House Number': '87-40', - 'Street Name': 'Brisbin St', - 'Intersecting Street': '', - 'Date First Observed': '01/05/0001 12:00:00 PM', - 'Law Section': 408, - 'Sub Division': 'j6', - 'Violation Legal Code': '', - 'Days Parking In Effect': 'YYYYYYY', - 'From Hours In Effect': '', - 'To Hours In Effect': '', - 'Vehicle Color': 'GY', - 'Unregistered Vehicle?': '', - 'Vehicle Year': 2004, - 'Meter Number': '', - 'Feet From Curb': 0, - 'Violation Post Code': '23 4', - 'Violation Description': '71A-Insp Sticker Expired (NYS)', - 'No Standing or Stopping Violation': '', - 'Hydrant Violation': '', - 'Double Parking Violation': '', - }, - { - _id: { - $oid: '5735040085629ed4fa839487', - }, - 'Summons Number': { - $numberLong: '7446300474', - }, - 'Plate ID': 2336837, - 'Registration State': 'ME', - 'Plate Type': 'PAS', - 'Issue Date': '07/17/2014', - 'Violation Code': 66, - 'Vehicle Body Type': 'TRLR', - 'Vehicle Make': 'NS/OT', - 'Issuing Agency': 'T', - 'Street Code1': 0, - 'Street Code2': 0, - 'Street Code3': 0, - 'Vehicle Expiration Date': '01/01/88880088 12:00:00 PM', - 'Violation Location': 104, - 'Violation Precinct': 104, - 'Issuer Precinct': 104, - 'Issuer Code': 341263, - 'Issuer Command': 'T803', - 'Issuer Squad': 'A', - 'Violation Time': '1156P', - 'Time First Observed': '', - 'Violation County': 'Q', - 'Violation In Front Of Or Opposite': 'I', - 'House Number': 'N', - 'Street Name': 'Borden Ave', - 'Intersecting Street': '544ft E/of Maurice A', - 'Date First Observed': '01/05/0001 12:00:00 PM', - 'Law Section': 408, - 'Sub Division': 'k4', - 'Violation Legal Code': '', - 'Days Parking In Effect': '', - 'From Hours In Effect': '', - 'To Hours In Effect': '', - 'Vehicle Color': 'WHITE', - 'Unregistered Vehicle?': '', - 'Vehicle Year': 0, - 'Meter Number': '', - 'Feet From Curb': 0, - 'Violation Post Code': 'E 42', - 'Violation Description': '66-Detached Trailer', - 'No Standing or Stopping Violation': '', - 'Hydrant Violation': '', - 'Double Parking Violation': '', - }, ]; From 6153f522df2141d992d103782eca5e181f573376 Mon Sep 17 00:00:00 2001 From: Basit Chonka Date: Tue, 16 Dec 2025 22:08:49 +0300 Subject: [PATCH 35/35] check fix --- packages/compass-generative-ai/tests/evals/use-cases/index.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/compass-generative-ai/tests/evals/use-cases/index.ts b/packages/compass-generative-ai/tests/evals/use-cases/index.ts index d9ca9e52a31..226714a2247 100644 --- a/packages/compass-generative-ai/tests/evals/use-cases/index.ts +++ b/packages/compass-generative-ai/tests/evals/use-cases/index.ts @@ -1,6 +1,7 @@ import { findQueries } from './find-query'; import { aggregateQueries } from './aggregate-query'; import toNS from 'mongodb-ns'; +import { UUID } from 'bson'; export type GenAiUsecase = { namespace: string; @@ -61,6 +62,9 @@ export async function generateGenAiEvalCases() { schema, collectionName, databaseName, + enableStorage: false, + requestId: new UUID().toString(), + userId: 'compass-eval-tests-user', }; const { metadata: { instructions },