Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,15 @@ updates:
directories:
- '/'
- '/common/core/'
- '/common/backend/core'
- '/common/backend/langchain'
- '/common/backend/'
- '/agents/agent-mastra/'
- '/agents/agent-ai-sdk/'
- '/agents/agent-claude-agent-sdk/'
- '/agents/agent-langchain/'
- '/agents/agent-langchain-nextjs/'
- '/agents/agent-mastra/'
- '/agents/agent-strands/'
- '/agents/agents-langchain/'
- '/agents/agents-langchain-nextjs/'
- '/basic/cdk/'
- '/basic/app/'
- '/mcp/clients/mastra-mcp-client/'
Expand Down
6 changes: 4 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,14 @@ jobs:
- name: Build
run: |
pnpm --filter @llm-ts-example/common-core build
pnpm --filter @llm-ts-example/common-backend build
pnpm --filter @llm-ts-example/common-backend-core build
pnpm --filter @llm-ts-example/common-backend-langchain build

- name: Debug workspace links
run: |
pnpm list -r --depth 0
pnpm why @llm-ts-example/common-backend
pnpm why @llm-ts-example/common-backend-core
pnpm why @llm-ts-example/common-backend-langchain

- name: Build all packages
run: pnpm build
Expand Down
38 changes: 38 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -127,3 +127,41 @@ jobs:
-c langsmith-project=${{ secrets.LANGCHAIN_PROJECT }} \
-c pinecone-index=${{ vars.PINECONE_INDEX }} \
-c pinecone-api-key=${{ secrets.PINECONE_API_KEY }}

deploy-aisdk-api:
# 同時実行すると CREATE_IN_PROGRESS や UPDATE_IN_PROGRESS 状態で cdk deploy を行う可能性があるため抑止する
concurrency:
group: "aisdk-api-examle-cloudformation"
cancel-in-progress: false

runs-on: ubuntu-latest
steps:
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 # v6.0.0
with:
role-to-assume: ${{ env.OIDC_IAM_ROLE_ARN }}
role-session-name: GitHubActions
aws-region: ${{ env.AWS_REGION }}

- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Use Node.js
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
node-version: 'lts/*'
check-latest: true
package-manager-cache: false

- uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
name: Install pnpm
with:
run_install: |
- recursive: true
args: [--no-frozen-lockfile]
- args: [--global, aws-cdk, esbuild]

- name: deploy
working-directory: ./agents/agent-ai-sdk
run: |
pnpm dlx aws-cdk@latest deploy \
--require-approval=never
11 changes: 9 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,28 @@ LLM (Large Language Model) の実装例を集めたTypeScriptプロジェクト
## プロジェクト一覧

### Basic Chat

- [Basic Chat](./basic/) - LangChain.jsとLangGraph.jsを使用した基本的なチャットボット

### RAG (Retrieval Augmented Generation)

- [RAG](./rag/) - LangChain.jsとLangGraph.jsを使用したRAG実装例

### Chat App

- [Chat App](./chat-app/) - Next.jsとAI SDKを使用したチャットアプリケーション

### Agents
- [Mastra](./agents/agent-mastra/) - Mastraフレームワークによるエージェント実装

- [AI SDK](./agents/agent-ai-sdk/) - Vercel AI SDKとAWS Lambdaによるエージェント実装(Amazon Bedrock/Azure OpenAI対応)
- [Claude Agent SDK](./agents/agent-claude-agent-sdk/) - Claude Agent SDKによるエージェント実装
- [LangChain.js Agent](./agents/agent-langchain/) - LangChain.jsによるエージェント実装
- [LangChain.js Agent (Next.js)](./agents/agent-langchain-nextjs/) - Next.jsとLangChain.jsによるエージェント実装
- [Claude Agent SDK](./agents/agent-sdk/) - Claude Agent SDKによるエージェント実装
- [Mastra](./agents/agent-mastra/) - Mastraフレームワークによるエージェント実装
- [Strands TypeScript SDK](./agents/agent-strands/) - Strands TypeScript SDKによるエージェント実装

