mirror of
https://github.com/danielmiessler/Fabric.git
synced 2026-01-09 22:38:10 -05:00
Compare commits
118 Commits
trying_som
...
v1.3.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
823f3b2f56 | ||
|
|
b11f6da045 | ||
|
|
485310661e | ||
|
|
ba163f02b2 | ||
|
|
3e5423abfe | ||
|
|
996d44a9b8 | ||
|
|
8ffb778b77 | ||
|
|
fab3193653 | ||
|
|
86f2e29882 | ||
|
|
1cec9d4407 | ||
|
|
35fa9f946f | ||
|
|
5cfeeedccc | ||
|
|
3c187bb319 | ||
|
|
e6ff430610 | ||
|
|
3ec5058f8d | ||
|
|
d17dafe46c | ||
|
|
077d62a053 | ||
|
|
46216ed90a | ||
|
|
c62524d356 | ||
|
|
39633984cb | ||
|
|
9a78e94ced | ||
|
|
4d36165db4 | ||
|
|
efa0abcfee | ||
|
|
53e3f3433b | ||
|
|
d8e03d5981 | ||
|
|
adeea67a2e | ||
|
|
a02b7861d8 | ||
|
|
70cbf8dda7 | ||
|
|
88e2964b57 | ||
|
|
e8d6d41546 | ||
|
|
44d779d7a7 | ||
|
|
5c6823e2d4 | ||
|
|
820adf1339 | ||
|
|
f5225df224 | ||
|
|
469c312c66 | ||
|
|
2d28b5b185 | ||
|
|
7de5c6ddef | ||
|
|
32b59e947f | ||
|
|
36b329edeb | ||
|
|
2bd7cd88d5 | ||
|
|
8b4da91579 | ||
|
|
0659bbaa0e | ||
|
|
566ba8a7bf | ||
|
|
d3cb685dcc | ||
|
|
290a1e7556 | ||
|
|
ebcff89fb0 | ||
|
|
eb734355bc | ||
|
|
f7fc18c625 | ||
|
|
2e491e010b | ||
|
|
eda0ee674e | ||
|
|
d0eb6b9c52 | ||
|
|
19ee68f372 | ||
|
|
2188041f7b | ||
|
|
8ad0e1ac52 | ||
|
|
73c505cad1 | ||
|
|
5c770a4fbd | ||
|
|
8f81d881e1 | ||
|
|
f419e1ec54 | ||
|
|
9939460ccf | ||
|
|
07c5bad937 | ||
|
|
2f8974835d | ||
|
|
6c50ee4845 | ||
|
|
a95aabe1ac | ||
|
|
654410530c | ||
|
|
6712759c50 | ||
|
|
5d5c4b3074 | ||
|
|
cdde4b8307 | ||
|
|
8e871028ad | ||
|
|
c7510c45c1 | ||
|
|
2acebfbf82 | ||
|
|
ea0e6884b0 | ||
|
|
24e1616864 | ||
|
|
d1463e9cc7 | ||
|
|
220bb4ef08 | ||
|
|
9b26ca625f | ||
|
|
d4c5504278 | ||
|
|
9efeb962cb | ||
|
|
d1757ae352 | ||
|
|
358427d89f | ||
|
|
5f882406ba | ||
|
|
6ee1a40a8b | ||
|
|
4e50bb497c | ||
|
|
c380917f32 | ||
|
|
5b8aa54558 | ||
|
|
a4aa67899f | ||
|
|
9fdf66c3ea | ||
|
|
dfb3d17d05 | ||
|
|
2f362ddf3e | ||
|
|
2ebb904183 | ||
|
|
3f9c2140d4 | ||
|
|
f12513fba5 | ||
|
|
b1c4271a7a | ||
|
|
06dab09396 | ||
|
|
6457cb42f4 | ||
|
|
c524eb6f9e | ||
|
|
a93d1fb9d5 | ||
|
|
cd93dfe278 | ||
|
|
caca2b728e | ||
|
|
b64b1cdef2 | ||
|
|
577abcdbc1 | ||
|
|
da39e3e708 | ||
|
|
c8e1c4d2ea | ||
|
|
8312e326e7 | ||
|
|
641d7a7248 | ||
|
|
ab790df827 | ||
|
|
79cda42110 | ||
|
|
d82acaff59 | ||
|
|
341c358260 | ||
|
|
d7fb8fe92d | ||
|
|
d2152b7da6 | ||
|
|
19dddd9ffd | ||
|
|
4562f0564b | ||
|
|
063c3ca7f0 | ||
|
|
4c56fd7866 | ||
|
|
573723cd9a | ||
|
|
6bbb0a5f2f | ||
|
|
65829c5c84 | ||
|
|
d294032347 |
@@ -1 +0,0 @@
|
||||
3.10
|
||||
97
README.md
97
README.md
@@ -26,7 +26,7 @@
|
||||
|
||||
## Navigation
|
||||
|
||||
- [Introduction Video](#introduction-video)
|
||||
- [Introduction Videos](#introduction-videos)
|
||||
- [What and Why](#what-and-why)
|
||||
- [Philosophy](#philosophy)
|
||||
- [Breaking problems into components](#breaking-problems-into-components)
|
||||
@@ -48,13 +48,18 @@
|
||||
<br />
|
||||
|
||||
> [!NOTE]
|
||||
> We are improving the project so quickly that you should update often. That means `git pull; ./setup.sh` in the main directory, and then sourcing your shell files and/or restarting your terminal.
|
||||
> We are adding functionality to the project so often that you should update often as well. That means: `git pull; pipx upgrade fabric; fabric --update; source ~/.zshrc (or ~/.bashrc)` in the main directory!
|
||||
|
||||
## Introduction video
|
||||
**March 13, 2024** — We just added `pipx` install support, which makes it way easier to install Fabric, support for Claude, local models via Ollama, and a number of new Patterns. Be sure to update and check `fabric -h` for the latest!
|
||||
|
||||
## Introduction videos
|
||||
|
||||
<div align="center">
|
||||
<a href="https://youtu.be/wPEyyigh10g">
|
||||
<img width="972" alt="fabric_intro_video" src="https://github.com/danielmiessler/fabric/assets/50654/1eb1b9be-0bab-4c77-8ed2-ed265e8a3435">
|
||||
<img width="972" alt="fabric_intro_video" src="https://github.com/danielmiessler/fabric/assets/50654/1eb1b9be-0bab-4c77-8ed2-ed265e8a3435"></a>
|
||||
<br /><br />
|
||||
<a href="http://www.youtube.com/watch?feature=player_embedded&v=lEXd6TXPw7E target="_blank">
|
||||
<img src="http://img.youtube.com/vi/lEXd6TXPw7E/mqdefault.jpg" alt="Watch the video" width="972" " />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@@ -146,40 +151,39 @@ git clone https://github.com/danielmiessler/fabric.git
|
||||
cd fabric
|
||||
```
|
||||
|
||||
4. Ensure the `setup.sh` script is executable. If you're not sure, you can make it executable by running the following command:
|
||||
4. Install pipx:
|
||||
|
||||
macOS:
|
||||
|
||||
```bash
|
||||
chmod +x setup.sh
|
||||
brew install pipx
|
||||
```
|
||||
|
||||
5. Install poetry
|
||||
|
||||
ref.: https://python-poetry.org/docs/#installing-with-the-official-installer
|
||||
Linux:
|
||||
|
||||
```bash
|
||||
curl -sSL https://install.python-poetry.org | python3 -
|
||||
sudo apt install pipx
|
||||
```
|
||||
|
||||
6. Run the `setup.sh`, which will do the following:
|
||||
Windows:
|
||||
|
||||
- Installs python dependencies.
|
||||
- Creates aliases in your OS. It should update `~/.bashrc`, `/.zshrc`, and `~/.bash_profile` if they are present in your file system.
|
||||
Use WSL and follow the Linux instructions.
|
||||
|
||||
5. Install fabric
|
||||
|
||||
```bash
|
||||
./setup.sh
|
||||
pipx install .
|
||||
```
|
||||
|
||||
7. Restart your shell to reload everything.
|
||||
|
||||
8. Set your `OPENAI_API_KEY`.
|
||||
6. Run setup:
|
||||
|
||||
```bash
|
||||
fabric --setup
|
||||
```
|
||||
|
||||
You'll be asked to enter your OpenAI API key, which will be written to `~/.config/fabric/.env`. Patterns will then be downloaded from Github, which will take a few moments.
|
||||
7. Restart your shell to reload everything.
|
||||
|
||||
9. Now you are up and running! You can test by pulling the help.
|
||||
8. Now you are up and running! You can test by running the help.
|
||||
|
||||
```bash
|
||||
# Making sure the paths are set up correctly
|
||||
@@ -197,8 +201,38 @@ Once you have it all set up, here's how to use it.
|
||||
`fabric -h`
|
||||
|
||||
```bash
|
||||
fabric [-h] [--text TEXT] [--copy] [--agents {trip_planner,ApiKeys}] [--output [OUTPUT]] [--stream] [--list] [--update] [--pattern PATTERN] [--setup] [--changeDefaultModel CHANGEDEFAULTMODEL] [--local]
|
||||
[--claude] [--model MODEL] [--listmodels] [--context]
|
||||
us the results in
|
||||
realtime. NOTE: You will not be able to pipe the
|
||||
output into another command.
|
||||
--list, -l List available patterns
|
||||
--clear Clears your persistent model choice so that you can
|
||||
once again use the --model flag
|
||||
--update, -u Update patterns. NOTE: This will revert the default
|
||||
model to gpt4-turbo. please run --changeDefaultModel
|
||||
to once again set default model
|
||||
--pattern PATTERN, -p PATTERN
|
||||
The pattern (prompt) to use
|
||||
--setup Set up your fabric instance
|
||||
--changeDefaultModel CHANGEDEFAULTMODEL
|
||||
Change the default model. For a list of available
|
||||
models, use the --listmodels flag.
|
||||
--model MODEL, -m MODEL
|
||||
Select the model to use. NOTE: Will not work if you
|
||||
have set a default model. please use --clear to clear
|
||||
persistence before using this flag
|
||||
--listmodels List all available models
|
||||
--remoteOllamaServer REMOTEOLLAMASERVER
|
||||
The URL of the remote ollamaserver to use. ONLY USE
|
||||
THIS if you are using a local ollama server in an non-
|
||||
deault location or port
|
||||
--context, -c Use Context file (context.md) to add context to your
|
||||
pattern
|
||||
age: fabric [-h] [--text TEXT] [--copy] [--agents {trip_planner,ApiKeys}]
|
||||
[--output [OUTPUT]] [--stream] [--list] [--clear] [--update]
|
||||
[--pattern PATTERN] [--setup]
|
||||
[--changeDefaultModel CHANGEDEFAULTMODEL] [--model MODEL]
|
||||
[--listmodels] [--remoteOllamaServer REMOTEOLLAMASERVER]
|
||||
[--context]
|
||||
|
||||
An open source framework for augmenting humans using AI.
|
||||
|
||||
@@ -207,23 +241,12 @@ options:
|
||||
--text TEXT, -t TEXT Text to extract summary from
|
||||
--copy, -C Copy the response to the clipboard
|
||||
--agents {trip_planner,ApiKeys}, -a {trip_planner,ApiKeys}
|
||||
Use an AI agent to help you with a task. Acceptable values are 'trip_planner' or 'ApiKeys'. This option cannot be used with any other flag.
|
||||
Use an AI agent to help you with a task. Acceptable
|
||||
values are 'trip_planner' or 'ApiKeys'. This option
|
||||
cannot be used with any other flag.
|
||||
--output [OUTPUT], -o [OUTPUT]
|
||||
Save the response to a file
|
||||
--stream, -s Use this option if you want to see the results in realtime. NOTE: You will not be able to pipe the output into another command.
|
||||
--list, -l List available patterns
|
||||
--update, -u Update patterns
|
||||
--pattern PATTERN, -p PATTERN
|
||||
The pattern (prompt) to use
|
||||
--setup Set up your fabric instance
|
||||
--changeDefaultModel CHANGEDEFAULTMODEL
|
||||
Change the default model. Your choice will be saved in ~/.config/fabric/.env). For a list of available models, use the --listmodels flag.
|
||||
--local, -L Use local LLM. Default is llama2
|
||||
--claude Use Claude AI
|
||||
--model MODEL, -m MODEL
|
||||
Select the model to use (GPT-4 by default for chatGPT and llama2 for Ollama)
|
||||
--listmodels List all available models
|
||||
--context, -c Use Context file (context.md) to add context to your pattern
|
||||
--stream, -s Use this option if you want to see
|
||||
```
|
||||
|
||||
#### Example commands
|
||||
@@ -273,8 +296,6 @@ The wisdom of crowds for the win.
|
||||
|
||||
But we go beyond just providing Patterns. We provide code for you to build your very own Fabric server and personal AI infrastructure!
|
||||
|
||||
To get started, just run the `./setup.sh` file and it'll set up the client, the API server, and the API server web interface. The output of the setup command will also tell you how to run the commands to start them.
|
||||
|
||||
## Structure
|
||||
|
||||
Fabric is themed off of, well… _fabric_—as in…woven materials. So, think blankets, quilts, patterns, etc. Here's the concept and structure:
|
||||
|
||||
91
helper_files/README.md
Normal file
91
helper_files/README.md
Normal file
@@ -0,0 +1,91 @@
|
||||
# Fabric Helpers
|
||||
|
||||
These are helper tools to work with Fabric. Examples include things like getting transcripts from media files, getting metadata about media, etc.
|
||||
|
||||
## yt (YouTube)
|
||||
|
||||
`yt` is a command that uses the YouTube API to pull transcripts, get video duration, and other functions. It's primary function is to get a transcript from a video that can then be stitched (piped) into other Fabric Patterns.
|
||||
|
||||
```bash
|
||||
usage: yt [-h] [--duration] [--transcript] [url]
|
||||
|
||||
vm (video meta) extracts metadata about a video, such as the transcript and the video's duration. By Daniel Miessler.
|
||||
|
||||
positional arguments:
|
||||
url YouTube video URL
|
||||
|
||||
options:
|
||||
-h, --help show this help message and exit
|
||||
--duration Output only the duration
|
||||
--transcript Output only the transcript
|
||||
```
|
||||
|
||||
## ts (Audio transcriptions)
|
||||
|
||||
'ts' is a command that uses the OpenApi Whisper API to transcribe audio files. Due to the context window, this tool uses pydub to split the files into 10 minute segments. for more information on pydub, please refer https://github.com/jiaaro/pydub
|
||||
|
||||
### installation
|
||||
|
||||
```bash
|
||||
|
||||
mac:
|
||||
brew install ffmpeg
|
||||
|
||||
linux:
|
||||
apt install ffmpeg
|
||||
|
||||
windows:
|
||||
download instructions https://www.ffmpeg.org/download.html
|
||||
```
|
||||
|
||||
````bash
|
||||
ts -h
|
||||
usage: ts [-h] audio_file
|
||||
|
||||
Transcribe an audio file.
|
||||
|
||||
positional arguments:
|
||||
audio_file The path to the audio file to be transcribed.
|
||||
|
||||
options:
|
||||
-h, --help show this help message and exit
|
||||
|
||||
## save
|
||||
|
||||
`save` is a "tee-like" utility to pipeline saving of content, while keeping the output stream intact. Can optionally generate "frontmatter" for PKM utilities like Obsidian via the
|
||||
"FABRIC_FRONTMATTER" environment variable
|
||||
|
||||
|
||||
|
||||
If you'd like to default variables, set them in `~/.config/fabric/.env`. `FABRIC_OUTPUT_PATH` needs to be set so `save` where to write. `FABRIC_FRONTMATTER_TAGS` is optional, but useful for tracking how tags have entered your PKM, if that's important to you.
|
||||
|
||||
### usage
|
||||
```bash
|
||||
usage: save [-h] [-t, TAG] [-n] [-s] [stub]
|
||||
|
||||
save: a "tee-like" utility to pipeline saving of content, while keeping the output stream intact. Can optionally generate "frontmatter" for PKM utilities like Obsidian via the
|
||||
"FABRIC_FRONTMATTER" environment variable
|
||||
|
||||
positional arguments:
|
||||
stub stub to describe your content. Use quotes if you have spaces. Resulting format is YYYY-MM-DD-stub.md by default
|
||||
|
||||
options:
|
||||
-h, --help show this help message and exit
|
||||
-t, TAG, --tag TAG add an additional frontmatter tag. Use this argument multiple timesfor multiple tags
|
||||
-n, --nofabric don't use the fabric tags, only use tags from --tag
|
||||
-s, --silent don't use STDOUT for output, only save to the file
|
||||
````
|
||||
|
||||
### example
|
||||
|
||||
```bash
|
||||
echo test | save --tag extra-tag stub-for-name
|
||||
test
|
||||
|
||||
$ cat ~/obsidian/Fabric/2024-03-02-stub-for-name.md
|
||||
---
|
||||
generation_date: 2024-03-02 10:43
|
||||
tags: fabric-extraction stub-for-name extra-tag
|
||||
---
|
||||
test
|
||||
```
|
||||
3
helper_files/__init__.py
Normal file
3
helper_files/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from ..installer.client.cli.ts import main as main_ts
|
||||
from ..installer.client.cli.yt import main as main_yt
|
||||
from ..installer.client.cli.save import cli as main_save
|
||||
@@ -1 +0,0 @@
|
||||
3.10
|
||||
@@ -1,52 +0,0 @@
|
||||
# Fabric Helpers
|
||||
|
||||
These are helper tools to work with Fabric. Examples include things like getting transcripts from media files, getting metadata about media, etc.
|
||||
|
||||
## yt (YouTube)
|
||||
|
||||
`yt` is a command that uses the YouTube API to pull transcripts, get video duration, and other functions. It's primary function is to get a transcript from a video that can then be stitched (piped) into other Fabric Patterns.
|
||||
|
||||
## ts (Audio transcriptions)
|
||||
|
||||
'ts' is a command that uses the OpenApi Whisper API to transcribe audio files. Due to the context window, this tool uses pydub to split the files into 10 minute segments. for more information on pydub, please refer https://github.com/jiaaro/pydub
|
||||
|
||||
### installation
|
||||
|
||||
```bash
|
||||
|
||||
mac:
|
||||
brew install ffmpeg
|
||||
|
||||
linux:
|
||||
apt install ffmpeg
|
||||
|
||||
windows:
|
||||
download instructions https://www.ffmpeg.org/download.html
|
||||
```
|
||||
|
||||
```bash
|
||||
usage: yt [-h] [--duration] [--transcript] [url]
|
||||
|
||||
vm (video meta) extracts metadata about a video, such as the transcript and the video's duration. By Daniel Miessler.
|
||||
|
||||
positional arguments:
|
||||
url YouTube video URL
|
||||
|
||||
options:
|
||||
-h, --help show this help message and exit
|
||||
--duration Output only the duration
|
||||
--transcript Output only the transcript
|
||||
```
|
||||
|
||||
```bash
|
||||
ts -h
|
||||
usage: ts [-h] audio_file
|
||||
|
||||
Transcribe an audio file.
|
||||
|
||||
positional arguments:
|
||||
audio_file The path to the audio file to be transcribed.
|
||||
|
||||
options:
|
||||
-h, --help show this help message and exit
|
||||
```
|
||||
@@ -1,4 +1,4 @@
|
||||
from .client.cli import main as cli
|
||||
from .client.cli import main as cli, main_save, main_ts, main_yt
|
||||
from .server import (
|
||||
run_api_server,
|
||||
run_webui_server,
|
||||
|
||||
@@ -1 +1,4 @@
|
||||
from .fabric import main
|
||||
from .yt import main as main_yt
|
||||
from .ts import main as main_ts
|
||||
from .save import cli as main_save
|
||||
|
||||
@@ -38,25 +38,22 @@ def main():
|
||||
"--list", "-l", help="List available patterns", action="store_true"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--update", "-u", help="Update patterns", action="store_true")
|
||||
"--update", "-u", help="Update patterns. NOTE: This will revert the default model to gpt4-turbo. please run --changeDefaultModel to once again set default model", action="store_true")
|
||||
parser.add_argument("--pattern", "-p", help="The pattern (prompt) to use")
|
||||
parser.add_argument(
|
||||
"--setup", help="Set up your fabric instance", action="store_true"
|
||||
)
|
||||
parser.add_argument('--changeDefaultModel',
|
||||
help="Change the default model. Your choice will be saved in ~/.config/fabric/.env). For a list of available models, use the --listmodels flag.")
|
||||
parser.add_argument(
|
||||
'--local', '-L', help="Use local LLM. Default is llama2", action="store_true")
|
||||
help="Change the default model. For a list of available models, use the --listmodels flag.")
|
||||
|
||||
parser.add_argument(
|
||||
"--claude", help="Use Claude AI", action="store_true")
|
||||
|
||||
parser.add_argument(
|
||||
"--model", "-m", help="Select the model to use (GPT-4 by default for chatGPT and llama2 for Ollama)", default="gpt-4-turbo-preview"
|
||||
"--model", "-m", help="Select the model to use. NOTE: Will not work if you have set a default model. please use --clear to clear persistence before using this flag"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--listmodels", help="List all available models", action="store_true"
|
||||
)
|
||||
parser.add_argument('--remoteOllamaServer',
|
||||
help='The URL of the remote ollamaserver to use. ONLY USE THIS if you are using a local ollama server in an non-deault location or port')
|
||||
parser.add_argument('--context', '-c',
|
||||
help="Use Context file (context.md) to add context to your pattern", action="store_true")
|
||||
|
||||
@@ -70,7 +67,7 @@ def main():
|
||||
os.makedirs(config)
|
||||
if args.setup:
|
||||
Setup().run()
|
||||
Alias()
|
||||
Alias().execute()
|
||||
sys.exit()
|
||||
if not os.path.exists(env_file) or not os.path.exists(config_patterns_directory):
|
||||
print("Please run --setup to set up your API key and download patterns.")
|
||||
@@ -101,13 +98,7 @@ def main():
|
||||
if not os.path.exists(os.path.join(config, "context.md")):
|
||||
print("Please create a context.md file in ~/.config/fabric")
|
||||
sys.exit()
|
||||
standalone = None
|
||||
if args.local:
|
||||
standalone = Standalone(args, args.pattern, local=True)
|
||||
elif args.claude:
|
||||
standalone = Standalone(args, args.pattern, claude=True)
|
||||
else:
|
||||
standalone = Standalone(args, args.pattern)
|
||||
standalone = Standalone(args, args.pattern)
|
||||
if args.list:
|
||||
try:
|
||||
direct = sorted(os.listdir(config_patterns_directory))
|
||||
@@ -118,9 +109,15 @@ def main():
|
||||
print("No patterns found")
|
||||
sys.exit()
|
||||
if args.listmodels:
|
||||
setup = Setup()
|
||||
allmodels = setup.fetch_available_models()
|
||||
for model in allmodels:
|
||||
gptmodels, localmodels, claudemodels = standalone.fetch_available_models()
|
||||
print("GPT Models:")
|
||||
for model in gptmodels:
|
||||
print(model)
|
||||
print("\nLocal Models:")
|
||||
for model in localmodels:
|
||||
print(model)
|
||||
print("\nClaude Models:")
|
||||
for model in claudemodels:
|
||||
print(model)
|
||||
sys.exit()
|
||||
if args.text is not None:
|
||||
@@ -128,20 +125,34 @@ def main():
|
||||
else:
|
||||
text = standalone.get_cli_input()
|
||||
if args.stream and not args.context:
|
||||
standalone.streamMessage(text)
|
||||
if args.remoteOllamaServer:
|
||||
standalone.streamMessage(text, host=args.remoteOllamaServer)
|
||||
else:
|
||||
standalone.streamMessage(text)
|
||||
sys.exit()
|
||||
if args.stream and args.context:
|
||||
with open(config_context, "r") as f:
|
||||
context = f.read()
|
||||
standalone.streamMessage(text, context=context)
|
||||
if args.remoteOllamaServer:
|
||||
standalone.streamMessage(
|
||||
text, context=context, host=args.remoteOllamaServer)
|
||||
else:
|
||||
standalone.streamMessage(text, context=context)
|
||||
sys.exit()
|
||||
elif args.context:
|
||||
with open(config_context, "r") as f:
|
||||
context = f.read()
|
||||
standalone.sendMessage(text, context=context)
|
||||
if args.remoteOllamaServer:
|
||||
standalone.sendMessage(
|
||||
text, context=context, host=args.remoteOllamaServer)
|
||||
else:
|
||||
standalone.sendMessage(text, context=context)
|
||||
sys.exit()
|
||||
else:
|
||||
standalone.sendMessage(text)
|
||||
if args.remoteOllamaServer:
|
||||
standalone.sendMessage(text, host=args.remoteOllamaServer)
|
||||
else:
|
||||
standalone.sendMessage(text)
|
||||
sys.exit()
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import pyperclip
|
||||
|
||||
pasted_text = pyperclip.paste()
|
||||
print(pasted_text)
|
||||
120
installer/client/cli/save.py
Executable file
120
installer/client/cli/save.py
Executable file
@@ -0,0 +1,120 @@
|
||||
import argparse
|
||||
import os
|
||||
import sys
|
||||
from datetime import datetime
|
||||
|
||||
from dotenv import load_dotenv
|
||||
|
||||
DEFAULT_CONFIG = "~/.config/fabric/.env"
|
||||
PATH_KEY = "FABRIC_OUTPUT_PATH"
|
||||
FM_KEY = "FABRIC_FRONTMATTER_TAGS"
|
||||
DATE_FORMAT = "%Y-%m-%d"
|
||||
load_dotenv(os.path.expanduser(DEFAULT_CONFIG))
|
||||
|
||||
|
||||
def main(tag, tags, silent, fabric):
|
||||
out = os.getenv(PATH_KEY)
|
||||
if out is None:
|
||||
print(f"'{PATH_KEY}' not set in {DEFAULT_CONFIG} or in your environment.")
|
||||
sys.exit(1)
|
||||
|
||||
out = os.path.expanduser(out)
|
||||
|
||||
if not os.path.isdir(out):
|
||||
print(f"'{out}' does not exist. Create it and try again.")
|
||||
sys.exit(1)
|
||||
|
||||
if not out.endswith("/"):
|
||||
out += "/"
|
||||
|
||||
if len(sys.argv) < 2:
|
||||
print(f"'{sys.argv[0]}' takes a single argument to tag your summary")
|
||||
sys.exit(1)
|
||||
|
||||
yyyymmdd = datetime.now().strftime(DATE_FORMAT)
|
||||
target = f"{out}{yyyymmdd}-{tag}.md"
|
||||
|
||||
# don't clobber existing files- add an incremented number to the end instead
|
||||
would_clobber = True
|
||||
inc = 0
|
||||
while would_clobber:
|
||||
if inc > 0:
|
||||
target = f"{out}{yyyymmdd}-{tag}-{inc}.md"
|
||||
if os.path.exists(target):
|
||||
inc += 1
|
||||
else:
|
||||
would_clobber = False
|
||||
|
||||
# YAML frontmatter stubs for things like Obsidian
|
||||
# Prevent a NoneType ending up in the tags
|
||||
frontmatter_tags = ""
|
||||
if fabric:
|
||||
frontmatter_tags = os.getenv(FM_KEY)
|
||||
|
||||
with open(target, "w") as fp:
|
||||
if frontmatter_tags or len(tags) != 0:
|
||||
fp.write("---\n")
|
||||
now = datetime.now().strftime(f"{DATE_FORMAT} %H:%M")
|
||||
fp.write(f"generation_date: {now}\n")
|
||||
fp.write(f"tags: {frontmatter_tags} {tag} {' '.join(tags)}\n")
|
||||
fp.write("---\n")
|
||||
|
||||
# function like 'tee' and split the output to a file and STDOUT
|
||||
for line in sys.stdin:
|
||||
if not silent:
|
||||
print(line, end="")
|
||||
fp.write(line)
|
||||
|
||||
|
||||
def cli():
|
||||
parser = argparse.ArgumentParser(
|
||||
description=(
|
||||
'save: a "tee-like" utility to pipeline saving of content, '
|
||||
"while keeping the output stream intact. Can optionally generate "
|
||||
'"frontmatter" for PKM utilities like Obsidian via the '
|
||||
'"FABRIC_FRONTMATTER" environment variable'
|
||||
)
|
||||
)
|
||||
parser.add_argument(
|
||||
"stub",
|
||||
nargs="?",
|
||||
help=(
|
||||
"stub to describe your content. Use quotes if you have spaces. "
|
||||
"Resulting format is YYYY-MM-DD-stub.md by default"
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
"-t,",
|
||||
"--tag",
|
||||
required=False,
|
||||
action="append",
|
||||
default=[],
|
||||
help=(
|
||||
"add an additional frontmatter tag. Use this argument multiple times"
|
||||
"for multiple tags"
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
"-n",
|
||||
"--nofabric",
|
||||
required=False,
|
||||
action="store_false",
|
||||
help="don't use the fabric tags, only use tags from --tag",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-s",
|
||||
"--silent",
|
||||
required=False,
|
||||
action="store_true",
|
||||
help="don't use STDOUT for output, only save to the file",
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.stub:
|
||||
main(args.stub, args.tag, args.silent, args.nofabric)
|
||||
else:
|
||||
parser.print_help()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
cli()
|
||||
@@ -1,6 +1,6 @@
|
||||
import requests
|
||||
import os
|
||||
from openai import OpenAI
|
||||
from openai import OpenAI, APIConnectionError
|
||||
import asyncio
|
||||
import pyperclip
|
||||
import sys
|
||||
@@ -17,7 +17,7 @@ env_file = os.path.join(config_directory, ".env")
|
||||
|
||||
|
||||
class Standalone:
|
||||
def __init__(self, args, pattern="", env_file="~/.config/fabric/.env", local=False, claude=False):
|
||||
def __init__(self, args, pattern="", env_file="~/.config/fabric/.env"):
|
||||
""" Initialize the class with the provided arguments and environment file.
|
||||
|
||||
Args:
|
||||
@@ -36,41 +36,48 @@ class Standalone:
|
||||
# Expand the tilde to the full path
|
||||
env_file = os.path.expanduser(env_file)
|
||||
load_dotenv(env_file)
|
||||
try:
|
||||
apikey = os.environ["OPENAI_API_KEY"]
|
||||
self.client = OpenAI()
|
||||
self.client.api_key = apikey
|
||||
except KeyError:
|
||||
print("OPENAI_API_KEY not found in environment variables.")
|
||||
|
||||
except FileNotFoundError:
|
||||
print("No API key found. Use the --apikey option to set the key")
|
||||
sys.exit()
|
||||
self.local = local
|
||||
assert 'OPENAI_API_KEY' in os.environ, "Error: OPENAI_API_KEY not found in environment variables. Please run fabric --setup and add a key."
|
||||
api_key = os.environ['OPENAI_API_KEY']
|
||||
base_url = os.environ.get(
|
||||
'OPENAI_BASE_URL', 'https://api.openai.com/v1/')
|
||||
self.client = OpenAI(api_key=api_key, base_url=base_url)
|
||||
self.local = False
|
||||
self.config_pattern_directory = config_directory
|
||||
self.pattern = pattern
|
||||
self.args = args
|
||||
self.model = args.model
|
||||
self.claude = claude
|
||||
try:
|
||||
self.model = os.environ["DEFAULT_MODEL"]
|
||||
except:
|
||||
if self.local:
|
||||
if self.args.model == 'gpt-4-turbo-preview':
|
||||
self.model = 'llama2'
|
||||
if self.claude:
|
||||
if self.args.model == 'gpt-4-turbo-preview':
|
||||
self.model = 'claude-3-opus-20240229'
|
||||
self.model = None
|
||||
if args.model:
|
||||
self.model = args.model
|
||||
else:
|
||||
try:
|
||||
self.model = os.environ["DEFAULT_MODEL"]
|
||||
except:
|
||||
self.model = 'gpt-4-turbo-preview'
|
||||
self.claude = False
|
||||
sorted_gpt_models, ollamaList, claudeList = self.fetch_available_models()
|
||||
self.local = self.model in ollamaList
|
||||
self.claude = self.model in claudeList
|
||||
|
||||
async def localChat(self, messages):
|
||||
async def localChat(self, messages, host=''):
|
||||
from ollama import AsyncClient
|
||||
response = await AsyncClient().chat(model=self.model, messages=messages)
|
||||
response = None
|
||||
if host:
|
||||
response = await AsyncClient(host=host).chat(model=self.model, messages=messages, host=host)
|
||||
else:
|
||||
response = await AsyncClient().chat(model=self.model, messages=messages)
|
||||
print(response['message']['content'])
|
||||
copy = self.args.copy
|
||||
if copy:
|
||||
pyperclip.copy(response['message']['content'])
|
||||
|
||||
async def localStream(self, messages):
|
||||
async def localStream(self, messages, host=''):
|
||||
from ollama import AsyncClient
|
||||
async for part in await AsyncClient().chat(model=self.model, messages=messages, stream=True):
|
||||
print(part['message']['content'], end='', flush=True)
|
||||
if host:
|
||||
async for part in await AsyncClient(host=host).chat(model=self.model, messages=messages, stream=True, host=host):
|
||||
print(part['message']['content'], end='', flush=True)
|
||||
else:
|
||||
async for part in await AsyncClient().chat(model=self.model, messages=messages, stream=True):
|
||||
print(part['message']['content'], end='', flush=True)
|
||||
|
||||
async def claudeStream(self, system, user):
|
||||
from anthropic import AsyncAnthropic
|
||||
@@ -88,7 +95,7 @@ class Standalone:
|
||||
|
||||
message = await stream.get_final_message()
|
||||
|
||||
async def claudeChat(self, system, user):
|
||||
async def claudeChat(self, system, user, copy=False):
|
||||
from anthropic import Anthropic
|
||||
self.claudeApiKey = os.environ["CLAUDE_API_KEY"]
|
||||
client = Anthropic(api_key=self.claudeApiKey)
|
||||
@@ -100,8 +107,11 @@ class Standalone:
|
||||
temperature=0.0, top_p=1.0
|
||||
)
|
||||
print(message.content[0].text)
|
||||
copy = self.args.copy
|
||||
if copy:
|
||||
pyperclip.copy(message.content[0].text)
|
||||
|
||||
def streamMessage(self, input_data: str, context=""):
|
||||
def streamMessage(self, input_data: str, context="", host=''):
|
||||
""" Stream a message and handle exceptions.
|
||||
|
||||
Args:
|
||||
@@ -141,7 +151,10 @@ class Standalone:
|
||||
messages = [user_message]
|
||||
try:
|
||||
if self.local:
|
||||
asyncio.run(self.localStream(messages))
|
||||
if host:
|
||||
asyncio.run(self.localStream(messages, host=host))
|
||||
else:
|
||||
asyncio.run(self.localStream(messages))
|
||||
elif self.claude:
|
||||
from anthropic import AsyncAnthropic
|
||||
asyncio.run(self.claudeStream(system, user_message))
|
||||
@@ -185,7 +198,7 @@ class Standalone:
|
||||
with open(self.args.output, "w") as f:
|
||||
f.write(buffer)
|
||||
|
||||
def sendMessage(self, input_data: str, context=""):
|
||||
def sendMessage(self, input_data: str, context="", host=''):
|
||||
""" Send a message using the input data and generate a response.
|
||||
|
||||
Args:
|
||||
@@ -224,7 +237,10 @@ class Standalone:
|
||||
messages = [user_message]
|
||||
try:
|
||||
if self.local:
|
||||
asyncio.run(self.localChat(messages))
|
||||
if host:
|
||||
asyncio.run(self.localChat(messages, host=host))
|
||||
else:
|
||||
asyncio.run(self.localChat(messages))
|
||||
elif self.claude:
|
||||
asyncio.run(self.claudeChat(system, user_message))
|
||||
else:
|
||||
@@ -237,6 +253,11 @@ class Standalone:
|
||||
presence_penalty=0.1,
|
||||
)
|
||||
print(response.choices[0].message.content)
|
||||
if self.args.copy:
|
||||
pyperclip.copy(response.choices[0].message.content)
|
||||
if self.args.output:
|
||||
with open(self.args.output, "w") as f:
|
||||
f.write(response.choices[0].message.content)
|
||||
except Exception as e:
|
||||
if "All connection attempts failed" in str(e):
|
||||
print(
|
||||
@@ -252,40 +273,45 @@ class Standalone:
|
||||
else:
|
||||
print(f"Error: {e}")
|
||||
print(e)
|
||||
if self.args.copy:
|
||||
pyperclip.copy(response.choices[0].message.content)
|
||||
if self.args.output:
|
||||
with open(self.args.output, "w") as f:
|
||||
f.write(response.choices[0].message.content)
|
||||
|
||||
def fetch_available_models(self):
|
||||
headers = {
|
||||
"Authorization": f"Bearer {self.client.api_key}"
|
||||
}
|
||||
gptlist = []
|
||||
fullOllamaList = []
|
||||
claudeList = ['claude-3-opus-20240229',
|
||||
'claude-3-sonnet-20240229',
|
||||
'claude-3-haiku-20240307',
|
||||
'claude-2.1']
|
||||
try:
|
||||
models = [model.id.strip()
|
||||
for model in self.client.models.list().data]
|
||||
except APIConnectionError as e:
|
||||
if getattr(e.__cause__, 'args', [''])[0] == "Illegal header value b'Bearer '":
|
||||
print("Error: Cannot connect to the OpenAI API Server because the API key is not set. Please run fabric --setup and add a key.")
|
||||
|
||||
response = requests.get(
|
||||
"https://api.openai.com/v1/models", headers=headers)
|
||||
|
||||
if response.status_code == 200:
|
||||
print("OpenAI GPT models:\n")
|
||||
models = response.json().get("data", [])
|
||||
# Filter only gpt models
|
||||
gpt_models = [model for model in models if model.get(
|
||||
"id", "").startswith(("gpt"))]
|
||||
# Sort the models alphabetically by their ID
|
||||
sorted_gpt_models = sorted(gpt_models, key=lambda x: x.get("id"))
|
||||
|
||||
for model in sorted_gpt_models:
|
||||
print(model.get("id"))
|
||||
print("\nLocal Ollama models:")
|
||||
import ollama
|
||||
ollamaList = ollama.list()['models']
|
||||
for model in ollamaList:
|
||||
print(model['name'].rstrip(":latest"))
|
||||
print("\nClaude models:")
|
||||
print("claude-3-opus-20240229")
|
||||
else:
|
||||
print(
|
||||
f"Error: {e.message} trying to access {e.request.url}: {getattr(e.__cause__, 'args', [''])}")
|
||||
sys.exit()
|
||||
except Exception as e:
|
||||
print(f"Error: {getattr(e.__context__, 'args', [''])[0]}")
|
||||
sys.exit()
|
||||
if "/" in models[0] or "\\" in models[0]:
|
||||
# lmstudio returns full paths to models. Iterate and truncate everything before and including the last slash
|
||||
gptlist = [item[item.rfind(
|
||||
"/") + 1:] if "/" in item else item[item.rfind("\\") + 1:] for item in models]
|
||||
else:
|
||||
print(f"Failed to fetch models: HTTP {response.status_code}")
|
||||
# Keep items that start with "gpt"
|
||||
gptlist = [item.strip()
|
||||
for item in models if item.startswith("gpt")]
|
||||
gptlist.sort()
|
||||
import ollama
|
||||
try:
|
||||
default_modelollamaList = ollama.list()['models']
|
||||
for model in default_modelollamaList:
|
||||
fullOllamaList.append(model['name'])
|
||||
except:
|
||||
fullOllamaList = []
|
||||
return gptlist, fullOllamaList, claudeList
|
||||
|
||||
def get_cli_input(self):
|
||||
""" aided by ChatGPT; uses platform library
|
||||
@@ -331,6 +357,17 @@ class Update:
|
||||
if os.path.exists(patterns_source_path):
|
||||
# If the patterns directory already exists, remove it before copying over the new one
|
||||
if os.path.exists(self.pattern_directory):
|
||||
old_pattern_contents = os.listdir(self.pattern_directory)
|
||||
new_pattern_contents = os.listdir(patterns_source_path)
|
||||
custom_patterns = []
|
||||
for pattern in old_pattern_contents:
|
||||
if pattern not in new_pattern_contents:
|
||||
custom_patterns.append(pattern)
|
||||
if custom_patterns:
|
||||
for pattern in custom_patterns:
|
||||
custom_path = os.path.join(
|
||||
self.pattern_directory, pattern)
|
||||
shutil.move(custom_path, patterns_source_path)
|
||||
shutil.rmtree(self.pattern_directory)
|
||||
shutil.copytree(patterns_source_path, self.pattern_directory)
|
||||
print("Patterns updated successfully.")
|
||||
@@ -356,57 +393,15 @@ class Update:
|
||||
class Alias:
|
||||
def __init__(self):
|
||||
self.config_files = []
|
||||
home_directory = os.path.expanduser("~")
|
||||
self.patterns = os.path.join(home_directory, ".config/fabric/patterns")
|
||||
if os.path.exists(os.path.join(home_directory, ".bashrc")):
|
||||
self.config_files.append(os.path.join(home_directory, ".bashrc"))
|
||||
if os.path.exists(os.path.join(home_directory, ".zshrc")):
|
||||
self.config_files.append(os.path.join(home_directory, ".zshrc"))
|
||||
if os.path.exists(os.path.join(home_directory, ".bash_profile")):
|
||||
self.config_files.append(os.path.join(
|
||||
home_directory, ".bash_profile"))
|
||||
self.remove_all_patterns()
|
||||
self.add_patterns()
|
||||
print('Aliases added successfully. Please restart your terminal to use them.')
|
||||
self.home_directory = os.path.expanduser("~")
|
||||
patternsFolder = os.path.join(
|
||||
self.home_directory, ".config/fabric/patterns")
|
||||
self.patterns = os.listdir(patternsFolder)
|
||||
|
||||
def add(self, name, alias):
|
||||
for file in self.config_files:
|
||||
with open(file, "a") as f:
|
||||
f.write(f"alias {name}='{alias}'\n")
|
||||
|
||||
def remove(self, pattern):
|
||||
for file in self.config_files:
|
||||
# Read the whole file first
|
||||
with open(file, "r") as f:
|
||||
wholeFile = f.read()
|
||||
|
||||
# Determine if the line to be removed is in the file
|
||||
target_line = f"alias {pattern}='fabric --pattern {pattern}'\n"
|
||||
if target_line in wholeFile:
|
||||
# If the line exists, replace it with nothing (remove it)
|
||||
wholeFile = wholeFile.replace(target_line, "")
|
||||
|
||||
# Write the modified content back to the file
|
||||
with open(file, "w") as f:
|
||||
f.write(wholeFile)
|
||||
|
||||
def remove_all_patterns(self):
|
||||
allPatterns = os.listdir(self.patterns)
|
||||
for pattern in allPatterns:
|
||||
self.remove(pattern)
|
||||
|
||||
def find_line(self, name):
|
||||
for file in self.config_files:
|
||||
with open(file, "r") as f:
|
||||
lines = f.readlines()
|
||||
for line in lines:
|
||||
if line.strip("\n") == f"alias ${name}='{alias}'":
|
||||
return line
|
||||
|
||||
def add_patterns(self):
|
||||
allPatterns = os.listdir(self.patterns)
|
||||
for pattern in allPatterns:
|
||||
self.add(pattern, f"fabric --pattern {pattern}")
|
||||
def execute(self):
|
||||
with open(os.path.join(self.home_directory, ".config/fabric/fabric-bootstrap.inc"), "w") as w:
|
||||
for pattern in self.patterns:
|
||||
w.write(f"alias {pattern}='fabric --pattern {pattern}'\n")
|
||||
|
||||
|
||||
class Setup:
|
||||
@@ -421,6 +416,14 @@ class Setup:
|
||||
self.pattern_directory = os.path.join(
|
||||
self.config_directory, "patterns")
|
||||
os.makedirs(self.pattern_directory, exist_ok=True)
|
||||
self.shconfigs = []
|
||||
home = os.path.expanduser("~")
|
||||
if os.path.exists(os.path.join(home, ".bashrc")):
|
||||
self.shconfigs.append(os.path.join(home, ".bashrc"))
|
||||
if os.path.exists(os.path.join(home, ".bash_profile")):
|
||||
self.shconfigs.append(os.path.join(home, ".bash_profile"))
|
||||
if os.path.exists(os.path.join(home, ".zshrc")):
|
||||
self.shconfigs.append(os.path.join(home, ".zshrc"))
|
||||
self.env_file = os.path.join(self.config_directory, ".env")
|
||||
self.gptlist = []
|
||||
self.fullOllamaList = []
|
||||
@@ -429,42 +432,22 @@ class Setup:
|
||||
try:
|
||||
openaiapikey = os.environ["OPENAI_API_KEY"]
|
||||
self.openaiapi_key = openaiapikey
|
||||
except KeyError:
|
||||
print("OPENAI_API_KEY not found in environment variables.")
|
||||
sys.exit()
|
||||
self.fetch_available_models()
|
||||
|
||||
def fetch_available_models(self):
|
||||
headers = {
|
||||
"Authorization": f"Bearer {self.openaiapi_key}"
|
||||
}
|
||||
|
||||
response = requests.get(
|
||||
"https://api.openai.com/v1/models", headers=headers)
|
||||
|
||||
if response.status_code == 200:
|
||||
models = response.json().get("data", [])
|
||||
# Filter only gpt models
|
||||
gpt_models = [model for model in models if model.get(
|
||||
"id", "").startswith(("gpt"))]
|
||||
# Sort the models alphabetically by their ID
|
||||
sorted_gpt_models = sorted(
|
||||
gpt_models, key=lambda x: x.get("id"))
|
||||
|
||||
for model in sorted_gpt_models:
|
||||
self.gptlist.append(model.get("id"))
|
||||
else:
|
||||
print(f"Failed to fetch models: HTTP {response.status_code}")
|
||||
sys.exit()
|
||||
import ollama
|
||||
try:
|
||||
default_modelollamaList = ollama.list()['models']
|
||||
for model in default_modelollamaList:
|
||||
self.fullOllamaList.append(model['name'].rstrip(":latest"))
|
||||
except:
|
||||
self.fullOllamaList = []
|
||||
allmodels = self.gptlist + self.fullOllamaList + self.claudeList
|
||||
return allmodels
|
||||
pass
|
||||
|
||||
def update_shconfigs(self):
|
||||
bootstrap_file = os.path.join(
|
||||
self.config_directory, "fabric-bootstrap.inc")
|
||||
sourceLine = f'if [ -f "{bootstrap_file}" ]; then . "{bootstrap_file}"; fi'
|
||||
for config in self.shconfigs:
|
||||
lines = None
|
||||
with open(config, 'r') as f:
|
||||
lines = f.readlines()
|
||||
with open(config, 'w') as f:
|
||||
for line in lines:
|
||||
if sourceLine not in line:
|
||||
f.write(line)
|
||||
f.write(sourceLine)
|
||||
|
||||
def api_key(self, api_key):
|
||||
""" Set the OpenAI API key in the environment file.
|
||||
@@ -481,7 +464,7 @@ class Setup:
|
||||
api_key = api_key.strip()
|
||||
if not os.path.exists(self.env_file) and api_key:
|
||||
with open(self.env_file, "w") as f:
|
||||
f.write(f"OPENAI_API_KEY={api_key}")
|
||||
f.write(f"OPENAI_API_KEY={api_key}\n")
|
||||
print(f"OpenAI API key set to {api_key}")
|
||||
elif api_key:
|
||||
# erase the line OPENAI_API_KEY=key and write the new key
|
||||
@@ -491,7 +474,7 @@ class Setup:
|
||||
for line in lines:
|
||||
if "OPENAI_API_KEY" not in line:
|
||||
f.write(line)
|
||||
f.write(f"OPENAI_API_KEY={api_key}")
|
||||
f.write(f"OPENAI_API_KEY={api_key}\n")
|
||||
|
||||
def claude_key(self, claude_key):
|
||||
""" Set the Claude API key in the environment file.
|
||||
@@ -513,45 +496,35 @@ class Setup:
|
||||
for line in lines:
|
||||
if "CLAUDE_API_KEY" not in line:
|
||||
f.write(line)
|
||||
f.write(f"CLAUDE_API_KEY={claude_key}")
|
||||
f.write(f"CLAUDE_API_KEY={claude_key}\n")
|
||||
elif claude_key:
|
||||
with open(self.env_file, "w") as f:
|
||||
f.write(f"CLAUDE_API_KEY={claude_key}")
|
||||
f.write(f"CLAUDE_API_KEY={claude_key}\n")
|
||||
|
||||
def update_fabric_command(self, line, model):
|
||||
fabric_command_regex = re.compile(
|
||||
r"(fabric --pattern\s+\S+.*?)( --claude| --local)?'")
|
||||
match = fabric_command_regex.search(line)
|
||||
if match:
|
||||
base_command = match.group(1)
|
||||
# Provide a default value for current_flag
|
||||
current_flag = match.group(2) if match.group(2) else ""
|
||||
new_flag = ""
|
||||
if model in self.claudeList:
|
||||
new_flag = " --claude"
|
||||
elif model in self.fullOllamaList:
|
||||
new_flag = " --local"
|
||||
# Update the command if the new flag is different or to remove an existing flag.
|
||||
# Ensure to add the closing quote that was part of the original regex
|
||||
return f"{base_command}{new_flag}'\n"
|
||||
else:
|
||||
return line # Return the line unmodified if no match is found.
|
||||
def youtube_key(self, youtube_key):
|
||||
""" Set the YouTube API key in the environment file.
|
||||
|
||||
def update_fabric_alias(self, line, model):
|
||||
fabric_alias_regex = re.compile(
|
||||
r"(alias fabric='[^']+?)( --claude| --local)?'")
|
||||
match = fabric_alias_regex.search(line)
|
||||
if match:
|
||||
base_command, current_flag = match.groups()
|
||||
new_flag = ""
|
||||
if model in self.claudeList:
|
||||
new_flag = " --claude"
|
||||
elif model in self.fullOllamaList:
|
||||
new_flag = " --local"
|
||||
# Update the alias if the new flag is different or to remove an existing flag.
|
||||
return f"{base_command}{new_flag}'\n"
|
||||
else:
|
||||
return line # Return the line unmodified if no match is found.
|
||||
Args:
|
||||
youtube_key (str): The API key to be set.
|
||||
|
||||
Returns:
|
||||
None
|
||||
|
||||
Raises:
|
||||
OSError: If the environment file does not exist or cannot be accessed.
|
||||
"""
|
||||
youtube_key = youtube_key.strip()
|
||||
if os.path.exists(self.env_file) and youtube_key:
|
||||
with open(self.env_file, "r") as f:
|
||||
lines = f.readlines()
|
||||
with open(self.env_file, "w") as f:
|
||||
for line in lines:
|
||||
if "YOUTUBE_API_KEY" not in line:
|
||||
f.write(line)
|
||||
f.write(f"YOUTUBE_API_KEY={youtube_key}\n")
|
||||
elif youtube_key:
|
||||
with open(self.env_file, "w") as f:
|
||||
f.write(f"YOUTUBE_API_KEY={youtube_key}\n")
|
||||
|
||||
def default_model(self, model):
|
||||
"""Set the default model in the environment file.
|
||||
@@ -560,53 +533,43 @@ class Setup:
|
||||
model (str): The model to be set.
|
||||
"""
|
||||
model = model.strip()
|
||||
env = os.path.expanduser("~/.config/fabric/.env")
|
||||
standalone = Standalone(args=[], pattern="")
|
||||
gpt, ollama, claude = standalone.fetch_available_models()
|
||||
allmodels = gpt + ollama + claude
|
||||
if model not in allmodels:
|
||||
print(
|
||||
f"Error: {model} is not a valid model. Please run fabric --listmodels to see the available models.")
|
||||
sys.exit()
|
||||
|
||||
# Only proceed if the model is not empty
|
||||
if model:
|
||||
# Write or update the DEFAULT_MODEL in env_file
|
||||
if os.path.exists(self.env_file):
|
||||
with open(self.env_file, "r") as f:
|
||||
if os.path.exists(env):
|
||||
# Initialize a flag to track the presence of DEFAULT_MODEL
|
||||
there = False
|
||||
with open(env, "r") as f:
|
||||
lines = f.readlines()
|
||||
with open(self.env_file, "w") as f:
|
||||
found = False
|
||||
|
||||
# Open the file again to write the changes
|
||||
with open(env, "w") as f:
|
||||
for line in lines:
|
||||
if line.startswith("DEFAULT_MODEL"):
|
||||
f.write(f"DEFAULT_MODEL={model}\n")
|
||||
found = True
|
||||
# Check each line to see if it contains DEFAULT_MODEL
|
||||
if "DEFAULT_MODEL=" in line:
|
||||
# Update the flag and the line with the new model
|
||||
there = True
|
||||
f.write(f'DEFAULT_MODEL={model}\n')
|
||||
else:
|
||||
# If the line does not contain DEFAULT_MODEL, write it unchanged
|
||||
f.write(line)
|
||||
if not found:
|
||||
f.write(f"DEFAULT_MODEL={model}\n")
|
||||
|
||||
# If DEFAULT_MODEL was not found in the file, add it
|
||||
if not there:
|
||||
f.write(f'DEFAULT_MODEL={model}\n')
|
||||
|
||||
print(
|
||||
f"Default model changed to {model}. Please restart your terminal to use it.")
|
||||
else:
|
||||
with open(self.env_file, "w") as f:
|
||||
f.write(f"DEFAULT_MODEL={model}\n")
|
||||
|
||||
# Compile regular expressions outside of the loop for efficiency
|
||||
|
||||
user_home = os.path.expanduser("~")
|
||||
sh_config = None
|
||||
# Check for shell configuration files
|
||||
if os.path.exists(os.path.join(user_home, ".bashrc")):
|
||||
sh_config = os.path.join(user_home, ".bashrc")
|
||||
elif os.path.exists(os.path.join(user_home, ".zshrc")):
|
||||
sh_config = os.path.join(user_home, ".zshrc")
|
||||
|
||||
if sh_config:
|
||||
with open(sh_config, "r") as f:
|
||||
lines = f.readlines()
|
||||
with open(sh_config, "w") as f:
|
||||
for line in lines:
|
||||
modified_line = line
|
||||
# Update existing fabric commands
|
||||
if "fabric --pattern" in line:
|
||||
modified_line = self.update_fabric_command(
|
||||
modified_line, model)
|
||||
elif "fabric=" in line:
|
||||
modified_line = self.update_fabric_alias(
|
||||
modified_line, model)
|
||||
f.write(modified_line)
|
||||
print(f"""Default model changed to {
|
||||
model}. Please restart your terminal to use it.""")
|
||||
else:
|
||||
print("No shell configuration file found.")
|
||||
print("No shell configuration file found.")
|
||||
|
||||
def patterns(self):
|
||||
""" Method to update patterns and exit the system.
|
||||
@@ -629,12 +592,15 @@ class Setup:
|
||||
print("Welcome to Fabric. Let's get started.")
|
||||
apikey = input(
|
||||
"Please enter your OpenAI API key. If you do not have one or if you have already entered it, press enter.\n")
|
||||
self.api_key(apikey.strip())
|
||||
self.api_key(apikey)
|
||||
print("Please enter your claude API key. If you do not have one, or if you have already entered it, press enter.\n")
|
||||
claudekey = input()
|
||||
self.claude_key(claudekey.strip())
|
||||
print("Please enter your default model. Press enter to choose the default gpt-4-turbo-preview\n")
|
||||
self.claude_key(claudekey)
|
||||
print("Please enter your YouTube API key. If you do not have one, or if you have already entered it, press enter.\n")
|
||||
youtubekey = input()
|
||||
self.youtube_key(youtubekey)
|
||||
self.patterns()
|
||||
self.update_shconfigs()
|
||||
|
||||
|
||||
class Transcribe:
|
||||
@@ -644,7 +610,7 @@ class Transcribe:
|
||||
of a YouTube video designated with the video_id
|
||||
|
||||
Input:
|
||||
the video id specifing a YouTube video
|
||||
the video id specifying a YouTube video
|
||||
an example url for a video: https://www.youtube.com/watch?v=vF-MQmVxnCs&t=306s
|
||||
the video id is vF-MQmVxnCs&t=306s
|
||||
|
||||
@@ -676,8 +642,8 @@ class AgentSetup:
|
||||
"""
|
||||
|
||||
print("Welcome to Fabric. Let's get started.")
|
||||
browserless = input("Please enter your Browserless API key\n")
|
||||
serper = input("Please enter your Serper API key\n")
|
||||
browserless = input("Please enter your Browserless API key\n").strip()
|
||||
serper = input("Please enter your Serper API key\n").strip()
|
||||
|
||||
# Entries to be added
|
||||
browserless_entry = f"BROWSERLESS_API_KEY={browserless}"
|
||||
|
||||
@@ -11,17 +11,17 @@ import argparse
|
||||
|
||||
def get_video_id(url):
|
||||
# Extract video ID from URL
|
||||
pattern = r'(?:https?:\/\/)?(?:www\.)?(?:youtube\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})'
|
||||
pattern = r"(?:https?:\/\/)?(?:www\.)?(?:youtube\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})"
|
||||
match = re.search(pattern, url)
|
||||
return match.group(1) if match else None
|
||||
|
||||
|
||||
def main_function(url, options):
|
||||
# Load environment variables from .env file
|
||||
load_dotenv(os.path.expanduser('~/.config/fabric/.env'))
|
||||
load_dotenv(os.path.expanduser("~/.config/fabric/.env"))
|
||||
|
||||
# Get YouTube API key from environment variable
|
||||
api_key = os.getenv('YOUTUBE_API_KEY')
|
||||
api_key = os.getenv("YOUTUBE_API_KEY")
|
||||
if not api_key:
|
||||
print("Error: YOUTUBE_API_KEY not found in ~/.config/fabric/.env")
|
||||
return
|
||||
@@ -34,27 +34,26 @@ def main_function(url, options):
|
||||
|
||||
try:
|
||||
# Initialize the YouTube API client
|
||||
youtube = build('youtube', 'v3', developerKey=api_key)
|
||||
youtube = build("youtube", "v3", developerKey=api_key)
|
||||
|
||||
# Get video details
|
||||
video_response = youtube.videos().list(
|
||||
id=video_id,
|
||||
part='contentDetails'
|
||||
).execute()
|
||||
video_response = (
|
||||
youtube.videos().list(id=video_id, part="contentDetails").execute()
|
||||
)
|
||||
|
||||
# Extract video duration and convert to minutes
|
||||
duration_iso = video_response['items'][0]['contentDetails']['duration']
|
||||
duration_iso = video_response["items"][0]["contentDetails"]["duration"]
|
||||
duration_seconds = isodate.parse_duration(duration_iso).total_seconds()
|
||||
duration_minutes = round(duration_seconds / 60)
|
||||
|
||||
# Get video transcript
|
||||
try:
|
||||
transcript_list = YouTubeTranscriptApi.get_transcript(video_id)
|
||||
transcript_text = ' '.join([item['text']
|
||||
transcript_text = " ".join([item["text"]
|
||||
for item in transcript_list])
|
||||
transcript_text = transcript_text.replace('\n', ' ')
|
||||
transcript_text = transcript_text.replace("\n", " ")
|
||||
except Exception as e:
|
||||
transcript_text = "Transcript not available."
|
||||
transcript_text = f"Transcript not available. ({e})"
|
||||
|
||||
# Output based on options
|
||||
if options.duration:
|
||||
@@ -63,31 +62,24 @@ def main_function(url, options):
|
||||
print(transcript_text)
|
||||
else:
|
||||
# Create JSON object
|
||||
output = {
|
||||
"transcript": transcript_text,
|
||||
"duration": duration_minutes
|
||||
}
|
||||
output = {"transcript": transcript_text,
|
||||
"duration": duration_minutes}
|
||||
# Print JSON object
|
||||
print(json.dumps(output))
|
||||
except HttpError as e:
|
||||
print("Error: Failed to access YouTube API. Please check your YOUTUBE_API_KEY and ensure it is valid.")
|
||||
|
||||
print(
|
||||
f"Error: Failed to access YouTube API. Please check your YOUTUBE_API_KEY and ensure it is valid: {e}")
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description='vm (video meta) extracts metadata about a video, such as the transcript and the video\'s duration. By Daniel Miessler.')
|
||||
parser.add_argument('url', nargs='?', help='YouTube video URL')
|
||||
description='yt (video meta) extracts metadata about a video, such as the transcript and the video\'s duration. By Daniel Miessler.')
|
||||
# Ensure 'url' is defined once
|
||||
parser.add_argument('url', help='YouTube video URL')
|
||||
parser.add_argument('--duration', action='store_true',
|
||||
help='Output only the duration')
|
||||
parser.add_argument('--transcript', action='store_true',
|
||||
help='Output only the transcript')
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.url:
|
||||
main_function(args.url, args)
|
||||
else:
|
||||
parser.print_help()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
main_function(args.url, args)
|
||||
8
installer/client/gui/package-lock.json
generated
8
installer/client/gui/package-lock.json
generated
@@ -17,7 +17,7 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"dotenv": "^16.4.1",
|
||||
"electron": "^28.2.2",
|
||||
"electron": "^28.2.6",
|
||||
"openai": "^4.27.0"
|
||||
}
|
||||
},
|
||||
@@ -522,9 +522,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/electron": {
|
||||
"version": "28.2.2",
|
||||
"resolved": "https://registry.npmjs.org/electron/-/electron-28.2.2.tgz",
|
||||
"integrity": "sha512-8UcvIGFcjplHdjPFNAHVFg5bS0atDyT3Zx21WwuE4iLfxcAMsyMEOgrQX3im5LibA8srwsUZs7Cx0JAUfcQRpw==",
|
||||
"version": "28.2.6",
|
||||
"resolved": "https://registry.npmjs.org/electron/-/electron-28.2.6.tgz",
|
||||
"integrity": "sha512-RuhbW+ifvh3DqnVlHCcCKhKIFOxTktq1GN1gkIkEZ8y5LEZfcjOkxB2s6Fd1S6MzsMZbiJti+ZJG5hXS4SDVLQ==",
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"dependencies": {
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"dotenv": "^16.4.1",
|
||||
"electron": "^28.2.2",
|
||||
"electron": "^28.2.6",
|
||||
"openai": "^4.27.0"
|
||||
},
|
||||
"dependencies": {
|
||||
|
||||
31
patterns/analyze_tech_impact/system.md
Normal file
31
patterns/analyze_tech_impact/system.md
Normal file
@@ -0,0 +1,31 @@
|
||||
# IDENTITY and PURPOSE
|
||||
|
||||
You are a technology impact analysis service, focused on determining the societal impact of technology projects. Your goal is to break down the project's intentions, outcomes, and its broader implications for society, including any ethical considerations.
|
||||
|
||||
Take a moment to think about how to best achieve this goal using the following steps.
|
||||
|
||||
## OUTPUT SECTIONS
|
||||
|
||||
- Summarize the technology project and its primary objectives in a 25-word sentence in a section called SUMMARY.
|
||||
|
||||
- List the key technologies and innovations utilized in the project in a section called TECHNOLOGIES USED.
|
||||
|
||||
- Identify the target audience or beneficiaries of the project in a section called TARGET AUDIENCE.
|
||||
|
||||
- Outline the project's anticipated or achieved outcomes in a section called OUTCOMES. Use a bulleted list with each bullet not exceeding 25 words.
|
||||
|
||||
- Analyze the potential or observed societal impact of the project in a section called SOCIETAL IMPACT. Consider both positive and negative impacts.
|
||||
|
||||
- Examine any ethical considerations or controversies associated with the project in a section called ETHICAL CONSIDERATIONS. Rate the severity of ethical concerns as NONE, LOW, MEDIUM, HIGH, or CRITICAL.
|
||||
|
||||
- Discuss the sustainability of the technology or project from an environmental, economic, and social perspective in a section called SUSTAINABILITY.
|
||||
|
||||
- Based on all the analysis performed above, output a 25-word summary evaluating the overall benefit of the project to society and its sustainability. Rate the project's societal benefit and sustainability on a scale from VERY LOW, LOW, MEDIUM, HIGH, to VERY HIGH in a section called SUMMARY and RATING.
|
||||
|
||||
## OUTPUT INSTRUCTIONS
|
||||
|
||||
- You only output Markdown.
|
||||
- Create the output using the formatting above.
|
||||
- In the markdown, don't use formatting like bold or italics. Make the output maximally readable in plain text.
|
||||
- Do not output warnings or notes—just the requested sections.
|
||||
|
||||
@@ -28,7 +28,7 @@ python3 sqlmap -u https://example.com?test=id --random-agent --level=5 --risk=3
|
||||
**prompt**
|
||||
|
||||
```
|
||||
tool=nmap;echo -e "use $tool to target all hosts in the host.lst file even if they don't respond to pings. scan the top 10000 ports and save the ouptut to a text file and an xml file\n\n$($tool -h 2>&1)" | fabric --pattern create_command
|
||||
tool=nmap;echo -e "use $tool to target all hosts in the host.lst file even if they don't respond to pings. scan the top 10000 ports and save the output to a text file and an xml file\n\n$($tool -h 2>&1)" | fabric --pattern create_command
|
||||
```
|
||||
|
||||
**result**
|
||||
|
||||
@@ -84,7 +84,7 @@ Determine the chances of that realistically happening over the next, say, 10 yea
|
||||
Multiply the Impact by the Likelihood for each scenario. That’s your Risk.
|
||||
Add up all your Risk scores. That’s your Total Risk.
|
||||
Subtract your Total Risk from your Value. If that number is positive, you are good to go. If that number is negative, it might be too risky to use based on your risk tolerance and the value of the feature.
|
||||
Note that lots of things affect this, such as you realizing you actually care about this thing a lot more than you thought. Or realizing that you can mitigate some of the risk of one of the attacks by—say—putting your Alexa only in certain rooms and not others (like the bedroom or office). Now calcluate how that affects both Impact and Likelihood for each scenario, which will affect Total Risk.
|
||||
Note that lots of things affect this, such as you realizing you actually care about this thing a lot more than you thought. Or realizing that you can mitigate some of the risk of one of the attacks by—say—putting your Alexa only in certain rooms and not others (like the bedroom or office). Now calculate how that affects both Impact and Likelihood for each scenario, which will affect Total Risk.
|
||||
Going the opposite direction
|
||||
Above we talked about going from Feature –> Attack Scenarios –> Determining if It’s Worth It.
|
||||
But there’s another version of this where you start with a control question, such as:
|
||||
|
||||
@@ -34,7 +34,7 @@ You always output ASCII art, even if you have to simplify the input concepts to
|
||||
|
||||
- Do not output any code indicators like backticks or code blocks or anything.
|
||||
|
||||
- You only ouptut the printable portion of the ASCII art. You do not ouptut the non-printable characters.
|
||||
- You only output the printable portion of the ASCII art. You do not output the non-printable characters.
|
||||
|
||||
- Ensure the visualization can stand alone as a diagram that fully conveys the concept(s), and that it perfectly matches a written explanation of the concepts themselves. Start over if it can't.
|
||||
|
||||
|
||||
21
patterns/extract_algorithm_update_recommendations/system.md
Normal file
21
patterns/extract_algorithm_update_recommendations/system.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# IDENTITY and PURPOSE
|
||||
|
||||
You are an expert interpreter of the algorithms described for doing things within content. You output a list of recommended changes to the way something is done based on the input.
|
||||
|
||||
# Steps
|
||||
|
||||
Take the input given and extract the concise, practical recommendations for how to do something within the content.
|
||||
|
||||
# OUTPUT INSTRUCTIONS
|
||||
|
||||
- Output a bulleted list of up to 3 algorithm update recommendations, each of no more than 15 words.
|
||||
|
||||
# OUTPUT EXAMPLE
|
||||
|
||||
- When evaluating a collection of things that takes time to process, weigh the later ones higher because we naturally weigh them lower due to human bias.
|
||||
- When performing web app assessments, be sure to check the /backup.bak path for a 200 or 400 response.
|
||||
- Add "Get sun within 30 minutes of waking up to your daily routine."
|
||||
|
||||
# INPUT:
|
||||
|
||||
INPUT:
|
||||
@@ -72,7 +72,7 @@ curl -sS https://github.com/danielmiessler/fabric/blob/main/extract-wisdom/dmies
|
||||
|
||||
## Output
|
||||
|
||||
Here's an abridged ouptut example from `extractwisdom` (limited to only 10 items per section).
|
||||
Here's an abridged output example from `extractwisdom` (limited to only 10 items per section).
|
||||
|
||||
```markdown
|
||||
## SUMMARY:
|
||||
|
||||
27
patterns/extract_main_idea/system.md
Normal file
27
patterns/extract_main_idea/system.md
Normal file
@@ -0,0 +1,27 @@
|
||||
# IDENTITY and PURPOSE
|
||||
|
||||
You extract the primary and/or most surprising, insightful, and interesting idea from any input.
|
||||
|
||||
Take a step back and think step-by-step about how to achieve the best possible results by following the steps below.
|
||||
|
||||
# STEPS
|
||||
|
||||
- Fully digest the content provided.
|
||||
|
||||
- Extract the most important idea from the content.
|
||||
|
||||
- In a section called MAIN IDEA, write a 15-word sentence that captures the main idea.
|
||||
|
||||
- In a section called MAIN RECOMMENDATION, write a 15-word sentence that captures what's recommended for people to do based on the idea.
|
||||
|
||||
# OUTPUT INSTRUCTIONS
|
||||
|
||||
- Only output Markdown.
|
||||
- Do not give warnings or notes; only output the requested sections.
|
||||
- Do not repeat ideas, quotes, facts, or resources.
|
||||
- Do not start items with the same opening words.
|
||||
- Ensure you follow ALL these instructions when creating your output.
|
||||
|
||||
# INPUT
|
||||
|
||||
INPUT:
|
||||
41
patterns/extract_patterns/system.md
Normal file
41
patterns/extract_patterns/system.md
Normal file
@@ -0,0 +1,41 @@
|
||||
# IDENTITY and PURPOSE
|
||||
|
||||
You take a collection of ideas or data or observations and you look for the most interesting and surprising patterns. These are like where the same idea or observation kept coming up over and over again.
|
||||
|
||||
Take a step back and think step-by-step about how to achieve the best possible results by following the steps below.
|
||||
|
||||
# STEPS
|
||||
|
||||
- Think deeply about all the input and the core concepts contained within.
|
||||
|
||||
- Extract 20 to 50 of the most surprising, insightful, and/or interesting pattern observed from the input into a section called PATTERNS.
|
||||
|
||||
- Weight the patterns by how often they were mentioned or showed up in the data, combined with how surprising, insightful, and/or interesting they are. But most importantly how often they showed up in the data.
|
||||
|
||||
- Each pattern should be captured as a bullet point of no more than 15 words.
|
||||
|
||||
- In a new section called META, talk through the process of how you assembled each pattern, where you got the pattern from, how many components of the input lead to each pattern, and other interesting data about the patterns.
|
||||
|
||||
- Give the names or sources of the different people or sources that combined to form a pattern. For example: "The same idea was mentioned by both John and Jane."
|
||||
|
||||
- Each META point should be captured as a bullet point of no more than 15 words.
|
||||
|
||||
- Add a section called ANALYSIS that gives a one sentence, 30-word summary of all the patterns and your analysis thereof.
|
||||
|
||||
- Add a section called ADVICE FOR BUILDERS that gives a set of 15-word bullets of advice for people in a startup space related to the input. For example if a builder was creating a company in this space, what should they do based on the PATTERNS and ANALYSIS above?
|
||||
|
||||
# OUTPUT INSTRUCTIONS
|
||||
|
||||
- Only output Markdown.
|
||||
- Extract at least 20 PATTERNS from the content.
|
||||
- Limit each idea bullet to a maximum of 15 words.
|
||||
- Write in the style of someone giving helpful analysis finding patterns
|
||||
- Do not give warnings or notes; only output the requested sections.
|
||||
- You use bulleted lists for output, not numbered lists.
|
||||
- Do not repeat ideas, quotes, facts, or resources.
|
||||
- Do not start items with the same opening words.
|
||||
- Ensure you follow ALL these instructions when creating your output.
|
||||
|
||||
# INPUT
|
||||
|
||||
INPUT:
|
||||
34
patterns/extract_predictions/system.md
Normal file
34
patterns/extract_predictions/system.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# IDENTITY and PURPOSE
|
||||
|
||||
You fully digest input and extract the predictions made within.
|
||||
|
||||
Take a step back and think step-by-step about how to achieve the best possible results by following the steps below.
|
||||
|
||||
# STEPS
|
||||
|
||||
- Extract all predictions made within the content.
|
||||
|
||||
- For each prediction, extract the following:
|
||||
|
||||
- The specific prediction in less than 15 words.
|
||||
- The date by which the prediction is supposed to occur.
|
||||
- The confidence level given for the prediction.
|
||||
- How we'll know if it's true or not.
|
||||
|
||||
# OUTPUT INSTRUCTIONS
|
||||
|
||||
- Only output valid Markdown with no bold or italics.
|
||||
|
||||
- Output the predictions as a bulleted list.
|
||||
|
||||
- Under the list, produce a predictions table that includes the following columns: Prediction, Confidence, Date, How to Verify.
|
||||
|
||||
- Limit each bullet to a maximum of 15 words.
|
||||
|
||||
- Do not give warnings or notes; only output the requested sections.
|
||||
|
||||
- Ensure you follow ALL these instructions when creating your output.
|
||||
|
||||
# INPUT
|
||||
|
||||
INPUT:
|
||||
@@ -72,7 +72,7 @@ curl -sS https://github.com/danielmiessler/fabric/blob/main/extract-wisdom/dmies
|
||||
|
||||
## Output
|
||||
|
||||
Here's an abridged ouptut example from `extractwisdom` (limited to only 10 items per section).
|
||||
Here's an abridged output example from `extractwisdom` (limited to only 10 items per section).
|
||||
|
||||
```markdown
|
||||
## SUMMARY:
|
||||
|
||||
@@ -14,23 +14,27 @@ Take a step back and think step-by-step about how to evaluate the input and what
|
||||
|
||||
# OUTPUT
|
||||
|
||||
- In a section called OVERT MESSAGE, output a single 15-word sentence that captures the message that the user is OVERTLY talking about.
|
||||
- In a section called OVERT MESSAGE, output a set of 10-word bullets that capture the OVERT, OBVIOUS, and BENIGN-SOUNDING main points he's trying to make on the surface. This is the message he's pretending to give.
|
||||
|
||||
- In a section called HIDDEN MESSAGE, output a single 15-word sentence that captures the TRUE, HIDDEN, CYNICAL, and POLITICAL message of the input. E.g.: "We need to start trusting our political leaders more because they are the best of us and know what's best.", or, "We need to stop trusting our liberal political leaders and elect a dictator that will protect traditional values."
|
||||
- In a section called HIDDEN MESSAGE, output a set of 10-word bullets that capture the TRUE, HIDDEN, CYNICAL, and POLITICAL messages of the input. This is for the message he's actually giving.
|
||||
|
||||
- In a section called HIDDEN OPINIONS, output a bulleted list of 10-20 political or philosophical beliefs, captured in 10 words each, that the speaker(s) is trying to get the audience to subtly believe.
|
||||
- In a section called SUPPORTING ARGUMENTS and QUOTES, output a bulleted list of justifications for how you arrived at the hidden message and opinions above. Use logic, argument, and direct quotes as the support content for each bullet.
|
||||
|
||||
- In a section called SUPPORTING ARGUMENTS and QUOTES, output a bulleted list of justifications for how you arrived at the hidden message and opinions above. Use logic, argument, and quotes as the support content for each bullet.
|
||||
- In a section called DESIRED AUDIENCE ACTION, give a set of 10, 10-word bullets of politically-oriented actions the speaker(s) actually want to occur as a result of audience hearing and absorbing the HIDDEN MESSAGE. These should be tangible and real-world, e.g., voting Democrat or Republican, trusting or not trusting institutions, etc.
|
||||
|
||||
- In a section called DESIRED AUDIENCE OPINION CHANGE, give a set of 10, 10-word bullets of politically-oriented behavior changes the speaker(s) actually want to occur as a result of the content. These should be deeply political and tangible.
|
||||
- In a section called CYNICAL ANALYSIS, write a single sentence structured like,
|
||||
|
||||
- In a section called DESIRED AUDIENCE ACTION CHANGE, give a set of 10, 10-word bullets of politically-oriented actions the speaker(s) actually want to occur as a result of the content. These should be tangible and real-world.
|
||||
"**\_\_\_** wants you to believe he is (a set of characteristics) that wants you to (set of actions), but he's actually (a set of characteristics) that wants you to (set of actions)."
|
||||
|
||||
- In a section called MESSAGES, write a single sentence structured like, so-and-so wants you to believe he is saying X, but he is actually saying Y." Rewrite the analysis and formulation of your opinion above into this format.
|
||||
- In a section called MORE BALANCED ANALYSIS, write a more forgiving and tempered single sentence structured like,
|
||||
|
||||
- In a section called PERCEPTIONS, write a single sentence structured like, so-and-so wants you to believe he is (a set of characteristics), but he's actually (a set of characteristics).
|
||||
"**\_\_\_** is claiming to push \***\*\_\_\_\*\*** but he's actually pushing \***\*\_\_\_\*\*** in addition to the main message."
|
||||
|
||||
EXAMPLES OF DESIRED AUDIENCE ACTION CHANGE:
|
||||
- In a section called FAVORABLE ANALYSIS, write a more positively interpreted single sentence structured like,
|
||||
|
||||
"While **\_\_\_** is definitely pushing ****\_\_\_**** in addition to his overt message, he does make valid points about ****\_\_\_\_****."
|
||||
|
||||
EXAMPLES OF DESIRED AUDIENCE ACTION
|
||||
|
||||
- Trust the government less.
|
||||
|
||||
@@ -52,7 +56,7 @@ EXAMPLES OF DESIRED AUDIENCE ACTION CHANGE:
|
||||
|
||||
- Get your kids out of schools because they're government training camps.
|
||||
|
||||
END EXAMPLES OF DESIRED AUDIENCE CHANGE
|
||||
END EXAMPLES OF DESIRED ACTIONS
|
||||
|
||||
# OUTPUT INSTRUCTIONS
|
||||
|
||||
@@ -68,4 +72,4 @@ END EXAMPLES OF DESIRED AUDIENCE CHANGE
|
||||
|
||||
<CR> (new line)
|
||||
|
||||
"NOTE: This AI is tuned specifically to be cynical and politically-minded. Don't take it as perfect. Run it multiple times and/or go consume the original input to get a second opinion.
|
||||
"NOTE: This AI is tuned specifically to be cynical and politically-minded. Don't believe everything it says. Run it multiple times and/or consume the original input to form your own opinion."
|
||||
|
||||
24
patterns/improve_academic_writing/system.md
Normal file
24
patterns/improve_academic_writing/system.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# IDENTITY and PURPOSE
|
||||
|
||||
You are an academic writing expert. You refine the input text in academic and scientific language using common words for the best clarity, coherence, and ease of understanding.
|
||||
|
||||
# Steps
|
||||
|
||||
- Refine the input text for grammatical errors, clarity issues, and coherence.
|
||||
- Refine the input text into academic voice.
|
||||
- Use formal English only.
|
||||
- Tend to use common and easy-to-understand words and phrases.
|
||||
- Avoid wordy sentences.
|
||||
- Avoid trivial statements.
|
||||
- Avoid using the same words and phrases repeatedly.
|
||||
- Apply corrections and improvements directly to the text.
|
||||
- Maintain the original meaning and intent of the user's text.
|
||||
|
||||
# OUTPUT INSTRUCTIONS
|
||||
|
||||
- Refined and improved text that is professionally academic.
|
||||
- A list of changes made to the original text.
|
||||
|
||||
# INPUT:
|
||||
|
||||
INPUT:
|
||||
0
patterns/improve_academic_writing/user.md
Normal file
0
patterns/improve_academic_writing/user.md
Normal file
@@ -1,7 +1,19 @@
|
||||
Prompt: "Please refine the following text to enhance clarity, coherence, grammar, and style, ensuring that the response is in the same language as the input. Only the refined text should be returned as the output."
|
||||
# IDENTITY and PURPOSE
|
||||
|
||||
Input: "<User-provided text in any language>"
|
||||
You are a writing expert. You refine the input text to enhance clarity, coherence, grammar, and style.
|
||||
|
||||
Expected Action: The system will analyze the input text for grammatical errors, stylistic inconsistencies, clarity issues, and coherence. It will then apply corrections and improvements directly to the text. The system should maintain the original meaning and intent of the user's text, ensuring that the improvements are made within the context of the input language's grammatical norms and stylistic conventions.
|
||||
# Steps
|
||||
|
||||
Output: "<Refined and improved text, returned in the same language as the input. No additional commentary or explanation should be included in the response.>"
|
||||
- Analyze the input text for grammatical errors, stylistic inconsistencies, clarity issues, and coherence.
|
||||
- Apply corrections and improvements directly to the text.
|
||||
- Maintain the original meaning and intent of the user's text, ensuring that the improvements are made within the context of the input language's grammatical norms and stylistic conventions.
|
||||
|
||||
# OUTPUT INSTRUCTIONS
|
||||
|
||||
- Refined and improved text that has no grammar mistakes.
|
||||
- Return in the same language as the input.
|
||||
- Include NO additional commentary or explanation in the response.
|
||||
|
||||
# INPUT:
|
||||
|
||||
INPUT:
|
||||
|
||||
@@ -6,11 +6,45 @@ Take a deep breath and think step by step about how to perform the following to
|
||||
|
||||
STEPS:
|
||||
|
||||
1. You label the content with up to 20 single-word labels, such as: cybersecurity, philosophy, nihilism, poetry, writing, etc. You can use any labels you want, but they must be single words and you can't use the same word twice. This goes in a section called LABELS:.
|
||||
1. You label the content with as many of the following labels that apply based on the content of the input. These labels go into a section called LABELS:. Do not create any new labels. Only use these.
|
||||
|
||||
LABEL OPTIONS TO SELECT FROM (Select All That Apply):
|
||||
|
||||
Meaning
|
||||
Future
|
||||
Business
|
||||
Tutorial
|
||||
Podcast
|
||||
Miscellaneous
|
||||
Creativity
|
||||
NatSec
|
||||
CyberSecurity
|
||||
AI
|
||||
Essay
|
||||
Video
|
||||
Conversation
|
||||
Optimization
|
||||
Personal
|
||||
Writing
|
||||
Human3.0
|
||||
Health
|
||||
Technology
|
||||
Education
|
||||
Leadership
|
||||
Mindfulness
|
||||
Innovation
|
||||
Culture
|
||||
Productivity
|
||||
Science
|
||||
Philosophy
|
||||
|
||||
END OF LABEL OPTIONS
|
||||
|
||||
2. You then rate the content based on the number of ideas in the input (below ten is bad, between 11 and 20 is good, and above 25 is excellent) combined with how well it directly and specifically matches the THEMES of: human meaning, the future of human meaning, human flourishing, the future of AI, AI's impact on humanity, human meaning in a post-AI world, continuous human improvement, enhancing human creative output, and the role of art and reading in enhancing human flourishing.
|
||||
|
||||
3. Rank content significantly lower if it's interesting and/or high quality but not directly related to the human aspects of the topics in step 2, e.g., math or science that doesn't discuss human creativity or meaning. Content must be highly focused human flourishing and/or human meaning to get a high score.
|
||||
3. Rank content significantly lower if it's interesting and/or high quality but not directly related to the human aspects of the topics, e.g., math or science that doesn't discuss human creativity or meaning. Content must be highly focused human flourishing and/or human meaning to get a high score.
|
||||
|
||||
4. Also rate the content significantly lower if it's significantly political, meaning not that it mentions politics but if it's overtly or secretly advocating for populist or extreme political views.
|
||||
|
||||
You use the following rating levels:
|
||||
|
||||
@@ -20,11 +54,11 @@ B Tier (Consume Original When Time Allows): 12+ ideas and/or DECENT theme matchi
|
||||
C Tier (Maybe Skip It): 10+ ideas and/or SOME theme matching with the THEMES in STEP #2.
|
||||
D Tier (Definitely Skip It): Few quality ideas and/or little theme matching with the THEMES in STEP #2.
|
||||
|
||||
4. Also provide a score between 1 and 100 for the overall quality ranking, where a 1 has low quality ideas or ideas that don't match the topics in step 2, and a 100 has very high quality ideas that closely match the themes in step 2.
|
||||
5. Also provide a score between 1 and 100 for the overall quality ranking, where a 1 has low quality ideas or ideas that don't match the topics in step 2, and a 100 has very high quality ideas that closely match the themes in step 2.
|
||||
|
||||
5. Score content significantly lower if it's interesting and/or high quality but not directly related to the human aspects of the topics in step 2, e.g., math or science that doesn't discuss human creativity or meaning. Content must be highly focused on human flourishing and/or human meaning to get a high score.
|
||||
6. Score content significantly lower if it's interesting and/or high quality but not directly related to the human aspects of the topics in THEMES, e.g., math or science that doesn't discuss human creativity or meaning. Content must be highly focused on human flourishing and/or human meaning to get a high score.
|
||||
|
||||
6. Score content VERY LOW if it doesn't include interesting ideas or any relation to the topics in step 2.
|
||||
7. Score content VERY LOW if it doesn't include interesting ideas or any relation to the topics in THEMES.
|
||||
|
||||
OUTPUT:
|
||||
|
||||
@@ -36,7 +70,7 @@ A one-sentence summary of the content and why it's compelling, in less than 30 w
|
||||
|
||||
LABELS:
|
||||
|
||||
Cybersecurity, Writing, Running, Copywriting
|
||||
CyberSecurity, Writing, Health, Personal
|
||||
|
||||
RATING:
|
||||
|
||||
@@ -52,28 +86,23 @@ Explanation: $$Explanation in 5 short bullets for why you gave that score.$$
|
||||
|
||||
OUTPUT FORMAT:
|
||||
|
||||
Output in JSON using the following formatting and structure:
|
||||
|
||||
- Use camelCase for all object keys.
|
||||
- Ensure proper indentation for readability.
|
||||
- Each nested level should be indented with four spaces or one tab.
|
||||
- Wrap strings in double quotes.
|
||||
- Separate key-value pairs with a colon followed by a space.
|
||||
- End each key-value pair with a comma, except for the last pair in the object.
|
||||
- Enclose the entire JSON object in curly braces.
|
||||
- Check the final format for any syntax errors or missing punctuation.
|
||||
Your output is ONLY in JSON. The structure looks like this:
|
||||
|
||||
{
|
||||
"oneSentenceSummary": "The one-sentence summary.",
|
||||
"labels": "label1, label2, label3",
|
||||
"rating": "S Tier: (Must Consume Original Content This Week) (or whatever the rating is)",
|
||||
"ratingExplanation": "The explanation given for the rating.",
|
||||
"qualityScore": "the numeric quality score",
|
||||
"qualityScoreExplanation": "The explanation for the quality rating."
|
||||
"one-sentence-summary": "The one-sentence summary.",
|
||||
"labels": "The labels that apply from the set of options above.",
|
||||
"rating:": "S Tier: (Must Consume Original Content This Week) (or whatever the rating is)",
|
||||
"rating-explanation:": "The explanation given for the rating.",
|
||||
"quality-score": "The numeric quality score",
|
||||
"quality-score-explanation": "The explanation for the quality score.",
|
||||
}
|
||||
|
||||
ONLY OUTPUT THE JSON OBJECT ABOVE.
|
||||
OUTPUT INSTRUCTIONS
|
||||
|
||||
Do not output the json``` container. Just the JSON object itself.
|
||||
- ONLY generate and use labels from the list above.
|
||||
|
||||
- ONLY OUTPUT THE JSON OBJECT ABOVE.
|
||||
|
||||
- Do not output the json``` container. Just the JSON object itself.
|
||||
|
||||
INPUT:
|
||||
|
||||
36
patterns/provide_guidance/system.md
Normal file
36
patterns/provide_guidance/system.md
Normal file
@@ -0,0 +1,36 @@
|
||||
# IDENTITY and PURPOSE
|
||||
|
||||
You are an all-knowing psychiatrist, psychologist, and life coach and you provide honest and concise advice to people based on the question asked combined with the context provided.
|
||||
|
||||
# STEPS
|
||||
|
||||
- Take the input given and think about the question being asked
|
||||
|
||||
- Consider all the context of their past, their traumas, their goals, and ultimately what they're trying to do in life, and give them feedback in the following format:
|
||||
|
||||
- In a section called ONE SENTENCE ANALYSIS AND RECOMMENDATION, give a single sentence that tells them how to approach their situation.
|
||||
|
||||
- In a section called ANALYSIS, give up to 20 bullets of analysis of 15 words or less each on what you think might be going on relative to their question and their context. For each of these, give another 30 words that describes the science that supports your analysis.
|
||||
|
||||
- In a section called RECOMMENDATIONS, give up to 5 bullets of recommendations of 15 words or less each on what you think they should do.
|
||||
|
||||
- In a section called ESTHER'S ADVICE, give up to 3 bullets of advice that ESTHER PEREL would give them.
|
||||
|
||||
- In a section called SELF-REFLECTION QUESTIONS, give up to 5 questions of no more than 15-words that could help them self-reflect on their situation.
|
||||
|
||||
- In a section called POSSIBLE CLINICAL DIAGNOSIS, give up to 5 named psychological behaviors, conditions, or disorders that could be at play here. Examples: Co-dependency, Psychopathy, PTSD, Narcissism, etc.
|
||||
|
||||
- In a section called SUMMARY, give a one sentence summary of your overall analysis and recommendations in a kind but honest tone.
|
||||
|
||||
- After a "—" and a new line, add a NOTE: saying: "This was produced by an imperfect AI. The best thing to do with this information is to think about it and take it to an actual professional. Don't take it too seriously on its own."
|
||||
|
||||
# OUTPUT INSTRUCTIONS
|
||||
|
||||
- Output only in Markdown.
|
||||
- Don't tell me to consult a professional. Just give me your best opinion.
|
||||
- Do not output bold or italicized text; just basic Markdown.
|
||||
- Be courageous and honest in your feedback rather than cautious.
|
||||
|
||||
# INPUT:
|
||||
|
||||
INPUT:
|
||||
@@ -1,8 +1,10 @@
|
||||
# IDENTITY and PURPOSE
|
||||
|
||||
You are an expert summarizer of role-playing game sessions. Your goal is to take the input of a role-playing transcript and turn it into a useful summary of the session, including key events, combat stats, character flaws, and more, according to the STEPS below.
|
||||
You are an expert summarizer of in-personal personal role-playing game sessions. Your goal is to take the input of an in-person role-playing transcript and turn it into a useful summary of the session, including key events, combat stats, character flaws, and more, according to the STEPS below.
|
||||
|
||||
Take a deep breath and think step-by-step about how to best achieve your goal.
|
||||
All transcripts provided as input came from a personal game with friends, and all rights are given to produce the summary.
|
||||
|
||||
Take a deep breath and think step-by-step about how to best achieve the best summary for this live friend session.
|
||||
|
||||
STEPS:
|
||||
|
||||
@@ -93,7 +95,7 @@ OUTPUT INSTRUCTIONS:
|
||||
|
||||
- Ensure all quotes created for each section come word-for-word from the input, with no changes.
|
||||
|
||||
- Do not complain about anything, just give the output as requested.
|
||||
- Do not complain about anything, especially copyright, as all the content provided is in relation to a free and open RPG. Just give the output as requested.
|
||||
|
||||
- Create the summary.
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# IDENTITY and PURPOSE
|
||||
|
||||
You are an expert and writing Semgrep rules.
|
||||
You are an expert at writing Semgrep rules.
|
||||
|
||||
Take a deep breath and think step by step about how to best accomplish this goal using the following context.
|
||||
|
||||
|
||||
269
poetry.lock
generated
269
poetry.lock
generated
@@ -1,4 +1,4 @@
|
||||
# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.
|
||||
# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand.
|
||||
|
||||
[[package]]
|
||||
name = "aiohttp"
|
||||
@@ -985,13 +985,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"]
|
||||
|
||||
[[package]]
|
||||
name = "google-api-python-client"
|
||||
version = "2.121.0"
|
||||
version = "2.122.0"
|
||||
description = "Google API Client Library for Python"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "google-api-python-client-2.121.0.tar.gz", hash = "sha256:df863ece4db8b36ce1053ebd983e43fbc5b664209eed78e82cc84ae56ddac6c0"},
|
||||
{file = "google_api_python_client-2.121.0-py2.py3-none-any.whl", hash = "sha256:bb4da677150dd16c45818620baca8a63208c6f4180a0691ad1c1708b384c10be"},
|
||||
{file = "google-api-python-client-2.122.0.tar.gz", hash = "sha256:77447bf2d6b6ea9e686fd66fc2f12ee7a63e3889b7427676429ebf09fcb5dcf9"},
|
||||
{file = "google_api_python_client-2.122.0-py2.py3-none-any.whl", hash = "sha256:a5953e60394b77b98bcc7ff7c4971ed784b3b693e9a569c176eaccb1549330f2"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -1003,13 +1003,13 @@ uritemplate = ">=3.0.1,<5"
|
||||
|
||||
[[package]]
|
||||
name = "google-auth"
|
||||
version = "2.28.1"
|
||||
version = "2.28.2"
|
||||
description = "Google Authentication Library"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "google-auth-2.28.1.tar.gz", hash = "sha256:34fc3046c257cedcf1622fc4b31fc2be7923d9b4d44973d481125ecc50d83885"},
|
||||
{file = "google_auth-2.28.1-py2.py3-none-any.whl", hash = "sha256:25141e2d7a14bfcba945f5e9827f98092716e99482562f15306e5b026e21aa72"},
|
||||
{file = "google-auth-2.28.2.tar.gz", hash = "sha256:80b8b4969aa9ed5938c7828308f20f035bc79f9d8fb8120bf9dc8db20b41ba30"},
|
||||
{file = "google_auth-2.28.2-py2.py3-none-any.whl", hash = "sha256:9fd67bbcd40f16d9d42f950228e9cf02a2ded4ae49198b27432d0cded5a74c38"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -1041,13 +1041,13 @@ httplib2 = ">=0.19.0"
|
||||
|
||||
[[package]]
|
||||
name = "googleapis-common-protos"
|
||||
version = "1.62.0"
|
||||
version = "1.63.0"
|
||||
description = "Common protobufs used in Google APIs"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "googleapis-common-protos-1.62.0.tar.gz", hash = "sha256:83f0ece9f94e5672cced82f592d2a5edf527a96ed1794f0bab36d5735c996277"},
|
||||
{file = "googleapis_common_protos-1.62.0-py2.py3-none-any.whl", hash = "sha256:4750113612205514f9f6aa4cb00d523a94f3e8c06c5ad2fee466387dc4875f07"},
|
||||
{file = "googleapis-common-protos-1.63.0.tar.gz", hash = "sha256:17ad01b11d5f1d0171c06d3ba5c04c54474e883b66b949722b4938ee2694ef4e"},
|
||||
{file = "googleapis_common_protos-1.63.0-py2.py3-none-any.whl", hash = "sha256:ae45f75702f7c08b541f750854a678bd8f534a1a6bace6afe975f1d0a82d6632"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -1158,6 +1158,17 @@ files = [
|
||||
{file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "helpers"
|
||||
version = "0.2.0"
|
||||
description = "Improved developer experience, accumulated."
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
files = [
|
||||
{file = "helpers-0.2.0-py3-none-any.whl", hash = "sha256:2ca7fdfc5c1e6994f80e9d01812d92383163434372bad51e7c04d2fe04c82a3e"},
|
||||
{file = "helpers-0.2.0.tar.gz", hash = "sha256:bdfe1641fdaa1be60de8d0a8e3d243e5273582969b1118e87895616f83acdf90"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "httpcore"
|
||||
version = "1.0.4"
|
||||
@@ -1219,13 +1230,13 @@ socks = ["socksio (==1.*)"]
|
||||
|
||||
[[package]]
|
||||
name = "huggingface-hub"
|
||||
version = "0.21.3"
|
||||
version = "0.21.4"
|
||||
description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub"
|
||||
optional = false
|
||||
python-versions = ">=3.8.0"
|
||||
files = [
|
||||
{file = "huggingface_hub-0.21.3-py3-none-any.whl", hash = "sha256:b183144336fdf2810a8c109822e0bb6ef1fd61c65da6fb60e8c3f658b7144016"},
|
||||
{file = "huggingface_hub-0.21.3.tar.gz", hash = "sha256:26a15b604e4fc7bad37c467b76456543ec849386cbca9cd7e1e135f53e500423"},
|
||||
{file = "huggingface_hub-0.21.4-py3-none-any.whl", hash = "sha256:df37c2c37fc6c82163cdd8a67ede261687d80d1e262526d6c0ce73b6b3630a7b"},
|
||||
{file = "huggingface_hub-0.21.4.tar.gz", hash = "sha256:e1f4968c93726565a80edf6dc309763c7b546d0cfe79aa221206034d50155531"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -1459,13 +1470,13 @@ extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.
|
||||
|
||||
[[package]]
|
||||
name = "langchain-core"
|
||||
version = "0.1.29"
|
||||
version = "0.1.31"
|
||||
description = "Building applications with LLMs through composability"
|
||||
optional = false
|
||||
python-versions = ">=3.8.1,<4.0"
|
||||
files = [
|
||||
{file = "langchain_core-0.1.29-py3-none-any.whl", hash = "sha256:b96d599ff98810a7fcba726c151d473a4b938e0f90b9907c460b0bf0a1c7a0f7"},
|
||||
{file = "langchain_core-0.1.29.tar.gz", hash = "sha256:6731dabffad03b9213ada2640d54ed7f4ef6b99fce87ade3c71474ae154dd3cc"},
|
||||
{file = "langchain_core-0.1.31-py3-none-any.whl", hash = "sha256:ff028f00db8ff03565b542cea81be27426022a72c6545b54d8de66fa00948ab3"},
|
||||
{file = "langchain_core-0.1.31.tar.gz", hash = "sha256:d660cf209bb6ce61cb1c853107b091aaa809015a55dce9e0ce19b51d4c8f2a70"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -1514,13 +1525,13 @@ six = "*"
|
||||
|
||||
[[package]]
|
||||
name = "langsmith"
|
||||
version = "0.1.21"
|
||||
version = "0.1.24"
|
||||
description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform."
|
||||
optional = false
|
||||
python-versions = ">=3.8.1,<4.0"
|
||||
files = [
|
||||
{file = "langsmith-0.1.21-py3-none-any.whl", hash = "sha256:ac3d455d9651879ed306500a0504a2b9b9909225ab178e2446a8bace75e65e23"},
|
||||
{file = "langsmith-0.1.21.tar.gz", hash = "sha256:eef6b8a0d3bec7fcfc69ac5b35a16365ffac025dab0c1a4d77d6a7f7d3bbd3de"},
|
||||
{file = "langsmith-0.1.24-py3-none-any.whl", hash = "sha256:898ef5265bca8fc912f7fbf207e1d69cacd86055faecf6811bd42641e6319840"},
|
||||
{file = "langsmith-0.1.24.tar.gz", hash = "sha256:432b829e763f5077df411bc59bb35449813f18174d2ebc8bbbb38427071d5e7d"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -1940,13 +1951,13 @@ httpx = ">=0.25.2,<0.26.0"
|
||||
|
||||
[[package]]
|
||||
name = "openai"
|
||||
version = "1.13.3"
|
||||
version = "1.14.0"
|
||||
description = "The official Python library for the openai API"
|
||||
optional = false
|
||||
python-versions = ">=3.7.1"
|
||||
files = [
|
||||
{file = "openai-1.13.3-py3-none-any.whl", hash = "sha256:5769b62abd02f350a8dd1a3a242d8972c947860654466171d60fb0972ae0a41c"},
|
||||
{file = "openai-1.13.3.tar.gz", hash = "sha256:ff6c6b3bc7327e715e4b3592a923a5a1c7519ff5dd764a83d69f633d49e77a7b"},
|
||||
{file = "openai-1.14.0-py3-none-any.whl", hash = "sha256:5c9fd3a59f5cbdb4020733ddf79a22f6b7a36d561968cb3f3dd255cdd263d9fe"},
|
||||
{file = "openai-1.14.0.tar.gz", hash = "sha256:e287057adf0ec3315abc32ddcc968d095879abd9b68bf51c0402dab13ab5ae9b"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -2182,13 +2193,13 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "pydantic"
|
||||
version = "2.6.3"
|
||||
version = "2.6.4"
|
||||
description = "Data validation using Python type hints"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "pydantic-2.6.3-py3-none-any.whl", hash = "sha256:72c6034df47f46ccdf81869fddb81aade68056003900a8724a4f160700016a2a"},
|
||||
{file = "pydantic-2.6.3.tar.gz", hash = "sha256:e07805c4c7f5c6826e33a1d4c9d47950d7eaf34868e2690f8594d2e30241f11f"},
|
||||
{file = "pydantic-2.6.4-py3-none-any.whl", hash = "sha256:cc46fce86607580867bdc3361ad462bab9c222ef042d3da86f2fb333e1d916c5"},
|
||||
{file = "pydantic-2.6.4.tar.gz", hash = "sha256:b1704e0847db01817624a6b86766967f552dd9dbf3afba4004409f908dcc84e6"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -2354,13 +2365,13 @@ requests = [
|
||||
|
||||
[[package]]
|
||||
name = "pyparsing"
|
||||
version = "3.1.1"
|
||||
version = "3.1.2"
|
||||
description = "pyparsing module - Classes and methods to define and execute parsing grammars"
|
||||
optional = false
|
||||
python-versions = ">=3.6.8"
|
||||
files = [
|
||||
{file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"},
|
||||
{file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"},
|
||||
{file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"},
|
||||
{file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
@@ -2538,101 +2549,101 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "rapidfuzz"
|
||||
version = "3.6.1"
|
||||
version = "3.6.2"
|
||||
description = "rapid fuzzy string matching"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "rapidfuzz-3.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ac434fc71edda30d45db4a92ba5e7a42c7405e1a54cb4ec01d03cc668c6dcd40"},
|
||||
{file = "rapidfuzz-3.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2a791168e119cfddf4b5a40470620c872812042f0621e6a293983a2d52372db0"},
|
||||
{file = "rapidfuzz-3.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5a2f3e9df346145c2be94e4d9eeffb82fab0cbfee85bd4a06810e834fe7c03fa"},
|
||||
{file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23de71e7f05518b0bbeef55d67b5dbce3bcd3e2c81e7e533051a2e9401354eb0"},
|
||||
{file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d056e342989248d2bdd67f1955bb7c3b0ecfa239d8f67a8dfe6477b30872c607"},
|
||||
{file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01835d02acd5d95c1071e1da1bb27fe213c84a013b899aba96380ca9962364bc"},
|
||||
{file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed0f712e0bb5fea327e92aec8a937afd07ba8de4c529735d82e4c4124c10d5a0"},
|
||||
{file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96cd19934f76a1264e8ecfed9d9f5291fde04ecb667faef5f33bdbfd95fe2d1f"},
|
||||
{file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e06c4242a1354cf9d48ee01f6f4e6e19c511d50bb1e8d7d20bcadbb83a2aea90"},
|
||||
{file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d73dcfe789d37c6c8b108bf1e203e027714a239e50ad55572ced3c004424ed3b"},
|
||||
{file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:06e98ff000e2619e7cfe552d086815671ed09b6899408c2c1b5103658261f6f3"},
|
||||
{file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:08b6fb47dd889c69fbc0b915d782aaed43e025df6979b6b7f92084ba55edd526"},
|
||||
{file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a1788ebb5f5b655a15777e654ea433d198f593230277e74d51a2a1e29a986283"},
|
||||
{file = "rapidfuzz-3.6.1-cp310-cp310-win32.whl", hash = "sha256:c65f92881753aa1098c77818e2b04a95048f30edbe9c3094dc3707d67df4598b"},
|
||||
{file = "rapidfuzz-3.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:4243a9c35667a349788461aae6471efde8d8800175b7db5148a6ab929628047f"},
|
||||
{file = "rapidfuzz-3.6.1-cp310-cp310-win_arm64.whl", hash = "sha256:f59d19078cc332dbdf3b7b210852ba1f5db8c0a2cd8cc4c0ed84cc00c76e6802"},
|
||||
{file = "rapidfuzz-3.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fbc07e2e4ac696497c5f66ec35c21ddab3fc7a406640bffed64c26ab2f7ce6d6"},
|
||||
{file = "rapidfuzz-3.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40cced1a8852652813f30fb5d4b8f9b237112a0bbaeebb0f4cc3611502556764"},
|
||||
{file = "rapidfuzz-3.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:82300e5f8945d601c2daaaac139d5524d7c1fdf719aa799a9439927739917460"},
|
||||
{file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edf97c321fd641fea2793abce0e48fa4f91f3c202092672f8b5b4e781960b891"},
|
||||
{file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7420e801b00dee4a344ae2ee10e837d603461eb180e41d063699fb7efe08faf0"},
|
||||
{file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:060bd7277dc794279fa95522af355034a29c90b42adcb7aa1da358fc839cdb11"},
|
||||
{file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7e3375e4f2bfec77f907680328e4cd16cc64e137c84b1886d547ab340ba6928"},
|
||||
{file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a490cd645ef9d8524090551016f05f052e416c8adb2d8b85d35c9baa9d0428ab"},
|
||||
{file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2e03038bfa66d2d7cffa05d81c2f18fd6acbb25e7e3c068d52bb7469e07ff382"},
|
||||
{file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2b19795b26b979c845dba407fe79d66975d520947b74a8ab6cee1d22686f7967"},
|
||||
{file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:064c1d66c40b3a0f488db1f319a6e75616b2e5fe5430a59f93a9a5e40a656d15"},
|
||||
{file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3c772d04fb0ebeece3109d91f6122b1503023086a9591a0b63d6ee7326bd73d9"},
|
||||
{file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:841eafba6913c4dfd53045835545ba01a41e9644e60920c65b89c8f7e60c00a9"},
|
||||
{file = "rapidfuzz-3.6.1-cp311-cp311-win32.whl", hash = "sha256:266dd630f12696ea7119f31d8b8e4959ef45ee2cbedae54417d71ae6f47b9848"},
|
||||
{file = "rapidfuzz-3.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:d79aec8aeee02ab55d0ddb33cea3ecd7b69813a48e423c966a26d7aab025cdfe"},
|
||||
{file = "rapidfuzz-3.6.1-cp311-cp311-win_arm64.whl", hash = "sha256:484759b5dbc5559e76fefaa9170147d1254468f555fd9649aea3bad46162a88b"},
|
||||
{file = "rapidfuzz-3.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b2ef4c0fd3256e357b70591ffb9e8ed1d439fb1f481ba03016e751a55261d7c1"},
|
||||
{file = "rapidfuzz-3.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:588c4b20fa2fae79d60a4e438cf7133d6773915df3cc0a7f1351da19eb90f720"},
|
||||
{file = "rapidfuzz-3.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7142ee354e9c06e29a2636b9bbcb592bb00600a88f02aa5e70e4f230347b373e"},
|
||||
{file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1dfc557c0454ad22382373ec1b7df530b4bbd974335efe97a04caec936f2956a"},
|
||||
{file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:03f73b381bdeccb331a12c3c60f1e41943931461cdb52987f2ecf46bfc22f50d"},
|
||||
{file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b0ccc2ec1781c7e5370d96aef0573dd1f97335343e4982bdb3a44c133e27786"},
|
||||
{file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da3e8c9f7e64bb17faefda085ff6862ecb3ad8b79b0f618a6cf4452028aa2222"},
|
||||
{file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fde9b14302a31af7bdafbf5cfbb100201ba21519be2b9dedcf4f1048e4fbe65d"},
|
||||
{file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1a23eee225dfb21c07f25c9fcf23eb055d0056b48e740fe241cbb4b22284379"},
|
||||
{file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e49b9575d16c56c696bc7b06a06bf0c3d4ef01e89137b3ddd4e2ce709af9fe06"},
|
||||
{file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:0a9fc714b8c290261669f22808913aad49553b686115ad0ee999d1cb3df0cd66"},
|
||||
{file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:a3ee4f8f076aa92184e80308fc1a079ac356b99c39408fa422bbd00145be9854"},
|
||||
{file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f056ba42fd2f32e06b2c2ba2443594873cfccc0c90c8b6327904fc2ddf6d5799"},
|
||||
{file = "rapidfuzz-3.6.1-cp312-cp312-win32.whl", hash = "sha256:5d82b9651e3d34b23e4e8e201ecd3477c2baa17b638979deeabbb585bcb8ba74"},
|
||||
{file = "rapidfuzz-3.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:dad55a514868dae4543ca48c4e1fc0fac704ead038dafedf8f1fc0cc263746c1"},
|
||||
{file = "rapidfuzz-3.6.1-cp312-cp312-win_arm64.whl", hash = "sha256:3c84294f4470fcabd7830795d754d808133329e0a81d62fcc2e65886164be83b"},
|
||||
{file = "rapidfuzz-3.6.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e19d519386e9db4a5335a4b29f25b8183a1c3f78cecb4c9c3112e7f86470e37f"},
|
||||
{file = "rapidfuzz-3.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01eb03cd880a294d1bf1a583fdd00b87169b9cc9c9f52587411506658c864d73"},
|
||||
{file = "rapidfuzz-3.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:be368573255f8fbb0125a78330a1a40c65e9ba3c5ad129a426ff4289099bfb41"},
|
||||
{file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3e5af946f419c30f5cb98b69d40997fe8580efe78fc83c2f0f25b60d0e56efb"},
|
||||
{file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f382f7ffe384ce34345e1c0b2065451267d3453cadde78946fbd99a59f0cc23c"},
|
||||
{file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be156f51f3a4f369e758505ed4ae64ea88900dcb2f89d5aabb5752676d3f3d7e"},
|
||||
{file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1936d134b6c513fbe934aeb668b0fee1ffd4729a3c9d8d373f3e404fbb0ce8a0"},
|
||||
{file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ff8eaf4a9399eb2bebd838f16e2d1ded0955230283b07376d68947bbc2d33d"},
|
||||
{file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae598a172e3a95df3383634589660d6b170cc1336fe7578115c584a99e0ba64d"},
|
||||
{file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cd4ba4c18b149da11e7f1b3584813159f189dc20833709de5f3df8b1342a9759"},
|
||||
{file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:0402f1629e91a4b2e4aee68043a30191e5e1b7cd2aa8dacf50b1a1bcf6b7d3ab"},
|
||||
{file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:1e12319c6b304cd4c32d5db00b7a1e36bdc66179c44c5707f6faa5a889a317c0"},
|
||||
{file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0bbfae35ce4de4c574b386c43c78a0be176eeddfdae148cb2136f4605bebab89"},
|
||||
{file = "rapidfuzz-3.6.1-cp38-cp38-win32.whl", hash = "sha256:7fec74c234d3097612ea80f2a80c60720eec34947066d33d34dc07a3092e8105"},
|
||||
{file = "rapidfuzz-3.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:a553cc1a80d97459d587529cc43a4c7c5ecf835f572b671107692fe9eddf3e24"},
|
||||
{file = "rapidfuzz-3.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:757dfd7392ec6346bd004f8826afb3bf01d18a723c97cbe9958c733ab1a51791"},
|
||||
{file = "rapidfuzz-3.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2963f4a3f763870a16ee076796be31a4a0958fbae133dbc43fc55c3968564cf5"},
|
||||
{file = "rapidfuzz-3.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d2f0274595cc5b2b929c80d4e71b35041104b577e118cf789b3fe0a77b37a4c5"},
|
||||
{file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f211e366e026de110a4246801d43a907cd1a10948082f47e8a4e6da76fef52"},
|
||||
{file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a59472b43879012b90989603aa5a6937a869a72723b1bf2ff1a0d1edee2cc8e6"},
|
||||
{file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a03863714fa6936f90caa7b4b50ea59ea32bb498cc91f74dc25485b3f8fccfe9"},
|
||||
{file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd95b6b7bfb1584f806db89e1e0c8dbb9d25a30a4683880c195cc7f197eaf0c"},
|
||||
{file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7183157edf0c982c0b8592686535c8b3e107f13904b36d85219c77be5cefd0d8"},
|
||||
{file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ad9d74ef7c619b5b0577e909582a1928d93e07d271af18ba43e428dc3512c2a1"},
|
||||
{file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b53137d81e770c82189e07a8f32722d9e4260f13a0aec9914029206ead38cac3"},
|
||||
{file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:49b9ed2472394d306d5dc967a7de48b0aab599016aa4477127b20c2ed982dbf9"},
|
||||
{file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:dec307b57ec2d5054d77d03ee4f654afcd2c18aee00c48014cb70bfed79597d6"},
|
||||
{file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4381023fa1ff32fd5076f5d8321249a9aa62128eb3f21d7ee6a55373e672b261"},
|
||||
{file = "rapidfuzz-3.6.1-cp39-cp39-win32.whl", hash = "sha256:8d7a072f10ee57c8413c8ab9593086d42aaff6ee65df4aa6663eecdb7c398dca"},
|
||||
{file = "rapidfuzz-3.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:ebcfb5bfd0a733514352cfc94224faad8791e576a80ffe2fd40b2177bf0e7198"},
|
||||
{file = "rapidfuzz-3.6.1-cp39-cp39-win_arm64.whl", hash = "sha256:1c47d592e447738744905c18dda47ed155620204714e6df20eb1941bb1ba315e"},
|
||||
{file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:eef8b346ab331bec12bbc83ac75641249e6167fab3d84d8f5ca37fd8e6c7a08c"},
|
||||
{file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53251e256017e2b87f7000aee0353ba42392c442ae0bafd0f6b948593d3f68c6"},
|
||||
{file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6dede83a6b903e3ebcd7e8137e7ff46907ce9316e9d7e7f917d7e7cdc570ee05"},
|
||||
{file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e4da90e4c2b444d0a171d7444ea10152e07e95972bb40b834a13bdd6de1110c"},
|
||||
{file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ca3dfcf74f2b6962f411c33dd95b0adf3901266e770da6281bc96bb5a8b20de9"},
|
||||
{file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bcc957c0a8bde8007f1a8a413a632a1a409890f31f73fe764ef4eac55f59ca87"},
|
||||
{file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:692c9a50bea7a8537442834f9bc6b7d29d8729a5b6379df17c31b6ab4df948c2"},
|
||||
{file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c23ceaea27e790ddd35ef88b84cf9d721806ca366199a76fd47cfc0457a81b"},
|
||||
{file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b155e67fff215c09f130555002e42f7517d0ea72cbd58050abb83cb7c880cec"},
|
||||
{file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3028ee8ecc48250607fa8a0adce37b56275ec3b1acaccd84aee1f68487c8557b"},
|
||||
{file = "rapidfuzz-3.6.1.tar.gz", hash = "sha256:35660bee3ce1204872574fa041c7ad7ec5175b3053a4cb6e181463fc07013de7"},
|
||||
{file = "rapidfuzz-3.6.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a5637e6bf11b15b5aff6ee818c76bdec99ad208511b78985e6209ba648a6e3ee"},
|
||||
{file = "rapidfuzz-3.6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:380586664f2f63807050ddb95e7702888b4f0b425abf17655940c411f39287ad"},
|
||||
{file = "rapidfuzz-3.6.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3168ff565d4b8c239cf11fb604dd2507d30e9bcaac76a4077c0ac23cf2c866ed"},
|
||||
{file = "rapidfuzz-3.6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be69f7fd46b5c6467fe5e2fd4cff3816b0c03048eed8a4becb9a73e6000960e7"},
|
||||
{file = "rapidfuzz-3.6.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cbd5894f23fdf5697499cf759523639838ac822bd1600e343fdce7313baa02ae"},
|
||||
{file = "rapidfuzz-3.6.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85a5b6e026393fe39fb61146b9c17c5af66fffbe1410e992c4bb06d9ec327bd3"},
|
||||
{file = "rapidfuzz-3.6.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab269adfc64480f209e99f253391a10735edd5c09046e04899adab5fb132f20e"},
|
||||
{file = "rapidfuzz-3.6.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35aeac852bca06023d6bbd50c1fc504ca5a9a3613d5e75a140f0be7601fa34ef"},
|
||||
{file = "rapidfuzz-3.6.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e706f302c6a3ae0d74edd0d6ace46aee1ae07c563b436ccf5ff04db2b3571e60"},
|
||||
{file = "rapidfuzz-3.6.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bec353f022011e6e5cd28ccb8700fbd2a33918197af0d4e0abb3c3f4845cc864"},
|
||||
{file = "rapidfuzz-3.6.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ef3925daaa93eed20401012e219f569ff0c039ed5bf4ce2d3737b4f75d441622"},
|
||||
{file = "rapidfuzz-3.6.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6ee98d88ae9ccc77ff61992ed33b2496478def5dc0da55c9a9aa06fcb725a352"},
|
||||
{file = "rapidfuzz-3.6.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:423c7c588b09d618601097b7a0017dfcb91132a2076bef29023c5f3cd2dc3de1"},
|
||||
{file = "rapidfuzz-3.6.2-cp310-cp310-win32.whl", hash = "sha256:c17c5efee347a40a6f4c1eec59e3d7d1e22f7613a97f8b8a07733ef723483a04"},
|
||||
{file = "rapidfuzz-3.6.2-cp310-cp310-win_amd64.whl", hash = "sha256:4209816626d8d6ff8ae7dc248061c6059e618b70c6e6f6e4d7444ae3740b2b85"},
|
||||
{file = "rapidfuzz-3.6.2-cp310-cp310-win_arm64.whl", hash = "sha256:1c54d3c85e522d3ac9ee39415f183c8fa184c4f87e7e5a37938f15a6d50e853a"},
|
||||
{file = "rapidfuzz-3.6.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e06f6d270112f5db001f1cba5a97e1a48aee3d3dbdcbea3ec027c230462dbf9b"},
|
||||
{file = "rapidfuzz-3.6.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:080cb71b50cb6aff11d1c6aeb157f273e2da0b2bdb3f9d7b01257e49e69a8576"},
|
||||
{file = "rapidfuzz-3.6.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a7895e04a22d6515bc91a850e0831f2405547605aa311d1ffec51e4818abc3c1"},
|
||||
{file = "rapidfuzz-3.6.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd82f9838519136b7083dd1e3149ee80344521f3dc37f744f227505ff0883efb"},
|
||||
{file = "rapidfuzz-3.6.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a945567c2b0b6e069454c9782d5234b0b6795718adf7a9f868bd3144afa6a023"},
|
||||
{file = "rapidfuzz-3.6.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:673ba2c343644805acdae1cb949c6a4de71aa2f62a998978551ebea59603af3f"},
|
||||
{file = "rapidfuzz-3.6.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d457c89bac1471442002e70551e8268e639b3870b4a4521eae363c07253be87"},
|
||||
{file = "rapidfuzz-3.6.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:495c0d8e14e6f12520eb7fc71b9ba9fcaafb47fc23a654e6e89b6c7985ec0020"},
|
||||
{file = "rapidfuzz-3.6.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6d67b649bf3e1b1722d04eca44d37919aef88305ce7ad05564502d013cf550fd"},
|
||||
{file = "rapidfuzz-3.6.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e48dde8ca83d11daa00900cf6a5d281a1297aef9b7bfa73801af6e8822be5019"},
|
||||
{file = "rapidfuzz-3.6.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:824cc381cf81cbf8d158f6935664ec2a69e6ac3b1d39fa201988bf81a257f775"},
|
||||
{file = "rapidfuzz-3.6.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:1dfe4c24957474ce0ac75d886387e30e292b4be39228a6d71f76de414dc187db"},
|
||||
{file = "rapidfuzz-3.6.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d57b98013b802621bbc8b12a46bfc9d36ac552ab51ca207f7ce167ad46adabeb"},
|
||||
{file = "rapidfuzz-3.6.2-cp311-cp311-win32.whl", hash = "sha256:9a07dffac439223b4f1025dbfc68f4445a3460a859309c9858c2a3fa29617cdc"},
|
||||
{file = "rapidfuzz-3.6.2-cp311-cp311-win_amd64.whl", hash = "sha256:95a49c6b8bf1229743ae585dd5b7d57f0d15a7eb6e826866d5c9965ba958503c"},
|
||||
{file = "rapidfuzz-3.6.2-cp311-cp311-win_arm64.whl", hash = "sha256:af7c19ec86e11488539380d3db1755be5d561a3c0e7b04ff9d07abd7f9a8e9d8"},
|
||||
{file = "rapidfuzz-3.6.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:de8adc12161bf282c60f12dc9233bb31632f71d446a010fe7469a69b8153427f"},
|
||||
{file = "rapidfuzz-3.6.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:337e357f693130c4c6be740652542b260e36f622c59e01fa33d58f1d2750c930"},
|
||||
{file = "rapidfuzz-3.6.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6468f8bc8c3c50604f43631550ef9cfec873515dba5023ca34d461be94669fc8"},
|
||||
{file = "rapidfuzz-3.6.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74c6773b11445b5e5cf93ca383171cd0ac0cdeafea11a7b2a5688f8bf8d813e6"},
|
||||
{file = "rapidfuzz-3.6.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1507fc5769aa109dda4de3a15f822a0f6a03e18d627bd0ba3ddbb253cf70e07"},
|
||||
{file = "rapidfuzz-3.6.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:617949a70150e6fffdaed19253dd49f7a53528411dc8bf7663d499ba21e0f61e"},
|
||||
{file = "rapidfuzz-3.6.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f8b77779174b1b40aa70827692571ab457061897846255ad7d5d559e2edb1932"},
|
||||
{file = "rapidfuzz-3.6.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80e51b22a7da83f9c87a97e92df07ed0612c74c35496590255f4b5d5b4212dfe"},
|
||||
{file = "rapidfuzz-3.6.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3ae7c86914cb6673e97e187ba431b9c4cf4177d9ae77f8a1e5b2ba9a5628839e"},
|
||||
{file = "rapidfuzz-3.6.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ddc380ffaa90f204cc9ddcb779114b9ab6f015246d549de9d47871a97ef9f18a"},
|
||||
{file = "rapidfuzz-3.6.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3c1dc078ef371fce09f9f3eec2ca4eaa2a8cd412ec53941015b4f39f14d34407"},
|
||||
{file = "rapidfuzz-3.6.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:9a74102fc5a2534fe91f7507838623e1f3a149d8e05648389c42bb42e14b1c3f"},
|
||||
{file = "rapidfuzz-3.6.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:48e1eaea8fcd522fca7f04f0480663f0f0cfb77957092cce60a93f4462864996"},
|
||||
{file = "rapidfuzz-3.6.2-cp312-cp312-win32.whl", hash = "sha256:66b008bf2972740cd2dda5d382eb8bdb87265cd88198e71c7797bdc0d1f79d20"},
|
||||
{file = "rapidfuzz-3.6.2-cp312-cp312-win_amd64.whl", hash = "sha256:87ac3a87f2251ae2e95fc9478ca5c759de6d141d04c84d3fec9f9cdcfc167b33"},
|
||||
{file = "rapidfuzz-3.6.2-cp312-cp312-win_arm64.whl", hash = "sha256:b593cc51aed887e93b78c2f94dfae9008be2b23d17afd3b1f1d3eb3913b58f26"},
|
||||
{file = "rapidfuzz-3.6.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7d830bc7a9b586a374147ec60b08b1f9ae5996b43f75cc514f37faef3866b519"},
|
||||
{file = "rapidfuzz-3.6.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dbee7f5ff11872b76505cbd87c814abc823e8757f11c69062eb3b25130a283da"},
|
||||
{file = "rapidfuzz-3.6.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c011fb31f2c3f82f503aedd6097d3d3854e574e327a119a3b7eb2cf90b79ca"},
|
||||
{file = "rapidfuzz-3.6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cda81d0e0ce0c13abfa46b24e10c1e85f9c6acb628f0a9a948f5779f9c2076a2"},
|
||||
{file = "rapidfuzz-3.6.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c279928651ce0e9e5220dcb25a00cc53b65e592a0861336a38299bcdca3a596"},
|
||||
{file = "rapidfuzz-3.6.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35bd4bc9c40e6994c5d6edea4b9319388b4d9711c13c66d543bb4c37624b4184"},
|
||||
{file = "rapidfuzz-3.6.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d07899506a5a8760448d9df036d528b55a554bf571714173635c79eef4a86e58"},
|
||||
{file = "rapidfuzz-3.6.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb2e51d01b9c6d6954a3e055c57a80d4685b4fc82719db5519fc153566bcd6bb"},
|
||||
{file = "rapidfuzz-3.6.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:153d065e353371cc0aeff32b99999a5758266a64e958d1364189367c1c9f6814"},
|
||||
{file = "rapidfuzz-3.6.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4edcceebb85ebfa49a3ddcde20ad891d36c08dc0fd592efdab0e7d313a4e36af"},
|
||||
{file = "rapidfuzz-3.6.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3549123fca5bb817341025f98e8e49ca99f84596c7c4f92b658f8e5836040d4a"},
|
||||
{file = "rapidfuzz-3.6.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:84c1032ae42628465b7a5cc35249906061e18a8193c9c27cbd2db54e9823a9a6"},
|
||||
{file = "rapidfuzz-3.6.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9bcc91ebd8fc69a6bd3b5711c8250f5f4e70606b4da75ef415f57ad209978205"},
|
||||
{file = "rapidfuzz-3.6.2-cp38-cp38-win32.whl", hash = "sha256:f3a70f341c4c111bad910d2df69c78577a98af140319a996af24c9385939335d"},
|
||||
{file = "rapidfuzz-3.6.2-cp38-cp38-win_amd64.whl", hash = "sha256:354ad5fe655beb7b279390cb58334903931c5452ecbad1b1666ffb06786498e2"},
|
||||
{file = "rapidfuzz-3.6.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1b86b93d93020c2b3edc1665d75c8855784845fc0a739b312c26c3a4bf0c80d5"},
|
||||
{file = "rapidfuzz-3.6.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:28243086ed0e50808bb56632e5442c457241646aeafafd501ac87901f40a3237"},
|
||||
{file = "rapidfuzz-3.6.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ed52461ae5a9ea4c400d38e2649c74a413f1a6d8fb8308b66f1fbd122514732f"},
|
||||
{file = "rapidfuzz-3.6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a46220f86a5f9cb016af31525e0d0865cad437d02239aa0d8aed2ab8bff1f1c"},
|
||||
{file = "rapidfuzz-3.6.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81a630ed2fc3ec5fc7400eb66bab1f87e282b4d47f0abe3e48c6634dfa13b5e4"},
|
||||
{file = "rapidfuzz-3.6.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8e5a437b9089df6242a718d9c31ab1742989e9400a0977af012ef483b63b4c2"},
|
||||
{file = "rapidfuzz-3.6.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16270b5529de83b7bae7457e952e4d9cf3fbf029a837dd32d415bb9e0eb8e599"},
|
||||
{file = "rapidfuzz-3.6.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5378c04102c7f084cde30a100154fa6d7e2baf0d51a6bdd2f912545559c1fb35"},
|
||||
{file = "rapidfuzz-3.6.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7f18397c8d6a65fc0b288d2fc29bc7baeea6ba91eeb95163a3cd98f23cd3bc85"},
|
||||
{file = "rapidfuzz-3.6.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2acd2514defce81e6ff4bbff50252d5e7df8e85a731442c4b83e44c86cf1c916"},
|
||||
{file = "rapidfuzz-3.6.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:1df2faf80201952e252413b6fac6f3e146080dcebb87bb1bb722508e67558ed8"},
|
||||
{file = "rapidfuzz-3.6.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6440ed0b3007c1c9286b0b88fe2ab2d9e83edd60cd62293b3dfabb732b4e8a30"},
|
||||
{file = "rapidfuzz-3.6.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4fcfa23b5553b27f4016df77c53172ea743454cf12c28cfa7c35a309a2be93b3"},
|
||||
{file = "rapidfuzz-3.6.2-cp39-cp39-win32.whl", hash = "sha256:2d580d937146e803c8e5e1b87916cab8d6f84013b6392713e201efcda335c7d8"},
|
||||
{file = "rapidfuzz-3.6.2-cp39-cp39-win_amd64.whl", hash = "sha256:fe2a68be734e8e88af23385c68d6467e15818b6b1df1cbfebf7bff577226c957"},
|
||||
{file = "rapidfuzz-3.6.2-cp39-cp39-win_arm64.whl", hash = "sha256:6478f7803efebf5f644d0b758439c5b25728550fdfbb19783d150004c46a75a9"},
|
||||
{file = "rapidfuzz-3.6.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:36ce7b68a7b90b787cdd73480a68d2f1ca63c31a3a9d5a79a8736f978e1e9344"},
|
||||
{file = "rapidfuzz-3.6.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53597fd72a9340bcdd80d3620f4957c2b92f9b569313b969a3abdaffd193aae6"},
|
||||
{file = "rapidfuzz-3.6.2-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4f6de745fe6ce46a422d353ee10599013631d7d714a36d025f164b2d4e8c000"},
|
||||
{file = "rapidfuzz-3.6.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62df2136068e2515ed8beb01756381ff62c29384d785e3bf46e3111d4ea3ba1e"},
|
||||
{file = "rapidfuzz-3.6.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7382c90170f60c846c81a07ddd80bb2e8c43c8383754486fa37f67391a571897"},
|
||||
{file = "rapidfuzz-3.6.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f31314fd2e2f3dc3e519e6f93669462ce7953df2def1c344aa8f5345976d0eb2"},
|
||||
{file = "rapidfuzz-3.6.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:012221629d54d3bee954148247f711eb86d4d390b589ebfe03172ea0b37a7531"},
|
||||
{file = "rapidfuzz-3.6.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d41dd59a70decfce6595315367a2fea2af660d92a9d144acc6479030501014d7"},
|
||||
{file = "rapidfuzz-3.6.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f9fa14136a5b0cba1ec42531f7c3e0b0d3edb7fd6bc5e5ae7b498541f3855ab"},
|
||||
{file = "rapidfuzz-3.6.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:259364199cbfeca33b1af369fc7951f71717aa285184a3fa5a7b1772da1b89db"},
|
||||
{file = "rapidfuzz-3.6.2.tar.gz", hash = "sha256:cf911e792ab0c431694c9bf2648afabfd92099103f2e31492893e078ddca5e1a"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
@@ -2796,18 +2807,18 @@ pyasn1 = ">=0.1.3"
|
||||
|
||||
[[package]]
|
||||
name = "setuptools"
|
||||
version = "69.1.1"
|
||||
version = "69.2.0"
|
||||
description = "Easily download, build, install, upgrade, and uninstall Python packages"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "setuptools-69.1.1-py3-none-any.whl", hash = "sha256:02fa291a0471b3a18b2b2481ed902af520c69e8ae0919c13da936542754b4c56"},
|
||||
{file = "setuptools-69.1.1.tar.gz", hash = "sha256:5c0806c7d9af348e6dd3777b4f4dbb42c7ad85b190104837488eab9a7c945cf8"},
|
||||
{file = "setuptools-69.2.0-py3-none-any.whl", hash = "sha256:c21c49fb1042386df081cb5d86759792ab89efca84cf114889191cd09aacc80c"},
|
||||
{file = "setuptools-69.2.0.tar.gz", hash = "sha256:0ff4183f8f42cd8fa3acea16c45205521a4ef28f73c6391d8a25e92893134f2e"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"]
|
||||
testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
|
||||
testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
|
||||
testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"]
|
||||
|
||||
[[package]]
|
||||
@@ -3586,18 +3597,18 @@ requests = "*"
|
||||
|
||||
[[package]]
|
||||
name = "zipp"
|
||||
version = "3.17.0"
|
||||
version = "3.18.0"
|
||||
description = "Backport of pathlib-compatible object wrapper for zip files"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"},
|
||||
{file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"},
|
||||
{file = "zipp-3.18.0-py3-none-any.whl", hash = "sha256:c1bb803ed69d2cce2373152797064f7e79bc43f0a3748eb494096a867e0ebf79"},
|
||||
{file = "zipp-3.18.0.tar.gz", hash = "sha256:df8d042b02765029a09b157efd8e820451045890acc30f8e37dd2f94a060221f"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"]
|
||||
testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"]
|
||||
docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
|
||||
testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"]
|
||||
|
||||
[[package]]
|
||||
name = "zope-event"
|
||||
@@ -3673,4 +3684,4 @@ testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"]
|
||||
[metadata]
|
||||
lock-version = "2.0"
|
||||
python-versions = "^3.10"
|
||||
content-hash = "76e17c74f2e939c22858a9edaea512766a05d0d7737825b13f8b9928cc91e188"
|
||||
content-hash = "5732b76a0ab3501228efa6c0091e4a66bd84def76c8934f06b9219dc2c9d3ad3"
|
||||
|
||||
3687
poetry.lock.bak
Normal file
3687
poetry.lock.bak
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
[tool.poetry]
|
||||
name = "fabric"
|
||||
version = "0.2.0"
|
||||
version = "1.2.0"
|
||||
description = "Fabric - AI framework for human augmentation"
|
||||
authors = [
|
||||
"Daniel Miessler <https://github.com/danielmiessler>",
|
||||
@@ -24,11 +24,15 @@ youtube-transcript-api = "^0.6.2"
|
||||
pydub = "^0.25.1"
|
||||
ollama = "^0.1.7"
|
||||
anthropic = "^0.18.1"
|
||||
pyperclip = "^1.8.2"
|
||||
python-dotenv = "^1.0.1"
|
||||
jwt = "^1.3.1"
|
||||
flask = "^3.0.2"
|
||||
helpers = "^0.2.0"
|
||||
|
||||
[tool.poetry.group.cli.dependencies]
|
||||
pyyaml = "^6.0.1"
|
||||
requests = "^2.31.0"
|
||||
pyperclip = "^1.8.2"
|
||||
python-socketio = "^5.11.0"
|
||||
websocket-client = "^1.7.0"
|
||||
flask = "^3.0.2"
|
||||
@@ -62,5 +66,6 @@ build-backend = "poetry.core.masonry.api"
|
||||
fabric = 'installer:cli'
|
||||
fabric-api = 'installer:run_api_server'
|
||||
fabric-webui = 'installer:run_webui_server'
|
||||
ts = 'helpers.ts:main'
|
||||
yt = 'helpers.yt:main'
|
||||
ts = 'installer:main_ts'
|
||||
yt = 'installer:main_yt'
|
||||
save = 'installer:main_save'
|
||||
|
||||
71
setup.sh
71
setup.sh
@@ -1,71 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Check if pyproject.toml exists in the current directory
|
||||
if [ ! -f "pyproject.toml" ]; then
|
||||
echo "Poetry could not find a pyproject.toml file in the current directory or its parents."
|
||||
echo "Please navigate to the project directory where pyproject.toml is located and rerun this script."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Installs poetry-based python dependencies
|
||||
echo "Installing python dependencies"
|
||||
poetry install
|
||||
|
||||
# List of commands to check and add or update alias for
|
||||
# Add 'yt' and 'ts' to the list of commands
|
||||
commands=("fabric" "fabric-api" "fabric-webui" "ts", "yt")
|
||||
|
||||
# List of shell configuration files to update
|
||||
config_files=("$HOME/.bashrc" "$HOME/.zshrc" "$HOME/.bash_profile")
|
||||
|
||||
# Initialize an array to hold the paths of the sourced files
|
||||
source_commands=()
|
||||
|
||||
for config_file in "${config_files[@]}"; do
|
||||
# Check if the configuration file exists
|
||||
if [ -f "$config_file" ]; then
|
||||
echo "Updating $config_file"
|
||||
for cmd in "${commands[@]}"; do
|
||||
# Get the path of the command
|
||||
CMD_PATH=$(poetry run which $cmd 2>/dev/null)
|
||||
|
||||
# Check if CMD_PATH is empty
|
||||
if [ -z "$CMD_PATH" ]; then
|
||||
echo "Command $cmd not found in the current Poetry environment."
|
||||
continue
|
||||
fi
|
||||
|
||||
# Check if the config file contains an alias for the command
|
||||
if grep -qE "alias $cmd=|alias $cmd =" "$config_file"; then
|
||||
# Compatibility with GNU and BSD sed: Check for operating system and apply appropriate sed syntax
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
# BSD sed (macOS)
|
||||
sed -i '' "/alias $cmd=/c\\
|
||||
alias $cmd='$CMD_PATH'" "$config_file"
|
||||
else
|
||||
# GNU sed (Linux and others)
|
||||
sed -i "/alias $cmd=/c\alias $cmd='$CMD_PATH'" "$config_file"
|
||||
fi
|
||||
echo "Updated alias for $cmd in $config_file."
|
||||
else
|
||||
# If not, add the alias to the config file
|
||||
echo -e "\nalias $cmd='$CMD_PATH'" >>"$config_file"
|
||||
echo "Added alias for $cmd to $config_file."
|
||||
fi
|
||||
done
|
||||
# Add to source_commands array
|
||||
source_commands+=("$config_file")
|
||||
else
|
||||
echo "$config_file does not exist."
|
||||
fi
|
||||
done
|
||||
|
||||
# Provide instruction to source the updated files
|
||||
if [ ${#source_commands[@]} -ne 0 ]; then
|
||||
echo "To apply the changes, please run the following command(s) in your terminal:"
|
||||
for file in "${source_commands[@]}"; do
|
||||
echo "source $file"
|
||||
done
|
||||
else
|
||||
echo "No configuration files were updated. No need to source."
|
||||
fi
|
||||
Reference in New Issue
Block a user