Skip to content

Commit 210e446

Browse files
committed
Add the Agent API by Vercel AI SDK
1 parent 1350d04 commit 210e446

46 files changed

Lines changed: 1904 additions & 708 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/dependabot.yml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,15 @@ updates:
2121
directories:
2222
- '/'
2323
- '/common/core/'
24+
- '/common/backend/core'
25+
- '/common/backend/langchain'
2426
- '/common/backend/'
25-
- '/agents/agent-mastra/'
27+
- '/agents/agent-ai-sdk/'
2628
- '/agents/agent-claude-agent-sdk/'
29+
- '/agents/agent-langchain/'
30+
- '/agents/agent-langchain-nextjs/'
31+
- '/agents/agent-mastra/'
2732
- '/agents/agent-strands/'
28-
- '/agents/agents-langchain/'
29-
- '/agents/agents-langchain-nextjs/'
3033
- '/basic/cdk/'
3134
- '/basic/app/'
3235
- '/mcp/clients/mastra-mcp-client/'

.github/workflows/ci.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,14 @@ jobs:
3232
- name: Build
3333
run: |
3434
pnpm --filter @llm-ts-example/common-core build
35-
pnpm --filter @llm-ts-example/common-backend build
35+
pnpm --filter @llm-ts-example/common-backend-core build
36+
pnpm --filter @llm-ts-example/common-backend-langchain build
3637
3738
- name: Debug workspace links
3839
run: |
3940
pnpm list -r --depth 0
40-
pnpm why @llm-ts-example/common-backend
41+
pnpm why @llm-ts-example/common-backend-core
42+
pnpm why @llm-ts-example/common-backend-langchain
4143
4244
- name: Build all packages
4345
run: pnpm build

.github/workflows/deploy.yml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,41 @@ jobs:
127127
-c langsmith-project=${{ secrets.LANGCHAIN_PROJECT }} \
128128
-c pinecone-index=${{ vars.PINECONE_INDEX }} \
129129
-c pinecone-api-key=${{ secrets.PINECONE_API_KEY }}
130+
131+
deploy-aisdk-api:
132+
# 同時実行すると CREATE_IN_PROGRESS や UPDATE_IN_PROGRESS 状態で cdk deploy を行う可能性があるため抑止する
133+
concurrency:
134+
group: "aisdk-api-examle-cloudformation"
135+
cancel-in-progress: false
136+
137+
runs-on: ubuntu-latest
138+
steps:
139+
- name: Configure AWS Credentials
140+
uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 # v6.0.0
141+
with:
142+
role-to-assume: ${{ env.OIDC_IAM_ROLE_ARN }}
143+
role-session-name: GitHubActions
144+
aws-region: ${{ env.AWS_REGION }}
145+
146+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
147+
148+
- name: Use Node.js
149+
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
150+
with:
151+
node-version: 'lts/*'
152+
check-latest: true
153+
package-manager-cache: false
154+
155+
- uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
156+
name: Install pnpm
157+
with:
158+
run_install: |
159+
- recursive: true
160+
args: [--no-frozen-lockfile]
161+
- args: [--global, aws-cdk, esbuild]
162+
163+
- name: deploy
164+
working-directory: ./agents/agent-ai-sdk
165+
run: |
166+
pnpm dlx aws-cdk@latest deploy \
167+
--require-approval=never

README.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,28 @@ LLM (Large Language Model) の実装例を集めたTypeScriptプロジェクト
55
## プロジェクト一覧
66

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

1011
### RAG (Retrieval Augmented Generation)
12+
1113
- [RAG](./rag/) - LangChain.jsとLangGraph.jsを使用したRAG実装例
1214

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

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

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

3137
### Common
38+
3239
- [Common](./common/) - 共通ユーティリティとコンポーネント
3340

3441
## 技術スタック

agents/agent-ai-sdk/.gitignore

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
*.js
2+
!jest.config.js
3+
*.d.ts
4+
node_modules
5+
6+
# CDK asset staging directory
7+
.cdk.staging
8+
cdk.out
9+
!lambda/awslambda.d.ts

