@tanstack/ai-gemini 0.23.0 → 0.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +10 -1
  2. package/dist/esm/adapters/image.d.ts +14 -7
  3. package/dist/esm/adapters/image.js +27 -56
  4. package/dist/esm/adapters/image.js.map +1 -1
  5. package/dist/esm/adapters/text.js.map +1 -1
  6. package/dist/esm/adapters/video.js +2 -1
  7. package/dist/esm/adapters/video.js.map +1 -1
  8. package/dist/esm/experimental/text-interactions/adapter.d.ts +8 -5
  9. package/dist/esm/experimental/text-interactions/adapter.js +20 -18
  10. package/dist/esm/experimental/text-interactions/adapter.js.map +1 -1
  11. package/dist/esm/image/image-provider-options.d.ts +167 -20
  12. package/dist/esm/image/image-provider-options.js +52 -5
  13. package/dist/esm/image/image-provider-options.js.map +1 -1
  14. package/dist/esm/index.d.ts +3 -1
  15. package/dist/esm/index.js +3 -1
  16. package/dist/esm/model-meta.d.ts +15 -2
  17. package/dist/esm/model-meta.js +82 -1
  18. package/dist/esm/model-meta.js.map +1 -1
  19. package/dist/esm/realtime/adapter.js +1 -5
  20. package/dist/esm/realtime/adapter.js.map +1 -1
  21. package/dist/esm/realtime/client.js.map +1 -1
  22. package/dist/esm/realtime/token.js +3 -2
  23. package/dist/esm/realtime/token.js.map +1 -1
  24. package/dist/esm/realtime/utils.js +4 -1
  25. package/dist/esm/realtime/utils.js.map +1 -1
  26. package/dist/esm/tools/code-execution-tool.js +3 -3
  27. package/dist/esm/tools/code-execution-tool.js.map +1 -1
  28. package/dist/esm/tools/computer-use-tool.js +4 -4
  29. package/dist/esm/tools/computer-use-tool.js.map +1 -1
  30. package/dist/esm/tools/file-search-tool.js +4 -4
  31. package/dist/esm/tools/file-search-tool.js.map +1 -1
  32. package/dist/esm/tools/gemini-provider-tool.d.ts +16 -0
  33. package/dist/esm/tools/gemini-provider-tool.js +42 -0
  34. package/dist/esm/tools/gemini-provider-tool.js.map +1 -0
  35. package/dist/esm/tools/google-maps-tool.js +4 -4
  36. package/dist/esm/tools/google-maps-tool.js.map +1 -1
  37. package/dist/esm/tools/google-search-retriveal-tool.js +4 -4
  38. package/dist/esm/tools/google-search-retriveal-tool.js.map +1 -1
  39. package/dist/esm/tools/google-search-tool.js +4 -4
  40. package/dist/esm/tools/google-search-tool.js.map +1 -1
  41. package/dist/esm/tools/tool-converter.js +5 -3
  42. package/dist/esm/tools/tool-converter.js.map +1 -1
  43. package/dist/esm/tools/url-context-tool.js +3 -3
  44. package/dist/esm/tools/url-context-tool.js.map +1 -1
  45. package/dist/esm/usage.js +1 -3
  46. package/dist/esm/usage.js.map +1 -1
  47. package/package.json +5 -5
  48. package/src/adapters/image.ts +123 -36
  49. package/src/experimental/text-interactions/adapter.ts +31 -18
  50. package/src/image/image-provider-options.ts +226 -25
  51. package/src/index.ts +28 -0
  52. package/src/model-meta.ts +118 -1
  53. package/src/tools/code-execution-tool.ts +9 -6
  54. package/src/tools/computer-use-tool.ts +19 -13
  55. package/src/tools/file-search-tool.ts +13 -7
  56. package/src/tools/gemini-provider-tool.ts +60 -0
  57. package/src/tools/google-maps-tool.ts +13 -7
  58. package/src/tools/google-search-retriveal-tool.ts +15 -7
  59. package/src/tools/google-search-tool.ts +13 -7
  60. package/src/tools/tool-converter.ts +5 -4
  61. package/src/tools/url-context-tool.ts +9 -6