### MCP (Model Context Protocol)

- [MCP Servers](./mcp/servers/) - MCPサーバーの実装例
- [Weather](./mcp/servers/weather/) - 天気予報MCPサーバー
- [Weather HTTP](./mcp/servers/weather-http/) - HTTP経由の天気予報MCPサーバー
Expand All @@ -29,6 +35,7 @@ LLM (Large Language Model) の実装例を集めたTypeScriptプロジェクト
- [HTTP Client](./mcp/clients/mcp-client-http/) - HTTP経由のMCPクライアント

### Common

- [Common](./common/) - 共通ユーティリティとコンポーネント

## 技術スタック
Expand Down
9 changes: 9 additions & 0 deletions agents/agent-ai-sdk/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
*.js
!jest.config.js
*.d.ts
node_modules

# CDK asset staging directory
.cdk.staging
cdk.out
!lambda/awslambda.d.ts
6 changes: 6 additions & 0 deletions agents/agent-ai-sdk/.npmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
*.ts
!*.d.ts

# CDK asset staging directory
.cdk.staging
cdk.out
223 changes: 223 additions & 0 deletions agents/agent-ai-sdk/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,223 @@
# Agent AI SDK

AWS Lambda上でVercel AI SDKを使用し、Amazon BedrockやAzure OpenAIとの対話を行うエージェントアプリケーションです。

## アーキテクチャ

- **AWS Lambda (Node.js 24.x)**: サーバーレスコンピューティング
- **Lambda Function URL**: エンドポイント公開
- **Amazon Bedrock / Azure OpenAI**: LLMバックエンド
- **Vercel AI SDK**: AI/LLM連携ライブラリ
- **AWS CDK**: インフラストラクチャ管理

## 機能

- ストリーミングレスポンス対応
- ToolLoopAgentによるツール呼び出し
- マルチプロバイダー対応(AWS Bedrock、Azure OpenAI)
- セッション管理
- トークン使用量のログ記録

## 必要条件

- Node.js 24.x
- AWS CLI(設定済み)
- AWS CDK
- pnpm

## セットアップ

```bash
# 依存関係のインストール
pnpm install

# ビルド
pnpm run build

# テスト
pnpm run test
```

## デプロイ

```bash
# CDK bootstrap(初回のみ)
npx cdk bootstrap

# デプロイ
npx cdk deploy
```

デプロイ後、Lambda Function URLが出力されます。

## API使用方法

```bash
curl -X POST <Function URL> \
-H "Content-Type: application/json" \
-d '{
"prompt": "こんにちは",
"modelId": "claude-3-sonnet",
"session": "session-id",
"id": "query-id"
}'
```

### リクエストパラメータ

| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | ---- | ---- |
| `prompt` | string | 是 | ユーザーの入力プロンプト |
| `modelId` | string | 是 | 使用するモデルID |
| `session` | string | 任意 | セッション識別子 |
| `id` | string | 任意 | クエリ識別子 |

## プロジェクト構造

```text
.
├── bin/
│ └── agent-ai-sdk.ts # CDKエントリポイント
├── lib/
│ └── agent-ai-sdk-stack.ts # CDKスタック定義
├── lambda/
│ ├── index.ts # Lambdaハンドラー
│ └── handler.ts # ビジネスロジック
├── test/
│ └── agent-ai-sdk.test.ts # テスト
└── cdk.json # CDK設定
```

## 開発コマンド

| コマンド | 説明 |
| ------- | ---- |
| `pnpm run build` | TypeScriptコンパイル |
| `pnpm run watch` | 変更監視モード |
| `pnpm run test` | テスト実行 |
| `npx cdk deploy` | スタックデプロイ |
| `npx cdk diff` | 差分確認 |
| `npx cdk synth` | CloudFormationテンプレート生成 |

