Skip to content

Commit 801115b

Browse files
authored
Merge pull request #195 from TECH-C-LT/feature/sunshine-model-option
2 parents 8207248 + 2491aa5 commit 801115b

File tree

30 files changed

+727
-78
lines changed

30 files changed

+727
-78
lines changed

apps/api/src/features/guardians/guardian.route.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@ import { UsageLogService } from '~/features/usageLogs/usageLog.service'
1515
import { UsageFacade } from '~/features/usages/usage.facade'
1616
import { UserPlanRepository } from '~/features/userPlans/userPlan.repository'
1717
import { UserPlanService } from '~/features/userPlans/userPlan.service'
18-
import { AnthropicClient } from '~/libs/anthropic'
19-
import { GoogleClient } from '~/libs/google'
20-
import { OpenAIClient } from '~/libs/openai'
18+
import { AnthropicClient, GoogleClient, OpenAIClient } from '~/libs/models'
2119
import { SupabaseClient } from '~/libs/supabase'
2220

2321
/**

apps/api/src/features/guardians/guardian.service.ts

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@ import { GoogleGenerativeAIProvider } from '@ai-sdk/google'
33
import { OpenAIProvider } from '@ai-sdk/openai'
44
import { InternalServerError } from '@peace-net/shared/core/error'
55
import { categoryScoresSchema } from '@peace-net/shared/schemas/guardian'
6-
import type { CategoryScores, Models } from '@peace-net/shared/types/guardian'
6+
import type { CategoryScores } from '@peace-net/shared/types/guardian'
7+
import { Models } from '@peace-net/shared/types/model'
78
import { generateObject } from 'ai'
89
import { z } from 'zod'
910

11+
import { selectAIModel } from '~/libs/models'
12+
1013
const systemPrompt = `
1114
# 役割
1215
あなたは日本語のコンテンツモデレーションの専門家です。
@@ -85,21 +88,12 @@ export class GuardianService implements IGuardianService {
8588
selectedModel: Models,
8689
): Promise<CategoryScores> {
8790
try {
88-
let model
89-
switch (selectedModel) {
90-
case 'gpt-4o-mini':
91-
model = this.openai('gpt-4o-mini')
92-
break
93-
case 'claude-3-haiku':
94-
model = this.anthropic('claude-3-haiku-20240307')
95-
break
96-
case 'gemini-1.5-flash':
97-
model = this.google('models/gemini-1.5-flash')
98-
break
99-
default:
100-
model = this.openai('gpt-4o-mini')
101-
break
102-
}
91+
const model = selectAIModel(
92+
selectedModel,
93+
this.openai,
94+
this.anthropic,
95+
this.google,
96+
)
10397

10498
const { object } = await generateObject({
10599
model,

apps/api/src/features/sunshines/sunshine.route.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { UsageLogService } from '~/features/usageLogs/usageLog.service'
1212
import { UsageFacade } from '~/features/usages/usage.facade'
1313
import { UserPlanRepository } from '~/features/userPlans/userPlan.repository'
1414
import { UserPlanService } from '~/features/userPlans/userPlan.service'
15-
import { OpenAIClient } from '~/libs/openai'
15+
import { AnthropicClient, GoogleClient, OpenAIClient } from '~/libs/models'
1616
import { SupabaseClient } from '~/libs/supabase'
1717

1818
/**
@@ -33,7 +33,11 @@ sunshineRoutes.post(
3333
async (c) => {
3434
return new SunshineController(
3535
new SunshineUseCase(
36-
new SunshineService(OpenAIClient(getEnv(c).OPENAI_API_KEY)),
36+
new SunshineService(
37+
OpenAIClient(getEnv(c).OPENAI_API_KEY),
38+
AnthropicClient(getEnv(c).ANTHROPIC_API_KEY),
39+
GoogleClient(getEnv(c).GOOGLE_API_KEY),
40+
),
3741
new UsageFacade(
3842
new UserPlanService(
3943
new UserPlanRepository(

apps/api/src/features/sunshines/sunshine.service.ts

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
1+
import { AnthropicProvider } from '@ai-sdk/anthropic'
2+
import { GoogleGenerativeAIProvider } from '@ai-sdk/google'
13
import { OpenAIProvider } from '@ai-sdk/openai'
24
import { InternalServerError } from '@peace-net/shared/core/error'
5+
import { Models } from '@peace-net/shared/types/model'
36
import { SunshineResult } from '@peace-net/shared/types/sunshine'
47
import { generateObject } from 'ai'
58
import { z } from 'zod'
69

10+
import { selectAIModel } from '~/libs/models'
11+
712
const systemPrompt = `
813
あなたは、ネガティブな表現をポジティブで建設的な表現に変換する専門家です。以下の指針に従ってテキストを変換してください:
914
@@ -33,16 +38,30 @@ const systemPrompt = `
3338
変換したテキストは、'text'オブジェクトに格納してください。
3439
`
3540
export interface ISunshineService {
36-
sunshineText(text: string): Promise<SunshineResult>
41+
sunshineText(text: string, selectedModel: Models): Promise<SunshineResult>
3742
}
3843

3944
export class SunshineService implements ISunshineService {
40-
constructor(private openai: OpenAIProvider) {}
45+
constructor(
46+
private openai: OpenAIProvider,
47+
private anthropic: AnthropicProvider,
48+
private google: GoogleGenerativeAIProvider,
49+
) {}
4150

42-
async sunshineText(text: string): Promise<SunshineResult> {
51+
async sunshineText(
52+
text: string,
53+
selectedModel: Models,
54+
): Promise<SunshineResult> {
4355
try {
56+
const model = selectAIModel(
57+
selectedModel,
58+
this.openai,
59+
this.anthropic,
60+
this.google,
61+
)
62+
4463
const { object } = await generateObject({
45-
model: this.openai('gpt-4o-mini'),
64+
model,
4665
schema: z.object({ text: z.string() }),
4766
messages: [
4867
{ role: 'system', content: systemPrompt },
@@ -53,7 +72,7 @@ export class SunshineService implements ISunshineService {
5372
return object
5473
} catch (error) {
5574
console.error(error)
56-
throw new InternalServerError('Failed to generate object')
75+
throw new InternalServerError('Failed to generate text')
5776
}
5877
}
5978
}

apps/api/src/features/sunshines/sunshine.usecase.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ export class SunshineUseCase implements ISunshineUseCase {
2121
input: SunshineTextInput,
2222
): Promise<Result<SunshineResult>> {
2323
try {
24-
const { text, userId, apiKeyId } = input
25-
const result = await this.SunshineService.sunshineText(text)
24+
const { text, model, userId, apiKeyId } = input
25+
const result = await this.SunshineService.sunshineText(text, model)
2626

2727
await this.usageFacade.incrementUsage(userId, apiKeyId, 'sunshines')
2828

apps/api/src/libs/anthropic.ts

Lines changed: 0 additions & 13 deletions
This file was deleted.

apps/api/src/libs/google.ts

Lines changed: 0 additions & 13 deletions
This file was deleted.

apps/api/src/libs/models.ts

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import { AnthropicProvider, createAnthropic } from '@ai-sdk/anthropic'
2+
import {
3+
createGoogleGenerativeAI,
4+
GoogleGenerativeAIProvider,
5+
} from '@ai-sdk/google'
6+
import { createOpenAI, OpenAIProvider } from '@ai-sdk/openai'
7+
import { Models } from '@peace-net/shared/types/model'
8+
import { LanguageModel } from 'ai'
9+
10+
/**
11+
* OpenAI APIのクライアントを生成します
12+
*
13+
* @param apiKey - OpenAI APIのAPIキー
14+
* @returns OpenAI APIのクライアント
15+
*/
16+
export const OpenAIClient = (apiKey: string) => {
17+
return createOpenAI({
18+
apiKey,
19+
})
20+
}
21+
22+
/**
23+
* Google Generative AI APIのクライアントを生成します
24+
*
25+
* @param apiKey - Google Generative AI APIのAPIキー
26+
* @returns Google Generative AIのクライアント
27+
*/
28+
export const GoogleClient = (apiKey: string) => {
29+
return createGoogleGenerativeAI({
30+
apiKey,
31+
})
32+
}
33+
34+
/**
35+
* Anthropic APIのクライアントを生成します
36+
*
37+
* @param apiKey - Anthropic APIのAPIキー
38+
* @returns Anthropic APIのクライアント
39+
*/
40+
export const AnthropicClient = (apiKey: string) => {
41+
return createAnthropic({
42+
apiKey,
43+
})
44+
}
45+
46+
export const selectAIModel: (
47+
selectedModel: Models,
48+
openai: OpenAIProvider,
49+
anthropic: AnthropicProvider,
50+
google: GoogleGenerativeAIProvider,
51+
) => LanguageModel = (selectedModel, openai, anthropic, google) => {
52+
switch (selectedModel) {
53+
case 'gpt-4o-mini':
54+
return openai('gpt-4o-mini')
55+
case 'claude-3-haiku':
56+
return anthropic('claude-3-haiku-20240307')
57+
case 'gemini-1.5-flash':
58+
return google('models/gemini-1.5-flash')
59+
default:
60+
return openai('gpt-4o-mini')
61+
}
62+
}

apps/api/src/libs/openai.ts

Lines changed: 0 additions & 13 deletions
This file was deleted.

apps/docs/docs/features/guardian.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ default値は`0.5`です。
2727

2828
**`model`** string optional <br/>
2929
指定可能なモデル
30-
- gpt-4o-mini
30+
- gpt-4o-mini (default)
3131
- claude-3-haiku
3232
- gemini-1.5-flash
3333

0 commit comments

Comments
 (0)