@@ -0,0 +1,60 @@
1
+ import { brandProviderTool } from '@tanstack/ai'
2
+ import type { ProviderTool, Tool } from '@tanstack/ai'
3
+
4
+ const GEMINI_PROVIDER_TOOL_KINDS = {
5
+ code_execution: 'gemini.code_execution',
6
+ computer_use: 'gemini.computer_use',
7
+ file_search: 'gemini.file_search',
8
+ google_maps: 'gemini.google_maps',
9
+ google_search: 'gemini.google_search',
10
+ google_search_retrieval: 'gemini.google_search_retrieval',
11
+ url_context: 'gemini.url_context',
12
+ } as const
13
+
14
+ type GeminiProviderToolKind = keyof typeof GEMINI_PROVIDER_TOOL_KINDS
15
+
16
+ export function brandGeminiProviderTool<
17
+ T extends ProviderTool<'gemini', GeminiProviderToolKind>,
18
+ >(tool: Omit<T, '~provider' | '~toolKind'>, toolKind: T['~toolKind']): T {
19
+ return brandProviderTool<T>({
20
+ ...tool,
21
+ metadata: {
22
+ ...tool.metadata,
23
+ __kind: GEMINI_PROVIDER_TOOL_KINDS[toolKind],
24
+ },
25
+ })
26
+ }
27
+
28
+ export function getGeminiProviderToolKind(
29
+ tool: Tool,
30
+ ): GeminiProviderToolKind | undefined {
31
+ const toolKind = tool.metadata?.['__kind']
32
+ switch (toolKind) {
33
+ case 'gemini.code_execution':
34
+ return 'code_execution'
35
+ case 'gemini.computer_use':
36
+ return 'computer_use'
37
+ case 'gemini.file_search':
38
+ return 'file_search'
39
+ case 'gemini.google_maps':
40
+ return 'google_maps'
41
+ case 'gemini.google_search':
42
+ return 'google_search'
43
+ case 'gemini.google_search_retrieval':
44
+ return 'google_search_retrieval'
45
+ case 'gemini.url_context':
46
+ return 'url_context'
47
+ default:
48
+ return undefined
49
+ }
50
+ }
51
+
52
+ /** Returns adapter metadata without the internal runtime discriminator. */
53
+ export function getGeminiProviderToolMetadata(tool: Tool): Tool['metadata'] {
54
+ if (!tool.metadata) {
55
+ return undefined
56
+ }
57
+ const { __kind: _kind, ...metadata } = tool.metadata
58
+ void _kind
59
+ return metadata
60
+ }
@@ -1,4 +1,7 @@
1
- import { brandProviderTool } from '@tanstack/ai'
1
+ import {
2
+ brandGeminiProviderTool,
3
+ getGeminiProviderToolMetadata,
4
+ } from './gemini-provider-tool'
2
5
  import type { GoogleMaps } from '@google/genai'
3
6
  import type { ProviderTool, Tool } from '@tanstack/ai'
4
7
 
@@ -10,7 +13,7 @@ export type GoogleMapsTool = GoogleMapsToolConfig
10
13
  export type GeminiGoogleMapsTool = ProviderTool<'gemini', 'google_maps'>
11
14
 