## Agents

本プロジェクトは Vercel AI SDK の `ToolLoopAgent` を使用して、LLMとの対話を行います。

### ToolLoopAgent の構成

```typescript
const agent = new ToolLoopAgent({
model, // LLMモデルインスタンス
instructions: 'You are a helpful assistant.', // システムプロンプト
tools: { // ツール定義(オプション)
// カスタムツールをここに追加
},
experimental_telemetry: { // テレメトリ設定(オプション)
isEnabled: true,
metadata: {
model: modelId,
thread_id: session,
query_id: id,
}
},
});
```

### ツールの追加方法

ToolLoopAgent はツール呼び出しを自動的にループ処理します。カスタムツールを追加する場合:

```typescript
import { tool } from 'ai';
import { z } from 'zod';

const agent = new ToolLoopAgent({
model,
instructions: 'You are a helpful assistant.',
tools: {
getWeather: tool({
description: '指定された都市の天気を取得します',
parameters: z.object({
city: z.string().describe('都市名'),
}),
execute: async ({ city }) => {
// 天気APIを呼び出す処理
return { temperature: 25, condition: 'sunny' };
},
}),
// 他のツールを追加...
},
});
```

### ストリーミング設定

スムーズなストリーミングレスポンスを実現するため、`smoothStream` を使用:

```typescript
const stream = await agent.stream({
messages,
experimental_transform: smoothStream({
delayInMs: 20, // チャンク間の遅延(デフォルト: 10ms)
chunking: 'line', // チャンク分割方法: 'word' | 'line'(デフォルト: 'word')
}),
});
```

### ステップ完了コールバック

各ステップ(ツール呼び出しや応答生成)完了時の処理:

```typescript
const stream = await agent.stream({
messages,
onStepFinish: async ({ usage, finishReason, toolCalls }) => {
// トークン使用量の記録
logger.info('Step completed:', {
inputTokens: usage.inputTokens,
outputTokens: usage.outputTokens,
finishReason, // 'stop' | 'length' | 'content-filter' | 'tool-calls' | 'error' | 'other'
toolsUsed: toolCalls?.map(tc => tc.toolName),
});
},
});
```

### セッション管理

会話履歴はメモリ内に保持され、複数ターンの対話が可能:

```typescript
const messages: ModelMessage[] = [];

// ユーザー入力を追加
messages.push({ role: 'user', content: prompt });

// エージェント実行
const stream = await agent.stream({ messages });

// アシスタント応答を履歴に追加
messages.push({ role: 'assistant', content: response });
```

**注意**: Lambdaのステートレス性により、セッションは同じLambdaインスタンス内でのみ保持されます。

## モデル設定

使用可能なモデルは `common-core` パッケージの `models` で定義されています。対応プラットフォーム:

- **AWS**: Amazon Bedrock
- **Azure**: Azure OpenAI

## IAMポリシー

Lambda実行ロールには以下の権限が付与されています:

- `AWSLambdaExecute`
- `CloudFrontReadOnlyAccess`
- `bedrock:InvokeModel*`
- `logs:PutLogEvents`

## ライセンス

MIT
8 changes: 8 additions & 0 deletions agents/agent-ai-sdk/bin/agent-ai-sdk.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#!/usr/bin/env node
import * as cdk from 'aws-cdk-lib/core';
import { AgentAiSdkStack } from '../lib/agent-ai-sdk-stack.js';

const app = new cdk.App();
const stack = new AgentAiSdkStack(app, 'agent-ai-sdk-stack', {
});
cdk.RemovalPolicies.of(stack).apply(cdk.RemovalPolicy.DESTROY);
5 changes: 5 additions & 0 deletions agents/agent-ai-sdk/cdk.context.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"acknowledged-issue-numbers": [
34892
]
}
Loading
Loading