chore: import upstream snapshot with attribution
Publish CLI Package / publish-npm (push) Waiting to run
Publish Python SDK / publish-pypi (push) Waiting to run
Publish TypeScript SDK / publish-npm (push) Waiting to run
CI / Migrate Dev DB (push) Has been skipped
CI / Detect Version (push) Has been cancelled
CI / Migrate DB (push) Has been cancelled
CI / Build Dev ECR (./docker/app.Dockerfile, ECR_APP) (push) Has been cancelled
CI / Build Dev ECR (./docker/db.Dockerfile, ECR_MIGRATIONS) (push) Has been cancelled
CI / Build Dev ECR (./docker/pii.Dockerfile, ECR_PII) (push) Has been cancelled
CI / Build Dev ECR (./docker/realtime.Dockerfile, ECR_REALTIME) (push) Has been cancelled
CI / Deploy Trigger.dev (Dev) (push) Has been cancelled
CI / Build AMD64 (./docker/app.Dockerfile, ECR_APP, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build AMD64 (./docker/db.Dockerfile, ECR_MIGRATIONS, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build AMD64 (./docker/pii.Dockerfile, ECR_PII, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build AMD64 (./docker/realtime.Dockerfile, ECR_REALTIME, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/app.Dockerfile, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/db.Dockerfile, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/pii.Dockerfile, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/realtime.Dockerfile, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Check Docs Changes (push) Has been cancelled
CI / Process Docs (push) Has been cancelled
CI / Create GitHub Release (push) Has been cancelled
CI / Test and Build (push) Has been cancelled

This commit is contained in:
wehub-resource-sync
2026-07-13 13:20:55 +08:00
commit d25d482dc2
13754 changed files with 4996608 additions and 0 deletions
+3
View File
@@ -0,0 +1,3 @@
export * from './types'
export { googleBooksVolumeDetailsTool } from './volume_details'
export { googleBooksVolumeSearchTool } from './volume_search'
+124
View File
@@ -0,0 +1,124 @@
import type { ToolResponse } from '@/tools/types'
/**
* Raw volume item from Google Books API search response
*/
export interface GoogleBooksVolumeItem {
id: string
volumeInfo: {
title?: string
subtitle?: string
authors?: string[]
publisher?: string
publishedDate?: string
description?: string
pageCount?: number
categories?: string[]
averageRating?: number
ratingsCount?: number
language?: string
previewLink?: string
infoLink?: string
imageLinks?: {
thumbnail?: string
smallThumbnail?: string
}
industryIdentifiers?: Array<{
type: string
identifier: string
}>
}
}
/**
* Raw volume response from Google Books API details endpoint
*/
export interface GoogleBooksVolumeResponse {
id: string
volumeInfo: {
title?: string
subtitle?: string
authors?: string[]
publisher?: string
publishedDate?: string
description?: string
pageCount?: number
categories?: string[]
averageRating?: number
ratingsCount?: number
language?: string
previewLink?: string
infoLink?: string
imageLinks?: {
thumbnail?: string
smallThumbnail?: string
}
industryIdentifiers?: Array<{
type: string
identifier: string
}>
}
}
/**
* Volume information structure shared between search and details responses
*/
export interface VolumeInfo {
id: string
title: string
subtitle: string | null
authors: string[]
publisher: string | null
publishedDate: string | null
description: string | null
pageCount: number | null
categories: string[]
averageRating: number | null
ratingsCount: number | null
language: string | null
previewLink: string | null
infoLink: string | null
thumbnailUrl: string | null
isbn10: string | null
isbn13: string | null
}
/**
* Parameters for searching volumes
*/
export interface GoogleBooksVolumeSearchParams {
apiKey: string
query: string
filter?: 'partial' | 'full' | 'free-ebooks' | 'paid-ebooks' | 'ebooks'
printType?: 'all' | 'books' | 'magazines'
orderBy?: 'relevance' | 'newest'
startIndex?: number
maxResults?: number
langRestrict?: string
}
/**
* Response from volume search
*/
export interface GoogleBooksVolumeSearchResponse extends ToolResponse {
output: {
totalItems: number
volumes: VolumeInfo[]
}
}
/**
* Parameters for getting volume details
*/
export interface GoogleBooksVolumeDetailsParams {
apiKey: string
volumeId: string
projection?: 'full' | 'lite'
}
/**
* Response from volume details
*/
export interface GoogleBooksVolumeDetailsResponse extends ToolResponse {
output: VolumeInfo
}
@@ -0,0 +1,186 @@
import type {
GoogleBooksVolumeDetailsParams,
GoogleBooksVolumeDetailsResponse,
GoogleBooksVolumeResponse,
} from '@/tools/google_books/types'
import type { ToolConfig } from '@/tools/types'
export const googleBooksVolumeDetailsTool: ToolConfig<
GoogleBooksVolumeDetailsParams,
GoogleBooksVolumeDetailsResponse
> = {
id: 'google_books_volume_details',
name: 'Google Books Volume Details',
description: 'Get detailed information about a specific book volume',
version: '1.0.0',
params: {
apiKey: {
type: 'string',
required: true,
visibility: 'user-only',
description: 'Google Books API key',
},
volumeId: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'The ID of the volume to retrieve',
},
projection: {
type: 'string',
required: false,
visibility: 'user-or-llm',
description: 'Projection level (full, lite)',
},
},
hosting: {
envKeyPrefix: 'GOOGLE_CLOUD_API_KEY',
apiKeyParam: 'apiKey',
byokProviderId: 'google_cloud',
pricing: {
type: 'per_request',
cost: 0,
},
rateLimit: {
mode: 'per_request',
requestsPerMinute: 30,
},
},
request: {
url: (params) => {
const url = new URL(`https://www.googleapis.com/books/v1/volumes/${params.volumeId.trim()}`)
url.searchParams.set('key', params.apiKey.trim())
if (params.projection) {
url.searchParams.set('projection', params.projection)
}
return url.toString()
},
method: 'GET',
headers: () => ({
'Content-Type': 'application/json',
}),
},
transformResponse: async (response: Response) => {
const data: GoogleBooksVolumeResponse = await response.json()
if (!data.volumeInfo) {
throw new Error('Volume not found')
}
const info = data.volumeInfo
const identifiers = info.industryIdentifiers ?? []
return {
success: true,
output: {
id: data.id,
title: info.title ?? '',
subtitle: info.subtitle ?? null,
authors: info.authors ?? [],
publisher: info.publisher ?? null,
publishedDate: info.publishedDate ?? null,
description: info.description ?? null,
pageCount: info.pageCount ?? null,
categories: info.categories ?? [],
averageRating: info.averageRating ?? null,
ratingsCount: info.ratingsCount ?? null,
language: info.language ?? null,
previewLink: info.previewLink ?? null,
infoLink: info.infoLink ?? null,
thumbnailUrl: info.imageLinks?.thumbnail ?? info.imageLinks?.smallThumbnail ?? null,
isbn10: identifiers.find((id) => id.type === 'ISBN_10')?.identifier ?? null,
isbn13: identifiers.find((id) => id.type === 'ISBN_13')?.identifier ?? null,
},
}
},
outputs: {
id: {
type: 'string',
description: 'Volume ID',
},
title: {
type: 'string',
description: 'Book title',
},
subtitle: {
type: 'string',
description: 'Book subtitle',
optional: true,
},
authors: {
type: 'array',
description: 'List of authors',
},
publisher: {
type: 'string',
description: 'Publisher name',
optional: true,
},
publishedDate: {
type: 'string',
description: 'Publication date',
optional: true,
},
description: {
type: 'string',
description: 'Book description',
optional: true,
},
pageCount: {
type: 'number',
description: 'Number of pages',
optional: true,
},
categories: {
type: 'array',
description: 'Book categories',
},
averageRating: {
type: 'number',
description: 'Average rating (1-5)',
optional: true,
},
ratingsCount: {
type: 'number',
description: 'Number of ratings',
optional: true,
},
language: {
type: 'string',
description: 'Language code',
optional: true,
},
previewLink: {
type: 'string',
description: 'Link to preview on Google Books',
optional: true,
},
infoLink: {
type: 'string',
description: 'Link to info page',
optional: true,
},
thumbnailUrl: {
type: 'string',
description: 'Book cover thumbnail URL',
optional: true,
},
isbn10: {
type: 'string',
description: 'ISBN-10 identifier',
optional: true,
},
isbn13: {
type: 'string',
description: 'ISBN-13 identifier',
optional: true,
},
},
}
@@ -0,0 +1,190 @@
import type {
GoogleBooksVolumeItem,
GoogleBooksVolumeSearchParams,
GoogleBooksVolumeSearchResponse,
VolumeInfo,
} from '@/tools/google_books/types'
import type { ToolConfig } from '@/tools/types'
function extractVolumeInfo(item: GoogleBooksVolumeItem): VolumeInfo {
const info = item.volumeInfo
const identifiers = info.industryIdentifiers ?? []
return {
id: item.id,
title: info.title ?? '',
subtitle: info.subtitle ?? null,
authors: info.authors ?? [],
publisher: info.publisher ?? null,
publishedDate: info.publishedDate ?? null,
description: info.description ?? null,
pageCount: info.pageCount ?? null,
categories: info.categories ?? [],
averageRating: info.averageRating ?? null,
ratingsCount: info.ratingsCount ?? null,
language: info.language ?? null,
previewLink: info.previewLink ?? null,
infoLink: info.infoLink ?? null,
thumbnailUrl: info.imageLinks?.thumbnail ?? info.imageLinks?.smallThumbnail ?? null,
isbn10: identifiers.find((id) => id.type === 'ISBN_10')?.identifier ?? null,
isbn13: identifiers.find((id) => id.type === 'ISBN_13')?.identifier ?? null,
}
}
export const googleBooksVolumeSearchTool: ToolConfig<
GoogleBooksVolumeSearchParams,
GoogleBooksVolumeSearchResponse
> = {
id: 'google_books_volume_search',
name: 'Google Books Volume Search',
description: 'Search for books using the Google Books API',
version: '1.0.0',
params: {
apiKey: {
type: 'string',
required: true,
visibility: 'user-only',
description: 'Google Books API key',
},
query: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description:
'Search query. Supports special keywords: intitle:, inauthor:, inpublisher:, subject:, isbn:',
},
filter: {
type: 'string',
required: false,
visibility: 'user-or-llm',
description:
'Filter results by availability (partial, full, free-ebooks, paid-ebooks, ebooks)',
},
printType: {
type: 'string',
required: false,
visibility: 'user-or-llm',
description: 'Restrict to print type (all, books, magazines)',
},
orderBy: {
type: 'string',
required: false,
visibility: 'user-or-llm',
description: 'Sort order (relevance, newest)',
},
startIndex: {
type: 'number',
required: false,
visibility: 'user-or-llm',
description: 'Index of the first result to return (for pagination)',
},
maxResults: {
type: 'number',
required: false,
visibility: 'user-or-llm',
description: 'Maximum number of results to return (1-40)',
},
langRestrict: {
type: 'string',
required: false,
visibility: 'user-or-llm',
description: 'Restrict results to a specific language (ISO 639-1 code)',
},
},
hosting: {
envKeyPrefix: 'GOOGLE_CLOUD_API_KEY',
apiKeyParam: 'apiKey',
byokProviderId: 'google_cloud',
pricing: {
type: 'per_request',
cost: 0,
},
rateLimit: {
mode: 'per_request',
requestsPerMinute: 30,
},
},
request: {
url: (params) => {
const url = new URL('https://www.googleapis.com/books/v1/volumes')
url.searchParams.set('q', params.query.trim())
url.searchParams.set('key', params.apiKey.trim())
if (params.filter) {
url.searchParams.set('filter', params.filter)
}
if (params.printType) {
url.searchParams.set('printType', params.printType)
}
if (params.orderBy) {
url.searchParams.set('orderBy', params.orderBy)
}
if (params.startIndex !== undefined) {
url.searchParams.set('startIndex', String(params.startIndex))
}
if (params.maxResults !== undefined) {
url.searchParams.set('maxResults', String(params.maxResults))
}
if (params.langRestrict) {
url.searchParams.set('langRestrict', params.langRestrict)
}
return url.toString()
},
method: 'GET',
headers: () => ({
'Content-Type': 'application/json',
}),
},
transformResponse: async (response: Response) => {
const data = await response.json()
const items: GoogleBooksVolumeItem[] = data.items ?? []
const volumes = items.map(extractVolumeInfo)
return {
success: true,
output: {
totalItems: data.totalItems ?? 0,
volumes,
},
}
},
outputs: {
totalItems: {
type: 'number',
description: 'Total number of matching results',
},
volumes: {
type: 'array',
description: 'List of matching volumes',
items: {
type: 'object',
properties: {
id: { type: 'string', description: 'Volume ID' },
title: { type: 'string', description: 'Book title' },
subtitle: { type: 'string', description: 'Book subtitle' },
authors: { type: 'array', description: 'List of authors' },
publisher: { type: 'string', description: 'Publisher name' },
publishedDate: { type: 'string', description: 'Publication date' },
description: { type: 'string', description: 'Book description' },
pageCount: { type: 'number', description: 'Number of pages' },
categories: { type: 'array', description: 'Book categories' },
averageRating: { type: 'number', description: 'Average rating (1-5)' },
ratingsCount: { type: 'number', description: 'Number of ratings' },
language: { type: 'string', description: 'Language code' },
previewLink: { type: 'string', description: 'Link to preview on Google Books' },
infoLink: { type: 'string', description: 'Link to info page' },
thumbnailUrl: { type: 'string', description: 'Book cover thumbnail URL' },
isbn10: { type: 'string', description: 'ISBN-10 identifier' },
isbn13: { type: 'string', description: 'ISBN-13 identifier' },
},
},
},
},
}