Skip to content

Commit 5c4f44b

Browse files
authoredJan 2, 2025
Merge branch 'develop' into goat-v2
2 parents dfabb52 + 9ea2449 commit 5c4f44b

File tree

11 files changed

+257
-109
lines changed

11 files changed

+257
-109
lines changed
 

‎README_KOR.md

+26-18
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,18 @@
1212

1313
## ✨ 기능
1414

15-
- 🛠 SNS 지원: 디스코드, 트위터, 텔레그램 모두 지원됩니다.
16-
- 🔗 다양한 모델 지원 (Llama, Grok, OpenAI, Anthropic 등)
17-
- 👥 다중 지원: 다중 에이전트 및 채팅방이 지원됩니다.
18-
- 📚 높은 유연성: 개발자가 쉽게 데이터를 추가하고, 이를 활용해 다양한 기능을 만들 수 있습니다.
19-
- 💾 검색 지원: 당신의 데이터와 작업을 쉽게 찾아볼 수 있도록, 검색 기능을 지원합니다.
20-
- 🚀 높은 확장성: 자신의 동작과 클라이언트를 만들어 기능을 확장할 수 있습니다.
21-
- ☁️ 다양한 AI 모델 지원: local Llama, OpenAI, Anthropic, Groq 등 다양한 AI 모델을 지원합니다
22-
- 📦 즐겁게 개발해 봐요!
15+
- 🛠 SNS 통합 지원: Discord, Twitter, Telegram을 모두 지원합니다.
16+
- 🔗 다양한 모델 호환: Llama, Grok, OpenAI, Anthropic 등 다양한 AI 모델을 지원합니다.
17+
- 👥 다중 에이전트 및 채팅방 지원: 여러 에이전트와 채팅방을 손쉽게 관리할 수 있습니다.
18+
- 📚 문서 처리 및 상호작용: 데이터를 손쉽게 추가하고 활용할 수 있는 기능을 제공합니다.
19+
- 💾 검색 가능한 메모리 및 문서 저장소: 데이터를 빠르고 간편하게 검색하고 액세스할 수 있습니다.
20+
- 🚀 높은 확장성: 사용자 정의 동작 및 클라이언트를 만들어 기능을 확장할 수 있습니다.
21+
- ☁️ 다양한 AI 모델 지원: Local Llama, OpenAI, Anthropic, Groq 등과 호환됩니다.
22+
- 📦 쉽게 시작하세요: 바로 작동하며 손쉽게 활용할 수 있습니다!
23+
24+
## 비디오 튜토리얼
25+
26+
[AI Agent Dev School](https://www.youtube.com/watch?v=ArptLpQiKfI&list=PLx5pnFXdPTRzWla0RaOxALTSTnVq53fKL)
2327

2428
## 🎯 eliza로 어떤걸 만들 수 있을까요?
2529

@@ -37,21 +41,25 @@
3741
- [Node.js 23.3+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)
3842
- [pnpm](https://pnpm.io/installation)
3943

40-
> **Windows 사용자 참고:** [WSL 2](https://learn.microsoft.com/en-us/windows/wsl/install-manual) 필요.
44+
> **Windows 사용자 참고:** [WSL 2](https://learn.microsoft.com/en-us/windows/wsl/install-manual)가 필요합니다.
4145
4246
### Starter 사용 (권장)
4347

4448
```bash
4549
git clone https://github.com/elizaos/eliza-starter.git
46-
50+
cd eliza-starter
4751
cp .env.example .env
48-
49-
pnpm i && pnpm start
52+
pnpm i && pnpm build && pnpm start
53+
```
54+
에이전트가 실행되면 마지막에 "pnpm start:client"를 실행하라는 메시지가 표시됩니다.
55+
다른 터미널을 열고 같은 디렉토리로 이동한 뒤 아래 명령어를 실행하세요. 표시된 URL을 열어 에이전트와 대화하세요.
56+
```bash
57+
pnpm start:client
5058
```
5159

52-
[문서](https://elizaos.github.io/eliza/)를 참고하여 Eliza를 커스마이징 방법을 확인하세요.
60+
[문서](https://elizaos.github.io/eliza/)를 참고하여 Eliza를 커스터마이징하는 방법을 배워보세요.
5361

54-
### 직접 실행하기 (경험자만 권장)
62+
### Eliza를 수동으로 실행하기 (경험자에게만 권장)
5563

5664
```bash
5765
# 리포지토리 클론
@@ -107,16 +115,16 @@ pnpm clean
107115

108116
#### 추가 요구 사항
109117

110-
시작 시 에러가 발생하면 Sharp를 설치해야 할 있습니다. 아래 명령어를 사용하여 설치하세요:
118+
시작할 때 오류가 발생하면 Sharp를 설치해야 할 수도 있습니다. 아래 명령어를 실행하여 설치하세요:
111119

112120
```
113121
pnpm install --include=optional sharp
114122
```
115123

116-
### Community & contact
124+
### 커뮤니티 & 문의
117125

118-
- [Github Issues](https://github.com/elizaos/eliza/issues). 용도: Eliza 사용 중 발견된 버그 리포트, 기능 제안.
119-
- [Discord](https://discord.gg/ai16z). 용도: 애플리케이션 공유 및 커뮤니티 활동.
126+
- [Github Issues](https://github.com/elizaos/eliza/issues). liza 사용 중 발견된 버그 보고 및 기능 제안에 적합합니다.
127+
- [Discord](https://discord.gg/ai16z). 애플리케이션 공유 및 커뮤니티와의 소통에 적합합니다.
120128

121129
## 컨트리뷰터
122130

‎packages/client-twitter/src/environment.ts

+62-49
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@ import { z, ZodError } from "zod";
33

44
export const DEFAULT_MAX_TWEET_LENGTH = 280;
55

6-
const twitterUsernameSchema = z.string()
7-
.min(1, 'An X/Twitter Username must be at least 1 characters long')
8-
.max(15, 'n X/Twitter Username cannot exceed 15 characters')
9-
.regex(/^[A-Za-z0-9_]*$/, 'n X Username can only contain letters, numbers, and underscores');
6+
const twitterUsernameSchema = z
7+
.string()
8+
.min(1, "An X/Twitter Username must be at least 1 characters long")
9+
.max(15, "An X/Twitter Username cannot exceed 15 characters")
10+
.regex(
11+
/^[A-Za-z0-9_]*$/,
12+
"An X Username can only contain letters, numbers, and underscores"
13+
);
1014

1115
/**
1216
* This schema defines all required/optional environment settings,
@@ -75,7 +79,10 @@ function parseTargetUsers(targetUsersStr?: string | null): string[] {
7579
.filter(Boolean);
7680
}
7781

78-
function safeParseInt(value: string | undefined | null, defaultValue: number): number {
82+
function safeParseInt(
83+
value: string | undefined | null,
84+
defaultValue: number
85+
): number {
7986
if (!value) return defaultValue;
8087
const parsed = parseInt(value, 10);
8188
return isNaN(parsed) ? defaultValue : Math.max(1, parsed);
@@ -90,13 +97,15 @@ function safeParseInt(value: string | undefined | null, defaultValue: number): n
9097

9198
// we also do a lot of typing/parsing here
9299
// so we can do it once and only once per character
93-
export async function validateTwitterConfig(runtime: IAgentRuntime): Promise<TwitterConfig> {
100+
export async function validateTwitterConfig(
101+
runtime: IAgentRuntime
102+
): Promise<TwitterConfig> {
94103
try {
95104
const twitterConfig = {
96105
TWITTER_DRY_RUN:
97106
parseBooleanFromText(
98107
runtime.getSetting("TWITTER_DRY_RUN") ||
99-
process.env.TWITTER_DRY_RUN
108+
process.env.TWITTER_DRY_RUN
100109
) ?? false, // parseBooleanFromText return null if "", map "" to false
101110

102111
TWITTER_USERNAME:
@@ -111,80 +120,84 @@ export async function validateTwitterConfig(runtime: IAgentRuntime): Promise<Twi
111120
runtime.getSetting("TWITTER_EMAIL") ||
112121
process.env.TWITTER_EMAIL,
113122

114-
MAX_TWEET_LENGTH: // number as string?
115-
safeParseInt(
116-
runtime.getSetting("MAX_TWEET_LENGTH") ||
123+
// number as string?
124+
MAX_TWEET_LENGTH: safeParseInt(
125+
runtime.getSetting("MAX_TWEET_LENGTH") ||
117126
process.env.MAX_TWEET_LENGTH,
118-
DEFAULT_MAX_TWEET_LENGTH
119-
),
127+
DEFAULT_MAX_TWEET_LENGTH
128+
),
120129

121130
TWITTER_SEARCH_ENABLE:
122131
parseBooleanFromText(
123132
runtime.getSetting("TWITTER_SEARCH_ENABLE") ||
124-
process.env.TWITTER_SEARCH_ENABLE
133+
process.env.TWITTER_SEARCH_ENABLE
125134
) ?? false,
126135

127-
TWITTER_2FA_SECRET: // string passthru
136+
// string passthru
137+
TWITTER_2FA_SECRET:
128138
runtime.getSetting("TWITTER_2FA_SECRET") ||
129-
process.env.TWITTER_2FA_SECRET || "",
139+
process.env.TWITTER_2FA_SECRET ||
140+
"",
130141

131-
TWITTER_RETRY_LIMIT: // int
132-
safeParseInt(
133-
runtime.getSetting("TWITTER_RETRY_LIMIT") ||
142+
// int
143+
TWITTER_RETRY_LIMIT: safeParseInt(
144+
runtime.getSetting("TWITTER_RETRY_LIMIT") ||
134145
process.env.TWITTER_RETRY_LIMIT,
135-
5
136-
),
146+
5
147+
),
137148

138-
TWITTER_POLL_INTERVAL: // int in seconds
139-
safeParseInt(
140-
runtime.getSetting("TWITTER_POLL_INTERVAL") ||
149+
// int in seconds
150+
TWITTER_POLL_INTERVAL: safeParseInt(
151+
runtime.getSetting("TWITTER_POLL_INTERVAL") ||
141152
process.env.TWITTER_POLL_INTERVAL,
142-
120 // 2m
143-
),
153+
120 // 2m
154+
),
144155

145-
TWITTER_TARGET_USERS: // comma separated string
146-
parseTargetUsers(
147-
runtime.getSetting("TWITTER_TARGET_USERS") ||
156+
// comma separated string
157+
TWITTER_TARGET_USERS: parseTargetUsers(
158+
runtime.getSetting("TWITTER_TARGET_USERS") ||
148159
process.env.TWITTER_TARGET_USERS
149-
),
160+
),
150161

151-
POST_INTERVAL_MIN: // int in minutes
152-
safeParseInt(
153-
runtime.getSetting("POST_INTERVAL_MIN") ||
162+
// int in minutes
163+
POST_INTERVAL_MIN: safeParseInt(
164+
runtime.getSetting("POST_INTERVAL_MIN") ||
154165
process.env.POST_INTERVAL_MIN,
155-
90 // 1.5 hours
156-
),
166+
90 // 1.5 hours
167+
),
157168

158-
POST_INTERVAL_MAX: // int in minutes
159-
safeParseInt(
160-
runtime.getSetting("POST_INTERVAL_MAX") ||
169+
// int in minutes
170+
POST_INTERVAL_MAX: safeParseInt(
171+
runtime.getSetting("POST_INTERVAL_MAX") ||
161172
process.env.POST_INTERVAL_MAX,
162-
180 // 3 hours
163-
),
173+
180 // 3 hours
174+
),
164175

165-
ENABLE_ACTION_PROCESSING: // bool
176+
// bool
177+
ENABLE_ACTION_PROCESSING:
166178
parseBooleanFromText(
167179
runtime.getSetting("ENABLE_ACTION_PROCESSING") ||
168-
process.env.ENABLE_ACTION_PROCESSING
180+
process.env.ENABLE_ACTION_PROCESSING
169181
) ?? false,
170182

171-
ACTION_INTERVAL: // init in minutes (min 1m)
172-
safeParseInt(
173-
runtime.getSetting("ACTION_INTERVAL") ||
183+
// init in minutes (min 1m)
184+
ACTION_INTERVAL: safeParseInt(
185+
runtime.getSetting("ACTION_INTERVAL") ||
174186
process.env.ACTION_INTERVAL,
175-
5 // 5 minutes
176-
),
187+
5 // 5 minutes
188+
),
177189

178-
POST_IMMEDIATELY: // bool
190+
// bool
191+
POST_IMMEDIATELY:
179192
parseBooleanFromText(
180193
runtime.getSetting("POST_IMMEDIATELY") ||
181-
process.env.POST_IMMEDIATELY
194+
process.env.POST_IMMEDIATELY
182195
) ?? false,
183196

184197
TWITTER_SPACES_ENABLE:
185198
parseBooleanFromText(
186199
runtime.getSetting("TWITTER_SPACES_ENABLE") ||
187-
process.env.TWITTER_SPACES_ENABLE
200+
process.env.TWITTER_SPACES_ENABLE
188201
) ?? false,
189202
};
190203

‎packages/core/src/generation.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ export async function generateText({
187187
elizaLogger.debug(
188188
`Trimming context to max length of ${max_context_length} tokens.`
189189
);
190-
context = await trimTokens(context, max_context_length, "gpt-4o");
190+
context = trimTokens(context, max_context_length, "gpt-4o");
191191

192192
let response: string;
193193

‎packages/plugin-evm/src/actions/transfer.ts

+13-13
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { ByteArray, formatEther, parseEther, type Hex } from "viem";
22
import {
3+
Action,
34
composeContext,
45
generateObjectDeprecated,
56
HandlerCallback,
@@ -13,8 +14,6 @@ import { initWalletProvider, WalletProvider } from "../providers/wallet";
1314
import type { Transaction, TransferParams } from "../types";
1415
import { transferTemplate } from "../templates";
1516

16-
export { transferTemplate };
17-
1817
// Exported for tests
1918
export class TransferAction {
2019
constructor(private walletProvider: WalletProvider) {}
@@ -72,21 +71,17 @@ const buildTransferDetails = async (
7271
runtime: IAgentRuntime,
7372
wp: WalletProvider
7473
): Promise<TransferParams> => {
74+
const chains = Object.keys(wp.chains);
75+
state.supportedChains = chains.map((item) => `"${item}"`).join("|");
76+
7577
const context = composeContext({
7678
state,
7779
template: transferTemplate,
7880
});
7981

80-
const chains = Object.keys(wp.chains);
81-
82-
const contextWithChains = context.replace(
83-
"SUPPORTED_CHAINS",
84-
chains.map((item) => `"${item}"`).join("|")
85-
);
86-
8782
const transferDetails = (await generateObjectDeprecated({
8883
runtime,
89-
context: contextWithChains,
84+
context,
9085
modelClass: ModelClass.SMALL,
9186
})) as TransferParams;
9287

@@ -104,16 +99,22 @@ const buildTransferDetails = async (
10499
return transferDetails;
105100
};
106101

107-
export const transferAction = {
102+
export const transferAction: Action = {
108103
name: "transfer",
109104
description: "Transfer tokens between addresses on the same chain",
110105
handler: async (
111106
runtime: IAgentRuntime,
112-
_message: Memory,
107+
message: Memory,
113108
state: State,
114109
_options: any,
115110
callback?: HandlerCallback
116111
) => {
112+
if (!state) {
113+
state = (await runtime.composeState(message)) as State;
114+
} else {
115+
state = await runtime.updateRecentMessageState(state);
116+
}
117+
117118
console.log("Transfer action handler called");
118119
const walletProvider = await initWalletProvider(runtime);
119120
const action = new TransferAction(walletProvider);
@@ -151,7 +152,6 @@ export const transferAction = {
151152
return false;
152153
}
153154
},
154-
template: transferTemplate,
155155
validate: async (runtime: IAgentRuntime) => {
156156
const privateKey = runtime.getSetting("EVM_PRIVATE_KEY");
157157
return typeof privateKey === "string" && privateKey.startsWith("0x");

0 commit comments

Comments
 (0)