12
15
  export function convertGoogleMapsToolToAdapterFormat(tool: Tool) {
13
- const metadata = tool.metadata as GoogleMapsToolConfig
16
+ const metadata = getGeminiProviderToolMetadata(tool) as GoogleMapsToolConfig
14
17
  return {
15
18
  googleMaps: metadata,
16
19
  }
@@ -19,9 +22,12 @@ export function convertGoogleMapsToolToAdapterFormat(tool: Tool) {
19
22
  export function googleMapsTool(
20
23
  config?: GoogleMapsToolConfig,
21
24
  ): GeminiGoogleMapsTool {
22
- return brandProviderTool<GeminiGoogleMapsTool>({
23
- name: 'google_maps',
24
- description: '',
25
- metadata: config,
26
- })
25
+ return brandGeminiProviderTool<GeminiGoogleMapsTool>(
26
+ {
27
+ name: 'google_maps',
28
+ description: '',
29
+ metadata: config,
30
+ },
31
+ 'google_maps',
32
+ )
27
33
  }
@@ -1,4 +1,7 @@
1
- import { brandProviderTool } from '@tanstack/ai'
1
+ import {
2
+ brandGeminiProviderTool,
3
+ getGeminiProviderToolMetadata,
4
+ } from './gemini-provider-tool'
2
5
  import type { GoogleSearchRetrieval } from '@google/genai'
3
6
  import type { ProviderTool, Tool } from '@tanstack/ai'
4
7
 
@@ -13,7 +16,9 @@ export type GeminiGoogleSearchRetrievalTool = ProviderTool<
13
16
  >
14
17
 
15
18
  export function convertGoogleSearchRetrievalToolToAdapterFormat(tool: Tool) {
16
- const metadata = tool.metadata as GoogleSearchRetrievalToolConfig
19
+ const metadata = getGeminiProviderToolMetadata(
20
+ tool,
21
+ ) as GoogleSearchRetrievalToolConfig
17
22
  return {
18
23
  googleSearchRetrieval: metadata,
19
24
  }
@@ -22,9 +27,12 @@ export function convertGoogleSearchRetrievalToolToAdapterFormat(tool: Tool) {
22
27
  export function googleSearchRetrievalTool(
23
28
  config?: GoogleSearchRetrievalToolConfig,
24
29
  ): GeminiGoogleSearchRetrievalTool {
25
- return brandProviderTool<GeminiGoogleSearchRetrievalTool>({
26
- name: 'google_search_retrieval',
27
- description: '',
28
- metadata: config,
29
- })
30
+ return brandGeminiProviderTool<GeminiGoogleSearchRetrievalTool>(
31
+ {
32
+ name: 'google_search_retrieval',
33
+ description: '',
34
+ metadata: config,
35
+ },
36
+ 'google_search_retrieval',
37
+ )
30
38
  }
@@ -1,4 +1,7 @@
1
- import { brandProviderTool } from '@tanstack/ai'
1
+ import {
2
+ brandGeminiProviderTool,
3
+ getGeminiProviderToolMetadata,
4
+ } from './gemini-provider-tool'
2
5
  import type { GoogleSearch } from '@google/genai'
3
6
  import type { ProviderTool, Tool } from '@tanstack/ai'
4
7
 
@@ -10,7 +13,7 @@ export type GoogleSearchTool = GoogleSearchToolConfig
10
13
  export type GeminiGoogleSearchTool = ProviderTool<'gemini', 'google_search'>
11
14
 
12
15
  export function convertGoogleSearchToolToAdapterFormat(tool: Tool) {
13
- const metadata = tool.metadata as GoogleSearchToolConfig
16
+ const metadata = getGeminiProviderToolMetadata(tool) as GoogleSearchToolConfig
14
17
  return {
15
18
  googleSearch: metadata,
16
19
  }
@@ -19,9 +22,12 @@ export function convertGoogleSearchToolToAdapterFormat(tool: Tool) {
19
22
  export function googleSearchTool(
20
23
  config?: GoogleSearchToolConfig,
21
24
  ): GeminiGoogleSearchTool {
22
- return brandProviderTool<GeminiGoogleSearchTool>({
23
- name: 'google_search',
24
- description: '',
25
- metadata: config,
26
- })
25
+ return brandGeminiProviderTool<GeminiGoogleSearchTool>(
26
+ {
27
+ name: 'google_search',
28
+ description: '',
29
+ metadata: config,
30
+ },
31
+ 'google_search',
32
+ )
27
33
  }
@@ -1,6 +1,8 @@
1
+ import { assertUniqueToolNames } from '@tanstack/ai/adapter-internals'
1
2
  import { convertCodeExecutionToolToAdapterFormat } from './code-execution-tool'
2
3
  import { convertComputerUseToolToAdapterFormat } from './computer-use-tool'
3
4
  import { convertFileSearchToolToAdapterFormat } from './file-search-tool'
5
+ import { getGeminiProviderToolKind } from './gemini-provider-tool'
4
6
  import { convertGoogleMapsToolToAdapterFormat } from './google-maps-tool'
5
7
  import { convertGoogleSearchRetrievalToolToAdapterFormat } from './google-search-retriveal-tool'
6
8
  import { convertGoogleSearchToolToAdapterFormat } from './google-search-tool'
@@ -33,6 +35,7 @@ export function convertToolsToProviderFormat<TTool extends Tool>(
33
35
  if (!tools || tools.length === 0) {
34
36
  return []
35
37
  }
38
+ assertUniqueToolNames(tools)
36
39
  const result: Array<ToolUnion> = []
37
40
  const functionDeclarations: Array<{
38
41
  name: string
@@ -42,9 +45,7 @@ export function convertToolsToProviderFormat<TTool extends Tool>(
42
45
 
43
46
  // Process each tool and group function declarations together
44
47
  for (const tool of tools) {
45
- const name = tool.name
46
-
47
- switch (name) {
48
+ switch (getGeminiProviderToolKind(tool)) {
48
49
  case 'code_execution':
49
50
  result.push(convertCodeExecutionToolToAdapterFormat(tool))
50
51
  break
@@ -66,7 +67,7 @@ export function convertToolsToProviderFormat<TTool extends Tool>(
66
67
  case 'url_context':
67
68
  result.push(convertUrlContextToolToAdapterFormat(tool))
68
69
  break
69
- default:
70
+ case undefined:
70
71
  // Collect function declarations to group together
71
72
  // Description is required for Gemini function declarations
72
73
  if (!tool.description) {
@@ -1,4 +1,4 @@
1
- import { brandProviderTool } from '@tanstack/ai'
1
+ import { brandGeminiProviderTool } from './gemini-provider-tool'
2
2
  import type { ProviderTool, Tool } from '@tanstack/ai'
3
3
 
4
4
  export interface UrlContextToolConfig {}
@@ -15,9 +15,12 @@ export function convertUrlContextToolToAdapterFormat(_tool: Tool) {
15
15
  }
16
16
 
17
17
  export function urlContextTool(): GeminiUrlContextTool {
18
- return brandProviderTool<GeminiUrlContextTool>({
19
- name: 'url_context',
20
- description: '',
21
- metadata: {},
22
- })
18
+ return brandGeminiProviderTool<GeminiUrlContextTool>(
19
+ {
20
+ name: 'url_context',
21
+ description: '',
22
+ metadata: {},
23
+ },
24
+ 'url_context',
25
+ )
23
26
  }