agents/agent-ai-sdk/.npmignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
*.ts
2+
!*.d.ts
3+
4+
# CDK asset staging directory
5+
.cdk.staging
6+
cdk.out

agents/agent-ai-sdk/README.md

Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
# Agent AI SDK
2+
3+
AWS Lambda上でVercel AI SDKを使用し、Amazon BedrockやAzure OpenAIとの対話を行うエージェントアプリケーションです。
4+
5+
## アーキテクチャ
6+
7+
- **AWS Lambda (Node.js 24.x)**: サーバーレスコンピューティング
8+
- **Lambda Function URL**: エンドポイント公開
9+
- **Amazon Bedrock / Azure OpenAI**: LLMバックエンド
10+
- **Vercel AI SDK**: AI/LLM連携ライブラリ
11+
- **AWS CDK**: インフラストラクチャ管理
12+
13+
## 機能
14+
15+
- ストリーミングレスポンス対応
16+
- ToolLoopAgentによるツール呼び出し
17+
- マルチプロバイダー対応(AWS Bedrock、Azure OpenAI)
18+
- セッション管理
19+
- トークン使用量のログ記録
20+
21+
## 必要条件
22+
23+
- Node.js 24.x
24+
- AWS CLI(設定済み)
25+
- AWS CDK
26+
- pnpm
27+
28+
## セットアップ
29+
30+
```bash
31+
# 依存関係のインストール
32+
pnpm install
33+
34+
# ビルド
35+
pnpm run build
36+
37+
# テスト
38+
pnpm run test
39+
```
40+
41+
## デプロイ
42+
43+
```bash
44+
# CDK bootstrap(初回のみ)
45+
npx cdk bootstrap
46+
47+
# デプロイ
48+
npx cdk deploy
49+
```
50+
51+
デプロイ後、Lambda Function URLが出力されます。
52+
53+
## API使用方法
54+
55+
```bash
56+
curl -X POST <Function URL> \
57+
-H "Content-Type: application/json" \
58+
-d '{
59+
"prompt": "こんにちは",
60+
"modelId": "claude-3-sonnet",
61+
"session": "session-id",
62+
"id": "query-id"
63+
}'
64+
```
65+
66+
### リクエストパラメータ
67+
68+
| パラメータ || 必須 | 説明 |
69+
| --------- | ---- | ---- | ---- |
70+
| `prompt` | string || ユーザーの入力プロンプト |
71+
| `modelId` | string || 使用するモデルID |
72+
| `session` | string | 任意 | セッション識別子 |
73+
| `id` | string | 任意 | クエリ識別子 |
74+
75+
## プロジェクト構造
76+
77+
```text
78+
.
79+
├── bin/
80+
│ └── agent-ai-sdk.ts # CDKエントリポイント
81+
├── lib/
82+
│ └── agent-ai-sdk-stack.ts # CDKスタック定義
83+
├── lambda/
84+
│ ├── index.ts # Lambdaハンドラー
85+
│ └── handler.ts # ビジネスロジック
86+
├── test/
87+
│ └── agent-ai-sdk.test.ts # テスト
88+
└── cdk.json # CDK設定
89+
```
90+
91+
## 開発コマンド
92+
93+
| コマンド | 説明 |
94+
| ------- | ---- |
95+
| `pnpm run build` | TypeScriptコンパイル |
96+
| `pnpm run watch` | 変更監視モード |
97+
| `pnpm run test` | テスト実行 |
98+
| `npx cdk deploy` | スタックデプロイ |
99+
| `npx cdk diff` | 差分確認 |
100+
| `npx cdk synth` | CloudFormationテンプレート生成 |
101+
102+
## Agents
103+
104+
本プロジェクトは Vercel AI SDK の `ToolLoopAgent` を使用して、LLMとの対話を行います。
105+
106+
### ToolLoopAgent の構成
107+
108+
```typescript
109+
const agent = new ToolLoopAgent({
110+
model, // LLMモデルインスタンス
111+
instructions: 'You are a helpful assistant.', // システムプロンプト
112+
tools: { // ツール定義(オプション)
113+
// カスタムツールをここに追加
114+
},
115+
experimental_telemetry: { // テレメトリ設定(オプション)
116+
isEnabled: true,
117+
metadata: {
118+
model: modelId,
119+
thread_id: session,
120+
query_id: id,
121+
}
122+
},
123+
});
124+
```
125+
126+
### ツールの追加方法
127+
128+
ToolLoopAgent はツール呼び出しを自動的にループ処理します。カスタムツールを追加する場合:
129+
130+
```typescript
131+
import { tool } from 'ai';
132+
import { z } from 'zod';
133+
134+
const agent = new ToolLoopAgent({
135+
model,
136+
instructions: 'You are a helpful assistant.',
137+
tools: {
138+
getWeather: tool({
139+
description: '指定された都市の天気を取得します',
140+
parameters: z.object({
141+
city: z.string().describe('都市名'),
142+
}),
143+
execute: async ({ city }) => {
144+
// 天気APIを呼び出す処理
145+
return { temperature: 25, condition: 'sunny' };
146+
},
147+
}),
148+
// 他のツールを追加...
149+
},
150+
});
151+
```
152+
153+
### ストリーミング設定
154+
155+
スムーズなストリーミングレスポンスを実現するため、`smoothStream` を使用:
156+
157+
```typescript
158+
const stream = await agent.stream({
159+
messages,
160+
experimental_transform: smoothStream({
161+
delayInMs: 20, // チャンク間の遅延(デフォルト: 10ms)
162+
chunking: 'line', // チャンク分割方法: 'word' | 'line'(デフォルト: 'word')
163+
}),
164+
});
165+
```
166+
167+
### ステップ完了コールバック
168+
169+
各ステップ(ツール呼び出しや応答生成)完了時の処理:
170+
171+
```typescript
172+
const stream = await agent.stream({
173+
messages,
174+
onStepFinish: async ({ usage, finishReason, toolCalls }) => {
175+
// トークン使用量の記録
176+
logger.info('Step completed:', {
177+
inputTokens: usage.inputTokens,
178+
outputTokens: usage.outputTokens,
179+
finishReason, // 'stop' | 'length' | 'content-filter' | 'tool-calls' | 'error' | 'other'
180+
toolsUsed: toolCalls?.map(tc => tc.toolName),
181+
});
182+
},
183+
});
184+
```
185+
186+
### セッション管理
187+
188+
会話履歴はメモリ内に保持され、複数ターンの対話が可能:
189+
190+
```typescript
191+
const messages: ModelMessage[] = [];
192+
193+
// ユーザー入力を追加
194+
messages.push({ role: 'user', content: prompt });
195+
196+
// エージェント実行
197+
const stream = await agent.stream({ messages });
198+
199+
// アシスタント応答を履歴に追加
200+
messages.push({ role: 'assistant', content: response });
201+
```
202+
203+
**注意**: Lambdaのステートレス性により、セッションは同じLambdaインスタンス内でのみ保持されます。
204+
205+
## モデル設定
206+
207+
使用可能なモデルは `common-core` パッケージの `models` で定義されています。対応プラットフォーム:
208+
209+
- **AWS**: Amazon Bedrock
210+
- **Azure**: Azure OpenAI
211+
212+
## IAMポリシー
213+
214+
Lambda実行ロールには以下の権限が付与されています:
215+
216+
- `AWSLambdaExecute`
217+
- `CloudFrontReadOnlyAccess`
218+
- `bedrock:InvokeModel*`
219+
- `logs:PutLogEvents`
220+
221+
## ライセンス
222+
223+
MIT
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/usr/bin/env node
2+
import * as cdk from 'aws-cdk-lib/core';
3+
import { AgentAiSdkStack } from '../lib/agent-ai-sdk-stack.js';
4+
5+
const app = new cdk.App();
6+
const stack = new AgentAiSdkStack(app, 'agent-ai-sdk-stack', {
7+
});
8+
cdk.RemovalPolicies.of(stack).apply(cdk.RemovalPolicy.DESTROY);
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"acknowledged-issue-numbers": [
3+
34892
4+
]
5+
}

0 commit comments

Comments
 (0)