From 6bdcbd7fc37b0d43a926b746c2c057dafb299a7f Mon Sep 17 00:00:00 2001 From: mulatta <67085791+mulatta@users.noreply.github.com> Date: Wed, 23 Sep 2026 16:24:48 +0900 Subject: [PATCH 1/2] flake: rename the project to cocobee The repository outgrew its name: it is no longer a place to try CocoIndex out, it is a Slack retrieval index with an eval harness and a measured pipeline. The flake description, the package name, the lock entry and the dev shell's virtualenv all follow the directory. The .envrc also stopped the formatter: shellcheck cannot see that direnv exports its own path into the file it evaluates, so SC2154 is silenced where it is raised, with the reason next to it. --- evals/questions.enc.yaml | 26 +++++++------- flake.nix | 2 +- nix/devshell.nix | 2 +- pyproject.toml | 4 +-- secrets.yaml | 28 +++++++-------- uv.lock | 74 ++++++++++++++++++++-------------------- 6 files changed, 68 insertions(+), 68 deletions(-) diff --git a/evals/questions.enc.yaml b/evals/questions.enc.yaml index 6eac09e..55925c5 100644 --- a/evals/questions.enc.yaml +++ b/evals/questions.enc.yaml @@ -1,15 +1,15 @@ data: ENC[AES256_GCM,data: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,iv:BhzkNDko9jS64JhDMjlyAe2o4M7xRZvVRK9w5Kb7UxA=,tag:HNniTwaqQZKJ2k22lLxhGw==,type:str] sops: - age: - - enc: | - -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA5VEhjYjc5SWNobm9BV0VR - bFU5Y2FhMS9GL2NFRWFBbFVKUFhDdnVVYlg4CjIwTEF2T1U4SHpjd3pjMmxHSzZY - SE80NXA1M0R2MFVPNTZiMi9ZcXZ5YU0KLS0tIHc3MlFQTGZiZVBLTnM1eklUamly - WmFiVFMrMVBRcGprVmlHQURQbDRGa1UKCrO5Fjn4EmOF2+b5kPGlJPaB93oFTJxY - nXPniqdN+jsDc5Z8uoCpGDybOtJn67wiwKZ1l7fniIVu3gAp7t4g1g== - -----END AGE ENCRYPTED FILE----- - recipient: age1730f3cxdyh56zw8xcvlmpa7u2x7353wu4u0e58kyx24rsefgp98sxehm6s - lastmodified: "2026-09-23T07:12:51Z" - mac: ENC[AES256_GCM,data:biR2CcelZsxkSaIIoDg1fnTMgaVfT3V8xE7SlbP/EabudvCPBOLXmuXbJngTLtUINV8WTDaTjqcWFOllCM3sywYXPfLkPg9auKos1t3A1a+825s/dnQMERN6UbCHUhPs9d/w1Uxnw4dbzCTVQY6i4hAqTZip47eVDJw/GZzJOW8=,iv:5qhp9bssLL2VTTBqelwsvBNgFuyLNOp/bfg/8PMpYIo=,tag:BZ6gGQjgWhRdLeYUSkuRlg==,type:str] - version: 3.13.3 + age: + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA5VEhjYjc5SWNobm9BV0VR + bFU5Y2FhMS9GL2NFRWFBbFVKUFhDdnVVYlg4CjIwTEF2T1U4SHpjd3pjMmxHSzZY + SE80NXA1M0R2MFVPNTZiMi9ZcXZ5YU0KLS0tIHc3MlFQTGZiZVBLTnM1eklUamly + WmFiVFMrMVBRcGprVmlHQURQbDRGa1UKCrO5Fjn4EmOF2+b5kPGlJPaB93oFTJxY + nXPniqdN+jsDc5Z8uoCpGDybOtJn67wiwKZ1l7fniIVu3gAp7t4g1g== + -----END AGE ENCRYPTED FILE----- + recipient: age1730f3cxdyh56zw8xcvlmpa7u2x7353wu4u0e58kyx24rsefgp98sxehm6s + lastmodified: "2026-09-23T07:12:51Z" + mac: ENC[AES256_GCM,data:biR2CcelZsxkSaIIoDg1fnTMgaVfT3V8xE7SlbP/EabudvCPBOLXmuXbJngTLtUINV8WTDaTjqcWFOllCM3sywYXPfLkPg9auKos1t3A1a+825s/dnQMERN6UbCHUhPs9d/w1Uxnw4dbzCTVQY6i4hAqTZip47eVDJw/GZzJOW8=,iv:5qhp9bssLL2VTTBqelwsvBNgFuyLNOp/bfg/8PMpYIo=,tag:BZ6gGQjgWhRdLeYUSkuRlg==,type:str] + version: 3.13.3 diff --git a/flake.nix b/flake.nix index a8a04ef..d6f6349 100644 --- a/flake.nix +++ b/flake.nix @@ -1,5 +1,5 @@ { - description = "cocoindex-playground"; + description = "cocobee"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; diff --git a/nix/devshell.nix b/nix/devshell.nix index 5a43eef..9288558 100644 --- a/nix/devshell.nix +++ b/nix/devshell.nix @@ -6,7 +6,7 @@ let inherit (pkgs) lib; - virtualenv = pythonSet.mkVirtualEnv "cocoindex-playground-dev" workspace.deps.all; + virtualenv = pythonSet.mkVirtualEnv "cocobee-dev" workspace.deps.all; base = { packages = with pkgs; [ diff --git a/pyproject.toml b/pyproject.toml index 27a9d46..82a8f43 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] -name = "cocoindex-playground" +name = "cocobee" version = "0.1.0" -description = "CocoIndex playground" +description = "Slack retrieval index built on CocoIndex" requires-python = ">=3.14" dependencies = [ "aiohttp>=3.14.3", diff --git a/secrets.yaml b/secrets.yaml index 3f3d836..42ddf8f 100644 --- a/secrets.yaml +++ b/secrets.yaml @@ -15,17 +15,17 @@ ANTHROPIC_API_KEY: ENC[AES256_GCM,data:LjEV90smqXsLU1HOGD3YShEEmGalXj5cS3A1DHGRi #ENC[AES256_GCM,data:zLaA23xAd1sVwBsVXD+Dun1EX6bJbohsVXctjHHa,iv:7+p50PqD8qbz9RhuqcINFGZMHCqXeu4wC0ixY3SACE4=,tag:4YuSzP1jV1/DeDYHFFZiFw==,type:comment] #ENC[AES256_GCM,data:5VxRntT1v/dxvxPx49mhTZqjeYOpP/yAuxLilRQDsA2BHk6sdw==,iv:z8jxiqsBwvJATEBNX5jttIHIsKr/3kDJ1AMhIrAl4/Q=,tag:9Ao52YQL1WQA3pJG9mw+/Q==,type:comment] sops: - age: - - enc: | - -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBuTGRTaDRKR0NOeTU1eEQr - NjNXZlB5bUNqR29qR2w5SjMwTjRPNUlpZkNRCmJsZWtObzcrcmx1YkRzc0ZWcjdr - ZkNOcXNON2IxdmtQaUtGVFEyM2dCK1EKLS0tIHFvajY3dVBzNEJBYW9oTkF4TnU4 - di9rd0FJTGV1TUJPSHRpU0NHancwZFEK48gfvnkzQoPgD0kQGrwxzYFp+Agp4k7K - C1vBUNEgRXrv0zpnNL7CChXKAb2zzfgGN9x1NOkSQ8Yd7NGjz1cfJg== - -----END AGE ENCRYPTED FILE----- - recipient: age1730f3cxdyh56zw8xcvlmpa7u2x7353wu4u0e58kyx24rsefgp98sxehm6s - lastmodified: "2026-09-23T06:33:35Z" - mac: ENC[AES256_GCM,data:PoO2ZUovKek6lSkQhgkofnn4CEoyAL6q3knv1wjI461JaxJ9NYSmdKu9jYlyQy/pC3OzVKtsNLWG8n5Mk98H51gY9NtVFLLHLlrIqyEGMPvi25wfKql2ft4AJVlTd+U8qTcDBb9Dv6rLgMggFl9F4YuVN0lb4V25+AnC2EFiDdA=,iv:B3hOWQh1IKPx0xLUK5usF1Nqu5OJzraTklzukCa3zZs=,tag:idVox70tlxxGQVqcyNThDw==,type:str] - unencrypted_suffix: _unencrypted - version: 3.13.3 + age: + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBuTGRTaDRKR0NOeTU1eEQr + NjNXZlB5bUNqR29qR2w5SjMwTjRPNUlpZkNRCmJsZWtObzcrcmx1YkRzc0ZWcjdr + ZkNOcXNON2IxdmtQaUtGVFEyM2dCK1EKLS0tIHFvajY3dVBzNEJBYW9oTkF4TnU4 + di9rd0FJTGV1TUJPSHRpU0NHancwZFEK48gfvnkzQoPgD0kQGrwxzYFp+Agp4k7K + C1vBUNEgRXrv0zpnNL7CChXKAb2zzfgGN9x1NOkSQ8Yd7NGjz1cfJg== + -----END AGE ENCRYPTED FILE----- + recipient: age1730f3cxdyh56zw8xcvlmpa7u2x7353wu4u0e58kyx24rsefgp98sxehm6s + lastmodified: "2026-09-23T06:33:35Z" + mac: ENC[AES256_GCM,data:PoO2ZUovKek6lSkQhgkofnn4CEoyAL6q3knv1wjI461JaxJ9NYSmdKu9jYlyQy/pC3OzVKtsNLWG8n5Mk98H51gY9NtVFLLHLlrIqyEGMPvi25wfKql2ft4AJVlTd+U8qTcDBb9Dv6rLgMggFl9F4YuVN0lb4V25+AnC2EFiDdA=,iv:B3hOWQh1IKPx0xLUK5usF1Nqu5OJzraTklzukCa3zZs=,tag:idVox70tlxxGQVqcyNThDw==,type:str] + unencrypted_suffix: _unencrypted + version: 3.13.3 diff --git a/uv.lock b/uv.lock index 0fc5952..90715eb 100644 --- a/uv.lock +++ b/uv.lock @@ -312,43 +312,7 @@ wheels = [ ] [[package]] -name = "cocoindex" -version = "1.0.24" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "msgspec" }, - { name = "numpy" }, - { name = "psutil" }, - { name = "python-dotenv" }, - { name = "rich" }, - { name = "typing-extensions" }, - { name = "watchdog" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/60/c0/51e837cc2c3ba6cc8e54adcbaa1d7fa2cc56427f912cdc9b14a190d6a632/cocoindex-1.0.24.tar.gz", hash = "sha256:4b8a37a8f3395385e459913615effcec2420a7d765713e61dfe7ee6a0aa40a61", size = 779913, upload-time = "2026-09-20T01:18:21.078Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/21/64/9213e4c849fda0598bbcbbaeb30c952a40d3fb9ce3b382b17e1e4ff9b9c8/cocoindex-1.0.24-cp311-abi3-macosx_10_12_x86_64.whl", hash = "sha256:f0ee415663c3c82db2179bca468b2dafd828c65028102b7cccd649db75dc378e", size = 9530378, upload-time = "2026-09-20T01:18:19.137Z" }, - { url = "https://files.pythonhosted.org/packages/71/e9/8f0c4b2625ab0ad07d0bf2f168744488e54e3008099214f5213334c76ec5/cocoindex-1.0.24-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:00f588ee7de50c0fdbd44d619975c833b6f571cf2033ca6dfd8af33a2ac71885", size = 9618471, upload-time = "2026-09-20T01:18:15.393Z" }, - { url = "https://files.pythonhosted.org/packages/98/81/7d407f2bfb99e12dd401e666a4a07c39f04d68983bf6e65fe607a9e9bc3f/cocoindex-1.0.24-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:92fd3cd175dcf10d69a241c64cbd8cb5c592e23c54e18ff741270d07cd88d547", size = 9497723, upload-time = "2026-09-20T01:18:07.141Z" }, - { url = "https://files.pythonhosted.org/packages/8a/2e/8abbc5430bc39782446b142151270f5b9c3dbceb13bf96d81ba9f0ddaa03/cocoindex-1.0.24-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2800b0d9d56fd230b0c7fd56201ed7d5d3471835d0f3d48786a09cb05aeeca34", size = 9735628, upload-time = "2026-09-20T01:18:11.685Z" }, - { url = "https://files.pythonhosted.org/packages/14/e5/1b9fd2e01845411aafdaf50c5818357526af1fb75205f6102d769e6c047b/cocoindex-1.0.24-cp311-abi3-win_amd64.whl", hash = "sha256:63db183e920b760d852677ddc7ae960bfae339fbc7f55542191f5be1af8b6afb", size = 9961478, upload-time = "2026-09-20T01:18:22.305Z" }, - { url = "https://files.pythonhosted.org/packages/a5/6e/a5e4002c211c64e1210c47ed7dde5c857177a1906ffcedbba63a7d65a03f/cocoindex-1.0.24-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b669c7031e1c9422ba0b55aa2c75ed77c7ec950171938abb0107a31c052385a0", size = 9600338, upload-time = "2026-09-20T01:18:17.361Z" }, - { url = "https://files.pythonhosted.org/packages/4b/22/89ed6e6eb096348c03a1b24703855005605ed1dba8dff3edbee526bd08a7/cocoindex-1.0.24-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:c7e2108e226fc0bdcf412778f95e1ff3ea919e1b80a30e63f46b79cace468ed7", size = 9491394, upload-time = "2026-09-20T01:18:09.721Z" }, - { url = "https://files.pythonhosted.org/packages/f2/06/1de151c6b1fbb0c7c753c35a8e2ea6e04a926ff7edd8c0a3c676f3846965/cocoindex-1.0.24-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:9196bd67200a5e74357ba83149b3821284a3600374497645bc0b84f024bae4b7", size = 9729406, upload-time = "2026-09-20T01:18:13.625Z" }, - { url = "https://files.pythonhosted.org/packages/be/a3/ca185657df3a379b2551a47be3809cc10e8bfb8358d4d31ce0b3e0cb25e2/cocoindex-1.0.24-cp314-cp314t-win_amd64.whl", hash = "sha256:9c8ccfe09a730e6a747d2a05f0d35d7a0059b7992b86c377356f87468c4a1b1f", size = 9957590, upload-time = "2026-09-20T01:18:24.054Z" }, -] - -[package.optional-dependencies] -lancedb = [ - { name = "lancedb" }, - { name = "pyarrow" }, -] -sentence-transformers = [ - { name = "sentence-transformers" }, -] - -[[package]] -name = "cocoindex-playground" +name = "cocobee" version = "0.1.0" source = { virtual = "." } dependencies = [ @@ -386,6 +350,42 @@ dev = [ { name = "types-pyyaml", specifier = ">=6.0.12.20260906" }, ] +[[package]] +name = "cocoindex" +version = "1.0.24" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "msgspec" }, + { name = "numpy" }, + { name = "psutil" }, + { name = "python-dotenv" }, + { name = "rich" }, + { name = "typing-extensions" }, + { name = "watchdog" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/60/c0/51e837cc2c3ba6cc8e54adcbaa1d7fa2cc56427f912cdc9b14a190d6a632/cocoindex-1.0.24.tar.gz", hash = "sha256:4b8a37a8f3395385e459913615effcec2420a7d765713e61dfe7ee6a0aa40a61", size = 779913, upload-time = "2026-09-20T01:18:21.078Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/64/9213e4c849fda0598bbcbbaeb30c952a40d3fb9ce3b382b17e1e4ff9b9c8/cocoindex-1.0.24-cp311-abi3-macosx_10_12_x86_64.whl", hash = "sha256:f0ee415663c3c82db2179bca468b2dafd828c65028102b7cccd649db75dc378e", size = 9530378, upload-time = "2026-09-20T01:18:19.137Z" }, + { url = "https://files.pythonhosted.org/packages/71/e9/8f0c4b2625ab0ad07d0bf2f168744488e54e3008099214f5213334c76ec5/cocoindex-1.0.24-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:00f588ee7de50c0fdbd44d619975c833b6f571cf2033ca6dfd8af33a2ac71885", size = 9618471, upload-time = "2026-09-20T01:18:15.393Z" }, + { url = "https://files.pythonhosted.org/packages/98/81/7d407f2bfb99e12dd401e666a4a07c39f04d68983bf6e65fe607a9e9bc3f/cocoindex-1.0.24-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:92fd3cd175dcf10d69a241c64cbd8cb5c592e23c54e18ff741270d07cd88d547", size = 9497723, upload-time = "2026-09-20T01:18:07.141Z" }, + { url = "https://files.pythonhosted.org/packages/8a/2e/8abbc5430bc39782446b142151270f5b9c3dbceb13bf96d81ba9f0ddaa03/cocoindex-1.0.24-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2800b0d9d56fd230b0c7fd56201ed7d5d3471835d0f3d48786a09cb05aeeca34", size = 9735628, upload-time = "2026-09-20T01:18:11.685Z" }, + { url = "https://files.pythonhosted.org/packages/14/e5/1b9fd2e01845411aafdaf50c5818357526af1fb75205f6102d769e6c047b/cocoindex-1.0.24-cp311-abi3-win_amd64.whl", hash = "sha256:63db183e920b760d852677ddc7ae960bfae339fbc7f55542191f5be1af8b6afb", size = 9961478, upload-time = "2026-09-20T01:18:22.305Z" }, + { url = "https://files.pythonhosted.org/packages/a5/6e/a5e4002c211c64e1210c47ed7dde5c857177a1906ffcedbba63a7d65a03f/cocoindex-1.0.24-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b669c7031e1c9422ba0b55aa2c75ed77c7ec950171938abb0107a31c052385a0", size = 9600338, upload-time = "2026-09-20T01:18:17.361Z" }, + { url = "https://files.pythonhosted.org/packages/4b/22/89ed6e6eb096348c03a1b24703855005605ed1dba8dff3edbee526bd08a7/cocoindex-1.0.24-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:c7e2108e226fc0bdcf412778f95e1ff3ea919e1b80a30e63f46b79cace468ed7", size = 9491394, upload-time = "2026-09-20T01:18:09.721Z" }, + { url = "https://files.pythonhosted.org/packages/f2/06/1de151c6b1fbb0c7c753c35a8e2ea6e04a926ff7edd8c0a3c676f3846965/cocoindex-1.0.24-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:9196bd67200a5e74357ba83149b3821284a3600374497645bc0b84f024bae4b7", size = 9729406, upload-time = "2026-09-20T01:18:13.625Z" }, + { url = "https://files.pythonhosted.org/packages/be/a3/ca185657df3a379b2551a47be3809cc10e8bfb8358d4d31ce0b3e0cb25e2/cocoindex-1.0.24-cp314-cp314t-win_amd64.whl", hash = "sha256:9c8ccfe09a730e6a747d2a05f0d35d7a0059b7992b86c377356f87468c4a1b1f", size = 9957590, upload-time = "2026-09-20T01:18:24.054Z" }, +] + +[package.optional-dependencies] +lancedb = [ + { name = "lancedb" }, + { name = "pyarrow" }, +] +sentence-transformers = [ + { name = "sentence-transformers" }, +] + [[package]] name = "colorama" version = "0.4.6" From e609daac6ab09e277297555c5905b167721e5eb1 Mon Sep 17 00:00:00 2001 From: mulatta <67085791+mulatta@users.noreply.github.com> Date: Wed, 23 Sep 2026 16:35:43 +0900 Subject: [PATCH 2/2] cocobee: rename the package after the project MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Slack is the first source, not the only one planned, so the package takes the project's name and the module names carry the subject: cocobee.source scans a channel, cocobee.files reads what was shared in it. Directory layout stays flat until a second source exists — splitting now would mean guessing which parts are shared, and the second implementation is what answers that. Renaming the modules changes the logic fingerprints cocoindex derives from them, so the whole channel re-distilled and re-embedded on the next run; the scores are unaffected because neither the prompts nor the text changed. --- {slack_index => cocobee}/__init__.py | 0 {slack_index => cocobee}/app.py | 18 +++++++++--------- {slack_index => cocobee}/chunking.py | 6 +++--- {slack_index => cocobee}/config.py | 0 {slack_index => cocobee}/context.py | 2 +- {slack_index => cocobee}/distill.py | 4 ++-- {slack_index => cocobee}/evals.py | 6 +++--- {slack_index => cocobee}/files.py | 10 +++++----- {slack_index => cocobee}/models.py | 2 +- {slack_index => cocobee}/query.py | 4 ++-- {slack_index => cocobee}/rerank.py | 4 ++-- {slack_index => cocobee}/search.py | 4 ++-- {slack_index => cocobee}/source.py | 4 ++-- {slack_index => cocobee}/threads.py | 12 ++++++------ {slack_index => cocobee}/users.py | 2 +- evals/questions.example.yaml | 2 +- tests/test_config.py | 2 +- tests/test_files.py | 4 ++-- tests/test_grouping.py | 6 +++--- tests/test_source.py | 4 ++-- 20 files changed, 48 insertions(+), 48 deletions(-) rename {slack_index => cocobee}/__init__.py (100%) rename {slack_index => cocobee}/app.py (83%) rename {slack_index => cocobee}/chunking.py (92%) rename {slack_index => cocobee}/config.py (100%) rename {slack_index => cocobee}/context.py (96%) rename {slack_index => cocobee}/distill.py (97%) rename {slack_index => cocobee}/evals.py (97%) rename {slack_index => cocobee}/files.py (90%) rename {slack_index => cocobee}/models.py (97%) rename {slack_index => cocobee}/query.py (83%) rename {slack_index => cocobee}/rerank.py (96%) rename {slack_index => cocobee}/search.py (97%) rename {slack_index => cocobee}/source.py (98%) rename {slack_index => cocobee}/threads.py (89%) rename {slack_index => cocobee}/users.py (94%) diff --git a/slack_index/__init__.py b/cocobee/__init__.py similarity index 100% rename from slack_index/__init__.py rename to cocobee/__init__.py diff --git a/slack_index/app.py b/cocobee/app.py similarity index 83% rename from slack_index/app.py rename to cocobee/app.py index ad39384..75ff5cf 100644 --- a/slack_index/app.py +++ b/cocobee/app.py @@ -1,7 +1,7 @@ """Pipeline entry point. -cocoindex update slack_index/app.py # one-shot catch-up -cocoindex update -L slack_index/app.py # live: re-scan every poll interval +cocoindex update cocobee/app.py # one-shot catch-up +cocoindex update -L cocobee/app.py # live: re-scan every poll interval """ from __future__ import annotations @@ -15,13 +15,13 @@ from cocoindex.resources.rate_limit import RateLimiter from slack_sdk.web.async_client import AsyncWebClient -from slack_index import config -from slack_index.context import DISTILLER, EMBEDDER, LANCE_DB, SLACK, SLACK_LIMIT -from slack_index.distill import Distiller -from slack_index.files import process_file -from slack_index.models import SlackChunk -from slack_index.source import SlackChannelFiles, SlackChannelThreads -from slack_index.threads import process_thread +from cocobee import config +from cocobee.context import DISTILLER, EMBEDDER, LANCE_DB, SLACK, SLACK_LIMIT +from cocobee.distill import Distiller +from cocobee.files import process_file +from cocobee.models import SlackChunk +from cocobee.source import SlackChannelFiles, SlackChannelThreads +from cocobee.threads import process_thread _settings = config.Settings.from_env() diff --git a/slack_index/chunking.py b/cocobee/chunking.py similarity index 92% rename from slack_index/chunking.py rename to cocobee/chunking.py index e0b882a..367ba24 100644 --- a/slack_index/chunking.py +++ b/cocobee/chunking.py @@ -11,9 +11,9 @@ from cocoindex.resources.chunk import Chunk from cocoindex.resources.id import IdGenerator -from slack_index.config import CHUNK_OVERLAP, CHUNK_SIZE -from slack_index.context import EMBEDDER -from slack_index.models import SlackChunk +from cocobee.config import CHUNK_OVERLAP, CHUNK_SIZE +from cocobee.context import EMBEDDER +from cocobee.models import SlackChunk _splitter = RecursiveSplitter() diff --git a/slack_index/config.py b/cocobee/config.py similarity index 100% rename from slack_index/config.py rename to cocobee/config.py diff --git a/slack_index/context.py b/cocobee/context.py similarity index 96% rename from slack_index/context.py rename to cocobee/context.py index 1aa9336..fb2a1fc 100644 --- a/slack_index/context.py +++ b/cocobee/context.py @@ -11,7 +11,7 @@ from slack_sdk.web.async_client import AsyncWebClient if _typing.TYPE_CHECKING: - from slack_index import distill + from cocobee import distill SLACK = coco.ContextKey[AsyncWebClient]("slack") # detect_change: a different distillation model must re-distill everything. diff --git a/slack_index/distill.py b/cocobee/distill.py similarity index 97% rename from slack_index/distill.py rename to cocobee/distill.py index e5df83b..b674be4 100644 --- a/slack_index/distill.py +++ b/cocobee/distill.py @@ -16,8 +16,8 @@ from anthropic import AsyncAnthropic from pydantic import BaseModel, Field -from slack_index.config import DISTILL_MAX_TOKENS, DISTILL_TEMPERATURE -from slack_index.context import DISTILLER +from cocobee.config import DISTILL_MAX_TOKENS, DISTILL_TEMPERATURE +from cocobee.context import DISTILLER _SYSTEM = """You summarise chat from a molecular biology lab's Slack channel. The chat is Korean and informal; the science terms are not. Write in Korean. diff --git a/slack_index/evals.py b/cocobee/evals.py similarity index 97% rename from slack_index/evals.py rename to cocobee/evals.py index efbd25b..93d0eea 100644 --- a/slack_index/evals.py +++ b/cocobee/evals.py @@ -1,7 +1,7 @@ """Score the index against a hand-labelled question set. - python -m slack_index.evals - python -m slack_index.evals --questions evals/questions.yaml --top-k 10 + python -m cocobee.evals + python -m cocobee.evals --questions evals/questions.yaml --top-k 10 Every retrieval change — a different embedding model, grouping, a reranker — is judged by re-running this against the same questions. @@ -18,7 +18,7 @@ import yaml -from slack_index.search import Searcher +from cocobee.search import Searcher DEFAULT_QUESTIONS = pathlib.Path("evals/questions.yaml") # The labels quote channel content, so the repo carries only this encrypted copy; diff --git a/slack_index/files.py b/cocobee/files.py similarity index 90% rename from slack_index/files.py rename to cocobee/files.py index 8279aa5..10ae51a 100644 --- a/slack_index/files.py +++ b/cocobee/files.py @@ -9,11 +9,11 @@ import cocoindex as coco from cocoindex.connectors import lancedb -from slack_index.chunking import ChunkMeta, declare_chunks -from slack_index.config import bot_token -from slack_index.context import SLACK_LIMIT -from slack_index.models import FileRef, SlackChunk -from slack_index.users import display_name +from cocobee.chunking import ChunkMeta, declare_chunks +from cocobee.config import bot_token +from cocobee.context import SLACK_LIMIT +from cocobee.models import FileRef, SlackChunk +from cocobee.users import display_name _logger = logging.getLogger(__name__) diff --git a/slack_index/models.py b/cocobee/models.py similarity index 97% rename from slack_index/models.py rename to cocobee/models.py index 060a7ed..94e8e6e 100644 --- a/slack_index/models.py +++ b/cocobee/models.py @@ -8,7 +8,7 @@ from numpy.typing import NDArray -from slack_index.context import EMBEDDER +from cocobee.context import EMBEDDER @dataclass(frozen=True, slots=True) diff --git a/slack_index/query.py b/cocobee/query.py similarity index 83% rename from slack_index/query.py rename to cocobee/query.py index ba4c701..66aca4e 100644 --- a/slack_index/query.py +++ b/cocobee/query.py @@ -5,7 +5,7 @@ import asyncio import sys -from slack_index.search import Searcher +from cocobee.search import Searcher TOP_K = 5 @@ -20,7 +20,7 @@ async def run(query: str, *, top_k: int = TOP_K) -> None: def main() -> None: if len(sys.argv) < 2: - sys.exit("usage: python -m slack_index.query ") + sys.exit("usage: python -m cocobee.query ") asyncio.run(run(" ".join(sys.argv[1:]))) diff --git a/slack_index/rerank.py b/cocobee/rerank.py similarity index 96% rename from slack_index/rerank.py rename to cocobee/rerank.py index 1dc5672..8769f1f 100644 --- a/slack_index/rerank.py +++ b/cocobee/rerank.py @@ -13,10 +13,10 @@ import torch from sentence_transformers import CrossEncoder -from slack_index import config +from cocobee import config if TYPE_CHECKING: - from slack_index.search import Hit + from cocobee.search import Hit def default_device() -> str: diff --git a/slack_index/search.py b/cocobee/search.py similarity index 97% rename from slack_index/search.py rename to cocobee/search.py index 15971f3..e3dfa53 100644 --- a/slack_index/search.py +++ b/cocobee/search.py @@ -8,8 +8,8 @@ from cocoindex.ops.sentence_transformers import SentenceTransformerEmbedder from lancedb.table import AsyncTable -from slack_index import config -from slack_index.rerank import Reranker +from cocobee import config +from cocobee.rerank import Reranker # One source can own many chunks; over-fetch so that collapsing them still # leaves top_k distinct sources. diff --git a/slack_index/source.py b/cocobee/source.py similarity index 98% rename from slack_index/source.py rename to cocobee/source.py index c3ab7e7..4bef476 100644 --- a/slack_index/source.py +++ b/cocobee/source.py @@ -16,8 +16,8 @@ from cocoindex.resources.rate_limit import RateLimiter from slack_sdk.web.async_client import AsyncWebClient -from slack_index.config import WINDOW_GAP, WINDOW_MAX_CHARS, WINDOW_MAX_MESSAGES -from slack_index.models import ConversationRef, FileRef, Message +from cocobee.config import WINDOW_GAP, WINDOW_MAX_CHARS, WINDOW_MAX_MESSAGES +from cocobee.models import ConversationRef, FileRef, Message # Joins, leaves and topic changes carry no content worth searching. SKIP_SUBTYPES = frozenset( diff --git a/slack_index/threads.py b/cocobee/threads.py similarity index 89% rename from slack_index/threads.py rename to cocobee/threads.py index b95b6de..571f7bc 100644 --- a/slack_index/threads.py +++ b/cocobee/threads.py @@ -8,12 +8,12 @@ import cocoindex as coco from cocoindex.connectors import lancedb -from slack_index.chunking import ChunkMeta, declare_chunks -from slack_index.context import SLACK, SLACK_LIMIT -from slack_index.distill import distill -from slack_index.models import ConversationRef, Message, SlackChunk -from slack_index.source import next_cursor -from slack_index.users import display_name +from cocobee.chunking import ChunkMeta, declare_chunks +from cocobee.context import SLACK, SLACK_LIMIT +from cocobee.distill import distill +from cocobee.models import ConversationRef, Message, SlackChunk +from cocobee.source import next_cursor +from cocobee.users import display_name def thread_permalink(channel: str, thread_ts: str) -> str: diff --git a/slack_index/users.py b/cocobee/users.py similarity index 94% rename from slack_index/users.py rename to cocobee/users.py index 0cc1cae..b546ffb 100644 --- a/slack_index/users.py +++ b/cocobee/users.py @@ -5,7 +5,7 @@ import cocoindex as coco from slack_sdk.errors import SlackApiError -from slack_index.context import SLACK, SLACK_LIMIT +from cocobee.context import SLACK, SLACK_LIMIT UNKNOWN_AUTHOR = "unknown" diff --git a/evals/questions.example.yaml b/evals/questions.example.yaml index 2eea3ea..95e4aef 100644 --- a/evals/questions.example.yaml +++ b/evals/questions.example.yaml @@ -1,4 +1,4 @@ -# Question set for `python -m slack_index.evals`. Copy to questions.yaml and fill +# Question set for `python -m cocobee.evals`. Copy to questions.yaml and fill # it with questions whose answers you already know; that file stays untracked # because its labels quote channel content. # diff --git a/tests/test_config.py b/tests/test_config.py index a4d5914..05ba891 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -4,7 +4,7 @@ import pytest -from slack_index import config +from cocobee import config def test_a_set_variable_is_used(monkeypatch: pytest.MonkeyPatch) -> None: diff --git a/tests/test_files.py b/tests/test_files.py index dac2a28..4694f34 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -4,8 +4,8 @@ import asyncio -from slack_index.files import extract_text, is_text -from slack_index.models import FileRef +from cocobee.files import extract_text, is_text +from cocobee.models import FileRef MAX_BYTES = 1024 diff --git a/tests/test_grouping.py b/tests/test_grouping.py index bc93065..608e8c0 100644 --- a/tests/test_grouping.py +++ b/tests/test_grouping.py @@ -2,9 +2,9 @@ from __future__ import annotations -from slack_index.config import WINDOW_MAX_CHARS, WINDOW_MAX_MESSAGES -from slack_index.models import Message -from slack_index.source import group_messages +from cocobee.config import WINDOW_MAX_CHARS, WINDOW_MAX_MESSAGES +from cocobee.models import Message +from cocobee.source import group_messages CHANNEL = "C0TEST" BASE = 1758470000.0 diff --git a/tests/test_source.py b/tests/test_source.py index 4289ceb..90adb1a 100644 --- a/tests/test_source.py +++ b/tests/test_source.py @@ -8,8 +8,8 @@ from cocoindex.resources.rate_limit import RateLimiter -from slack_index.models import FileRef -from slack_index.source import SlackChannelFiles, SlackChannelThreads, oldest_ts +from cocobee.models import FileRef +from cocobee.source import SlackChannelFiles, SlackChannelThreads, oldest_ts from tests.conftest import FakeSlackClient CHANNEL = "C0TEST"