Skip to content

Commit 4fb015e

Browse files
authored
feat(adk): expose callable provider (#221)
1 parent fdc145d commit 4fb015e

3 files changed

Lines changed: 27 additions & 30 deletions

File tree

apps/expo-example/src/components/adapters/adkSetupAdapter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export const createAdkLanguageSetupAdapter = (
2727
'You are a helpful assistant in the Callstack React Native AI demo app.',
2828
availableTools: tools,
2929
})
30-
const model = provider.languageModel()
30+
const model = provider()
3131

3232
return {
3333
model,

packages/adk/README.md

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,8 @@ Then run `npx expo prebuild --clean` so the native Android project picks up the
4141
import { adk } from '@react-native-ai/adk'
4242
import { generateText } from 'ai'
4343

44-
const model = adk.languageModel()
45-
4644
const { text } = await generateText({
47-
model,
45+
model: adk(),
4846
prompt: 'What time is it in New York?',
4947
})
5048
```
@@ -72,7 +70,7 @@ Pass file parts in user messages using the standard AI SDK prompt format:
7270
import { generateText } from 'ai'
7371

7472
const { text } = await generateText({
75-
model: adk.languageModel(),
73+
model: adk(),
7674
messages: [
7775
{
7876
role: 'user',
@@ -99,16 +97,14 @@ Streaming structured JSON is not supported by ADK yet.
9997
import { createAdkProvider } from '@react-native-ai/adk'
10098
import { generateText } from 'ai'
10199

102-
const provider = createAdkProvider({
100+
const adk = createAdkProvider({
103101
apiKey: process.env.GOOGLE_API_KEY,
104102
modelName: 'gemini-2.5-flash',
105103
instruction: 'You are a helpful assistant.',
106104
})
107105

108-
const model = provider.languageModel()
109-
110106
const { text } = await generateText({
111-
model,
107+
model: adk(),
112108
prompt: 'Summarize on-device AI in one sentence.',
113109
})
114110
```
@@ -121,8 +117,8 @@ Gemini Nano has two separate availability checks:
121117

122118
| API | Label | Question |
123119
| ------------------------------------ | --------------------- | ------------------------------------------ |
124-
| `provider.isNanoSupported()` | **Device capability** | Can this device ever run Nano? |
125-
| `provider.isAvailable('genai-nano')` | **Runtime readiness** | Can I call `prepareNano()` / generate now? |
120+
| `adk.isNanoSupported()` | **Device capability** | Can this device ever run Nano? |
121+
| `adk.isAvailable('genai-nano')` | **Runtime readiness** | Can I call `prepareNano()` / generate now? |
126122

127123
If `isNanoSupported()` is `false`, `isAvailable('genai-nano')` is also `false`.
128124

@@ -144,26 +140,26 @@ See [ML Kit GenAI Prompt API](https://developers.google.com/ml-kit/genai) for de
144140
```ts
145141
import { createAdkProvider } from '@react-native-ai/adk'
146142

147-
const provider = createAdkProvider({
143+
const adk = createAdkProvider({
148144
modelType: 'genai-nano',
149145
modelName: 'gemini-nano',
150146
})
151147

152-
const supported = await provider.isNanoSupported()
148+
const supported = await adk.isNanoSupported()
153149
if (!supported) {
154150
// Device lacks Gemini Nano / AICore support — hide from model picker
155151
return
156152
}
157153

158-
const ready = await provider.isAvailable('genai-nano')
154+
const ready = await adk.isAvailable('genai-nano')
159155
if (!ready) {
160156
// Device supports Nano but ML Kit is not ready yet (e.g. downloading)
161157
// Show disabled — do not mark as "Ready"
162158
return
163159
}
164160

165-
await provider.prepareNano()
166-
const model = provider.languageModel()
161+
await adk.prepareNano()
162+
const model = adk()
167163
```
168164

169165
Both checks are cheap native calls (no model download). Safe to cache at app startup and re-check after resume.
@@ -188,13 +184,13 @@ const getCurrentTime = tool({
188184
}),
189185
})
190186

191-
const provider = createAdkProvider({
187+
const adk = createAdkProvider({
192188
apiKey: process.env.GOOGLE_API_KEY,
193189
availableTools: { getCurrentTime },
194190
})
195191

196192
const { text } = await generateText({
197-
model: provider.languageModel(),
193+
model: adk(),
198194
tools: { getCurrentTime },
199195
prompt: 'What time is it in Warsaw?',
200196
})

packages/adk/src/ai-sdk.ts

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -73,18 +73,19 @@ export function createAdkProvider(
7373
options: AdkProviderOptions = {}
7474
): AdkProvider {
7575
const createLanguageModel = () => new AdkChatLanguageModel(options)
76-
77-
return Object.assign(() => createLanguageModel(), {
78-
languageModel: createLanguageModel,
79-
isNanoSupported: () => checkNanoSupported(),
80-
isAvailable: async (modelType: AdkModelType = 'gemini') => {
81-
if (modelType === 'genai-nano' && !(await checkNanoSupported())) {
82-
return false
83-
}
84-
return getNativeAdkEngine().isAvailable(modelType).then(Boolean)
85-
},
86-
prepareNano: () => getNativeAdkEngine().prepareNano(),
87-
})
76+
const provider = function () {
77+
return createLanguageModel()
78+
}
79+
provider.languageModel = createLanguageModel
80+
provider.isNanoSupported = () => checkNanoSupported()
81+
provider.isAvailable = async (modelType: AdkModelType = 'gemini') => {
82+
if (modelType === 'genai-nano' && !(await checkNanoSupported())) {
83+
return false
84+
}
85+
return getNativeAdkEngine().isAvailable(modelType).then(Boolean)
86+
}
87+
provider.prepareNano = () => getNativeAdkEngine().prepareNano()
88+
return provider
8889
}
8990

9091
export const adk = createAdkProvider()

0 commit comments

Comments
 (0)