From 3f57fce48a6a5175b6783ebedbca4f6a8b660545 Mon Sep 17 00:00:00 2001 From: RYU Date: Sun, 18 Aug 2024 05:35:49 +0900 Subject: [PATCH 1/5] refactor: summarize the model definition --- .../src/features/guardians/guardian.route.ts | 4 +- .../src/features/sunshines/sunshine.route.ts | 2 +- apps/api/src/libs/anthropic.ts | 13 ------- apps/api/src/libs/google.ts | 13 ------- apps/api/src/libs/models.ts | 39 +++++++++++++++++++ apps/api/src/libs/openai.ts | 13 ------- 6 files changed, 41 insertions(+), 43 deletions(-) delete mode 100644 apps/api/src/libs/anthropic.ts delete mode 100644 apps/api/src/libs/google.ts create mode 100644 apps/api/src/libs/models.ts delete mode 100644 apps/api/src/libs/openai.ts diff --git a/apps/api/src/features/guardians/guardian.route.ts b/apps/api/src/features/guardians/guardian.route.ts index 61a64e5..9b42373 100644 --- a/apps/api/src/features/guardians/guardian.route.ts +++ b/apps/api/src/features/guardians/guardian.route.ts @@ -15,9 +15,7 @@ import { UsageLogService } from '~/features/usageLogs/usageLog.service' import { UsageFacade } from '~/features/usages/usage.facade' import { UserPlanRepository } from '~/features/userPlans/userPlan.repository' import { UserPlanService } from '~/features/userPlans/userPlan.service' -import { AnthropicClient } from '~/libs/anthropic' -import { GoogleClient } from '~/libs/google' -import { OpenAIClient } from '~/libs/openai' +import { AnthropicClient, GoogleClient, OpenAIClient } from '~/libs/models' import { SupabaseClient } from '~/libs/supabase' /** diff --git a/apps/api/src/features/sunshines/sunshine.route.ts b/apps/api/src/features/sunshines/sunshine.route.ts index 9304961..cf3bb40 100644 --- a/apps/api/src/features/sunshines/sunshine.route.ts +++ b/apps/api/src/features/sunshines/sunshine.route.ts @@ -12,7 +12,7 @@ import { UsageLogService } from '~/features/usageLogs/usageLog.service' import { UsageFacade } from '~/features/usages/usage.facade' import { UserPlanRepository } from '~/features/userPlans/userPlan.repository' import { UserPlanService } from '~/features/userPlans/userPlan.service' -import { OpenAIClient } from '~/libs/openai' +import { OpenAIClient } from '~/libs/models' import { SupabaseClient } from '~/libs/supabase' /** diff --git a/apps/api/src/libs/anthropic.ts b/apps/api/src/libs/anthropic.ts deleted file mode 100644 index b182073..0000000 --- a/apps/api/src/libs/anthropic.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { createAnthropic } from '@ai-sdk/anthropic' - -/** - * Anthropic APIのクライアントを生成します - * - * @param apiKey - Anthropic APIのAPIキー - * @returns Anthropic APIのクライアント - */ -export const AnthropicClient = (apiKey: string) => { - return createAnthropic({ - apiKey, - }) -} diff --git a/apps/api/src/libs/google.ts b/apps/api/src/libs/google.ts deleted file mode 100644 index 006726e..0000000 --- a/apps/api/src/libs/google.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { createGoogleGenerativeAI } from '@ai-sdk/google' - -/** - * Google Generative AI APIのクライアントを生成します - * - * @param apiKey - Google Generative AI APIのAPIキー - * @returns Google Generative AIのクライアント - */ -export const GoogleClient = (apiKey: string) => { - return createGoogleGenerativeAI({ - apiKey, - }) -} diff --git a/apps/api/src/libs/models.ts b/apps/api/src/libs/models.ts new file mode 100644 index 0000000..54212b6 --- /dev/null +++ b/apps/api/src/libs/models.ts @@ -0,0 +1,39 @@ +import { createAnthropic } from '@ai-sdk/anthropic' +import { createGoogleGenerativeAI } from '@ai-sdk/google' +import { createOpenAI } from '@ai-sdk/openai' + +/** + * OpenAI APIのクライアントを生成します + * + * @param apiKey - OpenAI APIのAPIキー + * @returns OpenAI APIのクライアント + */ +export const OpenAIClient = (apiKey: string) => { + return createOpenAI({ + apiKey, + }) +} + +/** + * Google Generative AI APIのクライアントを生成します + * + * @param apiKey - Google Generative AI APIのAPIキー + * @returns Google Generative AIのクライアント + */ +export const GoogleClient = (apiKey: string) => { + return createGoogleGenerativeAI({ + apiKey, + }) +} + +/** + * Anthropic APIのクライアントを生成します + * + * @param apiKey - Anthropic APIのAPIキー + * @returns Anthropic APIのクライアント + */ +export const AnthropicClient = (apiKey: string) => { + return createAnthropic({ + apiKey, + }) +} diff --git a/apps/api/src/libs/openai.ts b/apps/api/src/libs/openai.ts deleted file mode 100644 index 9a999fc..0000000 --- a/apps/api/src/libs/openai.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { createOpenAI } from '@ai-sdk/openai' - -/** - * OpenAI APIのクライアントを生成します - * - * @param apiKey - OpenAI APIのAPIキー - * @returns OpenAI APIのクライアント - */ -export const OpenAIClient = (apiKey: string) => { - return createOpenAI({ - apiKey, - }) -} From 89b4ae73df1f5d99a051951883468596b2041c28 Mon Sep 17 00:00:00 2001 From: RYU Date: Sun, 18 Aug 2024 05:39:42 +0900 Subject: [PATCH 2/5] refactor: split model type definitions --- packages/shared/src/schemas/model.ts | 7 +++++++ packages/shared/src/types/guardian.ts | 3 --- packages/shared/src/types/model.ts | 4 ++++ 3 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 packages/shared/src/schemas/model.ts create mode 100644 packages/shared/src/types/model.ts diff --git a/packages/shared/src/schemas/model.ts b/packages/shared/src/schemas/model.ts new file mode 100644 index 0000000..87288b6 --- /dev/null +++ b/packages/shared/src/schemas/model.ts @@ -0,0 +1,7 @@ +import { z } from 'zod' + +export const modelsSchema = z.union([ + z.literal('gpt-4o-mini'), + z.literal('claude-3-haiku'), + z.literal('gemini-1.5-flash'), +]) diff --git a/packages/shared/src/types/guardian.ts b/packages/shared/src/types/guardian.ts index f0f7e49..94b027b 100644 --- a/packages/shared/src/types/guardian.ts +++ b/packages/shared/src/types/guardian.ts @@ -4,15 +4,12 @@ import { guardianTextRequestSchema, guardianImageRequestSchema, guardianResultSchema, - modelsSchema, } from '../schemas/guardian' export type Category = keyof z.infer export type CategoryScores = z.infer -export type Models = z.infer - export type GuardianTextDTO = z.infer export type GuardianTextInput = GuardianTextDTO & { diff --git a/packages/shared/src/types/model.ts b/packages/shared/src/types/model.ts new file mode 100644 index 0000000..909f30f --- /dev/null +++ b/packages/shared/src/types/model.ts @@ -0,0 +1,4 @@ +import { z } from 'zod' +import { modelsSchema } from '../schemas/model' + +export type Models = z.infer From 802a010802d168c43ce74451e0a2f6ebb9ca6bd0 Mon Sep 17 00:00:00 2001 From: RYU Date: Sun, 18 Aug 2024 05:48:43 +0900 Subject: [PATCH 3/5] refactor: split select model function --- .../features/guardians/guardian.service.ts | 26 +++++++---------- apps/api/src/libs/models.ts | 29 +++++++++++++++++-- packages/shared/src/schemas/guardian.ts | 7 +---- 3 files changed, 37 insertions(+), 25 deletions(-) diff --git a/apps/api/src/features/guardians/guardian.service.ts b/apps/api/src/features/guardians/guardian.service.ts index 492ecd9..54b710a 100644 --- a/apps/api/src/features/guardians/guardian.service.ts +++ b/apps/api/src/features/guardians/guardian.service.ts @@ -3,10 +3,13 @@ import { GoogleGenerativeAIProvider } from '@ai-sdk/google' import { OpenAIProvider } from '@ai-sdk/openai' import { InternalServerError } from '@peace-net/shared/core/error' import { categoryScoresSchema } from '@peace-net/shared/schemas/guardian' -import type { CategoryScores, Models } from '@peace-net/shared/types/guardian' +import type { CategoryScores } from '@peace-net/shared/types/guardian' +import { Models } from '@peace-net/shared/types/model' import { generateObject } from 'ai' import { z } from 'zod' +import { selectAIModel } from '~/libs/models' + const systemPrompt = ` # 役割 あなたは日本語のコンテンツモデレーションの専門家です。 @@ -85,21 +88,12 @@ export class GuardianService implements IGuardianService { selectedModel: Models, ): Promise { try { - let model - switch (selectedModel) { - case 'gpt-4o-mini': - model = this.openai('gpt-4o-mini') - break - case 'claude-3-haiku': - model = this.anthropic('claude-3-haiku-20240307') - break - case 'gemini-1.5-flash': - model = this.google('models/gemini-1.5-flash') - break - default: - model = this.openai('gpt-4o-mini') - break - } + const model = selectAIModel( + selectedModel, + this.openai, + this.anthropic, + this.google, + ) const { object } = await generateObject({ model, diff --git a/apps/api/src/libs/models.ts b/apps/api/src/libs/models.ts index 54212b6..533a8bf 100644 --- a/apps/api/src/libs/models.ts +++ b/apps/api/src/libs/models.ts @@ -1,6 +1,11 @@ -import { createAnthropic } from '@ai-sdk/anthropic' -import { createGoogleGenerativeAI } from '@ai-sdk/google' -import { createOpenAI } from '@ai-sdk/openai' +import { AnthropicProvider, createAnthropic } from '@ai-sdk/anthropic' +import { + createGoogleGenerativeAI, + GoogleGenerativeAIProvider, +} from '@ai-sdk/google' +import { createOpenAI, OpenAIProvider } from '@ai-sdk/openai' +import { Models } from '@peace-net/shared/types/model' +import { LanguageModel } from 'ai' /** * OpenAI APIのクライアントを生成します @@ -37,3 +42,21 @@ export const AnthropicClient = (apiKey: string) => { apiKey, }) } + +export const selectAIModel: ( + selectedModel: Models, + openai: OpenAIProvider, + anthropic: AnthropicProvider, + google: GoogleGenerativeAIProvider, +) => LanguageModel = (selectedModel, openai, anthropic, google) => { + switch (selectedModel) { + case 'gpt-4o-mini': + return openai('gpt-4o-mini') + case 'claude-3-haiku': + return anthropic('claude-3-haiku-20240307') + case 'gemini-1.5-flash': + return google('models/gemini-1.5-flash') + default: + return openai('gpt-4o-mini') + } +} diff --git a/packages/shared/src/schemas/guardian.ts b/packages/shared/src/schemas/guardian.ts index 47ab008..44cf7a5 100644 --- a/packages/shared/src/schemas/guardian.ts +++ b/packages/shared/src/schemas/guardian.ts @@ -1,4 +1,5 @@ import { z } from 'zod' +import { modelsSchema } from './model' export const categoryScoresSchema = z.object({ sexual: z.number(), @@ -8,12 +9,6 @@ export const categoryScoresSchema = z.object({ defamation: z.number(), }) -export const modelsSchema = z.union([ - z.literal('gpt-4o-mini'), - z.literal('claude-3-haiku'), - z.literal('gemini-1.5-flash'), -]) - export const guardianTextRequestSchema = z.object({ text: z.string().max(500), score_threshold: z.number().max(1).min(0.1).optional().default(0.5), From e9fd5e63c02b3ce711db7cf7f8ddb2cee0a3c5b4 Mon Sep 17 00:00:00 2001 From: RYU Date: Sun, 18 Aug 2024 05:55:13 +0900 Subject: [PATCH 4/5] feat(api): add sunshine model option --- .../src/features/sunshines/sunshine.route.ts | 8 +++-- .../features/sunshines/sunshine.service.ts | 29 +++++++++++++++---- .../features/sunshines/sunshine.usecase.ts | 4 +-- packages/shared/src/schemas/sunshine.ts | 2 ++ 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/apps/api/src/features/sunshines/sunshine.route.ts b/apps/api/src/features/sunshines/sunshine.route.ts index cf3bb40..5b9be2a 100644 --- a/apps/api/src/features/sunshines/sunshine.route.ts +++ b/apps/api/src/features/sunshines/sunshine.route.ts @@ -12,7 +12,7 @@ import { UsageLogService } from '~/features/usageLogs/usageLog.service' import { UsageFacade } from '~/features/usages/usage.facade' import { UserPlanRepository } from '~/features/userPlans/userPlan.repository' import { UserPlanService } from '~/features/userPlans/userPlan.service' -import { OpenAIClient } from '~/libs/models' +import { AnthropicClient, GoogleClient, OpenAIClient } from '~/libs/models' import { SupabaseClient } from '~/libs/supabase' /** @@ -33,7 +33,11 @@ sunshineRoutes.post( async (c) => { return new SunshineController( new SunshineUseCase( - new SunshineService(OpenAIClient(getEnv(c).OPENAI_API_KEY)), + new SunshineService( + OpenAIClient(getEnv(c).OPENAI_API_KEY), + AnthropicClient(getEnv(c).ANTHROPIC_API_KEY), + GoogleClient(getEnv(c).GOOGLE_API_KEY), + ), new UsageFacade( new UserPlanService( new UserPlanRepository( diff --git a/apps/api/src/features/sunshines/sunshine.service.ts b/apps/api/src/features/sunshines/sunshine.service.ts index 968d25d..a34e649 100644 --- a/apps/api/src/features/sunshines/sunshine.service.ts +++ b/apps/api/src/features/sunshines/sunshine.service.ts @@ -1,9 +1,14 @@ +import { AnthropicProvider } from '@ai-sdk/anthropic' +import { GoogleGenerativeAIProvider } from '@ai-sdk/google' import { OpenAIProvider } from '@ai-sdk/openai' import { InternalServerError } from '@peace-net/shared/core/error' +import { Models } from '@peace-net/shared/types/model' import { SunshineResult } from '@peace-net/shared/types/sunshine' import { generateObject } from 'ai' import { z } from 'zod' +import { selectAIModel } from '~/libs/models' + const systemPrompt = ` あなたは、ネガティブな表現をポジティブで建設的な表現に変換する専門家です。以下の指針に従ってテキストを変換してください: @@ -33,16 +38,30 @@ const systemPrompt = ` 変換したテキストは、'text'オブジェクトに格納してください。 ` export interface ISunshineService { - sunshineText(text: string): Promise + sunshineText(text: string, selectedModel: Models): Promise } export class SunshineService implements ISunshineService { - constructor(private openai: OpenAIProvider) {} + constructor( + private openai: OpenAIProvider, + private anthropic: AnthropicProvider, + private google: GoogleGenerativeAIProvider, + ) {} - async sunshineText(text: string): Promise { + async sunshineText( + text: string, + selectedModel: Models, + ): Promise { try { + const model = selectAIModel( + selectedModel, + this.openai, + this.anthropic, + this.google, + ) + const { object } = await generateObject({ - model: this.openai('gpt-4o-mini'), + model, schema: z.object({ text: z.string() }), messages: [ { role: 'system', content: systemPrompt }, @@ -53,7 +72,7 @@ export class SunshineService implements ISunshineService { return object } catch (error) { console.error(error) - throw new InternalServerError('Failed to generate object') + throw new InternalServerError('Failed to generate text') } } } diff --git a/apps/api/src/features/sunshines/sunshine.usecase.ts b/apps/api/src/features/sunshines/sunshine.usecase.ts index 8a441da..5a37af9 100644 --- a/apps/api/src/features/sunshines/sunshine.usecase.ts +++ b/apps/api/src/features/sunshines/sunshine.usecase.ts @@ -21,8 +21,8 @@ export class SunshineUseCase implements ISunshineUseCase { input: SunshineTextInput, ): Promise> { try { - const { text, userId, apiKeyId } = input - const result = await this.SunshineService.sunshineText(text) + const { text, model, userId, apiKeyId } = input + const result = await this.SunshineService.sunshineText(text, model) await this.usageFacade.incrementUsage(userId, apiKeyId, 'sunshines') diff --git a/packages/shared/src/schemas/sunshine.ts b/packages/shared/src/schemas/sunshine.ts index ce0c7f5..78d890d 100644 --- a/packages/shared/src/schemas/sunshine.ts +++ b/packages/shared/src/schemas/sunshine.ts @@ -1,7 +1,9 @@ import { z } from 'zod' +import { modelsSchema } from './model' export const sunshineTextRequestSchema = z.object({ text: z.string().max(500), + model: modelsSchema.optional().default('gpt-4o-mini'), }) export const sunshineResultSchema = z.object({ From 2491aa57d60543956389fa6be261f252fffd15b9 Mon Sep 17 00:00:00 2001 From: naruse666 <0x706f6b6f@gmail.com> Date: Wed, 21 Aug 2024 00:43:44 +0900 Subject: [PATCH 5/5] docs: version 1.5.0 --- apps/docs/docs/features/guardian.mdx | 2 +- apps/docs/docs/features/sunshine.mdx | 6 ++ apps/docs/docusaurus.config.ts | 2 +- .../version-1.4.1/code-reference/golang.md | 66 +++++++++++++ .../version-1.4.1/code-reference/index.md | 5 + .../version-1.4.1/code-reference/node-js.md | 29 ++++++ .../code-reference/sdk/golang.md | 41 ++++++++ .../version-1.4.1/errors/index.mdx | 42 ++++++++ .../version-1.4.1/features/guardian.mdx | 95 ++++++++++++++++++ .../version-1.4.1/features/sunshine.mdx | 71 +++++++++++++ .../version-1.4.1/how-to-use/basic.mdx | 99 +++++++++++++++++++ .../versioned_docs/version-1.4.1/overview.mdx | 60 +++++++++++ .../versioned_docs/version-1.4.1/plan/plan.md | 15 +++ .../version-1.4.1/quick-start.mdx | 15 +++ .../version-1.4.1-sidebars.json | 61 ++++++++++++ apps/docs/versions.json | 1 + 16 files changed, 608 insertions(+), 2 deletions(-) create mode 100644 apps/docs/versioned_docs/version-1.4.1/code-reference/golang.md create mode 100644 apps/docs/versioned_docs/version-1.4.1/code-reference/index.md create mode 100644 apps/docs/versioned_docs/version-1.4.1/code-reference/node-js.md create mode 100644 apps/docs/versioned_docs/version-1.4.1/code-reference/sdk/golang.md create mode 100644 apps/docs/versioned_docs/version-1.4.1/errors/index.mdx create mode 100644 apps/docs/versioned_docs/version-1.4.1/features/guardian.mdx create mode 100644 apps/docs/versioned_docs/version-1.4.1/features/sunshine.mdx create mode 100644 apps/docs/versioned_docs/version-1.4.1/how-to-use/basic.mdx create mode 100644 apps/docs/versioned_docs/version-1.4.1/overview.mdx create mode 100644 apps/docs/versioned_docs/version-1.4.1/plan/plan.md create mode 100644 apps/docs/versioned_docs/version-1.4.1/quick-start.mdx create mode 100644 apps/docs/versioned_sidebars/version-1.4.1-sidebars.json diff --git a/apps/docs/docs/features/guardian.mdx b/apps/docs/docs/features/guardian.mdx index 5da75ca..3c130d7 100644 --- a/apps/docs/docs/features/guardian.mdx +++ b/apps/docs/docs/features/guardian.mdx @@ -27,7 +27,7 @@ default値は`0.5`です。 **`model`** string optional
指定可能なモデル -- gpt-4o-mini +- gpt-4o-mini (default) - claude-3-haiku - gemini-1.5-flash diff --git a/apps/docs/docs/features/sunshine.mdx b/apps/docs/docs/features/sunshine.mdx index c6a41c7..93ca85e 100644 --- a/apps/docs/docs/features/sunshine.mdx +++ b/apps/docs/docs/features/sunshine.mdx @@ -21,6 +21,12 @@ export const SunshineApiName = () => { **`text`** string **required**
最大500文字までを受け付けています。 +**`model`** string optional
+指定可能なモデル +- gpt-4o-mini (default) +- claude-3-haiku +- gemini-1.5-flash + ### リクエスト例
cURL diff --git a/apps/docs/docusaurus.config.ts b/apps/docs/docusaurus.config.ts index 4b3217e..d417a75 100644 --- a/apps/docs/docusaurus.config.ts +++ b/apps/docs/docusaurus.config.ts @@ -52,7 +52,7 @@ const config: Config = { lastVersion: 'current', versions: { current: { - label: '1.4.1 (latest)', + label: '1.5.0 (latest)', path: '/', }, }, diff --git a/apps/docs/versioned_docs/version-1.4.1/code-reference/golang.md b/apps/docs/versioned_docs/version-1.4.1/code-reference/golang.md new file mode 100644 index 0000000..c83687c --- /dev/null +++ b/apps/docs/versioned_docs/version-1.4.1/code-reference/golang.md @@ -0,0 +1,66 @@ +# Go + +```go +// main.go +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "net/http" +) + +var ( + apiKey = "YOUR_API_KEY" + apiUrl = "https://api.peeace.net/v1/guardians/text" +) + +func main() { + // リクエストを作成 + body, err := json.Marshal(map[string]string{ + "text": "最低な文章", + }) + if err != nil { + fmt.Println("Error marshalling request body:", err) + return + } + + req, err := http.NewRequest("POST", apiUrl, bytes.NewBuffer(body)) + if err != nil { + fmt.Println("Error creating request:", err) + return + } + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", apiKey)) + + // リクエスト + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + fmt.Println("Error sending request:", err) + return + } + defer resp.Body.Close() + + // レスポンスをチェック + if resp.StatusCode != http.StatusOK { + fmt.Println("Request failed with status:", resp.Status) + return + } + + var responseBody map[string]interface{} + if err := json.NewDecoder(resp.Body).Decode(&responseBody); err != nil { + fmt.Println("Error decoding response body:", err) + return + } + + fmt.Println("Response:", responseBody) +} +``` + +### 実行 + +```sh +go run main.go +``` diff --git a/apps/docs/versioned_docs/version-1.4.1/code-reference/index.md b/apps/docs/versioned_docs/version-1.4.1/code-reference/index.md new file mode 100644 index 0000000..6dbe2a1 --- /dev/null +++ b/apps/docs/versioned_docs/version-1.4.1/code-reference/index.md @@ -0,0 +1,5 @@ +# コードリファレンス + + +- [Node.js](./node-js.md) +- [Go](./golang.md) diff --git a/apps/docs/versioned_docs/version-1.4.1/code-reference/node-js.md b/apps/docs/versioned_docs/version-1.4.1/code-reference/node-js.md new file mode 100644 index 0000000..6dc08e6 --- /dev/null +++ b/apps/docs/versioned_docs/version-1.4.1/code-reference/node-js.md @@ -0,0 +1,29 @@ +# Node.js + +```js +// 変数をセット +//// YOUR_API_KEYを取得したものに変更してください +const apiKey= 'YOUR_API_KEY'; + +const apiUrl = "https://api.peeace.net/v1/guardians/text"; +const requestBody = { + text: "最低な文章" +}; + +fetch(apiUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${apiKey}` + }, + body: JSON.stringify(requestBody) +}) +.then(response => response.json()) +.then(data => { + console.log(data); +}) +.catch(error => { + console.error('Error:', error); +}); + +``` diff --git a/apps/docs/versioned_docs/version-1.4.1/code-reference/sdk/golang.md b/apps/docs/versioned_docs/version-1.4.1/code-reference/sdk/golang.md new file mode 100644 index 0000000..2bbc302 --- /dev/null +++ b/apps/docs/versioned_docs/version-1.4.1/code-reference/sdk/golang.md @@ -0,0 +1,41 @@ +# SDK for Go + +### [GitHub Issues](https://github.com/naruse666/peace-net-sdk-go/issues) +バグや機能リクエストは[Issues](https://github.com/naruse666/peace-net-sdk-go/issues)からお願いします✨
+ +### サンプルコード +```go +// main.go +package main + +import ( + "fmt" + "github.com/naruse666/peace-net-sdk-go/guardian" + "os" +) + +func main() { + apiKey, ok := os.LookupEnv("API_KEY") + if !ok { + fmt.Println("API_KEY is not set") + return + } + + guardianInput := guardian.GuardianInput{ + Text: "最低な文章!", + APIKey: apiKey, + } + + resp, err := guardian.RequestGuardian(guardianInput) + if err != nil { + fmt.Println(err.Error()) + return + } + fmt.Println(resp) +} +``` + +### 実行 +```go +go run main.go +``` diff --git a/apps/docs/versioned_docs/version-1.4.1/errors/index.mdx b/apps/docs/versioned_docs/version-1.4.1/errors/index.mdx new file mode 100644 index 0000000..0d690a3 --- /dev/null +++ b/apps/docs/versioned_docs/version-1.4.1/errors/index.mdx @@ -0,0 +1,42 @@ +--- +title: よくあるエラー +--- + +import useDocusaurusContext from '@docusaurus/useDocusaurusContext' + +export const ApiName = () => { + const { siteConfig } = useDocusaurusContext() + return siteConfig.customFields.peace_net +} + +# エラー + +へのリクエストを完了できない場合、エラーが返される 表示されます。エラー メッセージを解析し、適切に処理することで、 予測できます。 + +エラー レスポンスの形式は次のとおりです。 + + ```json + { + "error": string, + "details": string, + "status": 400 | 401 | 404 | 429 | 500 | 501 + } + ``` + +## よくあるエラー + +以下に、一般的な API エラーと、次の場合に行う推奨の対応を示します。 + +:::info +推奨される対応を行ってもエラーが解決しない場合は、 [サポートに連絡](https://github.com/TECH-C-LT/Peace-Net/issues/new)して問題を報告してください。 +::: + + +| エラーコード | 説明 | 推奨される対応 | +|------------|------|--------------| +| 400 Invalid Input | リクエストの形式が正しくないか、必要なパラメータが不足しています。 | リクエストのパラメータと形式を確認し、必要な情報がすべて含まれていることを確認してください。 | +| 401 Unauthorized | APIキーが無効であるか、認証に失敗しました。 | APIキーが正しいことを確認し、必要に応じて新しいキーを生成してください。 | +| 404 Invalid Request | リクエストされたリソースが見つかりません。 | URLとリソースIDが正しいことを確認してください。 | +| 429 Usage Limit Exceeded | レート制限を超えています。 | リクエストの頻度を下げるか、より高いレート制限のプランにアップグレードすることを検討してください。 | +| 500 Internal Server Error | サーバー側で予期しないエラーが発生しました。 | しばらく待ってから再試行してください。問題が続く場合はサポートに連絡してください。 | +| 501 Not Implemented | リクエストされた機能が実装されていません。 | 他のエンドポイントを使用するか、サポートに問い合わせてください。 | \ No newline at end of file diff --git a/apps/docs/versioned_docs/version-1.4.1/features/guardian.mdx b/apps/docs/versioned_docs/version-1.4.1/features/guardian.mdx new file mode 100644 index 0000000..5da75ca --- /dev/null +++ b/apps/docs/versioned_docs/version-1.4.1/features/guardian.mdx @@ -0,0 +1,95 @@ +--- +title: Guardian API +--- + +import useDocusaurusContext from '@docusaurus/useDocusaurusContext' + +export const GuardianApiName = () => { + const { siteConfig } = useDocusaurusContext() + return siteConfig.customFields.guardian +} + +# + +**POST `v1/guardians/text`** + +## リクエスト +#### ヘッダー +**`accept`** string + +#### リクエストボディ +**`text`** string **required**
+最大500文字までを受け付けています。 + +**`score_threshold`** integer optional
+`0.1-1`までの値を受け付けています。
+default値は`0.5`です。 + +**`model`** string optional
+指定可能なモデル +- gpt-4o-mini +- claude-3-haiku +- gemini-1.5-flash + + +### リクエスト例 +
+ cURL +
+    
+      ```
+        curl -X POST \
+          --location 'https://api.peeace.net/v1/guardians/text' \
+          -H 'Content-Type: application/json' \
+          -H "Authorization: Bearer " \
+          -d '{
+          "text": ""
+        }'
+      ```
+    
+  
+
+ +## レスポンス +
+ レスポンス例 + + status: `200` +
+    
+    ```
+      {
+        "flagged": true,
+        "categories": {
+          "sexual": false,
+          "hate": false,
+          "self_harm": true,
+          "violence": false,
+          "defamation": true
+        },
+        "category_scores": {
+          "sexual": 0,
+          "hate": 0,
+          "self_harm": 0.9,
+          "violence": 0,
+          "defamation": 0.8
+        }
+      }
+    ```
+    
+  
+
+ +### レスポンスステータスコード + +| Status Code | Description | +| ---- | ---- | +| `200` | Success | +| `400` | Validation | +| `401` | Unauthorized | +| `404` | Not Found | +| `429` | Usage Limit Exceeded | +| `500` | Internal Server Error | +| `501` | Not Implemented Error | + +エラーの詳細は[よくあるエラー](/docs/errors)を参照してください。 diff --git a/apps/docs/versioned_docs/version-1.4.1/features/sunshine.mdx b/apps/docs/versioned_docs/version-1.4.1/features/sunshine.mdx new file mode 100644 index 0000000..c6a41c7 --- /dev/null +++ b/apps/docs/versioned_docs/version-1.4.1/features/sunshine.mdx @@ -0,0 +1,71 @@ +--- +title: Sunshine API +--- + +import useDocusaurusContext from '@docusaurus/useDocusaurusContext' + +export const SunshineApiName = () => { + const { siteConfig } = useDocusaurusContext() + return siteConfig.customFields.sunshine +} + +# + +**POST `v1/sunshines/text`** + +## リクエスト +#### ヘッダー +**`accept`** string + +#### リクエストボディ +**`text`** string **required**
+最大500文字までを受け付けています。 + +### リクエスト例 +
+ cURL +
+    
+      ```
+        curl -X POST \
+          --location 'https://api.peeace.net/v1/sunshines/text' \
+          -H 'Content-Type: application/json' \
+          -H "Authorization: Bearer " \
+          -d '{
+          "text": ""
+        }'
+      ```
+    
+  
+
+ +## レスポンス +
+ レスポンス例 + + status: `200` +
+    
+    ```
+      {
+        "flagged": "きっと大丈夫です!",
+      }
+    ```
+    
+  
+
+ +### レスポンスステータスコード + +| Status Code | Description | +| ---- | ---- | +| `200` | Success | +| `400` | Validation | +| `401` | Unauthorized | +| `404` | Not Found | +| `429` | Usage Limit Exceeded | +| `500` | Internal Server Error | +| `501` | Not Implemented Error | + +エラーの詳細は[よくあるエラー](/docs/errors)を参照してください。 + diff --git a/apps/docs/versioned_docs/version-1.4.1/how-to-use/basic.mdx b/apps/docs/versioned_docs/version-1.4.1/how-to-use/basic.mdx new file mode 100644 index 0000000..b551699 --- /dev/null +++ b/apps/docs/versioned_docs/version-1.4.1/how-to-use/basic.mdx @@ -0,0 +1,99 @@ +--- +title: 基本的な使用方法 +--- + +import useDocusaurusContext from '@docusaurus/useDocusaurusContext' + +export const ApiName = () => { + const { siteConfig } = useDocusaurusContext() + return siteConfig.customFields.peace_net +} + +# 基本的な使用方法 + + +の基本的な使い方を説明しています。 + +## API キーの発行 + +1. + ユーザーポータル + + にログインします。 「平和ネットAPIを使う」をクリックしてください。 + +:::info + +現在はGitHubのOAuth認証のみ利用可能です。 +::: + +2. API Keysというページからキーを生成します。
+ キーの名前と有効期限を選択し、キーを生成しましょう! + + + +3. APIキーをコピーします + + +:::warning + +紛失した場合は再度作成する必要があります。 +::: + +## APIにリクエストを送る + +
+ Linux / Mac +
+    環境変数に`API_KEY`をセットします。
+    
+      ```
+      export API_KEY="YOUR_API_KEY"
+      ```
+    
+
+    簡単なリクエストを送ってみましょう!
+    
+      ```
+      curl -s -X POST \
+        --location 'https://api.peeace.net/v1/guardians/text' \
+        --header 'Content-Type: application/json' \
+        --header "Authorization: Bearer $API_KEY" \
+        --data '{
+        "text": "最低な文章"
+      }'
+      ```
+    
+
+  
+
+ +
+ Windows +
+    環境変数に`API_KEY`をセットします。
+    
+      ```
+        $Env:API_KEY = "YOUR_API_KEY"
+      ```
+    
+
+    簡単なリクエストを送ってみましょう!
+    
+      ```
+        $headers = @{
+            "Content-Type" = "application/json"
+            "Authorization" = "Bearer $($Env:API_KEY)"
+        }
+
+        $body = @{
+            text = "最低な文章"
+        } | ConvertTo-Json
+
+        Invoke-RestMethod -Method Post -Uri "https://api.peeace.net/v1/guardians/text" -Headers $headers -Body $body
+      ```
+    
+
+  
+
+ +各言語での実装方法は[コードリファレンス](/docs/code-reference/)を参照してください。 diff --git a/apps/docs/versioned_docs/version-1.4.1/overview.mdx b/apps/docs/versioned_docs/version-1.4.1/overview.mdx new file mode 100644 index 0000000..62c12b7 --- /dev/null +++ b/apps/docs/versioned_docs/version-1.4.1/overview.mdx @@ -0,0 +1,60 @@ +--- +title: 平和ネット API 概要 +--- + +import useDocusaurusContext from '@docusaurus/useDocusaurusContext' + +export const ApiName = () => { + const { siteConfig } = useDocusaurusContext() + return siteConfig.customFields.peace_net +} + +export const GuardianApiName = () => { + const { siteConfig } = useDocusaurusContext() + return siteConfig.customFields.guardian +} + +export const SunshineApiName = () => { + const { siteConfig } = useDocusaurusContext() + return siteConfig.customFields.sunshine +} + +# 概要 + +## APIの目的 + +はより安全で平和なインターネット空間の実現を目指し、AIを活用したテキスト判定システムです。 +このシステムは、テキストの適切性を自動的に評価し、誰もが簡単に利用できるAPIを目標としています。 + +## 機能 + +### ユーザーポータル + +ユーザーポータルでは以下の操作を行うことができます。 + +- APIキーの発行 +- 使用回数の確認 + +### + +**誹謗中傷評価**を行うAPIです。 + +#### 特徴 + +- フラグ(bool)での判定 +- 分類ごとにスコアリング + +詳細は[ リファレンス](./features/guardian.mdx)を参照してください。 + + +### + +**ポジティブ変換**を行うAPIです。 + +#### 特徴 + +- ポジティブな言葉に変換 + +詳細は[ リファレンス](./features/sunshine.mdx)を参照してください。 + +おめでとう:tada: あなたはを完全に理解しました! diff --git a/apps/docs/versioned_docs/version-1.4.1/plan/plan.md b/apps/docs/versioned_docs/version-1.4.1/plan/plan.md new file mode 100644 index 0000000..f4364b0 --- /dev/null +++ b/apps/docs/versioned_docs/version-1.4.1/plan/plan.md @@ -0,0 +1,15 @@ +# プラン + +| プラン名 | 料金 | 使用回数制限 | +| ---- | ---- | ---- | +| Free | 0 | 30回 | + +:::info +使用回数制限を超過した場合、`Usage Limit Exceeded Error`となり以下のエラーがレスポンスされます。 +```json +{ + "error": "[Peace Net]: Usage Limit Exceeded Error", + "details": "User plan's usage limit exceeded" +} +``` +::: diff --git a/apps/docs/versioned_docs/version-1.4.1/quick-start.mdx b/apps/docs/versioned_docs/version-1.4.1/quick-start.mdx new file mode 100644 index 0000000..38437cd --- /dev/null +++ b/apps/docs/versioned_docs/version-1.4.1/quick-start.mdx @@ -0,0 +1,15 @@ +--- +title: クイックスタート +--- + +## APIを試してみる +APIキーを発行せずに試してみましょう。 + +1. [管理ページ](https://peeace.net)にアクセスし、`平和ネットAPIを使う`をクリックしてください。

+![](/img/top.png) + +2. `ログインしないで使ってみる`から簡単にAPIを試すことができます!

+![](/img/anon-login.png) + +3. Playgroundページで試しましょう!

+![](/img/playground.png) diff --git a/apps/docs/versioned_sidebars/version-1.4.1-sidebars.json b/apps/docs/versioned_sidebars/version-1.4.1-sidebars.json new file mode 100644 index 0000000..e9d939a --- /dev/null +++ b/apps/docs/versioned_sidebars/version-1.4.1-sidebars.json @@ -0,0 +1,61 @@ +{ + "docs": [ + { + "type": "category", + "label": "API 概要", + "link": { + "type": "doc", + "id": "quick-start" + }, + "items": [ + "quick-start", + "how-to-use/basic" + ] + }, + { + "type": "category", + "label": "機能", + "items": [ + "features/guardian", + "features/sunshine" + ] + }, + { + "type": "category", + "label": "プラン", + "link": { + "type": "doc", + "id": "plan/plan" + }, + "items": [] + }, + { + "type": "category", + "label": "コードリファレンス", + "link": { + "type": "doc", + "id": "code-reference/index" + }, + "items": [ + "code-reference/node-js", + "code-reference/golang", + { + "type": "category", + "label": "SDK", + "items": [ + "code-reference/sdk/golang" + ] + } + ] + }, + { + "type": "category", + "label": "よくあるエラー", + "link": { + "type": "doc", + "id": "errors/index" + }, + "items": [] + } + ] +} diff --git a/apps/docs/versions.json b/apps/docs/versions.json index 5f516c7..e6cb9ee 100644 --- a/apps/docs/versions.json +++ b/apps/docs/versions.json @@ -1,4 +1,5 @@ [ + "1.4.1", "1.3.0", "1.2.1", "1.2.0",