Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 2 additions & 16 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ['3.11', '3.12', '3.13', '3.14']
python-version: ['3.11', '3.12', '3.13', '3.14', '3.15']
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v5
Expand All @@ -34,7 +34,7 @@ jobs:
matrix:
include:
- resolution: highest
python-version: '3.14'
python-version: '3.15'
- resolution: lowest-direct
python-version: '3.11'
steps:
Expand All @@ -47,17 +47,3 @@ jobs:
- run: uv run --no-sync pytest packages/discolike-cli/tests -q
- run: uv build --all-packages -o dist
- run: uv run --no-project --isolated --resolution ${{ matrix.resolution }} --find-links dist --with dist/discolike_cli-*.whl discolike --version

# 3.15 is still prerelease; non-blocking until 3.15.0 final, when it moves
# into the matrix above and gets a classifier.
test-prerelease:
runs-on: ubuntu-latest
continue-on-error: true
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v5
with:
python-version: '3.15'
- run: uv sync --all-packages
- run: uv run pytest packages/discolike/tests -q
- run: uv run pytest packages/discolike-cli/tests -q
5 changes: 4 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
# Changelog

## Unreleased
## 0.6.2 (2026-10-21)

- SDK/CLI: Python 3.15 is supported and tested in CI.
- SDK/CLI: an LLM integration's `model_name` can carry provider settings after `#`, as URL query parameters: `region` for `bedrock` and `bedrock_mantle` (any AWS region, optional), `account` for `snowflake` (account identifier, with a programmatic access token as `api_key`) and `region` plus `project` for `watsonx`, e.g. `us.anthropic.claude-sonnet-4-5-20250929-v1:0#region=us-east-1`. Snowflake and watsonx become usable as providers. An unknown setting or region is a 400 (`ValidationError`). `DiscogenModels.provider_regions` lists the accepted regions per provider. The CLI's `llm-providers create`, `update` and `test-connection` gain `--region`, `--account` and `--project`, which build the suffix for you, and `discogen models` output gains a `provider_regions` key. It needs an API release that knows the settings; older SDKs can already send the suffix in `model_name`.
- SDK: `BulkContactMatchQueryItem` gains `linkedin`, a LinkedIn profile URL or username matched exactly before `email`, then name and company, so a list of profile URLs alone returns the matching contacts. It needs an API release that knows the field.
- SDK (note for maintainers): `discolike/_generated/requests.py` is regenerated from the dev spec, which adds `linkedin` and moves `api_key` after `base_url` on the LLM provider request models (keyword arguments, so no caller change).

