Skip to content

Commit

Permalink
Merge pull request #28 from ogios/master
Browse files Browse the repository at this point in the history
Add functions to login in into huggingface and grant auth to huggingchat
  • Loading branch information
Soulter authored Jun 2, 2023
2 parents 11e2362 + 7399ba7 commit 8470c1d
Show file tree
Hide file tree
Showing 5 changed files with 306 additions and 80 deletions.
43 changes: 26 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,33 +10,33 @@ HuggingChat Python API

Leave a star :)

> When you use this project, it means that you have agreed to the following two requirements of the HuggingChat:
> When you use this project, it means that you have agreed to the following two requirements of the HuggingChat:
>
> 1. AI is an area of active research with known problems such as biased generation and misinformation. Do not use this application for high-stakes decisions or advice.
> 1. AI is an area of active research with known problems such as biased generation and misinformation. Do not use this application for high-stakes decisions or advice.
> 2. Your conversations will be shared with model authors.
**Server resources are precious, it is not recommended to request this API in a high frequency.**
**Server resources are precious, it is not recommended to request this API in a high frequency.**

(`Hugging Face's CTO🤗` just liked the suggestion)

<div align="center"><img width=500 src="https://github.com/Soulter/hugging-chat-api/assets/37870767/06e64501-02fb-4d4a-ab6f-cf18d8638ace"></img></div>



## Authentication (Required Now)

### Cookies
### Get Cookies

<details>
<summary>How to Get Cookies ?</summary>
```python
from hugchat.login import Login

- Install the `Cookie-Editor` extension for [Chrome](https://chrome.google.com/webstore/detail/cookie-editor/hlkenndednhfkekhgcdicdfddnkalmdm) or [Firefox](https://addons.mozilla.org/en-US/firefox/addon/cookie-editor/)
- Go to [HuggingChat](https://huggingface.co/chat) and **login**
- Open the extension
- Click `Export` on the bottom right, then `Export as JSON`(This saves your cookies to the clipboard)
- Paste your cookies into a file `cookies.json`
# login
sign = Login(email, passwd)
cookies = sign.login()
sign.saveCookies()

</details>
# load cookies from usercookies/<email>.json
sign = login(email, None)
cookies = sign.loadCookies() # This will detect if the JSON file exists, return cookies if it does and raise an Exception if it's not.
```

## Usage

Expand All @@ -48,7 +48,17 @@ pip install hugchat

```py
from hugchat import hugchat
chatbot = hugchat.ChatBot(cookie_path="cookies.json") # or cookies=[...]
from hugchat.login import Login

# Log in to huggingface and grant authorization to huggingchat
sign = Login(email, passwd)
cookies = sign.login()

# Save cookies to usercookies/<email>.json
sign.saveCookies()

# Create a ChatBot
chatbot = hugchat.ChatBot(cookies=cookies.get_dict()) # or cookie_path="usercookies/<email>.json"
print(chatbot.chat("HI"))

# Create a new conversation
Expand All @@ -69,7 +79,7 @@ The `chat()` function receives these parameters:
- `truncate`: Optional[int]. Default is 1024
- `watermark`: Optional[bool]. Default is False
- `max_new_tokens`: Optional[int]. Default is 1024
- `stop`: Optional[list]. Default is ["</s>"]
- `stop`: Optional[list]. Default is ["`</s>`"]
- `return_full_text`: Optional[bool]. Default is False
- `stream`: Optional[bool]. Default is True
- `use_cache`: Optional[bool]. Default is False
Expand All @@ -96,4 +106,3 @@ Commands in cli mode:
## Disclaimers

This is not an official [Hugging Face](https://huggingface.co/) product. This is a **personal project** and is not affiliated with [Hugging Face](https://huggingface.co/) in any way. Don't sue us.

41 changes: 27 additions & 14 deletions README_cn.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,21 @@ HuggingChat Python API

## 鉴权 (必需)

### Cookies
### 获取Cookies

<details>
<summary>如何提取Cookies</summary>
```python
from hugchat.login import Login

- 安装 [Chrome](https://chrome.google.com/webstore/detail/cookie-editor/hlkenndednhfkekhgcdicdfddnkalmdm)[Firefox](https://addons.mozilla.org/en-US/firefox/addon/cookie-editor/) 的 cookie editor 扩展
- 访问 [HuggingChat](https://huggingface.co/chat)**登录**
- 打开扩展程序
- 点击右下角的"导出" (将会把内容保存到你的剪贴板上)
- 把你剪贴板上的内容粘贴到 `cookies.json` 文件中
# 登录
sign = Login(email, passwd)
cookies = sign.login()
sign.saveCookies()

</details>
# 从 usercookies/<email>.json 中加载已保存的cookies
sign = login(email, None)
cookies = sign.loadCookies() # 这个方法会查询保存cookies的文件是否存在,存在就返回cookies,不存在就报错

```

## 使用方式

Expand All @@ -35,14 +38,24 @@ pip install hugchat

```py
from hugchat import hugchat
chatbot = hugchat.ChatBot(cookie_path="cookies.json") # 或者 cookies=[...]
print(chatbot.chat("Hello!"))
from hugchat.login import Login

# 登入huggingface授权huggingchat
sign = Login(email, passwd)
cookies = sign.login()

# 保存cookies至 usercookies/<email>.json
sign.saveCookies()

# 创建一个 ChatBot
chatbot = hugchat.ChatBot(cookies=cookies.get_dict()) # or cookie_path="usercookies/<email>.json"
print(chatbot.chat("HI"))

# 创建一个新的会话
# 创建一个新会话
id = chatbot.new_conversation()
chatbot.change_conversation(id)

# 获取会话列表
# 获取对话列表
conversation_list = chatbot.get_conversation_list()
```

Expand All @@ -56,7 +69,7 @@ conversation_list = chatbot.get_conversation_list()
- `truncate`: Optional[int]. Default is 1024
- `watermark`: Optional[bool]. Default is False
- `max_new_tokens`: Optional[int]. Default is 1024
- `stop`: Optional[list]. Default is ["</s>"]
- `stop`: Optional[list]. Default is ["`</s>`"]
- `return_full_text`: Optional[bool]. Default is False
- `stream`: Optional[bool]. Default is True
- `use_cache`: Optional[bool]. Default is False
Expand Down
107 changes: 106 additions & 1 deletion src/hugchat/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,112 @@
to start cli.
"""

from .hugchat import cli
from .hugchat import ChatBot
from .login import Login
import getpass
import argparse

EMAIL = ""
PASSWD = ""
CHECK_BEFORE_PASSWORD = True

def cli():
global EMAIL
global PASSWD
global CHECK_BEFORE_PASSWORD
print("-------HuggingChat-------")
print("Official Site: https://huggingface.co/chat")
print("1. AI is an area of active research with known problems such as biased generation and misinformation. Do not use this application for high-stakes decisions or advice.\n2. Your conversations will be shared with model authors.\nContinuing to use means that you accept the above points")
parser = argparse.ArgumentParser()
parser.add_argument(
"-u",
type=str,
help="Your huggingface account's email"
)
parser.add_argument(
"-p",
action="store_true",
help="Require Password to login"
)
args = parser.parse_args()
email = args.u
inputpass = args.p
cookies = None
if CHECK_BEFORE_PASSWORD:
if not email:
email = EMAIL
try:
cookies = Login(email, None).loadCookies()
except Exception as e:
pass
if not cookies or inputpass:
if not email:
if EMAIL:
if not PASSWD or inputpass:
PASSWD = getpass.getpass("Password: ")
email = EMAIL
passwd = PASSWD
else:
raise Exception("No email specified. Please use '-u' or set it in cli.py")
else:
if inputpass or not PASSWD:
passwd = getpass.getpass("Password: ")
else:
passwd = PASSWD

print(f"Sign in as :{email}")
sign = Login(email, passwd)
try:
cookies = sign.loadCookies()
except Exception as e:
print(e)
print("Logging in...")
cookies = sign.login()
sign.saveCookies()

chatbot = ChatBot(cookies=cookies)
running = True
while running:
question = input("> ")
if question == "/new":
cid = chatbot.new_conversation()
print("The new conversation ID is: " + cid)
chatbot.change_conversation(cid)
print("Conversation changed successfully.")
continue

elif question.startswith("/switch"):
try:
conversations = chatbot.get_conversation_list()
conversation_id = str(question.split(" ")[1] if len(question.split(" ")) > 1 else "")
if conversation_id not in conversations:
print("# Please enter a valid ID number.")
print(f"# Sessions include: {conversations}")
else:
chatbot.change_conversation(conversation_id)
print(f"# Conversation switched successfully to {conversation_id}")
except ValueError:
print("# Please enter a valid ID number\n")



elif question == "/ids":
id_list = list(chatbot.get_conversation_list())
[print(f"{id_list.index(i)+1} : {i}{' <active>' if chatbot.current_conversation == i else ''}") for i in id_list]

elif question in ["/exit", "/quit","/close"]:
running = False

elif question.startswith("/"):
print("# Invalid command")

elif question == "":
pass

else:
res = chatbot.chat(question)
print("< " + res)


if __name__ == '__main__':
cli()
52 changes: 4 additions & 48 deletions src/hugchat/hugchat.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
from requests import Session
import requests
import json
import os
import uuid
import logging

import re
import getpass

class ChatBot:

Expand Down Expand Up @@ -44,6 +46,7 @@ def __init__(
self.accepted_welcome_modal = False # Only when accepted, it can create a new conversation.
self.current_conversation = self.new_conversation()


def get_hc_session(self) -> Session:
session = Session()
# set cookies
Expand Down Expand Up @@ -261,52 +264,6 @@ def chat(
raise Exception(obj["error"])
return res_text

def cli():
print("-------HuggingChat-------")
print("Official Site: https://huggingface.co/chat")
print("1. AI is an area of active research with known problems such as biased generation and misinformation. Do not use this application for high-stakes decisions or advice.\n2. Your conversations will be shared with model authors.\nContinuing to use means that you accept the above points")
chatbot = ChatBot(cookie_path="cookies.json")
running = True
while running:
question = input("> ")
if question == "/new":
cid = chatbot.new_conversation()
print("The new conversation ID is: " + cid)
chatbot.change_conversation(cid)
print("Conversation changed successfully.")
continue

elif question.startswith("/switch"):
try:
conversations = chatbot.get_conversation_list()
conversation_id = str(question.split(" ")[1] if len(question.split(" ")) > 1 else "")
if conversation_id not in conversations:
print("# Please enter a valid ID number.")
print(f"# Sessions include: {conversations}")
else:
chatbot.change_conversation(conversation_id)
print(f"# Conversation switched successfully to {conversation_id}")
except ValueError:
print("# Please enter a valid ID number\n")



elif question == "/ids":
id_list = list(chatbot.get_conversation_list())
[print(f"{id_list.index(i)+1} : {i}{' <active>' if chatbot.current_conversation == i else ''}") for i in id_list]

elif question in ["/exit", "/quit","/close"]:
running = False

elif question.startswith("/"):
print("# Invalid command")

elif question == "":
pass

else:
res = chatbot.chat(question)
print("< " + res)


if __name__ == "__main__":
Expand All @@ -318,4 +275,3 @@ def cli():
sharelink = bot.share_conversation()
print(sharelink)

cli()
Loading

0 comments on commit 8470c1d

Please sign in to comment.