@modelprofile.com/flexharness-providers 7.0.0

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 (130) hide show
  1. package/dist_ts_media_openai/image.d.ts +46 -0
  2. package/dist_ts_media_openai/image.js +110 -0
  3. package/dist_ts_media_openai/index.d.ts +10 -0
  4. package/dist_ts_media_openai/index.js +16 -0
  5. package/dist_ts_media_openai/plugins.d.ts +3 -0
  6. package/dist_ts_media_openai/plugins.js +4 -0
  7. package/dist_ts_openai_account/index.d.ts +6 -0
  8. package/dist_ts_openai_account/index.js +7 -0
  9. package/dist_ts_openai_account/plugins.d.ts +7 -0
  10. package/dist_ts_openai_account/plugins.js +6 -0
  11. package/dist_ts_openai_account/smartai.providers.credentials.d.ts +7 -0
  12. package/dist_ts_openai_account/smartai.providers.credentials.js +126 -0
  13. package/dist_ts_openai_account/smartai.providers.error.d.ts +11 -0
  14. package/dist_ts_openai_account/smartai.providers.error.js +30 -0
  15. package/dist_ts_openai_account/smartai.providers.interfaces.d.ts +161 -0
  16. package/dist_ts_openai_account/smartai.providers.interfaces.js +2 -0
  17. package/dist_ts_openai_account/smartai.providers.openai.d.ts +29 -0
  18. package/dist_ts_openai_account/smartai.providers.openai.js +1075 -0
  19. package/dist_ts_openai_account/smartai.providers.registry.d.ts +11 -0
  20. package/dist_ts_openai_account/smartai.providers.registry.js +53 -0
  21. package/dist_ts_openai_auth/index.d.ts +6 -0
  22. package/dist_ts_openai_auth/index.js +10 -0
  23. package/dist_ts_openai_auth/interfaces.d.ts +71 -0
  24. package/dist_ts_openai_auth/interfaces.js +2 -0
  25. package/dist_ts_openai_auth/smartai.auth.openai.d.ts +34 -0
  26. package/dist_ts_openai_auth/smartai.auth.openai.js +603 -0
  27. package/dist_ts_openai_auth/smartai.middleware.openai.d.ts +6 -0
  28. package/dist_ts_openai_auth/smartai.middleware.openai.js +47 -0
  29. package/dist_ts_openai_auth_files/index.d.ts +43 -0
  30. package/dist_ts_openai_auth_files/index.js +377 -0
  31. package/dist_ts_openai_auth_files/plugins.d.ts +9 -0
  32. package/dist_ts_openai_auth_files/plugins.js +10 -0
  33. package/dist_ts_providers/anthropic/index.d.ts +8 -0
  34. package/dist_ts_providers/anthropic/index.js +13 -0
  35. package/dist_ts_providers/anthropic/plugins.d.ts +4 -0
  36. package/dist_ts_providers/anthropic/plugins.js +4 -0
  37. package/dist_ts_providers/anthropic/smartai.middleware.anthropic.d.ts +8 -0
  38. package/dist_ts_providers/anthropic/smartai.middleware.anthropic.js +10 -0
  39. package/dist_ts_providers/google/index.d.ts +5 -0
  40. package/dist_ts_providers/google/index.js +6 -0
  41. package/dist_ts_providers/google/plugins.d.ts +3 -0
  42. package/dist_ts_providers/google/plugins.js +3 -0
  43. package/dist_ts_providers/groq/index.d.ts +5 -0
  44. package/dist_ts_providers/groq/index.js +6 -0
  45. package/dist_ts_providers/groq/plugins.d.ts +3 -0
  46. package/dist_ts_providers/groq/plugins.js +3 -0
  47. package/dist_ts_providers/index.d.ts +8 -0
  48. package/dist_ts_providers/index.js +9 -0
  49. package/dist_ts_providers/mistral/index.d.ts +5 -0
  50. package/dist_ts_providers/mistral/index.js +6 -0
  51. package/dist_ts_providers/mistral/plugins.d.ts +3 -0
  52. package/dist_ts_providers/mistral/plugins.js +3 -0
  53. package/dist_ts_providers/ollama/index.d.ts +6 -0
  54. package/dist_ts_providers/ollama/index.js +7 -0
  55. package/dist_ts_providers/ollama/interfaces.d.ts +26 -0
  56. package/dist_ts_providers/ollama/interfaces.js +2 -0
  57. package/dist_ts_providers/ollama/smartai.provider.ollama.d.ts +8 -0
  58. package/dist_ts_providers/ollama/smartai.provider.ollama.js +378 -0
  59. package/dist_ts_providers/openai/index.d.ts +15 -0
  60. package/dist_ts_providers/openai/index.js +14 -0
  61. package/dist_ts_providers/openai/plugins.d.ts +6 -0
  62. package/dist_ts_providers/openai/plugins.js +4 -0
  63. package/dist_ts_providers/perplexity/index.d.ts +5 -0
  64. package/dist_ts_providers/perplexity/index.js +6 -0
  65. package/dist_ts_providers/perplexity/plugins.d.ts +3 -0
  66. package/dist_ts_providers/perplexity/plugins.js +3 -0
  67. package/dist_ts_providers/xai/index.d.ts +5 -0
  68. package/dist_ts_providers/xai/index.js +6 -0
  69. package/dist_ts_providers/xai/plugins.d.ts +3 -0
  70. package/dist_ts_providers/xai/plugins.js +3 -0
  71. package/dist_ts_research/index.d.ts +19 -0
  72. package/dist_ts_research/index.js +98 -0
  73. package/dist_ts_research/plugins.d.ts +2 -0
  74. package/dist_ts_research/plugins.js +3 -0
  75. package/license.md +21 -0
  76. package/openai-codex-license.txt +201 -0
  77. package/package.json +105 -0
  78. package/readme.md +62 -0
  79. package/third-party-notices.md +19 -0
  80. package/ts_media_openai/image.ts +147 -0
  81. package/ts_media_openai/index.ts +26 -0
  82. package/ts_media_openai/plugins.ts +3 -0
  83. package/ts_media_openai/readme.md +37 -0
  84. package/ts_openai_account/index.ts +11 -0
  85. package/ts_openai_account/plugins.ts +9 -0
  86. package/ts_openai_account/readme.md +37 -0
  87. package/ts_openai_account/smartai.providers.credentials.ts +163 -0
  88. package/ts_openai_account/smartai.providers.error.ts +49 -0
  89. package/ts_openai_account/smartai.providers.interfaces.ts +222 -0
  90. package/ts_openai_account/smartai.providers.openai.ts +1209 -0
  91. package/ts_openai_account/smartai.providers.registry.ts +57 -0
  92. package/ts_openai_auth/index.ts +12 -0
  93. package/ts_openai_auth/interfaces.ts +89 -0
  94. package/ts_openai_auth/readme.md +37 -0
  95. package/ts_openai_auth/smartai.auth.openai.ts +789 -0
  96. package/ts_openai_auth/smartai.middleware.openai.ts +55 -0
  97. package/ts_openai_auth_files/index.ts +499 -0
  98. package/ts_openai_auth_files/plugins.ts +13 -0
  99. package/ts_openai_auth_files/readme.md +37 -0
  100. package/ts_providers/anthropic/index.ts +20 -0
  101. package/ts_providers/anthropic/plugins.ts +4 -0
  102. package/ts_providers/anthropic/readme.md +37 -0
  103. package/ts_providers/anthropic/smartai.middleware.anthropic.ts +12 -0
  104. package/ts_providers/google/index.ts +8 -0
  105. package/ts_providers/google/plugins.ts +3 -0
  106. package/ts_providers/google/readme.md +37 -0
  107. package/ts_providers/groq/index.ts +8 -0
  108. package/ts_providers/groq/plugins.ts +3 -0
  109. package/ts_providers/groq/readme.md +37 -0
  110. package/ts_providers/index.ts +8 -0
  111. package/ts_providers/mistral/index.ts +8 -0
  112. package/ts_providers/mistral/plugins.ts +3 -0
  113. package/ts_providers/mistral/readme.md +37 -0
  114. package/ts_providers/ollama/index.ts +8 -0
  115. package/ts_providers/ollama/interfaces.ts +28 -0
  116. package/ts_providers/ollama/readme.md +37 -0
  117. package/ts_providers/ollama/smartai.provider.ollama.ts +426 -0
  118. package/ts_providers/openai/index.ts +29 -0
  119. package/ts_providers/openai/plugins.ts +6 -0
  120. package/ts_providers/openai/readme.md +37 -0
  121. package/ts_providers/perplexity/index.ts +8 -0
  122. package/ts_providers/perplexity/plugins.ts +3 -0
  123. package/ts_providers/perplexity/readme.md +37 -0
  124. package/ts_providers/readme.md +62 -0
  125. package/ts_providers/xai/index.ts +8 -0
  126. package/ts_providers/xai/plugins.ts +3 -0
  127. package/ts_providers/xai/readme.md +37 -0
  128. package/ts_research/index.ts +120 -0
  129. package/ts_research/plugins.ts +2 -0
  130. package/ts_research/readme.md +37 -0
@@ -0,0 +1,47 @@
1
+ const isNonEmptyString = (value) => typeof value === 'string' && value.trim().length > 0;
2
+ const getSystemInstructions = (prompt) => {
3
+ const instructions = prompt
4
+ .filter((message) => message.role === 'system')
5
+ .map((message) => message.content)
6
+ .filter(isNonEmptyString);
7
+ return instructions.length > 0 ? instructions.join('\n') : undefined;
8
+ };
9
+ const hasUnsupportedChatGptCacheRetention = (options) => {
10
+ return options.promptCacheRetention !== undefined || options.prompt_cache_retention !== undefined;
11
+ };
12
+ /**
13
+ * ChatGPT's Codex backend requires top-level Responses API instructions.
14
+ * The standard OpenAI provider otherwise serializes system prompts as input items.
15
+ */
16
+ export function createOpenAiChatGptInstructionsMiddleware() {
17
+ return {
18
+ specificationVersion: 'v4',
19
+ transformParams: async ({ params }) => {
20
+ const instructions = getSystemInstructions(params.prompt);
21
+ const providerOptions = params.providerOptions ?? {};
22
+ const openAiProviderOptions = providerOptions.openai ?? {};
23
+ const shouldApplyInstructions = !!instructions && !isNonEmptyString(openAiProviderOptions.instructions);
24
+ const shouldStripCacheRetention = hasUnsupportedChatGptCacheRetention(openAiProviderOptions);
25
+ if (!shouldApplyInstructions && !shouldStripCacheRetention) {
26
+ return params;
27
+ }
28
+ const nextOpenAiProviderOptions = { ...openAiProviderOptions };
29
+ delete nextOpenAiProviderOptions.promptCacheRetention;
30
+ delete nextOpenAiProviderOptions.prompt_cache_retention;
31
+ if (shouldApplyInstructions) {
32
+ nextOpenAiProviderOptions.instructions = instructions;
33
+ }
34
+ return {
35
+ ...params,
36
+ prompt: shouldApplyInstructions
37
+ ? params.prompt.filter((message) => message.role !== 'system')
38
+ : params.prompt,
39
+ providerOptions: {
40
+ ...providerOptions,
41
+ openai: nextOpenAiProviderOptions,
42
+ },
43
+ };
44
+ },
45
+ };
46
+ }
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhaS5taWRkbGV3YXJlLm9wZW5haS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX29wZW5haV9hdXRoL3NtYXJ0YWkubWlkZGxld2FyZS5vcGVuYWkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEtBQWMsRUFBbUIsRUFBRSxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUVuSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsTUFBNEMsRUFBc0IsRUFBRTtJQUNqRyxNQUFNLFlBQVksR0FBRyxNQUFNO1NBQ3hCLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7U0FDOUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1NBQ2pDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRTVCLE9BQU8sWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN2RSxDQUFDLENBQUM7QUFFRixNQUFNLG1DQUFtQyxHQUFHLENBQUMsT0FBbUIsRUFBVyxFQUFFO0lBQzNFLE9BQU8sT0FBTyxDQUFDLG9CQUFvQixLQUFLLFNBQVMsSUFBSSxPQUFPLENBQUMsc0JBQXNCLEtBQUssU0FBUyxDQUFDO0FBQ3BHLENBQUMsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sVUFBVSx5Q0FBeUM7SUFDdkQsT0FBTztRQUNMLG9CQUFvQixFQUFFLElBQUk7UUFDMUIsZUFBZSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7WUFDcEMsTUFBTSxZQUFZLEdBQUcscUJBQXFCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFELE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFDO1lBQ3JELE1BQU0scUJBQXFCLEdBQUcsZUFBZSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7WUFDM0QsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUMsWUFBWSxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDeEcsTUFBTSx5QkFBeUIsR0FBRyxtQ0FBbUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBRTdGLElBQUksQ0FBQyx1QkFBdUIsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7Z0JBQzNELE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUM7WUFFRCxNQUFNLHlCQUF5QixHQUFlLEVBQUUsR0FBRyxxQkFBcUIsRUFBRSxDQUFDO1lBQzNFLE9BQU8seUJBQXlCLENBQUMsb0JBQW9CLENBQUM7WUFDdEQsT0FBTyx5QkFBeUIsQ0FBQyxzQkFBc0IsQ0FBQztZQUN4RCxJQUFJLHVCQUF1QixFQUFFLENBQUM7Z0JBQzVCLHlCQUF5QixDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7WUFDeEQsQ0FBQztZQUVELE9BQU87Z0JBQ0wsR0FBRyxNQUFNO2dCQUNULE1BQU0sRUFBRSx1QkFBdUI7b0JBQzdCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7b0JBQzlELENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTTtnQkFDakIsZUFBZSxFQUFFO29CQUNmLEdBQUcsZUFBZTtvQkFDbEIsTUFBTSxFQUFFLHlCQUF5QjtpQkFDbEM7YUFDbUMsQ0FBQztRQUN6QyxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMifQ==
@@ -0,0 +1,43 @@
1
+ import type { IOpenAiChatGptAuthOptions, IOpenAiChatGptTokenData } from '@modelprofile.com/flexharness-providers/auth';
2
+ export type TOpenAiChatGptAuthSource = 'smartai' | 'opencode' | 'codex';
3
+ export type TOpenAiChatGptAuthFileFormat = TOpenAiChatGptAuthSource | 'auto';
4
+ export interface IOpenAiChatGptAuthSourceConfig {
5
+ source: TOpenAiChatGptAuthSource;
6
+ filePath?: string;
7
+ format?: TOpenAiChatGptAuthFileFormat;
8
+ writeBack?: boolean;
9
+ }
10
+ export interface IOpenAiChatGptAuthSourceInspection {
11
+ source: TOpenAiChatGptAuthSource;
12
+ filePath: string;
13
+ exists: boolean;
14
+ usable: boolean;
15
+ expired?: boolean;
16
+ accountId?: string;
17
+ email?: string;
18
+ plan?: string;
19
+ expiresAt?: string;
20
+ error?: string;
21
+ }
22
+ export interface IInspectOpenAiChatGptAuthSourcesOptions {
23
+ sources?: Array<TOpenAiChatGptAuthSource | IOpenAiChatGptAuthSourceConfig>;
24
+ homeDir?: string;
25
+ now?: Date;
26
+ }
27
+ export interface IResolveOpenAiChatGptAuthOptions extends IInspectOpenAiChatGptAuthSourcesOptions {
28
+ refresh?: 'ifNeeded' | false;
29
+ writeBack?: Partial<Record<TOpenAiChatGptAuthSource, boolean>>;
30
+ authOptions?: IOpenAiChatGptAuthOptions;
31
+ }
32
+ export interface IResolvedOpenAiChatGptAuth {
33
+ source: TOpenAiChatGptAuthSource;
34
+ filePath: string;
35
+ tokenData: IOpenAiChatGptTokenData;
36
+ refreshed: boolean;
37
+ }
38
+ export declare const getDefaultOpenAiChatGptAuthPath: (source: TOpenAiChatGptAuthSource, homeDir?: string) => string;
39
+ export declare const normalizeOpenAiChatGptAuth: (input: unknown, format?: TOpenAiChatGptAuthFileFormat) => IOpenAiChatGptTokenData | undefined;
40
+ export declare const readOpenAiChatGptAuthFile: (filePath: string, format?: TOpenAiChatGptAuthFileFormat) => Promise<IOpenAiChatGptTokenData | undefined>;
41
+ export declare const inspectOpenAiChatGptAuthSources: (options?: IInspectOpenAiChatGptAuthSourcesOptions) => Promise<IOpenAiChatGptAuthSourceInspection[]>;
42
+ export declare const resolveOpenAiChatGptAuth: (options?: IResolveOpenAiChatGptAuthOptions) => Promise<IResolvedOpenAiChatGptAuth | undefined>;
43
+ export declare const writeOpenAiChatGptAuthFile: (filePath: string, tokenData: IOpenAiChatGptTokenData, format?: TOpenAiChatGptAuthFileFormat) => Promise<void>;
@@ -0,0 +1,377 @@
1
+ import * as plugins from './plugins.js';
2
+ import { parseOpenAiChatGptTokenInfo, refreshOpenAiChatGptTokenData, } from '@modelprofile.com/flexharness-providers/auth';
3
+ const defaultSources = ['smartai', 'opencode', 'codex'];
4
+ const refreshWindowMs = 5 * 60 * 1000;
5
+ const lockWaitTimeoutMs = 30_000;
6
+ const lockStaleMs = 60_000;
7
+ const maximumAuthFileBytes = 1024 * 1024;
8
+ const inProcessFileLocks = new Map();
9
+ const canonicalizeFilePath = async (filePathArg) => {
10
+ const resolvedPath = plugins.path.resolve(filePathArg);
11
+ await plugins.fs.mkdir(plugins.path.dirname(resolvedPath), { recursive: true, mode: 0o700 });
12
+ try {
13
+ return await plugins.fs.realpath(resolvedPath);
14
+ }
15
+ catch (errorArg) {
16
+ if (errorArg.code !== 'ENOENT')
17
+ throw errorArg;
18
+ const parentPath = await plugins.fs.realpath(plugins.path.dirname(resolvedPath));
19
+ return plugins.path.join(parentPath, plugins.path.basename(resolvedPath));
20
+ }
21
+ };
22
+ const acquireCrossProcessFileLock = async (filePathArg) => plugins.properLockfile.lock(filePathArg, {
23
+ lockfilePath: `${filePathArg}.smartai.lock`,
24
+ realpath: false,
25
+ stale: lockStaleMs,
26
+ update: 10_000,
27
+ retries: {
28
+ retries: Math.ceil(lockWaitTimeoutMs / 50),
29
+ factor: 1,
30
+ minTimeout: 50,
31
+ maxTimeout: 50,
32
+ randomize: false,
33
+ },
34
+ });
35
+ const withAuthFileLock = async (filePathArg, taskArg) => {
36
+ const canonicalFilePath = await canonicalizeFilePath(filePathArg);
37
+ const previous = inProcessFileLocks.get(canonicalFilePath) ?? Promise.resolve();
38
+ let releaseInProcess;
39
+ const current = new Promise((resolve) => {
40
+ releaseInProcess = resolve;
41
+ });
42
+ const tail = previous.then(() => current);
43
+ inProcessFileLocks.set(canonicalFilePath, tail);
44
+ await previous;
45
+ try {
46
+ const releaseCrossProcess = await acquireCrossProcessFileLock(canonicalFilePath);
47
+ try {
48
+ return await taskArg(canonicalFilePath);
49
+ }
50
+ finally {
51
+ await releaseCrossProcess();
52
+ }
53
+ }
54
+ finally {
55
+ releaseInProcess();
56
+ if (inProcessFileLocks.get(canonicalFilePath) === tail) {
57
+ inProcessFileLocks.delete(canonicalFilePath);
58
+ }
59
+ }
60
+ };
61
+ export const getDefaultOpenAiChatGptAuthPath = (source, homeDir = plugins.os.homedir()) => {
62
+ switch (source) {
63
+ case 'smartai':
64
+ return plugins.path.join(homeDir, '.git.zone', 'ide', 'openai-chatgpt-auth.json');
65
+ case 'opencode':
66
+ return plugins.path.join(homeDir, '.local', 'share', 'opencode', 'auth.json');
67
+ case 'codex':
68
+ return plugins.path.join(homeDir, '.codex', 'auth.json');
69
+ default:
70
+ throw new Error(`Unsupported OpenAI ChatGPT auth source: ${source}`);
71
+ }
72
+ };
73
+ export const normalizeOpenAiChatGptAuth = (input, format = 'auto') => {
74
+ if (format === 'auto') {
75
+ return normalizeOpenAiChatGptAuth(input, 'smartai')
76
+ ?? normalizeOpenAiChatGptAuth(input, 'opencode')
77
+ ?? normalizeOpenAiChatGptAuth(input, 'codex');
78
+ }
79
+ if (!isRecord(input))
80
+ return undefined;
81
+ if (format === 'opencode') {
82
+ return normalizeOpenCodeAuth(input);
83
+ }
84
+ return normalizeTokenObject(isRecord(input.tokens) ? input.tokens : input);
85
+ };
86
+ const readBoundedAuthFileText = async (filePathArg) => {
87
+ const canonicalFilePath = await plugins.fs.realpath(filePathArg);
88
+ let handle;
89
+ try {
90
+ handle = await plugins.fs.open(canonicalFilePath, plugins.fsConstants.O_RDONLY | plugins.fsConstants.O_NONBLOCK);
91
+ const stat = await handle.stat();
92
+ if (!stat.isFile() || stat.size > maximumAuthFileBytes) {
93
+ throw new Error('Authentication file is not a bounded regular file.');
94
+ }
95
+ const bytes = new Uint8Array(maximumAuthFileBytes + 1);
96
+ let offset = 0;
97
+ while (offset < bytes.byteLength) {
98
+ const result = await handle.read(bytes, offset, bytes.byteLength - offset, offset);
99
+ if (result.bytesRead === 0)
100
+ break;
101
+ offset += result.bytesRead;
102
+ }
103
+ if (offset > maximumAuthFileBytes) {
104
+ throw new Error('Authentication file exceeds its size limit.');
105
+ }
106
+ return new TextDecoder().decode(bytes.subarray(0, offset));
107
+ }
108
+ finally {
109
+ await handle?.close();
110
+ }
111
+ };
112
+ const readBoundedAuthJson = async (filePathArg) => JSON.parse(await readBoundedAuthFileText(filePathArg));
113
+ export const readOpenAiChatGptAuthFile = async (filePath, format = 'auto') => {
114
+ const parsed = await readBoundedAuthJson(filePath);
115
+ return normalizeOpenAiChatGptAuth(parsed, format);
116
+ };
117
+ export const inspectOpenAiChatGptAuthSources = async (options = {}) => {
118
+ const now = options.now ?? new Date();
119
+ const sourceConfigs = normalizeSourceConfigs(options.sources, options.homeDir);
120
+ return Promise.all(sourceConfigs.map(async (sourceConfig) => {
121
+ try {
122
+ const tokenData = await readOpenAiChatGptAuthFile(sourceConfig.filePath, sourceConfig.format ?? sourceConfig.source);
123
+ if (!tokenData) {
124
+ return {
125
+ source: sourceConfig.source,
126
+ filePath: sourceConfig.filePath,
127
+ exists: true,
128
+ usable: false,
129
+ error: 'No OpenAI ChatGPT auth token found in file.',
130
+ };
131
+ }
132
+ return toInspection(sourceConfig.source, sourceConfig.filePath, tokenData, now);
133
+ }
134
+ catch (error) {
135
+ const nodeError = error;
136
+ return {
137
+ source: sourceConfig.source,
138
+ filePath: sourceConfig.filePath,
139
+ exists: nodeError.code !== 'ENOENT',
140
+ usable: false,
141
+ error: nodeError.code === 'ENOENT' ? undefined : 'Authentication file could not be read.',
142
+ };
143
+ }
144
+ }));
145
+ };
146
+ export const resolveOpenAiChatGptAuth = async (options = {}) => {
147
+ const now = options.now ?? new Date();
148
+ const sourceConfigs = normalizeSourceConfigs(options.sources, options.homeDir);
149
+ const refresh = options.refresh ?? 'ifNeeded';
150
+ for (const sourceConfig of sourceConfigs) {
151
+ let tokenData;
152
+ try {
153
+ tokenData = await readOpenAiChatGptAuthFile(sourceConfig.filePath, sourceConfig.format ?? sourceConfig.source);
154
+ }
155
+ catch (error) {
156
+ const nodeError = error;
157
+ if (nodeError.code === 'ENOENT')
158
+ continue;
159
+ continue;
160
+ }
161
+ if (!tokenData)
162
+ continue;
163
+ const shouldRefresh = refresh === 'ifNeeded' && shouldRefreshToken(tokenData, now);
164
+ const writeBack = sourceConfig.writeBack ?? options.writeBack?.[sourceConfig.source] ?? sourceConfig.source === 'smartai';
165
+ if (writeBack && sourceConfig.format === 'auto') {
166
+ throw new Error('The auto auth-file format cannot be used for write-back.');
167
+ }
168
+ if (!shouldRefresh) {
169
+ return { source: sourceConfig.source, filePath: sourceConfig.filePath, tokenData, refreshed: false };
170
+ }
171
+ if (!writeBack) {
172
+ if (!isExpired(tokenData, now)) {
173
+ return { source: sourceConfig.source, filePath: sourceConfig.filePath, tokenData, refreshed: false };
174
+ }
175
+ continue;
176
+ }
177
+ try {
178
+ const resolved = await withAuthFileLock(sourceConfig.filePath, async (canonicalFilePath) => {
179
+ const latestTokenData = await readOpenAiChatGptAuthFile(canonicalFilePath, sourceConfig.format ?? sourceConfig.source);
180
+ if (!latestTokenData)
181
+ return undefined;
182
+ if (!shouldRefreshToken(latestTokenData, now)) {
183
+ return {
184
+ source: sourceConfig.source,
185
+ filePath: sourceConfig.filePath,
186
+ tokenData: latestTokenData,
187
+ refreshed: false,
188
+ };
189
+ }
190
+ const refreshed = await refreshOpenAiChatGptTokenData(latestTokenData, options.authOptions ?? {});
191
+ await writeOpenAiChatGptAuthFileUnlocked(canonicalFilePath, refreshed, sourceConfig.format ?? sourceConfig.source);
192
+ return {
193
+ source: sourceConfig.source,
194
+ filePath: sourceConfig.filePath,
195
+ tokenData: refreshed,
196
+ refreshed: true,
197
+ };
198
+ });
199
+ if (resolved)
200
+ return resolved;
201
+ }
202
+ catch {
203
+ continue;
204
+ }
205
+ }
206
+ return undefined;
207
+ };
208
+ export const writeOpenAiChatGptAuthFile = async (filePath, tokenData, format = 'smartai') => {
209
+ if (format === 'auto')
210
+ throw new Error('The auto auth-file format cannot be written.');
211
+ return withAuthFileLock(filePath, async (canonicalFilePath) => {
212
+ await writeOpenAiChatGptAuthFileUnlocked(canonicalFilePath, tokenData, format);
213
+ });
214
+ };
215
+ const writeOpenAiChatGptAuthFileUnlocked = async (filePath, tokenData, format) => {
216
+ const current = await readJsonFileIfExists(filePath);
217
+ const payload = format === 'opencode'
218
+ ? toOpenCodeAuthFile(current, tokenData)
219
+ : format === 'codex'
220
+ ? toCodexAuthFile(current, tokenData)
221
+ : toSmartAiAuthFile(tokenData);
222
+ await writeJsonAtomic(filePath, payload);
223
+ };
224
+ const normalizeSourceConfigs = (sources, homeDir = plugins.os.homedir()) => {
225
+ return (sources ?? defaultSources).map((sourceInput) => {
226
+ const sourceConfig = typeof sourceInput === 'string' ? { source: sourceInput } : sourceInput;
227
+ return {
228
+ source: sourceConfig.source,
229
+ filePath: sourceConfig.filePath ?? getDefaultOpenAiChatGptAuthPath(sourceConfig.source, homeDir),
230
+ format: sourceConfig.format ?? sourceConfig.source,
231
+ writeBack: sourceConfig.writeBack,
232
+ };
233
+ });
234
+ };
235
+ const toInspection = (source, filePath, tokenData, now) => {
236
+ const expired = isExpired(tokenData, now);
237
+ return {
238
+ source,
239
+ filePath,
240
+ exists: true,
241
+ usable: !expired,
242
+ expired,
243
+ accountId: tokenData.accountId ?? tokenData.tokenInfo.chatgptAccountId,
244
+ email: tokenData.tokenInfo.email,
245
+ plan: tokenData.tokenInfo.chatgptPlanType,
246
+ expiresAt: tokenData.tokenInfo.expiresAt,
247
+ };
248
+ };
249
+ const normalizeTokenObject = (input) => {
250
+ const accessToken = stringValue(input.accessToken) ?? stringValue(input.access_token);
251
+ const refreshToken = stringValue(input.refreshToken) ?? stringValue(input.refresh_token);
252
+ const idToken = stringValue(input.idToken) ?? stringValue(input.id_token);
253
+ const accountId = stringValue(input.accountId) ?? stringValue(input.account_id);
254
+ return createTokenDataFromValues({ accessToken, refreshToken, idToken, accountId });
255
+ };
256
+ const normalizeOpenCodeAuth = (input) => {
257
+ if (!isRecord(input.openai))
258
+ return undefined;
259
+ const accessToken = stringValue(input.openai.access);
260
+ const refreshToken = stringValue(input.openai.refresh);
261
+ const accountId = stringValue(input.openai.accountId);
262
+ const expiresAt = typeof input.openai.expires === 'number' ? new Date(input.openai.expires).toISOString() : undefined;
263
+ return createTokenDataFromValues({ accessToken, refreshToken, accountId, fallbackExpiresAt: expiresAt });
264
+ };
265
+ const createTokenDataFromValues = (input) => {
266
+ if (!input.accessToken || !input.refreshToken)
267
+ return undefined;
268
+ const parseToken = input.idToken ?? input.accessToken;
269
+ const tokenInfo = parseTokenInfo(parseToken, input.accountId, input.fallbackExpiresAt);
270
+ if (input.accountId !== undefined
271
+ && tokenInfo.chatgptAccountId !== undefined
272
+ && input.accountId !== tokenInfo.chatgptAccountId) {
273
+ return undefined;
274
+ }
275
+ const accountId = tokenInfo.chatgptAccountId ?? input.accountId;
276
+ return {
277
+ accessToken: input.accessToken,
278
+ refreshToken: input.refreshToken,
279
+ idToken: input.idToken,
280
+ accountId,
281
+ tokenInfo: { ...tokenInfo, chatgptAccountId: accountId },
282
+ };
283
+ };
284
+ const parseTokenInfo = (token, accountId, fallbackExpiresAt) => {
285
+ try {
286
+ const tokenInfo = parseOpenAiChatGptTokenInfo(token);
287
+ return {
288
+ ...tokenInfo,
289
+ chatgptAccountId: tokenInfo.chatgptAccountId ?? accountId,
290
+ expiresAt: tokenInfo.expiresAt ?? fallbackExpiresAt,
291
+ };
292
+ }
293
+ catch {
294
+ return {
295
+ chatgptAccountId: accountId,
296
+ chatgptAccountIsFedramp: false,
297
+ expiresAt: fallbackExpiresAt,
298
+ rawJwt: token,
299
+ };
300
+ }
301
+ };
302
+ const toSmartAiAuthFile = (tokenData) => ({
303
+ accessToken: tokenData.accessToken,
304
+ refreshToken: tokenData.refreshToken,
305
+ idToken: tokenData.idToken,
306
+ accountId: tokenData.accountId,
307
+ tokenInfo: tokenData.tokenInfo,
308
+ });
309
+ const toCodexAuthFile = (current, tokenData) => ({
310
+ ...current,
311
+ OPENAI_API_KEY: current.OPENAI_API_KEY ?? null,
312
+ tokens: {
313
+ ...(isRecord(current.tokens) ? current.tokens : {}),
314
+ id_token: tokenData.idToken,
315
+ access_token: tokenData.accessToken,
316
+ refresh_token: tokenData.refreshToken,
317
+ account_id: tokenData.accountId ?? tokenData.tokenInfo.chatgptAccountId,
318
+ },
319
+ last_refresh: new Date().toISOString(),
320
+ });
321
+ const toOpenCodeAuthFile = (current, tokenData) => ({
322
+ ...current,
323
+ openai: {
324
+ ...(isRecord(current.openai) ? current.openai : {}),
325
+ type: 'oauth',
326
+ refresh: tokenData.refreshToken,
327
+ access: tokenData.accessToken,
328
+ expires: tokenData.tokenInfo.expiresAt ? Date.parse(tokenData.tokenInfo.expiresAt) : undefined,
329
+ accountId: tokenData.accountId ?? tokenData.tokenInfo.chatgptAccountId,
330
+ },
331
+ });
332
+ const shouldRefreshToken = (tokenData, now) => {
333
+ if (!tokenData.tokenInfo.expiresAt)
334
+ return false;
335
+ return Date.parse(tokenData.tokenInfo.expiresAt) - now.getTime() < refreshWindowMs;
336
+ };
337
+ const isExpired = (tokenData, now) => {
338
+ if (!tokenData.tokenInfo.expiresAt)
339
+ return false;
340
+ return Date.parse(tokenData.tokenInfo.expiresAt) <= now.getTime();
341
+ };
342
+ const readJsonFileIfExists = async (filePath) => {
343
+ try {
344
+ const parsed = await readBoundedAuthJson(filePath);
345
+ return isRecord(parsed) ? parsed : {};
346
+ }
347
+ catch (error) {
348
+ const nodeError = error;
349
+ if (nodeError.code === 'ENOENT')
350
+ return {};
351
+ throw error;
352
+ }
353
+ };
354
+ const writeJsonAtomic = async (filePath, payload) => {
355
+ const tempPath = `${filePath}.${plugins.crypto.randomUUID()}.tmp`;
356
+ await plugins.fs.mkdir(plugins.path.dirname(filePath), { recursive: true, mode: 0o700 });
357
+ try {
358
+ await plugins.fs.writeFile(tempPath, `${JSON.stringify(payload, undefined, 2)}\n`, {
359
+ flag: 'wx',
360
+ mode: 0o600,
361
+ });
362
+ await plugins.fs.rename(tempPath, filePath);
363
+ }
364
+ finally {
365
+ await plugins.fs.unlink(tempPath).catch((errorArg) => {
366
+ if (errorArg.code !== 'ENOENT')
367
+ throw errorArg;
368
+ });
369
+ }
370
+ };
371
+ const isRecord = (value) => {
372
+ return !!value && typeof value === 'object' && !Array.isArray(value);
373
+ };
374
+ const stringValue = (value) => {
375
+ return typeof value === 'string' && value.length > 0 ? value : undefined;
376
+ };
377
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19vcGVuYWlfYXV0aF9maWxlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLDZCQUE2QixHQUM5QixNQUFNLDhDQUE4QyxDQUFDO0FBd0R0RCxNQUFNLGNBQWMsR0FBK0IsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3BGLE1BQU0sZUFBZSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDO0FBQ2pDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQztBQUMzQixNQUFNLG9CQUFvQixHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDekMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztBQUU1RCxNQUFNLG9CQUFvQixHQUFHLEtBQUssRUFBRSxXQUFtQixFQUFtQixFQUFFO0lBQzFFLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzdGLElBQUksQ0FBQztRQUNILE9BQU8sTUFBTSxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQUMsT0FBTyxRQUFRLEVBQUUsQ0FBQztRQUNsQixJQUFLLFFBQWtDLENBQUMsSUFBSSxLQUFLLFFBQVE7WUFBRSxNQUFNLFFBQVEsQ0FB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
@@ -0,0 +1,9 @@
1
+ import * as crypto from 'node:crypto';
2
+ import { constants as fsConstants } from 'node:fs';
3
+ import * as fs from 'node:fs/promises';
4
+ import type { FileHandle } from 'node:fs/promises';
5
+ import * as os from 'node:os';
6
+ import * as path from 'node:path';
7
+ import * as properLockfile from 'proper-lockfile';
8
+ export { crypto, fs, fsConstants, os, path, properLockfile };
9
+ export type { FileHandle };
@@ -0,0 +1,10 @@
1
+ // node native scope
2
+ import * as crypto from 'node:crypto';
3
+ import { constants as fsConstants } from 'node:fs';
4
+ import * as fs from 'node:fs/promises';
5
+ import * as os from 'node:os';
6
+ import * as path from 'node:path';
7
+ // third-party scope
8
+ import * as properLockfile from 'proper-lockfile';
9
+ export { crypto, fs, fsConstants, os, path, properLockfile };
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX29wZW5haV9hdXRoX2ZpbGVzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxTQUFTLElBQUksV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ25ELE9BQU8sS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFdkMsT0FBTyxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUM7QUFFbEMsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxjQUFjLE1BQU0saUJBQWlCLENBQUM7QUFFbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLENBQUMifQ==
@@ -0,0 +1,8 @@
1
+ import * as plugins from './plugins.js';
2
+ import { createAnthropicCachingMiddleware } from './smartai.middleware.anthropic.js';
3
+ export interface IAnthropicModelOptions extends plugins.ISmartAiOptions {
4
+ provider: 'anthropic';
5
+ promptCaching?: boolean | plugins.ISmartAiCacheOptions;
6
+ }
7
+ export declare const createAnthropicModelProvider: () => plugins.IModelProvider<IAnthropicModelOptions>;
8
+ export { createAnthropicCachingMiddleware };
@@ -0,0 +1,13 @@
1
+ import * as plugins from './plugins.js';
2
+ import { createAnthropicCachingMiddleware } from './smartai.middleware.anthropic.js';
3
+ export const createAnthropicModelProvider = () => ({
4
+ id: 'anthropic',
5
+ getModel: (options) => {
6
+ const model = plugins.createAnthropic({ apiKey: options.apiKey })(options.model);
7
+ if (options.promptCaching === false)
8
+ return model;
9
+ return plugins.wrapLanguageModel({ model, middleware: createAnthropicCachingMiddleware(typeof options.promptCaching === 'object' ? options.promptCaching : undefined) });
10
+ },
11
+ });
12
+ export { createAnthropicCachingMiddleware };
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19wcm92aWRlcnMvYW50aHJvcGljL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBT3JGLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLEdBQW1ELEVBQUUsQ0FBQyxDQUFDO0lBQ2pHLEVBQUUsRUFBRSxXQUFXO0lBQ2YsUUFBUSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDcEIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakYsSUFBSSxPQUFPLENBQUMsYUFBYSxLQUFLLEtBQUs7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNsRCxPQUFPLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsZ0NBQWdDLENBQ3BGLE9BQU8sT0FBTyxDQUFDLGFBQWEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FDOUUsRUFBRSxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0YsQ0FBQyxDQUFDO0FBRUgsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLENBQUMifQ==
@@ -0,0 +1,4 @@
1
+ import { createAnthropic } from '@ai-sdk/anthropic';
2
+ import { wrapLanguageModel } from 'ai';
3
+ export { createAnthropic, wrapLanguageModel };
4
+ export type { IModelProvider, ISmartAiOptions, ISmartAiCacheOptions } from '@modelprofile.com/flexharness-models';
@@ -0,0 +1,4 @@
1
+ import { createAnthropic } from '@ai-sdk/anthropic';
2
+ import { wrapLanguageModel } from 'ai';
3
+ export { createAnthropic, wrapLanguageModel };
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3Byb3ZpZGVycy9hbnRocm9waWMvcGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyJ9
@@ -0,0 +1,8 @@
1
+ import type { LanguageModelV4Middleware } from '@ai-sdk/provider';
2
+ import type { ISmartAiCacheOptions } from '@modelprofile.com/flexharness-models';
3
+ /**
4
+ * Creates middleware that adds Anthropic prompt caching directives.
5
+ * Marks the last system message and last user message with ephemeral cache control,
6
+ * reducing input token cost and latency on repeated calls.
7
+ */
8
+ export declare function createAnthropicCachingMiddleware(options?: ISmartAiCacheOptions): LanguageModelV4Middleware;
@@ -0,0 +1,10 @@
1
+ import { createSmartAiCachingMiddleware } from '@modelprofile.com/flexharness-models';
2
+ /**
3
+ * Creates middleware that adds Anthropic prompt caching directives.
4
+ * Marks the last system message and last user message with ephemeral cache control,
5
+ * reducing input token cost and latency on repeated calls.
6
+ */
7
+ export function createAnthropicCachingMiddleware(options = {}) {
8
+ return createSmartAiCachingMiddleware({ ...options, provider: 'anthropic' });
9
+ }
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhaS5taWRkbGV3YXJlLmFudGhyb3BpYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3Byb3ZpZGVycy9hbnRocm9waWMvc21hcnRhaS5taWRkbGV3YXJlLmFudGhyb3BpYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUd0Rjs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGdDQUFnQyxDQUFDLFVBQWdDLEVBQUU7SUFDakYsT0FBTyw4QkFBOEIsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQy9FLENBQUMifQ==
@@ -0,0 +1,5 @@
1
+ import * as plugins from './plugins.js';
2
+ export interface IGoogleModelOptions extends plugins.ISmartAiOptions {
3
+ provider: 'google';
4
+ }
5
+ export declare const createGoogleModelProvider: () => plugins.IModelProvider<IGoogleModelOptions>;
@@ -0,0 +1,6 @@
1
+ import * as plugins from './plugins.js';
2
+ export const createGoogleModelProvider = () => ({
3
+ id: 'google',
4
+ getModel: (options) => plugins.createGoogle({ apiKey: options.apiKey })(options.model),
5
+ });
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19wcm92aWRlcnMvZ29vZ2xlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBSXhDLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLEdBQWdELEVBQUUsQ0FBQyxDQUFDO0lBQzNGLEVBQUUsRUFBRSxRQUFRO0lBQ1osUUFBUSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7Q0FDdkYsQ0FBQyxDQUFDIn0=
@@ -0,0 +1,3 @@
1
+ import { createGoogle } from '@ai-sdk/google';
2
+ export { createGoogle };
3
+ export type { IModelProvider, ISmartAiOptions } from '@modelprofile.com/flexharness-models';
@@ -0,0 +1,3 @@
1
+ import { createGoogle } from '@ai-sdk/google';
2
+ export { createGoogle };
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3Byb3ZpZGVycy9nb29nbGUvcGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDIn0=
@@ -0,0 +1,5 @@
1
+ import * as plugins from './plugins.js';
2
+ export interface IGroqModelOptions extends plugins.ISmartAiOptions {
3
+ provider: 'groq';
4
+ }
5
+ export declare const createGroqModelProvider: () => plugins.IModelProvider<IGroqModelOptions>;
@@ -0,0 +1,6 @@
1
+ import * as plugins from './plugins.js';
2
+ export const createGroqModelProvider = () => ({
3
+ id: 'groq',
4
+ getModel: (options) => plugins.createGroq({ apiKey: options.apiKey })(options.model),
5
+ });
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19wcm92aWRlcnMvZ3JvcS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUl4QyxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxHQUE4QyxFQUFFLENBQUMsQ0FBQztJQUN2RixFQUFFLEVBQUUsTUFBTTtJQUNWLFFBQVEsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0NBQ3JGLENBQUMsQ0FBQyJ9
@@ -0,0 +1,3 @@
1
+ import { createGroq } from '@ai-sdk/groq';
2
+ export { createGroq };
3
+ export type { IModelProvider, ISmartAiOptions } from '@modelprofile.com/flexharness-models';
@@ -0,0 +1,3 @@
1
+ import { createGroq } from '@ai-sdk/groq';
2
+ export { createGroq };
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3Byb3ZpZGVycy9ncm9xL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMifQ==