Skip to content

Commit fcf9360

Browse files
committed
feat(ollama): add ollama types and meta
1 parent 29466c1 commit fcf9360

69 files changed

Lines changed: 6176 additions & 50 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

packages/typescript/ai-ollama/src/adapters/summarize.ts

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
getOllamaHostFromEnv,
66
} from '../utils'
77

8+
import type { OLLAMA_TEXT_MODELS as OllamaSummarizeModels } from '../model-meta'
89
import type { Ollama } from 'ollama'
910
import type { SummarizeAdapter } from '@tanstack/ai/adapters'
1011
import type {
@@ -13,23 +14,6 @@ import type {
1314
SummarizationResult,
1415
} from '@tanstack/ai'
1516

16-
/**
17-
* Ollama models suitable for summarization
18-
* Note: Ollama models are dynamically loaded, this is a common subset
19-
*/
20-
export const OllamaSummarizeModels = [
21-
'llama2',
22-
'llama3',
23-
'llama3.1',
24-
'llama3.2',
25-
'mistral',
26-
'mixtral',
27-
'phi',
28-
'phi3',
29-
'qwen2',
30-
'qwen2.5',
31-
] as const
32-
3317
export type OllamaSummarizeModel =
3418
| (typeof OllamaSummarizeModels)[number]
3519
| (string & {})
@@ -64,9 +48,9 @@ export interface OllamaSummarizeAdapterOptions {
6448
* Ollama Summarize Adapter
6549
* A tree-shakeable summarization adapter for Ollama
6650
*/
67-
export class OllamaSummarizeAdapter<
68-
TModel extends OllamaSummarizeModel,
69-
> implements SummarizeAdapter<TModel, OllamaSummarizeProviderOptions> {
51+
export class OllamaSummarizeAdapter<TModel extends OllamaSummarizeModel>
52+
implements SummarizeAdapter<TModel, OllamaSummarizeProviderOptions>
53+
{
7054
readonly kind = 'summarize' as const
7155
readonly name = 'ollama' as const
7256
readonly model: TModel

packages/typescript/ai-ollama/src/adapters/text.ts

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ import { BaseTextAdapter } from '@tanstack/ai/adapters'
22

33
import { createOllamaClient, generateId, getOllamaHostFromEnv } from '../utils'
44

5+
import type {
6+
OLLAMA_TEXT_MODELS,
7+
OllamaChatModelProviderOptionsByName,
8+
} from '../model-meta'
59
import type {
610
StructuredOutputOptions,
711
StructuredOutputResult,
@@ -17,34 +21,18 @@ import type {
1721
} from 'ollama'
1822
import type { StreamChunk, TextOptions, Tool } from '@tanstack/ai'
1923

24+
export type OllamaTextModel =
25+
| (typeof OLLAMA_TEXT_MODELS)[number]
26+
| (string & {})
27+
2028
/**
21-
* Ollama text models
22-
* Note: Ollama models are dynamically loaded, this is a common subset
29+
* Resolve provider options for a specific model.
30+
* If the model has explicit options in the map, use those; otherwise use base options.
2331
*/
24-
export const OllamaTextModels = [
25-
'llama2',
26-
'llama3',
27-
'llama3.1',
28-
'llama3.2',
29-
'codellama',
30-
'mistral',
31-
'mixtral',
32-
'phi',
33-
'phi3',
34-
'neural-chat',
35-
'starling-lm',
36-
'orca-mini',
37-
'vicuna',
38-
'nous-hermes',
39-
'qwen2',
40-
'qwen2.5',
41-
'gemma',
42-
'gemma2',
43-
'deepseek-coder',
44-
'command-r',
45-
] as const
46-
47-
export type OllamaTextModel = (typeof OllamaTextModels)[number] | (string & {})
32+
type ResolveProviderOptions<TModel extends string> =
33+
TModel extends keyof OllamaChatModelProviderOptionsByName
34+
? OllamaChatModelProviderOptionsByName[TModel]
35+
: ChatRequest
4836

4937
/**
5038
* Ollama-specific provider options
@@ -122,7 +110,7 @@ type OllamaMessageMetadataByModality = {
122110
*/
123111
export class OllamaTextAdapter<TModel extends string> extends BaseTextAdapter<
124112
TModel,
125-
OllamaTextProviderOptions,
113+
ResolveProviderOptions<TModel>,
126114
OllamaInputModalities,
127115
OllamaMessageMetadataByModality
128116
> {
@@ -155,7 +143,7 @@ export class OllamaTextAdapter<TModel extends string> extends BaseTextAdapter<
155143
* The outputSchema is already JSON Schema (converted in the ai layer).
156144
*/
157145
async structuredOutput(
158-
options: StructuredOutputOptions<OllamaTextProviderOptions>,
146+
options: StructuredOutputOptions<ResolveProviderOptions<TModel>>,
159147
): Promise<StructuredOutputResult<unknown>> {
160148
const { chatOptions, outputSchema } = options
161149

packages/typescript/ai-ollama/src/index.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,24 @@
55
// Text/Chat adapter
66
export {
77
OllamaTextAdapter,
8-
OllamaTextModels,
98
createOllamaChat,
109
ollamaText,
1110
type OllamaTextAdapterOptions,
1211
type OllamaTextModel,
1312
type OllamaTextProviderOptions,
1413
} from './adapters/text'
14+
export { OLLAMA_TEXT_MODELS as OllamaTextModels } from './model-meta'
1515

1616
// Summarize adapter
1717
export {
1818
OllamaSummarizeAdapter,
19-
OllamaSummarizeModels,
2019
createOllamaSummarize,
2120
ollamaSummarize,
2221
type OllamaSummarizeAdapterOptions,
2322
type OllamaSummarizeModel,
2423
type OllamaSummarizeProviderOptions,
2524
} from './adapters/summarize'
25+
export { OLLAMA_TEXT_MODELS as OllamaSummarizeModels } from './model-meta'
2626

2727
// ===========================
2828
// Type Exports
@@ -35,3 +35,8 @@ export type {
3535
OllamaDocumentMetadata,
3636
OllamaMessageMetadataByModality,
3737
} from './message-types'
38+
39+
export type {
40+
OllamaChatModelProviderOptionsByName,
41+
OllamaModelInputModalitiesByName,
42+
} from './model-meta'
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import type {
2+
OllamaChatRequest,
3+
OllamaChatRequestMessages,
4+
OllamaChatRequestTools,
5+
OllamaMessageTools,
6+
OllamaModelMeta,
7+
} from './models-meta'
8+
9+
const ATHENE_V2_LATEST = {
10+
name: 'athene-v2:latest',
11+
supports: {
12+
input: ['text'],
13+
output: ['text'],
14+
capabilities: ['tools'],
15+
},
16+
size: '47gb',
17+
context: 32_000,
18+
} as const satisfies OllamaModelMeta<
19+
OllamaChatRequest &
20+
OllamaChatRequestMessages<OllamaMessageTools> &
21+
OllamaChatRequestTools
22+
>
23+
24+
const ATHENE_V2_72b = {
25+
name: 'athene-v2:72b',
26+
supports: {
27+
input: ['text'],
28+
output: ['text'],
29+
capabilities: ['tools'],
30+
},
31+
size: '47gb',
32+
context: 32_000,
33+
} as const satisfies OllamaModelMeta<
34+
OllamaChatRequest &
35+
OllamaChatRequestMessages<OllamaMessageTools> &
36+
OllamaChatRequestTools
37+
>
38+
39+
export const ATHENE_MODELS = [
40+
ATHENE_V2_LATEST.name,
41+
ATHENE_V2_72b.name,
42+
] as const
43+
44+
// const ATHENE_IMAGE_MODELS = [] as const
45+
46+
// export const ATHENE_EMBEDDING_MODELS = [] as const
47+
48+
// const ATHENE_AUDIO_MODELS = [] as const
49+
50+
// const ATHENE_VIDEO_MODELS = [] as const
51+
52+
// export type AtheneChatModels = (typeof ATHENE_MODELS)[number]
53+
54+
// Manual type map for per-model provider options
55+
export type AtheneChatModelProviderOptionsByName = {
56+
// Models with thinking and structured output support
57+
[ATHENE_V2_LATEST.name]: OllamaChatRequest &
58+
OllamaChatRequestMessages<OllamaMessageTools> &
59+
OllamaChatRequestTools
60+
[ATHENE_V2_72b.name]: OllamaChatRequest &
61+
OllamaChatRequestMessages<OllamaMessageTools> &
62+
OllamaChatRequestTools
63+
}
64+
65+
export type AtheneModelInputModalitiesByName = {
66+
// Models with text, image, audio, video (no document)
67+
[ATHENE_V2_LATEST.name]: typeof ATHENE_V2_LATEST.supports.input
68+
[ATHENE_V2_72b.name]: typeof ATHENE_V2_72b.supports.input
69+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import type {
2+
OllamaChatRequest,
3+
OllamaChatRequestMessages,
4+
OllamaModelMeta,
5+
} from './models-meta'
6+
7+
const AYA_LATEST = {
8+
name: 'aya:latest',
9+
supports: {
10+
input: ['text'],
11+
output: ['text'],
12+
capabilities: [],
13+
},
14+
size: '4.8gb',
15+
context: 8_000,
16+
} as const satisfies OllamaModelMeta<
17+
OllamaChatRequest & OllamaChatRequestMessages
18+
>
19+
20+
const AYA_8b = {
21+
name: 'aya:8b',
22+
supports: {
23+
input: ['text'],
24+
output: ['text'],
25+
capabilities: [],
26+
},
27+
size: '4.8gb',
28+
context: 8_000,
29+
} as const satisfies OllamaModelMeta<
30+
OllamaChatRequest & OllamaChatRequestMessages
31+
>
32+
33+
const AYA_35b = {
34+
name: 'aya:35b',
35+
supports: {
36+
input: ['text'],
37+
output: ['text'],
38+
capabilities: [],
39+
},
40+
size: '20gb',
41+
context: 8_000,
42+
} as const satisfies OllamaModelMeta<
43+
OllamaChatRequest & OllamaChatRequestMessages
44+
>
45+
46+
export const AYA_MODELS = [AYA_LATEST.name, AYA_8b.name, AYA_35b.name] as const
47+
48+
// const AYA_IMAGE_MODELS = [] as const
49+
50+
// export const AYA_EMBEDDING_MODELS = [] as const
51+
52+
// const AYA_AUDIO_MODELS = [] as const
53+
54+
// const AYA_VIDEO_MODELS = [] as const
55+
56+
// export type AyaChatModels = (typeof AYA_MODELS)[number]
57+
58+
// Manual type map for per-model provider options
59+
export type AyaChatModelProviderOptionsByName = {
60+
// Models with thinking and structured output support
61+
[AYA_LATEST.name]: OllamaChatRequest & OllamaChatRequestMessages
62+
[AYA_8b.name]: OllamaChatRequest & OllamaChatRequestMessages
63+
[AYA_35b.name]: OllamaChatRequest & OllamaChatRequestMessages
64+
}
65+
66+
export type AyaModelInputModalitiesByName = {
67+
// Models with text, image, audio, video (no document)
68+
[AYA_LATEST.name]: typeof AYA_LATEST.supports.input
69+
[AYA_8b.name]: typeof AYA_8b.supports.input
70+
[AYA_35b.name]: typeof AYA_35b.supports.input
71+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import type {
2+
OllamaChatRequest,
3+
OllamaChatRequestMessages,
4+
OllamaModelMeta,
5+
} from './models-meta'
6+
7+
const CODEGEMMA_LATEST = {
8+
name: 'codegemma:latest',
9+
supports: {
10+
input: ['text'],
11+
output: ['text'],
12+
capabilities: [],
13+
},
14+
size: '5gb',
15+
context: 8_000,
16+
} as const satisfies OllamaModelMeta<
17+
OllamaChatRequest & OllamaChatRequestMessages
18+
>
19+
20+
const CODEGEMMA_8b = {
21+
name: 'codegemma:2b',
22+
supports: {
23+
input: ['text'],
24+
output: ['text'],
25+
capabilities: [],
26+
},
27+
size: '1.65gb',
28+
context: 8_000,
29+
} as const satisfies OllamaModelMeta<
30+
OllamaChatRequest & OllamaChatRequestMessages
31+
>
32+
33+
const CODEGEMMA_35b = {
34+
name: 'codegemma:7b',
35+
supports: {
36+
input: ['text'],
37+
output: ['text'],
38+
capabilities: [],
39+
},
40+
size: '5gb',
41+
context: 8_000,
42+
} as const satisfies OllamaModelMeta<
43+
OllamaChatRequest & OllamaChatRequestMessages
44+
>
45+
46+
export const CODEGEMMA_MODELS = [
47+
CODEGEMMA_LATEST.name,
48+
CODEGEMMA_8b.name,
49+
CODEGEMMA_35b.name,
50+
] as const
51+
52+
// const CODEGEMMA_IMAGE_MODELS = [] as const
53+
54+
// export const CODEGEMMA_EMBEDDING_MODELS = [] as const
55+
56+
// const CODEGEMMA_AUDIO_MODELS = [] as const
57+
58+
// const CODEGEMMA_VIDEO_MODELS = [] as const
59+
60+
// export type CodegemmaChatModels = (typeof CODEGEMMA_MODELS)[number]
61+
62+
// Manual type map for per-model provider options
63+
export type CodegemmaChatModelProviderOptionsByName = {
64+
// Models with thinking and structured output support
65+
[CODEGEMMA_LATEST.name]: OllamaChatRequest & OllamaChatRequestMessages
66+
[CODEGEMMA_8b.name]: OllamaChatRequest & OllamaChatRequestMessages
67+
[CODEGEMMA_35b.name]: OllamaChatRequest & OllamaChatRequestMessages
68+
}
69+
70+
export type CodegemmaModelInputModalitiesByName = {
71+
// Models with text, image, audio, video (no document)
72+
[CODEGEMMA_LATEST.name]: typeof CODEGEMMA_LATEST.supports.input
73+
[CODEGEMMA_8b.name]: typeof CODEGEMMA_8b.supports.input
74+
[CODEGEMMA_35b.name]: typeof CODEGEMMA_35b.supports.input
75+
}

0 commit comments

Comments
 (0)