返回提交历史
Added
README-DE.md
+726
-0
Modified
README.md
+12
-13
Added
etc/tool/translate_readme.py
+88
-0
XFEstudio/gpt4free
Add translate readme module Translate readme to german
ba9d5ed6
代码差异
3 个文件
+826
-13
@@ -1,3 +1,7 @@
1
<a href="./README-DE.md">
2
<img src="https://img.shields.io/badge/öffnen in-🇩🇪 deutsch-bleu.svg" alt="Öffnen en DE">
3
</a>
4
1
5

2
6
3
7
<a href='https://ko-fi.com/xtekky' target='_blank'><img height='35' style='border:0px;height:46px;' src='https://az743702.vo.msecnd.net/cdn/kofi3.png?v=0' border='0' alt='Buy Me a Coffee at ko-fi.com' />
@@ -245,12 +249,7 @@ for message in response:
245
249
246
250
##### Using Browser
247
251
248
Some providers using a browser to bypass the bot protection.
249
They using the selenium webdriver to control the browser.
250
The browser settings and the login data are saved in a custom directory.
251
If the headless mode is enabled, the browser windows are loaded invisibly.
252
For performance reasons, it is recommended to reuse the browser instances
253
and close them yourself at the end:
252
Some providers using a a browser to bypass the bot protection. They using the selenium webdriver to control the browser. The browser settings and the login data are saved in a custom directory. If the headless mode is enabled, the browser windows are loaded invisibly. For performance reasons, it is recommended to reuse the browser instances and close them yourself at the end:
254
253
255
254
```python
256
255
import g4f
@@ -266,16 +265,16 @@ from g4f.Provider import (
266
265
267
266
options = ChromeOptions()
268
267
options.add_argument("--incognito");
269
browser = Chrome(options=options, headless=True)
268
webdriver = Chrome(options=options, headless=True)
270
269
for idx in range(10):
271
270
response = g4f.ChatCompletion.create(
272
271
model=g4f.models.default,
273
272
provider=g4f.Provider.Phind,
274
273
messages=[{"role": "user", "content": "Suggest me a name."}],
275
browser=browser
274
webdriver=webdriver
276
275
)
277
276
print(f"{idx}:", response)
278
browser.quit()
277
webdriver.quit()
279
278
```
280
279
281
280
##### Cookies Required
@@ -605,7 +604,7 @@ if __name__ == "__main__":
605
604
606
605
#### Create Provider with AI Tool
607
606
608
Call in your terminal the "create_provider" script:
607
Call in your terminal the `create_provider.py` script:
609
608
```bash
610
609
python etc/tool/create_provider.py
611
610
```
@@ -628,8 +627,8 @@ from .base_provider import AsyncGeneratorProvider
628
627
629
628
class HogeService(AsyncGeneratorProvider):
630
629
url = "https://chat-gpt.com"
631
supports_gpt_35_turbo = True
632
630
working = True
631
supports_gpt_35_turbo = True
633
632
634
633
@classmethod
635
634
async def create_async_generator(
@@ -644,7 +643,7 @@ class HogeService(AsyncGeneratorProvider):
644
643
645
644
4. Here, you can adjust the settings, for example, if the website does support streaming, set `supports_stream` to `True`...
646
645
5. Write code to request the provider in `create_async_generator` and `yield` the response, _even if_ it's a one-time response, do not hesitate to look at other providers for inspiration
647
6. Add the Provider Name in [g4f/Provider/**init**.py](./g4f/Provider/__init__.py)
646
6. Add the Provider Name in [`g4f/Provider/__init__.py`](./g4f/Provider/__init__.py)
648
647
649
648
```py
650
649
from .HogeService import HogeService
@@ -708,7 +707,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
708
707
</td>
709
708
<td>
710
709
<img src="https://img.shields.io/badge/License-GNU_GPL_v3.0-red.svg"/> <br>
711
This project is licensed under <a href="./LICENSE">GNU_GPL_v3.0</a>. <img width=2300/>
710
This project is licensed under <a href="./LICENSE">GNU_GPL_v3.0</a>.
712
711
</td>
713
712
</tr>
714
713
</table>
@@ -0,0 +1,88 @@
1
2
import sys
3
from pathlib import Path
4
import asyncio
5
6
sys.path.append(str(Path(__file__).parent.parent.parent))
7
8
import g4f
9
g4f.debug.logging = True
10
from g4f.debug import access_token
11
provider = g4f.Provider.OpenaiChat
12
13
iso = "GE"
14
language = "german"
15
translate_prompt = f"""
16
Translate this markdown document to {language}.
17
Don't translate or change inline code examples.
18
```md
19
"""
20
keep_note = "Keep this: [!Note] as [!Note].\n"
21
blacklist = [
22
'## ©️ Copyright',
23
'## 🚀 Providers and Models',
24
'## 🔗 Related GPT4Free Projects'
25
]
26
whitelist = [
27
"### Other",
28
"### Models"
29
]
30
31
def read_text(text):
32
start = end = 0
33
new = text.strip().split('\n')
34
for i, line in enumerate(new):
35
if line.startswith('```'):
36
if not start:
37
start = i + 1
38
end = i
39
return '\n'.join(new[start:end]).strip()
40
41
async def translate(text):
42
prompt = translate_prompt + text.strip() + '\n```'
43
if "[!Note]" in text:
44
prompt = keep_note + prompt
45
result = read_text(await provider.create_async(
46
model="",
47
messages=[{"role": "user", "content": prompt}],
48
access_token=access_token
49
))
50
if text.endswith("```") and not result.endswith("```"):
51
result += "\n```"
52
return result
53
54
async def translate_part(part, i):
55
blacklisted = False
56
for headline in blacklist:
57
if headline in part:
58
blacklisted = True
59
if blacklisted:
60
lines = part.split('\n')
61
lines[0] = await translate(lines[0])
62
part = '\n'.join(lines)
63
for trans in whitelist:
64
if trans in part:
65
part = part.replace(trans, await translate(trans))
66
else:
67
part = await translate(part)
68
print(f"[{i}] translated")
69
return part
70
71
async def translate_readme(readme) -> str:
72
parts = readme.split('\n## ')
73
print(f"{len(parts)} parts...")
74
parts = await asyncio.gather(
75
*[translate_part("## " + part, i) for i, part in enumerate(parts)]
76
)
77
return "\n\n".join(parts)
78
79
with open("README.md", "r") as fp:
80
readme = fp.read()
81
82
print("Translate readme...")
83
readme = asyncio.run(translate_readme(readme))
84
85
file = f"README-{iso}.md"
86
with open(file, "w") as fp:
87
fp.write(readme)
88
print(f'"{file}" saved')