## 0.6.1 (2026-10-19)

Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ uv run pytest packages/discolike/tests -q
uv run pytest packages/discolike-cli/tests -q
```

CI runs the same checks across Python 3.11–3.14.
CI runs the same checks across Python 3.11–3.15.

## Branches

Expand Down
2 changes: 1 addition & 1 deletion examples/discover_and_enrich.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ def main() -> None:

print(f"\nRunning DiscoGen over {len(domains)} domains: {args.query!r}")
job = client.discogen.process(DiscoGenProcessRequest(query=args.query, domains=domains, web_search=True))
status = job.wait(timeout=args.timeout, on_poll=lambda s: print(f" status={s.status} progress={s.progress}%"))
status = job.wait(max_wait=args.timeout, on_poll=lambda s: print(f" status={s.status} progress={s.progress}%"))

print("\nEnriched results:")
for row in status.results or []:
Expand Down
6 changes: 3 additions & 3 deletions examples/enrich_crm_export.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,9 @@ def enrich_row(client: Discolike, *, domain: str) -> dict[str, str]:
"dl_name": profile.name or "",
"dl_employees": profile.employees or "",
"dl_revenue_range": profile.revenue_range or "",
"dl_country": address.country if address else "",
"dl_state": address.state if address else "",
"dl_city": address.city if address else "",
"dl_country": (address.country if address else None) or "",
"dl_state": (address.state if address else None) or "",
"dl_city": (address.city if address else None) or "",
"dl_industry_groups": top_keys(profile.industry_groups),
"dl_business_model": top_keys(profile.business_model),
"dl_description": profile.description or "",
Expand Down
2 changes: 1 addition & 1 deletion examples/find_emails_from_csv.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ def main() -> None:
chunk = contacts[start : start + MAX_CONTACTS_PER_BATCH]
print(f"Submitting batch of {len(chunk)} contacts ({start + len(chunk)}/{len(contacts)})...")
batch = client.email.find_batch(FindEmailBatchRequest.model_validate({"requests": chunk}))
results = batch.results(timeout=args.timeout)
results = batch.results(max_wait=args.timeout)
for item in results.results:
output = item.result
if not isinstance(output, EnumerationOutput):
Expand Down
2 changes: 1 addition & 1 deletion examples/match_crm_contacts.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ def main() -> None:
job = client.contacts.bulk_match(
BulkContactMatchRequest.model_validate({"queries": queries, "limit": 1})
)
status = job.wait(timeout=args.timeout)
status = job.wait(max_wait=args.timeout)
except Exception as exc: # leave the chunk un-checkpointed so a rerun retries it
failed_chunks += 1
print(f" ! {label} failed ({exc}); rows left pending, rerun to retry")
Expand Down
5 changes: 3 additions & 2 deletions packages/discolike-cli/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ build-backend = "hatchling.build"

[project]
name = "discolike-cli"
version = "0.6.1"
version = "0.6.2"
description = "Official CLI for the DiscoLike API"
readme = "README.md"
license = "MIT"
license-files = ["LICENSE"]
requires-python = ">=3.11"
authors = [{ name = "DiscoLike", email = "support@discolike.com" }]
dependencies = [
"discolike==0.6.1",
"discolike==0.6.2",
"typer>=0.26.1,<0.28",
"rich>=13.0",
]
Expand All @@ -25,6 +25,7 @@ classifiers = [
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Programming Language :: Python :: 3.15",
"Programming Language :: Python :: 3 :: Only",
"Operating System :: OS Independent",
"Environment :: Console",
Expand Down
3 changes: 2 additions & 1 deletion packages/discolike/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,15 @@ classifiers = [
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Programming Language :: Python :: 3.15",
"Programming Language :: Python :: 3 :: Only",
"Operating System :: OS Independent",
"Topic :: Software Development :: Libraries :: Python Modules",
"Typing :: Typed",
]

[project.optional-dependencies]
cli = ["discolike-cli==0.6.1"]
cli = ["discolike-cli==0.6.2"]

[project.urls]
Homepage = "https://www.discolike.com"
Expand Down
25 changes: 16 additions & 9 deletions packages/discolike/src/discolike/_generated/requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -2905,7 +2905,6 @@ class LLMProviderCreateRequest(DiscolikeRequest):
title="Provider",
),
]
api_key: Annotated[str, Field(description="API key for the provider", title="Api Key")]
model_name: Annotated[
str,
Field(description="Default model name for this integration", title="Model Name"),
Expand All @@ -2917,6 +2916,7 @@ class LLMProviderCreateRequest(DiscolikeRequest):
title="Base Url",
),
] = None
api_key: Annotated[str, Field(description="API key for the provider", title="Api Key")]


class LLMProviderUpdateRequest(DiscolikeRequest):
Expand All @@ -2934,13 +2934,6 @@ class LLMProviderUpdateRequest(DiscolikeRequest):
title="Provider",
),
]
api_key: Annotated[
str | None,
Field(
description="API key for the provider (null to keep existing)",
title="Api Key",
),
]
model_name: Annotated[
str,
Field(description="Default model name for this integration", title="Model Name"),
Expand All @@ -2952,6 +2945,13 @@ class LLMProviderUpdateRequest(DiscolikeRequest):
title="Base Url",
),
] = None
api_key: Annotated[
str | None,
Field(
description="API key for the provider (null to keep existing)",
title="Api Key",
),
]


class SearchProviderRequest(DiscolikeRequest):
Expand Down Expand Up @@ -3084,7 +3084,7 @@ class BulkContactMatchQueryItem(DiscolikeRequest):
name: Annotated[
str | None,
Field(
description="Person name to search for. Required unless email is provided.",
description="Person name to search for. Required unless email or linkedin is provided.",
title="Name",
),
] = None
Expand All @@ -3095,6 +3095,13 @@ class BulkContactMatchQueryItem(DiscolikeRequest):
title="Email",
),
] = None
linkedin: Annotated[
str | None,
Field(
description="LinkedIn profile URL or username for exact lookup, tried before email. When found, email and name/company matching are skipped for this row.",
title="Linkedin",
),
] = None
company_name: Annotated[
str | None,
Field(description="Company name to narrow the search.", title="Company Name"),
Expand Down
2 changes: 1 addition & 1 deletion packages/discolike/src/discolike/_version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "0.6.1"
__version__ = "0.6.2"
2 changes: 1 addition & 1 deletion packages/discolike/tests/test_package.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@


def test_version() -> None:
assert discolike.__version__ == "0.6.1"
assert discolike.__version__ == "0.6.2"
2 changes: 1 addition & 1 deletion uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading