tests updated with new import

This commit is contained in:
geoffsee
2025-06-25 13:56:39 -04:00
committed by Geoff Seemueller
parent 554096abb2
commit 068d8614e0
10 changed files with 146 additions and 103 deletions

View File

@@ -108,6 +108,8 @@
"itty-router": "^5.0.18", "itty-router": "^5.0.18",
"mobx": "^6.13.5", "mobx": "^6.13.5",
"mobx-state-tree": "^6.0.1", "mobx-state-tree": "^6.0.1",
"vite": "^6.3.5",
"vitest": "^3.1.4",
}, },
}, },
"packages/schema": { "packages/schema": {

View File

@@ -2,6 +2,36 @@
"name": "@open-gsio/ai", "name": "@open-gsio/ai",
"type": "module", "type": "module",
"module": "src/index.ts", "module": "src/index.ts",
"exports": {
".": {
"import": "./src/index.ts",
"types": "./src/index.ts"
},
"./chat-sdk/chat-sdk.ts": {
"import": "./src/chat-sdk/chat-sdk.ts",
"types": "./src/chat-sdk/chat-sdk.ts"
},
"./providers/_ProviderRepository.ts": {
"import": "./src/providers/_ProviderRepository.ts",
"types": "./src/providers/_ProviderRepository.ts"
},
"./providers/google.ts": {
"import": "./src/providers/google.ts",
"types": "./src/providers/google.ts"
},
"./providers/openai.ts": {
"import": "./src/providers/openai.ts",
"types": "./src/providers/openai.ts"
},
"./src": {
"import": "./src/index.ts",
"types": "./src/index.ts"
},
"./utils": {
"import": "./src/utils/index.ts",
"types": "./src/utils/index.ts"
}
},
"scripts": { "scripts": {
"tests": "vitest run", "tests": "vitest run",
"tests:coverage": "vitest run --coverage.enabled=true" "tests:coverage": "vitest run --coverage.enabled=true"

View File

@@ -4,7 +4,7 @@ import { AssistantSdk } from '../assistant-sdk';
import { Utils } from '../utils/utils.ts'; import { Utils } from '../utils/utils.ts';
// Mock dependencies // Mock dependencies
vi.mock('../utils', () => ({ vi.mock('../utils/utils.ts', () => ({
Utils: { Utils: {
selectEquitably: vi.fn(), selectEquitably: vi.fn(),
getCurrentDate: vi.fn(), getCurrentDate: vi.fn(),
@@ -26,8 +26,7 @@ describe('AssistantSdk', () => {
vi.setSystemTime(new Date('2023-01-01T12:30:45Z')); vi.setSystemTime(new Date('2023-01-01T12:30:45Z'));
// Reset mocks // Reset mocks
vi.mocked(Utils.selectEquitably).mockReset(); vi.resetAllMocks();
vi.mocked(Utils.getCurrentDate).mockReset();
}); });
afterEach(() => { afterEach(() => {
@@ -37,11 +36,11 @@ describe('AssistantSdk', () => {
describe('getAssistantPrompt', () => { describe('getAssistantPrompt', () => {
it('should return a prompt with default values when minimal params are provided', () => { it('should return a prompt with default values when minimal params are provided', () => {
// Mock dependencies // Mock dependencies
vi.mocked(Utils.selectEquitably).mockReturnValue({ Utils.selectEquitably.mockReturnValue({
question1: 'answer1', question1: 'answer1',
question2: 'answer2', question2: 'answer2',
}); });
vi.mocked(Utils.getCurrentDate).mockReturnValue('2023-01-01T12:30:45Z'); Utils.getCurrentDate.mockReturnValue('2023-01-01T12:30:45Z');
const prompt = AssistantSdk.getAssistantPrompt({}); const prompt = AssistantSdk.getAssistantPrompt({});
@@ -54,11 +53,11 @@ describe('AssistantSdk', () => {
it('should include maxTokens when provided', () => { it('should include maxTokens when provided', () => {
// Mock dependencies // Mock dependencies
vi.mocked(Utils.selectEquitably).mockReturnValue({ Utils.selectEquitably.mockReturnValue({
question1: 'answer1', question1: 'answer1',
question2: 'answer2', question2: 'answer2',
}); });
vi.mocked(Utils.getCurrentDate).mockReturnValue('2023-01-01T12:30:45Z'); Utils.getCurrentDate.mockReturnValue('2023-01-01T12:30:45Z');
const prompt = AssistantSdk.getAssistantPrompt({ maxTokens: 1000 }); const prompt = AssistantSdk.getAssistantPrompt({ maxTokens: 1000 });
@@ -67,11 +66,11 @@ describe('AssistantSdk', () => {
it('should use provided userTimezone and userLocation', () => { it('should use provided userTimezone and userLocation', () => {
// Mock dependencies // Mock dependencies
vi.mocked(Utils.selectEquitably).mockReturnValue({ Utils.selectEquitably.mockReturnValue({
question1: 'answer1', question1: 'answer1',
question2: 'answer2', question2: 'answer2',
}); });
vi.mocked(Utils.getCurrentDate).mockReturnValue('2023-01-01T12:30:45Z'); Utils.getCurrentDate.mockReturnValue('2023-01-01T12:30:45Z');
const prompt = AssistantSdk.getAssistantPrompt({ const prompt = AssistantSdk.getAssistantPrompt({
userTimezone: 'America/New_York', userTimezone: 'America/New_York',
@@ -84,12 +83,12 @@ describe('AssistantSdk', () => {
it('should use current date when Utils.getCurrentDate is not available', () => { it('should use current date when Utils.getCurrentDate is not available', () => {
// Mock dependencies // Mock dependencies
vi.mocked(Utils.selectEquitably).mockReturnValue({ Utils.selectEquitably.mockReturnValue({
question1: 'answer1', question1: 'answer1',
question2: 'answer2', question2: 'answer2',
}); });
// @ts-expect-error - is supposed to break // @ts-expect-error - is supposed to break
vi.mocked(Utils.getCurrentDate).mockReturnValue(undefined); Utils.getCurrentDate.mockReturnValue(undefined);
const prompt = AssistantSdk.getAssistantPrompt({}); const prompt = AssistantSdk.getAssistantPrompt({});
@@ -99,8 +98,8 @@ describe('AssistantSdk', () => {
it('should use few_shots directly when Utils.selectEquitably is not available', () => { it('should use few_shots directly when Utils.selectEquitably is not available', () => {
// @ts-expect-error - is supposed to break // @ts-expect-error - is supposed to break
vi.mocked(Utils.selectEquitably).mockReturnValue(undefined); Utils.selectEquitably.mockReturnValue(undefined);
vi.mocked(Utils.getCurrentDate).mockReturnValue('2023-01-01T12:30:45Z'); Utils.getCurrentDate.mockReturnValue('2023-01-01T12:30:45Z');
const prompt = AssistantSdk.getAssistantPrompt({}); const prompt = AssistantSdk.getAssistantPrompt({});

View File

@@ -1,8 +1,9 @@
import { Message } from '@open-gsio/schema'; import { Schema } from '@open-gsio/schema';
import { describe, it, expect, vi, beforeEach } from 'vitest'; import { describe, it, expect, vi, beforeEach } from 'vitest';
import { AssistantSdk } from '../assistant-sdk'; import { AssistantSdk } from '../assistant-sdk';
import { ChatSdk } from '../chat-sdk'; import { ChatSdk } from '../chat-sdk';
import { ProviderRepository } from '../providers/_ProviderRepository.ts';
// Mock dependencies // Mock dependencies
vi.mock('../assistant-sdk', () => ({ vi.mock('../assistant-sdk', () => ({
@@ -11,15 +12,17 @@ vi.mock('../assistant-sdk', () => ({
}, },
})); }));
vi.mock('../../models/Message', () => ({ vi.mock('@open-gsio/schema', () => ({
default: { Schema: {
create: vi.fn(message => message), Message: {
create: vi.fn(message => message),
},
}, },
})); }));
vi.mock('../../providers/_ProviderRepository', () => ({ vi.mock('../providers/_ProviderRepository', () => ({
ProviderRepository: { ProviderRepository: {
getModelFamily: vi.fn(), getModelFamily: vi.fn().mockResolvedValue('openai'),
}, },
})); }));
@@ -35,7 +38,7 @@ describe('ChatSdk', () => {
const result = await ChatSdk.preprocess({ messages }); const result = await ChatSdk.preprocess({ messages });
expect(Message.create).toHaveBeenCalledWith({ expect(Schema.Message.create).toHaveBeenCalledWith({
role: 'assistant', role: 'assistant',
content: '', content: '',
}); });
@@ -155,80 +158,80 @@ describe('ChatSdk', () => {
describe('buildMessageChain', () => { describe('buildMessageChain', () => {
// TODO: Fix this test // TODO: Fix this test
// it('should build a message chain with system role for most models', async () => { it('should build a message chain with system role for most models', async () => {
// vi.mocked(ProviderRepository.getModelFamily).mockResolvedValue('openai'); ProviderRepository.getModelFamily.mockResolvedValue('openai');
//
// const messages = [{ role: 'user', content: 'Hello' }]; const messages = [{ role: 'user', content: 'Hello' }];
//
// const opts = { const opts = {
// systemPrompt: 'System prompt', systemPrompt: 'System prompt',
// assistantPrompt: 'Assistant prompt', assistantPrompt: 'Assistant prompt',
// toolResults: { role: 'tool', content: 'Tool result' }, toolResults: { role: 'tool', content: 'Tool result' },
// model: 'gpt-4', model: 'gpt-4',
// }; env: {},
// };
// const result = await ChatSdk.buildMessageChain(messages, opts as any);
// const result = await ChatSdk.buildMessageChain(messages, opts as any);
// expect(ProviderRepository.getModelFamily).toHaveBeenCalledWith('gpt-4', undefined);
// expect(Message.create).toHaveBeenCalledTimes(3); expect(ProviderRepository.getModelFamily).toHaveBeenCalledWith('gpt-4', {});
// expect(Message.create).toHaveBeenNthCalledWith(1, { expect(Schema.Message.create).toHaveBeenCalledTimes(3);
// role: 'system', expect(Schema.Message.create).toHaveBeenNthCalledWith(1, {
// content: 'System prompt', role: 'system',
// }); content: 'System prompt',
// expect(Message.create).toHaveBeenNthCalledWith(2, { });
// role: 'assistant', expect(Schema.Message.create).toHaveBeenNthCalledWith(2, {
// content: 'Assistant prompt', role: 'assistant',
// }); content: 'Assistant prompt',
// expect(Message.create).toHaveBeenNthCalledWith(3, { });
// role: 'user', expect(Schema.Message.create).toHaveBeenNthCalledWith(3, {
// content: 'Hello', role: 'user',
// }); content: 'Hello',
// }); });
// TODO: Fix this test });
// it('should build a message chain with assistant role for o1, gemma, claude, or google models', async () => { it('should build a message chain with assistant role for o1, gemma, claude, or google models', async () => {
// vi.mocked(ProviderRepository.getModelFamily).mockResolvedValue('claude'); ProviderRepository.getModelFamily.mockResolvedValue('claude');
//
// const messages = [{ role: 'user', content: 'Hello' }]; const messages = [{ role: 'user', content: 'Hello' }];
//
// const opts = { const opts = {
// systemPrompt: 'System prompt', systemPrompt: 'System prompt',
// assistantPrompt: 'Assistant prompt', assistantPrompt: 'Assistant prompt',
// toolResults: { role: 'tool', content: 'Tool result' }, toolResults: { role: 'tool', content: 'Tool result' },
// model: 'claude-3', model: 'claude-3',
// }; env: {},
// };
// const result = await ChatSdk.buildMessageChain(messages, opts as any);
// const result = await ChatSdk.buildMessageChain(messages, opts as any);
// expect(ProviderRepository.getModelFamily).toHaveBeenCalledWith('claude-3', undefined);
// expect(Message.create).toHaveBeenCalledTimes(3); expect(ProviderRepository.getModelFamily).toHaveBeenCalledWith('claude-3', {});
// expect(Message.create).toHaveBeenNthCalledWith(1, { expect(Schema.Message.create).toHaveBeenCalledTimes(3);
// role: 'assistant', expect(Schema.Message.create).toHaveBeenNthCalledWith(1, {
// content: 'System prompt', role: 'assistant',
// }); content: 'System prompt',
// }); });
// TODO: Fix this test });
// it('should filter out messages with empty content', async () => { it('should filter out messages with empty content', async () => {
// // ProviderRepository.getModelFamily.mockResolvedValue('openai');
// vi.mocked(ProviderRepository.getModelFamily).mockResolvedValue('openai');
// const messages = [
// const messages = [ { role: 'user', content: 'Hello' },
// { role: 'user', content: 'Hello' }, { role: 'user', content: '' },
// { role: 'user', content: '' }, { role: 'user', content: ' ' },
// { role: 'user', content: ' ' }, { role: 'user', content: 'World' },
// { role: 'user', content: 'World' }, ];
// ];
// const opts = {
// const opts = { systemPrompt: 'System prompt',
// systemPrompt: 'System prompt', assistantPrompt: 'Assistant prompt',
// assistantPrompt: 'Assistant prompt', toolResults: { role: 'tool', content: 'Tool result' },
// toolResults: { role: 'tool', content: 'Tool result' }, model: 'gpt-4',
// model: 'gpt-4', env: {},
// }; };
//
// const result = await ChatSdk.buildMessageChain(messages, opts as any); const result = await ChatSdk.buildMessageChain(messages, opts as any);
//
// // 2 system/assistant messages + 2 user messages (Hello and World) // 2 system/assistant messages + 2 user messages (Hello and World)
// expect(Message.create).toHaveBeenCalledTimes(4); expect(Schema.Message.create).toHaveBeenCalledTimes(4);
// }); });
}); });
}); });

View File

@@ -1,4 +1,4 @@
import { Message } from '@open-gsio/schema'; import { Schema } from '@open-gsio/schema';
import type { Instance } from 'mobx-state-tree'; import type { Instance } from 'mobx-state-tree';
import { OpenAI } from 'openai'; import { OpenAI } from 'openai';
@@ -14,7 +14,7 @@ import type {
export class ChatSdk { export class ChatSdk {
static async preprocess(params: PreprocessParams) { static async preprocess(params: PreprocessParams) {
// a slot for to provide additional context // a slot for to provide additional context
return Message.create({ return Schema.Message.create({
role: 'assistant', role: 'assistant',
content: '', content: '',
}); });
@@ -105,7 +105,7 @@ export class ChatSdk {
const messagesToSend = []; const messagesToSend = [];
messagesToSend.push( messagesToSend.push(
Message.create({ Schema.Message.create({
role: role:
opts.model.includes('o1') || opts.model.includes('o1') ||
opts.model.includes('gemma') || opts.model.includes('gemma') ||
@@ -118,7 +118,7 @@ export class ChatSdk {
); );
messagesToSend.push( messagesToSend.push(
Message.create({ Schema.Message.create({
role: 'assistant', role: 'assistant',
content: opts.assistantPrompt.trim(), content: opts.assistantPrompt.trim(),
}), }),
@@ -127,7 +127,7 @@ export class ChatSdk {
messagesToSend.push( messagesToSend.push(
...messages ...messages
.filter((message: any) => message.content?.trim()) .filter((message: any) => message.content?.trim())
.map((message: any) => Message.create(message)), .map((message: any) => Schema.Message.create(message)),
); );
return messagesToSend; return messagesToSend;

View File

@@ -1 +1,2 @@
export * from './providers'; export * from './providers';
export * from './chat-sdk';

View File

@@ -10,6 +10,8 @@
"@open-gsio/services": "workspace:*", "@open-gsio/services": "workspace:*",
"itty-router": "^5.0.18", "itty-router": "^5.0.18",
"mobx": "^6.13.5", "mobx": "^6.13.5",
"mobx-state-tree": "^6.0.1" "mobx-state-tree": "^6.0.1",
"vitest": "^3.1.4",
"vite": "^6.3.5"
} }
} }

View File

@@ -2,6 +2,13 @@
"name": "@open-gsio/services", "name": "@open-gsio/services",
"type": "module", "type": "module",
"module": "src/index.ts", "module": "src/index.ts",
"version": "1.0.0",
"exports": {
".": {
"import": "./src/index.ts",
"types": "./src/index.ts"
}
},
"scripts": { "scripts": {
"tests": "vitest run", "tests": "vitest run",
"tests:coverage": "vitest run --coverage.enabled=true" "tests:coverage": "vitest run --coverage.enabled=true"

View File

@@ -1,6 +1,5 @@
import { getSnapshot } from 'mobx-state-tree'; import { getSnapshot } from 'mobx-state-tree';
import OpenAI from 'openai'; import OpenAI from 'openai';
import { ChatSdk } from 'packages/ai/src/chat-sdk';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import ChatService, { ClientError } from '../chat-service/ChatService.ts'; import ChatService, { ClientError } from '../chat-service/ChatService.ts';

View File

@@ -13,10 +13,10 @@ import {
OllamaChatSdk, OllamaChatSdk,
XaiChatSdk, XaiChatSdk,
} from '@open-gsio/ai/src'; } from '@open-gsio/ai/src';
import { Common } from '@open-gsio/ai/utils';
import { Schema } from '@open-gsio/schema'; import { Schema } from '@open-gsio/schema';
import { flow, getSnapshot, types } from 'mobx-state-tree'; import { flow, getSnapshot, types } from 'mobx-state-tree';
import OpenAI from 'openai'; import OpenAI from 'openai';
import { Common } from 'packages/ai/src/utils';
export interface StreamParams { export interface StreamParams {
env: Env; env: Env;