simple_node_characterai 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +89 -0
- package/dist/Auth/index.d.ts.map +1 -1
- package/dist/Auth/index.js +30 -20
- package/dist/Auth/index.js.map +1 -1
- package/dist/Chat/index.d.ts +8 -2
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/Chat/index.js +14 -9
- package/dist/Chat/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -45,6 +45,95 @@ import { authenticate, createNewConversation, sendMessage, getMessages, getProfi
|
|
|
45
45
|
})();
|
|
46
46
|
```
|
|
47
47
|
|
|
48
|
+
## Example with Hono Route Handler
|
|
49
|
+
```ts
|
|
50
|
+
import { Hono } from 'hono'
|
|
51
|
+
import { authenticate, createNewConversation, sendMessage, getMessages, getProfile } from 'simple_node_characterai';
|
|
52
|
+
|
|
53
|
+
const app = new Hono();
|
|
54
|
+
|
|
55
|
+
(async () => {
|
|
56
|
+
await authenticate(process.env.CHARACTERAI_TOKEN!);
|
|
57
|
+
})();
|
|
58
|
+
|
|
59
|
+
// Creates a new one-on-one conversation
|
|
60
|
+
// Body: { characterId: string } -> Response: { chatId: string }
|
|
61
|
+
app.post('/conversations', async (c) => {
|
|
62
|
+
try {
|
|
63
|
+
const body = await c.req.json();
|
|
64
|
+
const characterId = body?.characterId;
|
|
65
|
+
if (!characterId) return c.json({ error: 'characterId is required' }, 400);
|
|
66
|
+
const addTurn = await createNewConversation(characterId);
|
|
67
|
+
const chatId = addTurn.turn.turn_key.chat_id;
|
|
68
|
+
return c.json({ chatId });
|
|
69
|
+
} catch (e) {
|
|
70
|
+
return c.json({ error: 'failed to create conversation' }, 500);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// Sends a message to a conversation and returns the final content
|
|
75
|
+
// Body: { message: string, characterId: string, chatId: string }
|
|
76
|
+
// Make sure to store the characterId and chatId somewhere, like Database
|
|
77
|
+
// The messages field can be get in response.turn.candidates[0].raw_content
|
|
78
|
+
app.post('/messages', async (c) => {
|
|
79
|
+
try {
|
|
80
|
+
const body = await c.req.json();
|
|
81
|
+
const message = body?.message;
|
|
82
|
+
const characterId = body?.characterId;
|
|
83
|
+
const chatId = body?.chatId;
|
|
84
|
+
if (!message || !characterId || !chatId) {
|
|
85
|
+
return c.json({ error: 'message, characterId, and chatId are required' }, 400);
|
|
86
|
+
}
|
|
87
|
+
const response = await sendMessage(message, characterId, chatId);
|
|
88
|
+
const final = response.turn.candidates?.[0];
|
|
89
|
+
return c.json({
|
|
90
|
+
turn: response.turn,
|
|
91
|
+
content: final?.raw_content ?? null
|
|
92
|
+
});
|
|
93
|
+
} catch (e) {
|
|
94
|
+
return c.json({ error: 'failed to send message' }, 500);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
// Fetches up to 50 turns for the given chatId
|
|
99
|
+
// Optional query: ?token=NEXT_TOKEN for pagination
|
|
100
|
+
// Token will be available in meta field of response if there's more turns to fetch.
|
|
101
|
+
app.get('/messages/:chatId', async (c) => {
|
|
102
|
+
try {
|
|
103
|
+
const chatId = c.req.param('chatId');
|
|
104
|
+
const token = c.req.query('token') ?? undefined;
|
|
105
|
+
const messages = await getMessages(chatId, token);
|
|
106
|
+
return c.json({ turns: messages.turns, token: messages.meta.next_token });
|
|
107
|
+
} catch (e) {
|
|
108
|
+
return c.json({ error: 'failed to fetch messages' }, 500);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
export default app
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Find Authorization Token
|
|
116
|
+
<img width="795" height="550" alt="image" src="https://github.com/user-attachments/assets/fefe6262-00cb-4a1f-82da-51a4c96ef299" />
|
|
117
|
+
|
|
118
|
+
1. Logged in to [character.ai](https://character.ai)
|
|
119
|
+
2. Make sure to select any character first
|
|
120
|
+
3. Open the developer tools <code> F12, FN + F12, CTRL + SHIFT + I</code>
|
|
121
|
+
4. Go to `Application` tab
|
|
122
|
+
5. Navigate to Cookies section, and select https://character.ai cookies
|
|
123
|
+
6. Look up for `HTTP_AUTHORIZATION` token with string that starts with `Token `
|
|
124
|
+
7. If token doesn't present, refresh the page and see the token again
|
|
125
|
+
8. Copy the value
|
|
126
|
+
|
|
127
|
+
Sometimes the token will show up for a minutes and dissapear.
|
|
128
|
+
|
|
129
|
+
## Find Character ID and Chat ID
|
|
130
|
+
<img width="859" height="46" alt="image" src="https://github.com/user-attachments/assets/37f03b58-1cd0-436f-aa31-941fc2791620" />
|
|
131
|
+
|
|
132
|
+
Logged in to [character.ai](https://character.ai), and select a character you want to chat, then look up at URL, the URL contains the Character and Chat ID with following detail:
|
|
133
|
+
```
|
|
134
|
+
https://character.ai/chat/{characterId}?hist={chatId}
|
|
135
|
+
```
|
|
136
|
+
|
|
48
137
|
## API Reference
|
|
49
138
|
|
|
50
139
|
### Auth
|
package/dist/Auth/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAMtC;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAU,cAAc,MAAM,KAAI,OAAO,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAMtC;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAU,cAAc,MAAM,KAAI,OAAO,CAAC,IAAI,CAoBtE,CAAA;AAoBD;;;GAGG;AACH,eAAO,MAAM,UAAU,QAAQ,OAAe,CAAC"}
|
package/dist/Auth/index.js
CHANGED
|
@@ -11,20 +11,25 @@ let user = {};
|
|
|
11
11
|
* @returns Resolves when authentication and connection complete.
|
|
12
12
|
*/
|
|
13
13
|
const authenticate = async (sessionToken) => {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
14
|
+
try {
|
|
15
|
+
if (sessionToken.startsWith("Token "))
|
|
16
|
+
sessionToken = sessionToken.substring("Token ".length, sessionToken.length);
|
|
17
|
+
(0, api_1.updateToken)(sessionToken);
|
|
18
|
+
const req = await (0, api_1.request)("https://plus.character.ai/chat/user/settings/", {
|
|
19
|
+
method: "GET",
|
|
20
|
+
includeAuthorization: true
|
|
21
|
+
});
|
|
22
|
+
if (!req.ok)
|
|
23
|
+
throw Error("Invaild authentication token.");
|
|
24
|
+
await loadProfile();
|
|
25
|
+
await (0, Websocket_1.connect)({
|
|
26
|
+
edgeRollout: "60",
|
|
27
|
+
authorization: sessionToken
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
throw Error(`Failed to initialize Character AI, Error: ${error}`);
|
|
32
|
+
}
|
|
28
33
|
};
|
|
29
34
|
exports.authenticate = authenticate;
|
|
30
35
|
/**
|
|
@@ -33,12 +38,17 @@ exports.authenticate = authenticate;
|
|
|
33
38
|
* @returns Resolves when the profile has been populated.
|
|
34
39
|
*/
|
|
35
40
|
const loadProfile = async () => {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
41
|
+
try {
|
|
42
|
+
const result = await (0, api_1.request)("https://plus.character.ai/chat/user/", {
|
|
43
|
+
method: 'GET',
|
|
44
|
+
includeAuthorization: true
|
|
45
|
+
});
|
|
46
|
+
const profile = await result.json();
|
|
47
|
+
Object.assign(user, profile.user);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
throw Error(`Failed to load profile from Character AI, Error: ${error}`);
|
|
51
|
+
}
|
|
42
52
|
};
|
|
43
53
|
/**
|
|
44
54
|
* Returns the authenticated user's profile.
|
package/dist/Auth/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Auth/index.ts"],"names":[],"mappings":";;;AACA,4CAAuC;AACvC,gCAA8C;AAE9C,IAAI,IAAI,GAAY,EAAa,CAAC;AAElC;;;;;GAKG;AACI,MAAM,YAAY,GAAG,KAAK,EAAE,YAAoB,EAAkB,EAAE;IACvE,IAAI,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Auth/index.ts"],"names":[],"mappings":";;;AACA,4CAAuC;AACvC,gCAA8C;AAE9C,IAAI,IAAI,GAAY,EAAa,CAAC;AAElC;;;;;GAKG;AACI,MAAM,YAAY,GAAG,KAAK,EAAE,YAAoB,EAAkB,EAAE;IACvE,IAAI,CAAC;QACD,IAAI,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,YAAY,GAAG,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;QAEnH,IAAA,iBAAW,EAAC,YAAY,CAAC,CAAC;QAE1B,MAAM,GAAG,GAAG,MAAM,IAAA,aAAO,EAAC,+CAA+C,EAAE;YACvE,MAAM,EAAE,KAAK;YACb,oBAAoB,EAAE,IAAI;SAC7B,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAE1D,MAAM,WAAW,EAAE,CAAC;QACpB,MAAM,IAAA,mBAAO,EAAC;YACV,WAAW,EAAE,IAAI;YACjB,aAAa,EAAE,YAAY;SAC9B,CAAC,CAAC;IACP,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACtB,MAAM,KAAK,CAAC,6CAA6C,KAAK,EAAE,CAAC,CAAC;IACtE,CAAC;AACL,CAAC,CAAA;AApBY,QAAA,YAAY,gBAoBxB;AAED;;;;GAIG;AACH,MAAM,WAAW,GAAG,KAAK,IAAoB,EAAE;IAC3C,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAA,aAAO,EAAC,sCAAsC,EAAE;YACjE,MAAM,EAAE,KAAK;YACb,oBAAoB,EAAE,IAAI;SAC7B,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACtB,MAAM,KAAK,CAAC,oDAAoD,KAAK,EAAE,CAAC,CAAC;IAC7E,CAAC;AACL,CAAC,CAAA;AAED;;;GAGG;AACI,MAAM,UAAU,GAAG,GAAa,EAAE,CAAC,IAAI,CAAC;AAAlC,QAAA,UAAU,cAAwB"}
|
package/dist/Chat/index.d.ts
CHANGED
|
@@ -18,9 +18,15 @@ export declare const sendMessage: (message: string, characterId: string, chatId:
|
|
|
18
18
|
/**
|
|
19
19
|
* Retrieves up to 50 messages (turns) for a given chat.
|
|
20
20
|
* If a `token` is provided, it fetches the next page of results.
|
|
21
|
+
* Token can be null in the end of the chat.
|
|
21
22
|
* @param chatId - The ID of the chat whose messages are to be fetched.
|
|
22
23
|
* @param token - Optional pagination token for retrieving the next batch.
|
|
23
|
-
* @return Parsed JSON containing up to 50 messages.
|
|
24
|
+
* @return Parsed JSON containing up to 50 messages in turns field, and the token for pagination in meta field.
|
|
24
25
|
*/
|
|
25
|
-
export declare const getMessages: (chatId: string, token?: string) => Promise<
|
|
26
|
+
export declare const getMessages: (chatId: string, token?: string) => Promise<{
|
|
27
|
+
turns: Turn[];
|
|
28
|
+
meta: {
|
|
29
|
+
next_token: string | null;
|
|
30
|
+
};
|
|
31
|
+
}>;
|
|
26
32
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/Chat/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Chat/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAmD,kBAAkB,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAK3H;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAAU,aAAa,MAAM,KAAG,OAAO,CAAC,eAAe,CA0CxF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,GAAU,SAAS,MAAM,EAAE,aAAa,MAAM,EAAE,QAAQ,MAAM,KAAG,OAAO,CAAC,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Chat/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAmD,kBAAkB,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAK3H;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAAU,aAAa,MAAM,KAAG,OAAO,CAAC,eAAe,CA0CxF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,GAAU,SAAS,MAAM,EAAE,aAAa,MAAM,EAAE,QAAQ,MAAM,KAAG,OAAO,CAAC,kBAAkB,CAoFlH,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,GAAU,QAAQ,MAAM,EAAE,QAAQ,MAAM,KAAI,OAAO,CAAC;IACxE,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,IAAI,EAAE;QACF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAC5B,CAAA;CACJ,CAcA,CAAA"}
|
package/dist/Chat/index.js
CHANGED
|
@@ -76,7 +76,6 @@ const sendMessage = async (message, characterId, chatId) => {
|
|
|
76
76
|
throw Error('Character ID is required for sending message');
|
|
77
77
|
const websocket = (0, Websocket_1.getSocket)();
|
|
78
78
|
return new Promise((resolve, reject) => {
|
|
79
|
-
console.log('sending message');
|
|
80
79
|
const uuid = (0, uuid_1.v4)();
|
|
81
80
|
const profile = (0, Auth_1.getProfile)();
|
|
82
81
|
const request = {
|
|
@@ -159,18 +158,24 @@ exports.sendMessage = sendMessage;
|
|
|
159
158
|
/**
|
|
160
159
|
* Retrieves up to 50 messages (turns) for a given chat.
|
|
161
160
|
* If a `token` is provided, it fetches the next page of results.
|
|
161
|
+
* Token can be null in the end of the chat.
|
|
162
162
|
* @param chatId - The ID of the chat whose messages are to be fetched.
|
|
163
163
|
* @param token - Optional pagination token for retrieving the next batch.
|
|
164
|
-
* @return Parsed JSON containing up to 50 messages.
|
|
164
|
+
* @return Parsed JSON containing up to 50 messages in turns field, and the token for pagination in meta field.
|
|
165
165
|
*/
|
|
166
166
|
const getMessages = async (chatId, token) => {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
167
|
+
try {
|
|
168
|
+
const query = token ? `?next_token=${encodeURIComponent(token)}` : '';
|
|
169
|
+
const req = await (0, api_1.request)(`https://neo.character.ai/turns/${chatId}/${query}`, {
|
|
170
|
+
method: 'GET',
|
|
171
|
+
includeAuthorization: true
|
|
172
|
+
});
|
|
173
|
+
const result = await req.json();
|
|
174
|
+
return result;
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
throw Error(`Failed to get messages, Error: ${error}`);
|
|
178
|
+
}
|
|
174
179
|
};
|
|
175
180
|
exports.getMessages = getMessages;
|
|
176
181
|
//# sourceMappingURL=index.js.map
|
package/dist/Chat/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Chat/index.ts"],"names":[],"mappings":";;;;;;AAAA,2DAAkC;AAClC,kCAAqC;AAErC,4CAAyC;AACzC,+BAA0B;AAC1B,gCAAiC;AAEjC;;;;;GAKG;AACI,MAAM,qBAAqB,GAAG,KAAK,EAAE,WAAmB,EAA4B,EAAE;IACzF,IAAI,CAAC,WAAW;QAAE,MAAM,KAAK,CAAC,wDAAwD,CAAC,CAAC;IACxF,MAAM,SAAS,GAAG,IAAA,qBAAS,GAAE,CAAC;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,MAAM,UAAU,GAAG,IAAA,SAAE,GAAE,CAAC;QACxB,MAAM,OAAO,GAAG,IAAA,iBAAU,GAAE,CAAC;QAC7B,MAAM,OAAO,GAAsB;YAC/B,OAAO,EAAE,aAAa;YACtB,UAAU;YACV,OAAO,EAAE;gBACL,IAAI,EAAE;oBACF,YAAY,EAAE,WAAW;oBACzB,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE;oBACtC,OAAO,EAAE,UAAU;oBACnB,IAAI,EAAE,iBAAiB;oBACvB,UAAU,EAAE,oBAAoB;iBACnC;gBACD,SAAS,EAAE,iBAAiB;gBAC5B,aAAa,EAAE,IAAI;aACtB;YACD,SAAS,EAAE,UAAU;SACxB,CAAC;QAEF,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,EAAE;YACpC,IAAI,CAAC;gBACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACrC,IAAI,QAAQ,CAAC,OAAO,KAAK,UAAU,IAAI,QAAQ,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;oBACxE,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,kBAAO,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;oBACvC,OAAO,CAAC,QAA2B,CAAC,CAAC;gBACzC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACd,CAAC,CAAC;QAEF,kBAAO,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,kBAAO,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YACvC,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACtD,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AA1CW,QAAA,qBAAqB,yBA0ChC;AAEF;;;;;;;GAOG;AACI,MAAM,WAAW,GAAG,KAAK,EAAE,OAAe,EAAE,WAAmB,EAAE,MAAc,EAA+B,EAAE;IACnH,IAAI,CAAC,OAAO;QAAE,MAAM,KAAK,CAAC,yCAAyC,CAAC,CAAC;IACrE,IAAI,CAAC,MAAM;QAAE,MAAM,KAAK,CAAC,yCAAyC,CAAC,CAAC;IACpE,IAAI,CAAC,WAAW;QAAE,MAAM,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAG,IAAA,qBAAS,GAAE,CAAC;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Chat/index.ts"],"names":[],"mappings":"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"}
|